From ae3edf84a808da7160e0b4b97fa51b08d5025d8c Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Sun, 27 Nov 2022 15:50:07 +0800 Subject: [PATCH 01/44] =?UTF-8?q?1.=E5=9B=BE=E7=89=87=20=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=20=E5=A4=A7=E5=B0=8F=20=E5=B0=BA=E5=AF=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/javaex/htool/crypto/IdUtils.java | 2 +- htool-picture/pom.xml | 10 +++ .../cn/javaex/htool/picture/PictureUtils.java | 72 +++++++++++++++++++ pom.xml | 1 + 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 htool-picture/pom.xml create mode 100644 htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/IdUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/IdUtils.java index f1973a3..7436301 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/IdUtils.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/IdUtils.java @@ -27,7 +27,7 @@ public class IdUtils { static { long localIp = Long.parseLong(getSiteLocalIp().replace(".", "")); workerId = localIp % (-1L ^ (-1L << workerIdBits)); - dataCenterId = 0l; + dataCenterId = 0L; } /** diff --git a/htool-picture/pom.xml b/htool-picture/pom.xml new file mode 100644 index 0000000..1581c15 --- /dev/null +++ b/htool-picture/pom.xml @@ -0,0 +1,10 @@ + + 4.0.0 + + cn.javaex + htool + 1.0.0 + + htool-picture + 图片处理 + \ No newline at end of file diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java new file mode 100644 index 0000000..5f1378a --- /dev/null +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -0,0 +1,72 @@ +package cn.javaex.htool.picture; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +/** + * @author 韩建东 + * @Date 2022年11月27日 + */ +public class PictureUtils { + /** + * 改变 图片 最低 宽度 + */ + private static int MIN_PIC_WIDTH = 10; + /** + * 改变 图片 最低 高度 + */ + private static int MAX_PIC_HEIGHT = 10; + + /** + * @param picFile 修改的 图片 路径 + * @param width 自定义 变化 的 图片 宽度 + * @param height 自定义 变化 的 图片 高度 + * @return BufferedImage 图片buffer + */ + public static BufferedImage changeSize(File picFile, int width, int height) { + try { + if (width < MIN_PIC_WIDTH || height < MAX_PIC_HEIGHT) { + System.err.println("图片尺寸不能小于10*10"); + return null; + } + BufferedImage srcBuffer = ImageIO.read(picFile); + BufferedImage to = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = to.createGraphics(); + to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); + g2d.dispose(); + g2d = to.createGraphics(); + Image from = srcBuffer.getScaledInstance(width, height, BufferedImage.SCALE_AREA_AVERAGING); + g2d.drawImage(from, 0, 0, null); + return to; + } catch (IOException e) { + // TODO Auto-generated catch block + System.err.println("图片修改尺寸失败"); + } + return null; + } + + public static BufferedImage getPic(File picFile, int width, int height) { + try { + if (width < MIN_PIC_WIDTH || height < MAX_PIC_HEIGHT) { + System.err.println("图片尺寸不能小于10*10"); + return null; + } + BufferedImage srcBuffer = ImageIO.read(picFile); + BufferedImage to = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = to.createGraphics(); + to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); + g2d.dispose(); + g2d = to.createGraphics(); + Image from = srcBuffer.getScaledInstance(width, height, BufferedImage.SCALE_AREA_AVERAGING); + g2d.drawImage(from, 0, 0, null); + return to; + } catch (IOException e) { + // TODO Auto-generated catch block + System.err.println("图片修改尺寸失败"); + } + return null; + } +} diff --git a/pom.xml b/pom.xml index 3b81f4e..ed44337 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ htool-date htool-crypto htool-servlet + htool-picture -- Gitee From 834f2f1a018adfbb17e63f2444fc074303e34082 Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Sun, 27 Nov 2022 16:16:48 +0800 Subject: [PATCH 02/44] =?UTF-8?q?=E7=AD=89=E6=AF=94=E4=BE=8B=20=E5=A4=84?= =?UTF-8?q?=E7=90=86=20=E5=9B=BE=E7=89=87=E5=A4=A7=E5=B0=8F=E5=B0=BA?= =?UTF-8?q?=E5=AF=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/picture/PictureUtils.java | 80 ++++++++----------- 1 file changed, 35 insertions(+), 45 deletions(-) diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index 5f1378a..f437e05 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -1,10 +1,7 @@ package cn.javaex.htool.picture; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; /** * @author 韩建东 @@ -18,55 +15,48 @@ public class PictureUtils { /** * 改变 图片 最低 高度 */ - private static int MAX_PIC_HEIGHT = 10; + private static int MIN_PIC_HEIGHT = 10; /** - * @param picFile 修改的 图片 路径 - * @param width 自定义 变化 的 图片 宽度 - * @param height 自定义 变化 的 图片 高度 + * 自定义修改图片 大小 + * + * @param srcBuffer 修改的 图片 的流 + * @param width 自定义 变化 的 图片 宽度 + * @param height 自定义 变化 的 图片 高度 * @return BufferedImage 图片buffer */ - public static BufferedImage changeSize(File picFile, int width, int height) { - try { - if (width < MIN_PIC_WIDTH || height < MAX_PIC_HEIGHT) { - System.err.println("图片尺寸不能小于10*10"); - return null; - } - BufferedImage srcBuffer = ImageIO.read(picFile); - BufferedImage to = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics2D g2d = to.createGraphics(); - to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); - g2d.dispose(); - g2d = to.createGraphics(); - Image from = srcBuffer.getScaledInstance(width, height, BufferedImage.SCALE_AREA_AVERAGING); - g2d.drawImage(from, 0, 0, null); - return to; - } catch (IOException e) { - // TODO Auto-generated catch block - System.err.println("图片修改尺寸失败"); + public static BufferedImage changeSize(BufferedImage srcBuffer, int width, int height) { + if (width < MIN_PIC_WIDTH || height < MIN_PIC_HEIGHT) { + System.err.println("图片尺寸不能小于10*10"); + return null; } - return null; + BufferedImage to = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = to.createGraphics(); + to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); + g2d.dispose(); + g2d = to.createGraphics(); + Image from = srcBuffer.getScaledInstance(width, height, BufferedImage.SCALE_AREA_AVERAGING); + g2d.drawImage(from, 0, 0, null); + return to; } - public static BufferedImage getPic(File picFile, int width, int height) { - try { - if (width < MIN_PIC_WIDTH || height < MAX_PIC_HEIGHT) { - System.err.println("图片尺寸不能小于10*10"); - return null; - } - BufferedImage srcBuffer = ImageIO.read(picFile); - BufferedImage to = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics2D g2d = to.createGraphics(); - to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); - g2d.dispose(); - g2d = to.createGraphics(); - Image from = srcBuffer.getScaledInstance(width, height, BufferedImage.SCALE_AREA_AVERAGING); - g2d.drawImage(from, 0, 0, null); - return to; - } catch (IOException e) { - // TODO Auto-generated catch block - System.err.println("图片修改尺寸失败"); + /** + * 等比例 处理 图片大小尺寸 + * + * @param srcBuffer 需要处理的图片流 + * @param scale 等比例数值 (0,100] 原尺寸 = 原尺寸*scale + * @return + */ + public static BufferedImage proportion(BufferedImage srcBuffer, double scale) { + String picFormat = ""; + int width = srcBuffer.getWidth(); + int height = srcBuffer.getHeight(); + int targetWidth = (int) (width * scale); + int targetHeight = (int) (height * scale); + if (targetWidth < MIN_PIC_WIDTH || targetHeight < MIN_PIC_HEIGHT) { + System.err.println("尺寸不能再缩小"); + return null; } - return null; + return changeSize(srcBuffer, targetWidth, targetHeight); } } -- Gitee From b199065f0419f5021253467e88c609fe90a2d249 Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 27 Nov 2022 16:49:24 +0800 Subject: [PATCH 03/44] =?UTF-8?q?=E5=9B=BE=E7=89=87+RGB=E8=BD=AC16?= =?UTF-8?q?=E8=BF=9B=E5=88=B6=E3=80=81=E5=B8=B8=E7=94=A8=E6=AD=A3=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/regular/RegularUtil.java | 98 +++++++++++++++++++ .../cn/javaex/htool/picture/PictureUtils.java | 12 +++ 2 files changed, 110 insertions(+) create mode 100644 htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java diff --git a/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java b/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java new file mode 100644 index 0000000..c1cb1f3 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java @@ -0,0 +1,98 @@ +package cn.javaex.htool.regular; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 常用正则表达式 + * + * @author 杨伟辰 + * @Date 2022年11月27日16:32:36 + */ +public class RegularUtil { + + /** + * 匹配正则 + * @param regular 正则规则 + * @param msg 内容 + * @return 返回所有匹配结果 + */ + public static List getRegular(String regular, String msg) { + ArrayList ids = new ArrayList<>(); + Pattern pattern = Pattern.compile(regular); + Matcher matcher = pattern.matcher(msg); + while (matcher.find()) { + String str = matcher.group(0); + ids.add(str); + } + return ids; + } + + /** + * 获取URL中的参数名和参数值的Map集合 + * @param url url + * @return 返回Map集合保存 + */ + private static Map getUrlPramNameAndValue(String url) { + //匹配参数名和参数值的正则表达式 + String regEx = "(\\?|&+)(.+?)=([^&]*)"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(url); + // LinkedHashMap是有序的Map集合,遍历时会按照加入的顺序遍历输出 + Map paramMap = new LinkedHashMap(); + while (m.find()) { + //获取参数名 + String paramName = m.group(2); + //获取参数值 + String paramVal = m.group(3); + paramMap.put(paramName, paramVal); + } + return paramMap; + } + + /** + * 传过来一堆字符串,就算有html标签也行,可以提取里面包含图片格式的url + * 常用在提取富文本中的图片链接 + * @param htmlStr html字符 + * @return + */ + public static List getImgStr(String htmlStr) { + List list = new ArrayList<>(); + String img = ""; + Pattern p_image; + Matcher m_image; + String regEx_img = "]*?>"; + p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE); + m_image = p_image.matcher(htmlStr); + while (m_image.find()) { + // 得到数据 + img = m_image.group(); + // 匹配中的src数据 + String regEx = "src\\s*=\\s*\"?(.*?)(\"|>|\\s+)"; + Matcher m = Pattern.compile(regEx).matcher(img); + while (m.find()) { + list.add(m.group(1)); + } + } + return list; + } + + /** + * 判断字符串中是否包含中文 + * @param str 待校验字符串 + * @return 是否为中文 + * @warn 不能校验是否为中文标点符号 + */ + public static boolean isContainChinese(String str) { + Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); + Matcher m = p.matcher(str); + if (m.find()) { + return true; + } + return false; + } +} diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index f437e05..4ecc2b6 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -59,4 +59,16 @@ public class PictureUtils { } return changeSize(srcBuffer, targetWidth, targetHeight); } + + + /** + * RGB转换成16进制 + * @param r + * @param g + * @param b + * @return + */ + public static String rgb2Hex(int r,int g,int b){ + return String.format("#%02X%02X%02X", r,g,b); + } } -- Gitee From f6a0d3e2a541de8141c886284cb40c2c8edde529 Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Sun, 27 Nov 2022 18:09:09 +0800 Subject: [PATCH 04/44] =?UTF-8?q?1.=20=E5=8E=8B=E7=BC=A9=20=E5=9B=BE?= =?UTF-8?q?=E7=89=87=20=EF=BC=88=E6=9C=AA=20=E5=AE=8C=E6=88=90=EF=BC=89=20?= =?UTF-8?q?2.=20IdUtils=20=E8=BD=AC=E7=A7=BB=20=E5=88=B0=20core=20?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/javaex/htool/core}/IdUtils.java | 0 htool-picture/pom.xml | 27 +++++--- .../cn/javaex/htool/picture/PictureUtils.java | 61 +++++++++++++++---- 3 files changed, 68 insertions(+), 20 deletions(-) rename {htool-crypto/src/main/java/cn/javaex/htool/crypto => htool-core/src/main/java/cn/javaex/htool/core}/IdUtils.java (100%) diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/IdUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java similarity index 100% rename from htool-crypto/src/main/java/cn/javaex/htool/crypto/IdUtils.java rename to htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java diff --git a/htool-picture/pom.xml b/htool-picture/pom.xml index 1581c15..0cbea05 100644 --- a/htool-picture/pom.xml +++ b/htool-picture/pom.xml @@ -1,10 +1,19 @@ - - 4.0.0 - - cn.javaex - htool - 1.0.0 - - htool-picture - 图片处理 + + 4.0.0 + + cn.javaex + htool + 1.0.0 + + htool-picture + 图片处理 + + + cn.javaex + htool-core + 1.0.0 + compile + + \ No newline at end of file diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index 4ecc2b6..d520449 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -1,21 +1,26 @@ package cn.javaex.htool.picture; +import cn.javaex.htool.crypto.IdUtils; + +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; import java.awt.*; import java.awt.image.BufferedImage; /** - * @author 韩建东 - * @Date 2022年11月27日 + * @author 韩建东 2022年11月27日 */ public class PictureUtils { /** * 改变 图片 最低 宽度 */ - private static int MIN_PIC_WIDTH = 10; + private static final int MIN_PIC_WIDTH = 10; /** * 改变 图片 最低 高度 */ - private static int MIN_PIC_HEIGHT = 10; + private static final int MIN_PIC_HEIGHT = 10; /** * 自定义修改图片 大小 @@ -25,7 +30,7 @@ public class PictureUtils { * @param height 自定义 变化 的 图片 高度 * @return BufferedImage 图片buffer */ - public static BufferedImage changeSize(BufferedImage srcBuffer, int width, int height) { + public static BufferedImage sizeChange(BufferedImage srcBuffer, int width, int height) { if (width < MIN_PIC_WIDTH || height < MIN_PIC_HEIGHT) { System.err.println("图片尺寸不能小于10*10"); return null; @@ -45,10 +50,9 @@ public class PictureUtils { * * @param srcBuffer 需要处理的图片流 * @param scale 等比例数值 (0,100] 原尺寸 = 原尺寸*scale - * @return + * @return BufferedImage 图片buffer */ - public static BufferedImage proportion(BufferedImage srcBuffer, double scale) { - String picFormat = ""; + public static BufferedImage sizeProportion(BufferedImage srcBuffer, double scale) { int width = srcBuffer.getWidth(); int height = srcBuffer.getHeight(); int targetWidth = (int) (width * scale); @@ -57,18 +61,53 @@ public class PictureUtils { System.err.println("尺寸不能再缩小"); return null; } - return changeSize(srcBuffer, targetWidth, targetHeight); + return sizeChange(srcBuffer, targetWidth, targetHeight); + } + + /** + * 图片的压缩 算法 + * + * @param srcBuffer 图片流 + * @param quality 质量 (0,1] + * @return + */ + public static BufferedImage qualityCompress(BufferedImage srcBuffer, float quality) { + if (quality <= 0 || quality > 1) { + System.err.println("参数不合法"); + return null; + } + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); + + BufferedImage to = new BufferedImage(srcBuffer.getWidth(), srcBuffer.getHeight(), BufferedImage.TYPE_INT_RGB); + ImageWriteParam imageWriteParam = writer.getDefaultWriteParam(); + String uuid = IdUtils.getUUID(); + //File.createTempFile("quality_" + uuid, "") + writer.setOutput(imageWriteParam); + if (imageWriteParam.canWriteCompressed()) { + imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + imageWriteParam.setCompressionQuality(quality); + } + try { + writer.write(null, new IIOImage(to, null, null), imageWriteParam); + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + System.err.println("图片压缩失败"); + return null; + } + return to; } /** * RGB转换成16进制 + * * @param r * @param g * @param b * @return */ - public static String rgb2Hex(int r,int g,int b){ - return String.format("#%02X%02X%02X", r,g,b); + public static String rgb2Hex(int r, int g, int b) { + return String.format("#%02X%02X%02X", r, g, b); } } -- Gitee From ed6c4b71eb7cdcbdefa0ad59832bb44101f3b8e6 Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Sun, 27 Nov 2022 18:09:09 +0800 Subject: [PATCH 05/44] =?UTF-8?q?2.=20IdUtils=20=E8=BD=AC=E7=A7=BB=20?= =?UTF-8?q?=E5=88=B0=20core=20=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htool-core/pom.xml | 2 - .../java/cn/javaex/htool/core}/IdUtils.java | 2 +- htool-picture/pom.xml | 27 +++++--- .../cn/javaex/htool/picture/PictureUtils.java | 61 +++++++++++++++---- 4 files changed, 69 insertions(+), 23 deletions(-) rename {htool-crypto/src/main/java/cn/javaex/htool/crypto => htool-core/src/main/java/cn/javaex/htool/core}/IdUtils.java (98%) diff --git a/htool-core/pom.xml b/htool-core/pom.xml index e2a8ae7..0e50c2a 100644 --- a/htool-core/pom.xml +++ b/htool-core/pom.xml @@ -6,6 +6,4 @@ 1.0.0 htool-core - htool-core - htool核心模块 \ No newline at end of file diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/IdUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java similarity index 98% rename from htool-crypto/src/main/java/cn/javaex/htool/crypto/IdUtils.java rename to htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java index 7436301..60dc13a 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/IdUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.crypto; +package cn.javaex.htool.core; import java.util.UUID; import java.net.InetAddress; diff --git a/htool-picture/pom.xml b/htool-picture/pom.xml index 1581c15..0cbea05 100644 --- a/htool-picture/pom.xml +++ b/htool-picture/pom.xml @@ -1,10 +1,19 @@ - - 4.0.0 - - cn.javaex - htool - 1.0.0 - - htool-picture - 图片处理 + + 4.0.0 + + cn.javaex + htool + 1.0.0 + + htool-picture + 图片处理 + + + cn.javaex + htool-core + 1.0.0 + compile + + \ No newline at end of file diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index 4ecc2b6..d520449 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -1,21 +1,26 @@ package cn.javaex.htool.picture; +import cn.javaex.htool.crypto.IdUtils; + +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; import java.awt.*; import java.awt.image.BufferedImage; /** - * @author 韩建东 - * @Date 2022年11月27日 + * @author 韩建东 2022年11月27日 */ public class PictureUtils { /** * 改变 图片 最低 宽度 */ - private static int MIN_PIC_WIDTH = 10; + private static final int MIN_PIC_WIDTH = 10; /** * 改变 图片 最低 高度 */ - private static int MIN_PIC_HEIGHT = 10; + private static final int MIN_PIC_HEIGHT = 10; /** * 自定义修改图片 大小 @@ -25,7 +30,7 @@ public class PictureUtils { * @param height 自定义 变化 的 图片 高度 * @return BufferedImage 图片buffer */ - public static BufferedImage changeSize(BufferedImage srcBuffer, int width, int height) { + public static BufferedImage sizeChange(BufferedImage srcBuffer, int width, int height) { if (width < MIN_PIC_WIDTH || height < MIN_PIC_HEIGHT) { System.err.println("图片尺寸不能小于10*10"); return null; @@ -45,10 +50,9 @@ public class PictureUtils { * * @param srcBuffer 需要处理的图片流 * @param scale 等比例数值 (0,100] 原尺寸 = 原尺寸*scale - * @return + * @return BufferedImage 图片buffer */ - public static BufferedImage proportion(BufferedImage srcBuffer, double scale) { - String picFormat = ""; + public static BufferedImage sizeProportion(BufferedImage srcBuffer, double scale) { int width = srcBuffer.getWidth(); int height = srcBuffer.getHeight(); int targetWidth = (int) (width * scale); @@ -57,18 +61,53 @@ public class PictureUtils { System.err.println("尺寸不能再缩小"); return null; } - return changeSize(srcBuffer, targetWidth, targetHeight); + return sizeChange(srcBuffer, targetWidth, targetHeight); + } + + /** + * 图片的压缩 算法 + * + * @param srcBuffer 图片流 + * @param quality 质量 (0,1] + * @return + */ + public static BufferedImage qualityCompress(BufferedImage srcBuffer, float quality) { + if (quality <= 0 || quality > 1) { + System.err.println("参数不合法"); + return null; + } + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); + + BufferedImage to = new BufferedImage(srcBuffer.getWidth(), srcBuffer.getHeight(), BufferedImage.TYPE_INT_RGB); + ImageWriteParam imageWriteParam = writer.getDefaultWriteParam(); + String uuid = IdUtils.getUUID(); + //File.createTempFile("quality_" + uuid, "") + writer.setOutput(imageWriteParam); + if (imageWriteParam.canWriteCompressed()) { + imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + imageWriteParam.setCompressionQuality(quality); + } + try { + writer.write(null, new IIOImage(to, null, null), imageWriteParam); + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + System.err.println("图片压缩失败"); + return null; + } + return to; } /** * RGB转换成16进制 + * * @param r * @param g * @param b * @return */ - public static String rgb2Hex(int r,int g,int b){ - return String.format("#%02X%02X%02X", r,g,b); + public static String rgb2Hex(int r, int g, int b) { + return String.format("#%02X%02X%02X", r, g, b); } } -- Gitee From 0f30d5655c563713a2c630584b3f59a6afb7495b Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Sun, 27 Nov 2022 19:05:22 +0800 Subject: [PATCH 06/44] =?UTF-8?q?=E5=9B=BE=E7=89=87=20=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=20=E7=AE=97=E6=B3=95=20=EF=BC=88=E8=A7=A3=E5=86=B3=20=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=20=E5=8F=98=E7=BA=A2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 getSrcBufferedImage 方法 --- .../cn/javaex/htool/picture/PictureUtils.java | 54 +++++++++++----- .../picture/util/BufferedImageBuilder.java | 62 +++++++++++++++++++ 2 files changed, 99 insertions(+), 17 deletions(-) create mode 100644 htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index d520449..d10a77e 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -1,13 +1,15 @@ package cn.javaex.htool.picture; -import cn.javaex.htool.crypto.IdUtils; +import cn.javaex.htool.core.IdUtils; +import cn.javaex.htool.picture.util.BufferedImageBuilder; -import javax.imageio.IIOImage; -import javax.imageio.ImageIO; -import javax.imageio.ImageWriteParam; -import javax.imageio.ImageWriter; +import javax.imageio.*; +import javax.imageio.stream.ImageOutputStream; import java.awt.*; import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.io.File; +import java.io.FileOutputStream; /** * @author 韩建东 2022年11月27日 @@ -69,7 +71,7 @@ public class PictureUtils { * * @param srcBuffer 图片流 * @param quality 质量 (0,1] - * @return + * @return BufferedImage */ public static BufferedImage qualityCompress(BufferedImage srcBuffer, float quality) { if (quality <= 0 || quality > 1) { @@ -77,25 +79,43 @@ public class PictureUtils { return null; } ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); - - BufferedImage to = new BufferedImage(srcBuffer.getWidth(), srcBuffer.getHeight(), BufferedImage.TYPE_INT_RGB); ImageWriteParam imageWriteParam = writer.getDefaultWriteParam(); - String uuid = IdUtils.getUUID(); - //File.createTempFile("quality_" + uuid, "") - writer.setOutput(imageWriteParam); - if (imageWriteParam.canWriteCompressed()) { - imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); - imageWriteParam.setCompressionQuality(quality); - } + ColorModel colorModel = srcBuffer.getColorModel(); try { - writer.write(null, new IIOImage(to, null, null), imageWriteParam); + String uuid = IdUtils.getUUID(); + File tempFile = File.createTempFile("quality_" + uuid, ".jpg"); + FileOutputStream fileOutputStream = new FileOutputStream(tempFile); + ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(fileOutputStream); + writer.setOutput(imageOutputStream); + if (imageWriteParam.canWriteCompressed()) { + imageWriteParam.setDestinationType(new ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16))); + imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + imageWriteParam.setCompressionQuality(quality); + imageWriteParam.setProgressiveMode(ImageWriteParam.MODE_DISABLED); + } + writer.write(null, new IIOImage(srcBuffer, null, null), imageWriteParam); + BufferedImage read = ImageIO.read(tempFile); + tempFile.delete(); + fileOutputStream.close(); + imageOutputStream.close(); + return read; } catch (Exception e) { // TODO: handle exception e.printStackTrace(); System.err.println("图片压缩失败"); return null; } - return to; + } + + /** + * 获得图片的BufferedImage 处理 图片 变红 的bug + * + * @param file 图片路径 + * @return BufferedImage + */ + public static BufferedImage getSrcBufferedImage(File file) { + Image src = Toolkit.getDefaultToolkit().getImage(file.getPath()); + return BufferedImageBuilder.toBufferedImage(src); } diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java b/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java new file mode 100644 index 0000000..7aa1ab7 --- /dev/null +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java @@ -0,0 +1,62 @@ +package cn.javaex.htool.picture.util; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; + +/** + * @author 韩建东 2022年11月27日 + */ +public class BufferedImageBuilder { + public static BufferedImage toBufferedImage(Image image) { + + if (image instanceof BufferedImage) { + + return (BufferedImage) image; + + } + + image = new ImageIcon(image).getImage(); + + BufferedImage bimage = null; + + GraphicsEnvironment ge = GraphicsEnvironment + + .getLocalGraphicsEnvironment(); + + try { + + int transparency = Transparency.OPAQUE; + + GraphicsDevice gs = ge.getDefaultScreenDevice(); + + GraphicsConfiguration gc = gs.getDefaultConfiguration(); + + bimage = gc.createCompatibleImage(image.getWidth(null), + + image.getHeight(null), transparency); + + } catch (HeadlessException e) { + System.err.println("报错"); + } + + if (bimage == null) { + + int type = BufferedImage.TYPE_INT_RGB; + + bimage = new BufferedImage(image.getWidth(null), + + image.getHeight(null), type); + + } + + Graphics g = bimage.createGraphics(); + + g.drawImage(image, 0, 0, null); + + g.dispose(); + + return bimage; + + } +} -- Gitee From 742f92017dcb00c9be22883fbba00a401964cdfe Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Sun, 27 Nov 2022 19:09:48 +0800 Subject: [PATCH 07/44] =?UTF-8?q?=E8=A7=84=E8=8C=83=20=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaex/htool/cache/model/CacheInfo.java | 82 ++++---- .../crypto/{MD5Utils.java => Md5Utils.java} | 2 +- .../cn/javaex/htool/servlet/AgentUtils.java | 191 +++++++++--------- 3 files changed, 148 insertions(+), 127 deletions(-) rename htool-crypto/src/main/java/cn/javaex/htool/crypto/{MD5Utils.java => Md5Utils.java} (98%) diff --git a/htool-cache/src/main/java/cn/javaex/htool/cache/model/CacheInfo.java b/htool-cache/src/main/java/cn/javaex/htool/cache/model/CacheInfo.java index f3824cb..d80eeab 100644 --- a/htool-cache/src/main/java/cn/javaex/htool/cache/model/CacheInfo.java +++ b/htool-cache/src/main/java/cn/javaex/htool/cache/model/CacheInfo.java @@ -2,43 +2,57 @@ package cn.javaex.htool.cache.model; /** * 缓存信息 - * + * * @author 陈霓清 * @Date 2022年11月25日 */ public class CacheInfo { - private Object data; // 缓存数据 - private long expireTime; // 失效时间:单位(毫秒)(0表示永不失效) - private long lastRefeshTime; // 最后刷新时间 - - public CacheInfo(Object data, long expireTime, long lastRefeshTime) { - this.data = data; - this.expireTime = expireTime; - this.lastRefeshTime = lastRefeshTime; - } - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public long getExpireTime() { - return expireTime; - } - public void setExpireTime(long expireTime) { - this.expireTime = expireTime; - } - public long getLastRefeshTime() { - return lastRefeshTime; - } - public void setLastRefeshTime(long lastRefeshTime) { - this.lastRefeshTime = lastRefeshTime; - } - - @Override - public String toString() { - return "CacheInfo [data=" + data + ", expireTime=" + expireTime + ", lastRefeshTime=" + lastRefeshTime + "]"; - } + /** + * 缓存数据 + */ + private Object data; + /** + * 失效时间:单位(毫秒)(0表示永不失效) + */ + private long expireTime; + /** + * 最后刷新时间 + */ + private long lastRefeshTime; + + public CacheInfo(Object data, long expireTime, long lastRefeshTime) { + this.data = data; + this.expireTime = expireTime; + this.lastRefeshTime = lastRefeshTime; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public long getExpireTime() { + return expireTime; + } + + public void setExpireTime(long expireTime) { + this.expireTime = expireTime; + } + + public long getLastRefeshTime() { + return lastRefeshTime; + } + + public void setLastRefeshTime(long lastRefeshTime) { + this.lastRefeshTime = lastRefeshTime; + } + + @Override + public String toString() { + return "CacheInfo [data=" + data + ", expireTime=" + expireTime + ", lastRefeshTime=" + lastRefeshTime + "]"; + } } diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/MD5Utils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/Md5Utils.java similarity index 98% rename from htool-crypto/src/main/java/cn/javaex/htool/crypto/MD5Utils.java rename to htool-crypto/src/main/java/cn/javaex/htool/crypto/Md5Utils.java index c735e68..a296cd5 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/MD5Utils.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/Md5Utils.java @@ -11,7 +11,7 @@ import java.util.Arrays; * @author 陈霓清 * @Date 2022年11月25日 */ -public class MD5Utils { +public class Md5Utils { /** * 将传入的字符串进行MD5加密,并返回加密后的字符串 diff --git a/htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java b/htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java index 2c22152..6ccc934 100644 --- a/htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java +++ b/htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java @@ -1,105 +1,112 @@ package cn.javaex.htool.servlet; -import javax.servlet.http.HttpServletRequest; - -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - import eu.bitwalker.useragentutils.Browser; import eu.bitwalker.useragentutils.OperatingSystem; import eu.bitwalker.useragentutils.UserAgent; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; /** * 获取终端信息 - * + * * @author 陈霓清 * @Date 2022年11月26日 */ public class AgentUtils { - - /** - * 获取访问者的ip地址 - * @return - */ - public static String getIp() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - - if (request==null) { - return "unknown"; - } - - String ip = null; - - // X-Forwarded-For:Squid 服务代理 - String ipAddresses = request.getHeader("X-Forwarded-For"); - - if (ipAddresses==null || ipAddresses.length()==0 || "unknown".equalsIgnoreCase(ipAddresses)) { - ipAddresses = request.getHeader("Proxy-Client-IP"); // Proxy-Client-IP:apache 服务代理 - } - if (ipAddresses==null || ipAddresses.length()==0 || "unknown".equalsIgnoreCase(ipAddresses)) { - ipAddresses = request.getHeader("WL-Proxy-Client-IP"); // WL-Proxy-Client-IP:weblogic 服务代理 - } - if (ipAddresses==null || ipAddresses.length()==0 || "unknown".equalsIgnoreCase(ipAddresses)) { - ipAddresses = request.getHeader("HTTP_CLIENT_IP"); // HTTP_CLIENT_IP:有些代理服务器 - } - if (ipAddresses==null || ipAddresses.length()==0 || "unknown".equalsIgnoreCase(ipAddresses)) { - ipAddresses = request.getHeader("X-Real-IP"); // X-Real-IP:nginx服务代理 - } - - // 有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP - if (ipAddresses!=null && ipAddresses.length()!=0) { - ip = ipAddresses.split(",")[0]; - } - - // 还是不能获取到,最后再通过request.getRemoteAddr();获取 - if (ip==null || ip.length()==0 || "unknown".equalsIgnoreCase(ipAddresses)) { - ip = request.getRemoteAddr(); - } - - return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; - } - - /** - * 判断访问来路是否是移动端 - * @return - */ - public static boolean isMoblie() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String userAgent = request.getHeader("user-agent"); - - if (userAgent.indexOf("Android")!=-1 || userAgent.indexOf("iPhone")!=-1 || userAgent.indexOf("iPad")!=-1) { - return true; - } - - return false; - } - - /** - * 获取访问者浏览器 - * @return - */ - public static String getBrowser() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String userAgent = request.getHeader("user-agent"); - - if (userAgent.contains("Edg/")) { - return userAgent.substring(userAgent.indexOf("Edg/"), userAgent.length()).replace("Edg/", "Edge "); - } - - Browser browser = UserAgent.parseUserAgentString(userAgent).getBrowser(); - return browser.getName(); - } - - /** - * 获取访问者操作系统 - * @return - */ - public static String getOperatingSystem() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - String userAgent = request.getHeader("user-agent"); - - OperatingSystem operatingSystem = UserAgent.parseUserAgentString(userAgent).getOperatingSystem(); - return operatingSystem.getName(); - } - + + /** + * 获取访问者的ip地址 + * + * @return + */ + public static String getIp() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + + if (request == null) { + return "unknown"; + } + + String ip = null; + + // X-Forwarded-For:Squid 服务代理 + String ipAddresses = request.getHeader("X-Forwarded-For"); + + if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { + // Proxy-Client-IP:apache 服务代理 + ipAddresses = request.getHeader("Proxy-Client-IP"); + } + if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { + // WL-Proxy-Client-IP:weblogic 服务代理 + ipAddresses = request.getHeader("WL-Proxy-Client-IP"); + } + if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { + // HTTP_CLIENT_IP:有些代理服务器 + ipAddresses = request.getHeader("HTTP_CLIENT_IP"); + } + if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { + // X-Real-IP:nginx服务代理 + ipAddresses = request.getHeader("X-Real-IP"); + } + + // 有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP + if (ipAddresses != null && ipAddresses.length() != 0) { + ip = ipAddresses.split(",")[0]; + } + + // 还是不能获取到,最后再通过request.getRemoteAddr();获取 + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { + ip = request.getRemoteAddr(); + } + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; + } + + /** + * 判断访问来路是否是移动端 + * + * @return + */ + public static boolean isMoblie() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String userAgent = request.getHeader("user-agent"); + + if (userAgent.indexOf("Android") != -1 || userAgent.indexOf("iPhone") != -1 || userAgent.indexOf("iPad") != -1) { + return true; + } + + return false; + } + + /** + * 获取访问者浏览器 + * + * @return + */ + public static String getBrowser() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String userAgent = request.getHeader("user-agent"); + + if (userAgent.contains("Edg/")) { + return userAgent.substring(userAgent.indexOf("Edg/"), userAgent.length()).replace("Edg/", "Edge "); + } + + Browser browser = UserAgent.parseUserAgentString(userAgent).getBrowser(); + return browser.getName(); + } + + /** + * 获取访问者操作系统 + * + * @return + */ + public static String getOperatingSystem() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String userAgent = request.getHeader("user-agent"); + + OperatingSystem operatingSystem = UserAgent.parseUserAgentString(userAgent).getOperatingSystem(); + return operatingSystem.getName(); + } + } -- Gitee From 8004c4071a8770d18342e9d053c9b8bcfc0d9bdb Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Sun, 27 Nov 2022 19:12:57 +0800 Subject: [PATCH 08/44] =?UTF-8?q?=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/regular/RegularUtil.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java b/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java index c1cb1f3..bd1f2df 100644 --- a/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java +++ b/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java @@ -15,10 +15,16 @@ import java.util.regex.Pattern; */ public class RegularUtil { + /** + * 中文 正则 + */ + private static Pattern ZH_Pattern = Pattern.compile("[\u4e00-\u9fa5]"); + /** * 匹配正则 + * * @param regular 正则规则 - * @param msg 内容 + * @param msg 内容 * @return 返回所有匹配结果 */ public static List getRegular(String regular, String msg) { @@ -34,6 +40,7 @@ public class RegularUtil { /** * 获取URL中的参数名和参数值的Map集合 + * * @param url url * @return 返回Map集合保存 */ @@ -56,7 +63,8 @@ public class RegularUtil { /** * 传过来一堆字符串,就算有html标签也行,可以提取里面包含图片格式的url - * 常用在提取富文本中的图片链接 + * 常用在提取富文本中的图片链接 + * * @param htmlStr html字符 * @return */ @@ -83,13 +91,13 @@ public class RegularUtil { /** * 判断字符串中是否包含中文 + * * @param str 待校验字符串 * @return 是否为中文 * @warn 不能校验是否为中文标点符号 */ public static boolean isContainChinese(String str) { - Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); - Matcher m = p.matcher(str); + Matcher m = ZH_Pattern.matcher(str); if (m.find()) { return true; } -- Gitee From 55d80b9225963523f927a0cf326e5d8c33ef9d34 Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Sun, 27 Nov 2022 19:25:43 +0800 Subject: [PATCH 09/44] =?UTF-8?q?=E8=A7=84=E8=8C=83=20=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/javaex/htool/core/IdUtils.java | 197 +++++------ .../cn/javaex/htool/regular/RegularUtil.java | 14 +- .../htool/date/constant/DatePattern.java | 55 +-- .../htool/date/handler/DateHandler.java | 139 ++++---- .../htool/date/handler/TimeHandler.java | 317 +++++++++--------- 5 files changed, 374 insertions(+), 348 deletions(-) diff --git a/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java index 60dc13a..fa8721c 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java @@ -1,110 +1,115 @@ package cn.javaex.htool.core; -import java.util.UUID; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; +import java.util.UUID; /** * ID生成工具类 - * + * * @author 陈霓清 * @Date 2022年11月25日 */ public class IdUtils { - private static final long twepoch = 1543376515623L; - private static final long workerIdBits = 10L; - private static final long dataCenterIdBits = 0L; - private static final long sequenceBits = 12L; - private static final long workerIdShift = sequenceBits; - private static final long dataCenterIdShift = sequenceBits + workerIdBits; - private static final long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits; - private static final long sequenceMask = -1L ^ (-1L << sequenceBits); - private static long workerId; - private static long dataCenterId; - private static long sequence = 0L; - private static long lastTimestamp = -1L; - static { - long localIp = Long.parseLong(getSiteLocalIp().replace(".", "")); - workerId = localIp % (-1L ^ (-1L << workerIdBits)); - dataCenterId = 0L; - } - - /** - * 生成UUID - * @return - */ - public static String getUUID() { - return UUID.randomUUID().toString().replace("-", ""); - } - - /** - * 得到唯一数字ID(字符串形式) - * @return - */ - public static synchronized String getLongIdStr() { - return String.valueOf(getLongId()); - } - - /** - * 得到唯一数字ID - * @return - */ - public static synchronized long getLongId() { - long timestamp = System.currentTimeMillis(); - - if (timestamp networkInterfaces = NetworkInterface.getNetworkInterfaces(); - while (networkInterfaces.hasMoreElements()) { - NetworkInterface networkInterface = networkInterfaces.nextElement(); - if (networkInterface.getName() != null && networkInterface.getName().startsWith("eth")) { - Enumeration inetAddresses = networkInterface.getInetAddresses(); - while (inetAddresses.hasMoreElements()) { - InetAddress inetAddress = inetAddresses.nextElement(); - if (inetAddress.isSiteLocalAddress() && !inetAddress.isMulticastAddress()) { - return inetAddress.getHostAddress() == null ? "127.0.0.1" : inetAddress.getHostAddress(); - } - } - } - } - } catch (Exception e) { - e.printStackTrace(); - throw new ExceptionInInitializerError("get site local ip error."); - } - - return "127.0.0.1"; - } - - private static long tilNextMillis(long lastTimestamp) { - long timestamp = System.currentTimeMillis(); - - while (timestamp<=lastTimestamp) { - timestamp = System.currentTimeMillis(); - } - - return timestamp; - } + private static final long twepoch = 1543376515623L; + private static final long workerIdBits = 10L; + private static final long dataCenterIdBits = 0L; + private static final long sequenceBits = 12L; + private static final long workerIdShift = sequenceBits; + private static final long dataCenterIdShift = sequenceBits + workerIdBits; + private static final long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits; + private static final long sequenceMask = -1L ^ (-1L << sequenceBits); + private static long workerId; + private static long dataCenterId; + private static long sequence = 0L; + private static long lastTimestamp = -1L; + + static { + long localIp = Long.parseLong(getSiteLocalIp().replace(".", "")); + workerId = localIp % (-1L ^ (-1L << workerIdBits)); + dataCenterId = 0L; + } + + /** + * 生成UUID + * + * @return + */ + @SuppressWarnings("AlibabaLowerCamelCaseVariableNaming") + public static String getUUID() { + return UUID.randomUUID().toString().replace("-", ""); + } + + /** + * 得到唯一数字ID(字符串形式) + * + * @return + */ + public static synchronized String getLongIdStr() { + return String.valueOf(getLongId()); + } + + /** + * 得到唯一数字ID + * + * @return + */ + public static synchronized long getLongId() { + long timestamp = System.currentTimeMillis(); + + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("Clock moved backwards", lastTimestamp - timestamp)); + } + + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0L; + } + + lastTimestamp = timestamp; + + return ((timestamp - twepoch) << timestampLeftShift) + | (dataCenterId << dataCenterIdShift) + | (workerId << workerIdShift) + | sequence; + } + + private static String getSiteLocalIp() { + try { + Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); + while (networkInterfaces.hasMoreElements()) { + NetworkInterface networkInterface = networkInterfaces.nextElement(); + if (networkInterface.getName() != null && networkInterface.getName().startsWith("eth")) { + Enumeration inetAddresses = networkInterface.getInetAddresses(); + while (inetAddresses.hasMoreElements()) { + InetAddress inetAddress = inetAddresses.nextElement(); + if (inetAddress.isSiteLocalAddress() && !inetAddress.isMulticastAddress()) { + return inetAddress.getHostAddress() == null ? "127.0.0.1" : inetAddress.getHostAddress(); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + throw new ExceptionInInitializerError("get site local ip error."); + } + + return "127.0.0.1"; + } + + private static long tilNextMillis(long lastTimestamp) { + long timestamp = System.currentTimeMillis(); + + while (timestamp <= lastTimestamp) { + timestamp = System.currentTimeMillis(); + } + + return timestamp; + } } diff --git a/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java b/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java index bd1f2df..769b696 100644 --- a/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java +++ b/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java @@ -71,14 +71,14 @@ public class RegularUtil { public static List getImgStr(String htmlStr) { List list = new ArrayList<>(); String img = ""; - Pattern p_image; - Matcher m_image; - String regEx_img = "]*?>"; - p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE); - m_image = p_image.matcher(htmlStr); - while (m_image.find()) { + Pattern pImage; + Matcher mImage; + String regExImg = "]*?>"; + pImage = Pattern.compile(regExImg, Pattern.CASE_INSENSITIVE); + mImage = pImage.matcher(htmlStr); + while (mImage.find()) { // 得到数据 - img = m_image.group(); + img = mImage.group(); // 匹配中的src数据 String regEx = "src\\s*=\\s*\"?(.*?)(\"|>|\\s+)"; Matcher m = Pattern.compile(regEx).matcher(img); diff --git a/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java b/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java index 64455b0..95ce644 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java @@ -2,27 +2,44 @@ package cn.javaex.htool.date.constant; /** * 日期格式化常量 - * + * * @author 陈霓清 * @Date 2022年11月24日 */ +@SuppressWarnings("ALL") public class DatePattern { - /** 2022-11-24 */ - public static final String yyyyMMdd = "yyyy-MM-dd"; - /** 2022-11-24 23 */ - public static final String yyyyMMddHH = "yyyy-MM-dd HH"; - /** 2022-11-24 23:59 */ - public static final String yyyyMMddHHmm = "yyyy-MM-dd HH:mm"; - /** 2022-11-24 23:59:59 */ - public static final String yyyyMMddHHmmss = "yyyy-MM-dd HH:mm:ss"; - - /** 2022年11月24日 */ - public static final String yyyy年MM月dd日 = "yyyy年MM月dd日"; - /** 2022年11月24日 23时 */ - public static final String yyyy年MM月dd日HH时 = "yyyy年MM月dd日 HH时"; - /** 2022年11月24日 23时59分 */ - public static final String yyyy年MM月dd日HH时mm分 = "yyyy年MM月dd日 HH时mm分"; - /** 2022年11月24日 23时59分59秒 */ - public static final String yyyy年MM月dd日HH时mm分ss秒 = "yyyy年MM月dd日 HH时mm分ss秒"; - + /** + * 2022-11-24 + */ + public static final String yyyyMMdd = "yyyy-MM-dd"; + /** + * 2022-11-24 23 + */ + public static final String yyyyMMddHH = "yyyy-MM-dd HH"; + /** + * 2022-11-24 23:59 + */ + public static final String yyyyMMddHHmm = "yyyy-MM-dd HH:mm"; + /** + * 2022-11-24 23:59:59 + */ + public static final String yyyyMMddHHmmss = "yyyy-MM-dd HH:mm:ss"; + + /** + * 2022年11月24日 + */ + public static final String yyyy年MM月dd日 = "yyyy年MM月dd日"; + /** + * 2022年11月24日 23时 + */ + public static final String yyyy年MM月dd日HH时 = "yyyy年MM月dd日 HH时"; + /** + * 2022年11月24日 23时59分 + */ + public static final String yyyy年MM月dd日HH时mm分 = "yyyy年MM月dd日 HH时mm分"; + /** + * 2022年11月24日 23时59分59秒 + */ + public static final String yyyy年MM月dd日HH时mm分ss秒 = "yyyy年MM月dd日 HH时mm分ss秒"; + } diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java b/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java index 2dceb22..cb8ff8b 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java @@ -1,5 +1,7 @@ package cn.javaex.htool.date.handler; +import cn.javaex.htool.date.constant.DatePattern; + import java.lang.reflect.Field; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -11,78 +13,79 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; -import cn.javaex.htool.date.constant.DatePattern; - /** * java.util.Date处理器 - * + * * @author 陈霓清 * @Date 2022年11月24日 */ public class DateHandler extends TimeHandler { - - public static final Map> parseMap = new ConcurrentHashMap<>(); - public static final Map> formatMap = new ConcurrentHashMap<>(); - - static { - Field[] fields = DatePattern.class.getDeclaredFields(); - for (Field field : fields) { - try { - String pattern = (String) field.get(DatePattern.class); - - parseMap.put(pattern, (text) -> { - try { - return new SimpleDateFormat(pattern).parse(text); - } catch (ParseException e) { - - } - return null; - }); - - formatMap.put(pattern, (date) -> { - return new SimpleDateFormat(pattern).format(date); - }); - } catch (IllegalArgumentException | IllegalAccessException e) { - e.printStackTrace(); - } - } - } - - /** - * String 转 java.util.Date - * @param text - * @param pattern - * @return - * @throws ParseException - */ - public Date parse(String text, String pattern) throws ParseException { - Function func = parseMap.get(pattern); - if (func!=null) { - return func.apply(text); - } - - return new SimpleDateFormat(pattern).parse(text); - } - - /** - * java.util.Date 转 java.time.LocalDateTime - * @param date - * @return - */ - public LocalDateTime parseLocalDateTime(Date date) { - Instant instant = date.toInstant(); - return LocalDateTime.ofInstant(instant, zone); - } - - /** - * java.util.Date 转 java.time.LocalDate - * @param date - * @return - */ - public LocalDate parseLocalDate(Date date) { - Instant instant = date.toInstant(); - LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); - return localDateTime.toLocalDate(); - } - + + public static final Map> Parse_Map = new ConcurrentHashMap<>(); + public static final Map> Format_Map = new ConcurrentHashMap<>(); + + static { + Field[] fields = DatePattern.class.getDeclaredFields(); + for (Field field : fields) { + try { + String pattern = (String) field.get(DatePattern.class); + + Parse_Map.put(pattern, (text) -> { + try { + return new SimpleDateFormat(pattern).parse(text); + } catch (ParseException e) { + + } + return null; + }); + + Format_Map.put(pattern, (date) -> { + return new SimpleDateFormat(pattern).format(date); + }); + } catch (IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + /** + * String 转 java.util.Date + * + * @param text + * @param pattern + * @return + * @throws ParseException + */ + public Date parse(String text, String pattern) throws ParseException { + Function func = Parse_Map.get(pattern); + if (func != null) { + return func.apply(text); + } + + return new SimpleDateFormat(pattern).parse(text); + } + + /** + * java.util.Date 转 java.time.LocalDateTime + * + * @param date + * @return + */ + public LocalDateTime parseLocalDateTime(Date date) { + Instant instant = date.toInstant(); + return LocalDateTime.ofInstant(instant, zone); + } + + /** + * java.util.Date 转 java.time.LocalDate + * + * @param date + * @return + */ + public LocalDate parseLocalDate(Date date) { + Instant instant = date.toInstant(); + LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); + return localDateTime.toLocalDate(); + } + } diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java b/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java index 0ac1b64..0cb96e9 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java @@ -1,175 +1,176 @@ package cn.javaex.htool.date.handler; +import cn.javaex.htool.date.DateUtils; +import cn.javaex.htool.date.constant.DatePattern; + import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.Duration; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.Period; -import java.time.ZoneId; +import java.time.*; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.function.Function; -import cn.javaex.htool.date.DateUtils; -import cn.javaex.htool.date.constant.DatePattern; - /** * 时间处理器 - * + * + * @param * @author 陈霓清 - * @param * @Date 2022年11月24日 */ public class TimeHandler { - - public static final ZoneId zone = ZoneId.systemDefault(); - - /** - * 时间类型 转 String - * @param - * @param - * @param date - * @param pattern - * @return - * @throws ParseException - */ - public String format(T date, String pattern) throws ParseException { - if (date instanceof Date) { - Function func = DateHandler.formatMap.get(pattern); - if (func!=null) { - return func.apply((Date) date); - } - - return new SimpleDateFormat(pattern).format(date); - } - else if (date instanceof LocalDateTime) { - Function func = LocalDateTimeHandler.formatMap.get(pattern); - if (func!=null) { - return func.apply((LocalDateTime) date); - } - - return ((DateFormat) date).format(DateTimeFormatter.ofPattern(pattern)); - } - else if (date instanceof LocalDate) { - Function func = LocalDateHandler.formatMap.get(pattern); - if (func!=null) { - return func.apply((LocalDate) date); - } - - return ((DateFormat) date).format(DateTimeFormatter.ofPattern(pattern)); - } - - return null; - } - - /** - * 计算2个时间间隔多少年 - * @param - * @param time1 - * @param time2 - * @return - * @throws ParseException - */ - public long yearDifference(T time1, T time2) throws ParseException { - String timestr1 = this.format(time1, DatePattern.yyyyMMdd); - String timestr2 = this.format(time2, DatePattern.yyyyMMdd); - - LocalDate localDate1 = DateUtils.parseLocalDate(timestr1, DatePattern.yyyyMMdd); - LocalDate localDate2 = DateUtils.parseLocalDate(timestr2, DatePattern.yyyyMMdd); - - return Period.between(localDate1, localDate2).getYears(); - } - - /** - * 计算2个时间间隔多少月 - * @param - * @param time1 - * @param time2 - * @return - * @throws ParseException - */ - public long monthDifference(T time1, T time2) throws ParseException { - String timestr1 = this.format(time1, DatePattern.yyyyMMdd); - String timestr2 = this.format(time2, DatePattern.yyyyMMdd); - - LocalDate localDate1 = DateUtils.parseLocalDate(timestr1, DatePattern.yyyyMMdd); - LocalDate localDate2 = DateUtils.parseLocalDate(timestr2, DatePattern.yyyyMMdd); - - return Period.between(localDate1, localDate2).getYears()*12 + Period.between(localDate1, localDate2).getMonths(); - } - - /** - * 计算2个时间间隔多少天 - * @param - * @param time1 - * @param time2 - * @return - * @throws ParseException - */ - public long dayDifference(T time1, T time2) throws ParseException { - String timestr1 = this.format(time1, DatePattern.yyyyMMddHHmmss); - String timestr2 = this.format(time2, DatePattern.yyyyMMddHHmmss); - - LocalDateTime localDateTime1 = DateUtils.parseLocalDateTime(timestr1, DatePattern.yyyyMMddHHmmss); - LocalDateTime localDateTime2 = DateUtils.parseLocalDateTime(timestr2, DatePattern.yyyyMMddHHmmss); - - return Duration.between(localDateTime1, localDateTime2).toDays(); - } - - /** - * 计算2个时间间隔多少时 - * @param - * @param time1 - * @param time2 - * @return - * @throws ParseException - */ - public long hourDifference(T time1, T time2) throws ParseException { - String timestr1 = this.format(time1, DatePattern.yyyyMMddHHmmss); - String timestr2 = this.format(time2, DatePattern.yyyyMMddHHmmss); - - LocalDateTime localDateTime1 = DateUtils.parseLocalDateTime(timestr1, DatePattern.yyyyMMddHHmmss); - LocalDateTime localDateTime2 = DateUtils.parseLocalDateTime(timestr2, DatePattern.yyyyMMddHHmmss); - - return Duration.between(localDateTime1, localDateTime2).toHours(); - } - - /** - * 计算2个时间间隔多少分 - * @param - * @param time1 - * @param time2 - * @return - * @throws ParseException - */ - public long minuteDifference(T time1, T time2) throws ParseException { - String timestr1 = this.format(time1, DatePattern.yyyyMMddHHmmss); - String timestr2 = this.format(time2, DatePattern.yyyyMMddHHmmss); - - LocalDateTime localDateTime1 = DateUtils.parseLocalDateTime(timestr1, DatePattern.yyyyMMddHHmmss); - LocalDateTime localDateTime2 = DateUtils.parseLocalDateTime(timestr2, DatePattern.yyyyMMddHHmmss); - - return Duration.between(localDateTime1, localDateTime2).toMinutes(); - } - - /** - * 计算2个时间间隔多少秒 - * @param - * @param time1 - * @param time2 - * @return - * @throws ParseException - */ - public long secondDifference(T time1, T time2) throws ParseException { - String timestr1 = this.format(time1, DatePattern.yyyyMMddHHmmss); - String timestr2 = this.format(time2, DatePattern.yyyyMMddHHmmss); - - LocalDateTime localDateTime1 = DateUtils.parseLocalDateTime(timestr1, DatePattern.yyyyMMddHHmmss); - LocalDateTime localDateTime2 = DateUtils.parseLocalDateTime(timestr2, DatePattern.yyyyMMddHHmmss); - - return Duration.between(localDateTime1, localDateTime2).getSeconds(); - } + + public static final ZoneId zone = ZoneId.systemDefault(); + + /** + * 时间类型 转 String + * + * @param + * @param + * @param date + * @param pattern + * @return + * @throws ParseException + */ + public String format(T date, String pattern) throws ParseException { + if (date instanceof Date) { + Function func = DateHandler.Format_Map.get(pattern); + if (func != null) { + return func.apply((Date) date); + } + + return new SimpleDateFormat(pattern).format(date); + } else if (date instanceof LocalDateTime) { + Function func = LocalDateTimeHandler.formatMap.get(pattern); + if (func != null) { + return func.apply((LocalDateTime) date); + } + + return ((DateFormat) date).format(DateTimeFormatter.ofPattern(pattern)); + } else if (date instanceof LocalDate) { + Function func = LocalDateHandler.formatMap.get(pattern); + if (func != null) { + return func.apply((LocalDate) date); + } + + return ((DateFormat) date).format(DateTimeFormatter.ofPattern(pattern)); + } + + return null; + } + + /** + * 计算2个时间间隔多少年 + * + * @param + * @param time1 + * @param time2 + * @return + * @throws ParseException + */ + public long yearDifference(T time1, T time2) throws ParseException { + String timestr1 = this.format(time1, DatePattern.yyyyMMdd); + String timestr2 = this.format(time2, DatePattern.yyyyMMdd); + + LocalDate localDate1 = DateUtils.parseLocalDate(timestr1, DatePattern.yyyyMMdd); + LocalDate localDate2 = DateUtils.parseLocalDate(timestr2, DatePattern.yyyyMMdd); + + return Period.between(localDate1, localDate2).getYears(); + } + + /** + * 计算2个时间间隔多少月 + * + * @param + * @param time1 + * @param time2 + * @return + * @throws ParseException + */ + public long monthDifference(T time1, T time2) throws ParseException { + String timestr1 = this.format(time1, DatePattern.yyyyMMdd); + String timestr2 = this.format(time2, DatePattern.yyyyMMdd); + + LocalDate localDate1 = DateUtils.parseLocalDate(timestr1, DatePattern.yyyyMMdd); + LocalDate localDate2 = DateUtils.parseLocalDate(timestr2, DatePattern.yyyyMMdd); + + return Period.between(localDate1, localDate2).getYears() * 12 + Period.between(localDate1, localDate2).getMonths(); + } + + /** + * 计算2个时间间隔多少天 + * + * @param + * @param time1 + * @param time2 + * @return + * @throws ParseException + */ + public long dayDifference(T time1, T time2) throws ParseException { + String timestr1 = this.format(time1, DatePattern.yyyyMMddHHmmss); + String timestr2 = this.format(time2, DatePattern.yyyyMMddHHmmss); + + LocalDateTime localDateTime1 = DateUtils.parseLocalDateTime(timestr1, DatePattern.yyyyMMddHHmmss); + LocalDateTime localDateTime2 = DateUtils.parseLocalDateTime(timestr2, DatePattern.yyyyMMddHHmmss); + + return Duration.between(localDateTime1, localDateTime2).toDays(); + } + + /** + * 计算2个时间间隔多少时 + * + * @param + * @param time1 + * @param time2 + * @return + * @throws ParseException + */ + public long hourDifference(T time1, T time2) throws ParseException { + String timestr1 = this.format(time1, DatePattern.yyyyMMddHHmmss); + String timestr2 = this.format(time2, DatePattern.yyyyMMddHHmmss); + + LocalDateTime localDateTime1 = DateUtils.parseLocalDateTime(timestr1, DatePattern.yyyyMMddHHmmss); + LocalDateTime localDateTime2 = DateUtils.parseLocalDateTime(timestr2, DatePattern.yyyyMMddHHmmss); + + return Duration.between(localDateTime1, localDateTime2).toHours(); + } + + /** + * 计算2个时间间隔多少分 + * + * @param + * @param time1 + * @param time2 + * @return + * @throws ParseException + */ + public long minuteDifference(T time1, T time2) throws ParseException { + String timestr1 = this.format(time1, DatePattern.yyyyMMddHHmmss); + String timestr2 = this.format(time2, DatePattern.yyyyMMddHHmmss); + + LocalDateTime localDateTime1 = DateUtils.parseLocalDateTime(timestr1, DatePattern.yyyyMMddHHmmss); + LocalDateTime localDateTime2 = DateUtils.parseLocalDateTime(timestr2, DatePattern.yyyyMMddHHmmss); + + return Duration.between(localDateTime1, localDateTime2).toMinutes(); + } + + /** + * 计算2个时间间隔多少秒 + * + * @param + * @param time1 + * @param time2 + * @return + * @throws ParseException + */ + public long secondDifference(T time1, T time2) throws ParseException { + String timestr1 = this.format(time1, DatePattern.yyyyMMddHHmmss); + String timestr2 = this.format(time2, DatePattern.yyyyMMddHHmmss); + + LocalDateTime localDateTime1 = DateUtils.parseLocalDateTime(timestr1, DatePattern.yyyyMMddHHmmss); + LocalDateTime localDateTime2 = DateUtils.parseLocalDateTime(timestr2, DatePattern.yyyyMMddHHmmss); + + return Duration.between(localDateTime1, localDateTime2).getSeconds(); + } } -- Gitee From eb459eb3a7705d9796cbcbe06a6dedf8bf39968c Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Sun, 27 Nov 2022 20:01:57 +0800 Subject: [PATCH 10/44] =?UTF-8?q?=E5=9B=BE=E7=89=87=20=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=20core=20=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htool-all/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/htool-all/pom.xml b/htool-all/pom.xml index 15cd65d..1f73eb7 100644 --- a/htool-all/pom.xml +++ b/htool-all/pom.xml @@ -35,6 +35,11 @@ htool-servlet ${project.parent.version} + + cn.javaex + htool-picture + ${project.parent.version} + -- Gitee From 1e47bcfc8565c6b5613f0d4df7caf8d43c3945bd Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Mon, 28 Nov 2022 01:03:58 +0800 Subject: [PATCH 11/44] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/javaex/htool/core/IdUtils.java | 55 +++++++++---------- .../java/cn/javaex/htool/date/DateUtils.java | 18 +++--- .../cn/javaex/htool/date/TimeConversion.java | 9 ++- .../{TimeAccuracy.java => TimeUnit.java} | 12 ++-- .../htool/date/handler/DateHandler.java | 14 ++--- .../htool/date/handler/LocalDateHandler.java | 12 ++-- .../date/handler/LocalDateTimeHandler.java | 12 ++-- .../htool/date/handler/TimeHandler.java | 8 +-- .../cn/javaex/htool/picture/PictureUtils.java | 2 +- .../cn/javaex/htool/servlet/AgentUtils.java | 30 ++++++---- 10 files changed, 92 insertions(+), 80 deletions(-) rename htool-date/src/main/java/cn/javaex/htool/date/enums/{TimeAccuracy.java => TimeUnit.java} (62%) diff --git a/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java index fa8721c..0e110ee 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java @@ -12,23 +12,23 @@ import java.util.UUID; * @Date 2022年11月25日 */ public class IdUtils { - private static final long twepoch = 1543376515623L; - private static final long workerIdBits = 10L; - private static final long dataCenterIdBits = 0L; - private static final long sequenceBits = 12L; - private static final long workerIdShift = sequenceBits; - private static final long dataCenterIdShift = sequenceBits + workerIdBits; - private static final long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits; - private static final long sequenceMask = -1L ^ (-1L << sequenceBits); - private static long workerId; - private static long dataCenterId; - private static long sequence = 0L; - private static long lastTimestamp = -1L; + private static final long TWEPOCH = 1543376515623L; + private static final long WORKER_ID_BITS = 10L; + private static final long DATA_CENTER_ID_BITS = 0L; + private static final long SEQUENCE_BITS = 12L; + private static final long WORKER_ID_SHIFT = SEQUENCE_BITS; + private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS; + private static final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS; + private static final long SEQUENCE_MASK = -1L ^ (-1L << SEQUENCE_BITS); + private static long WORKER_ID; + private static long DATA_CENTER_ID; + private static long SEQUENCE = 0L; + private static long LAST_TIMESTAMP = -1L; static { long localIp = Long.parseLong(getSiteLocalIp().replace(".", "")); - workerId = localIp % (-1L ^ (-1L << workerIdBits)); - dataCenterId = 0L; + WORKER_ID = localIp % (-1L ^ (-1L << WORKER_ID_BITS)); + DATA_CENTER_ID = 0L; } /** @@ -36,8 +36,7 @@ public class IdUtils { * * @return */ - @SuppressWarnings("AlibabaLowerCamelCaseVariableNaming") - public static String getUUID() { + public static String getUuid() { return UUID.randomUUID().toString().replace("-", ""); } @@ -58,25 +57,25 @@ public class IdUtils { public static synchronized long getLongId() { long timestamp = System.currentTimeMillis(); - if (timestamp < lastTimestamp) { - throw new RuntimeException(String.format("Clock moved backwards", lastTimestamp - timestamp)); + if (timestamp < LAST_TIMESTAMP) { + throw new RuntimeException(String.format("Clock moved backwards", LAST_TIMESTAMP - timestamp)); } - if (lastTimestamp == timestamp) { - sequence = (sequence + 1) & sequenceMask; - if (sequence == 0) { - timestamp = tilNextMillis(lastTimestamp); + if (LAST_TIMESTAMP == timestamp) { + SEQUENCE = (SEQUENCE + 1) & SEQUENCE_MASK; + if (SEQUENCE == 0) { + timestamp = tilNextMillis(LAST_TIMESTAMP); } } else { - sequence = 0L; + SEQUENCE = 0L; } - lastTimestamp = timestamp; + LAST_TIMESTAMP = timestamp; - return ((timestamp - twepoch) << timestampLeftShift) - | (dataCenterId << dataCenterIdShift) - | (workerId << workerIdShift) - | sequence; + return ((timestamp - TWEPOCH) << TIMESTAMP_LEFT_SHIFT) + | (DATA_CENTER_ID << DATA_CENTER_ID_SHIFT) + | (WORKER_ID << WORKER_ID_SHIFT) + | SEQUENCE; } private static String getSiteLocalIp() { diff --git a/htool-date/src/main/java/cn/javaex/htool/date/DateUtils.java b/htool-date/src/main/java/cn/javaex/htool/date/DateUtils.java index 4544577..6a05020 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/DateUtils.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/DateUtils.java @@ -9,7 +9,7 @@ import java.time.temporal.TemporalAdjusters; import java.util.Date; import cn.javaex.htool.date.constant.DatePattern; -import cn.javaex.htool.date.enums.TimeAccuracy; +import cn.javaex.htool.date.enums.TimeUnit; import cn.javaex.htool.date.handler.TimeHandler; /** @@ -289,12 +289,12 @@ public class DateUtils extends TimeConversion { */ public static long timeDifference(T time1, T time2, String accuracy) throws ParseException { if (time1==null || time2==null || accuracy==null) { - throw new RuntimeException("Parameter cannot be empty"); + throw new RuntimeException("Parameter cannot be null"); } - TimeAccuracy timeAccuracy = TimeAccuracy.find(accuracy.toLowerCase()); + TimeUnit timeUnit = TimeUnit.find(accuracy.toLowerCase()); - switch (timeAccuracy) { + switch (timeUnit) { case YEAR: return new TimeHandler().yearDifference(time1, time2); case MONTH: @@ -494,7 +494,7 @@ public class DateUtils extends TimeConversion { LocalDate time1 = DateUtils.parseLocalDate(time, pattern); LocalDate time2 = LocalDate.now(); - return DateUtils.timeDifference(time1, time2, TimeAccuracy.YEAR.getValue()); + return DateUtils.timeDifference(time1, time2, TimeUnit.YEAR.getValue()); } /** @@ -510,7 +510,7 @@ public class DateUtils extends TimeConversion { LocalDate time1 = parseLocalDate(timestr1, DatePattern.yyyyMMdd); LocalDate time2 = LocalDate.now(); - return DateUtils.timeDifference(time1, time2, TimeAccuracy.YEAR.getValue()); + return DateUtils.timeDifference(time1, time2, TimeUnit.YEAR.getValue()); } /** @@ -519,11 +519,11 @@ public class DateUtils extends TimeConversion { * @return */ public static String getZodiac(int year) { - if (year < 1900) { + if (year < MIN_YEAR) { return "未知"; } - return zodiacs[(year - 1900) % zodiacs.length]; + return ZODIACS[(year - 1900) % ZODIACS.length]; } /** @@ -533,6 +533,6 @@ public class DateUtils extends TimeConversion { * @return */ public static String getConstellation(int month, int day) { - return day < constellation_days[month - 1] ? constellations[month - 1] : constellations[month]; + return day < CONSTELLATION_DAYS[month - 1] ? CONSTELLATIONS[month - 1] : CONSTELLATIONS[month]; } } diff --git a/htool-date/src/main/java/cn/javaex/htool/date/TimeConversion.java b/htool-date/src/main/java/cn/javaex/htool/date/TimeConversion.java index 9d358b4..e901b90 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/TimeConversion.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/TimeConversion.java @@ -18,11 +18,14 @@ import cn.javaex.htool.date.handler.TimeHandler; */ public class TimeConversion { - public static final String[] zodiacs = new String[] {"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"}; + /** 最小可识别的年份 */ + protected static final int MIN_YEAR = 1990; + /** 生肖 */ + protected static final String[] ZODIACS = new String[] {"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"}; /** 星座分隔时间日 */ - public static final int[] constellation_days = new int[] {20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22}; + protected static final int[] CONSTELLATION_DAYS = new int[] {20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22}; /** 星座 */ - public static final String[] constellations = new String[] {"摩羯座", "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座"}; + protected static final String[] CONSTELLATIONS = new String[] {"摩羯座", "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座"}; /** * String 转 java.util.Date diff --git a/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeAccuracy.java b/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java similarity index 62% rename from htool-date/src/main/java/cn/javaex/htool/date/enums/TimeAccuracy.java rename to htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java index e63a7d0..d44387e 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeAccuracy.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java @@ -3,12 +3,12 @@ package cn.javaex.htool.date.enums; import java.util.Arrays; /** - * 时间精度 + * 时间单位 * * @author 陈霓清 * @Date 2022年11月25日 */ -public enum TimeAccuracy { +public enum TimeUnit { /** 年 */ YEAR("year"), /** 月 */ @@ -22,7 +22,7 @@ public enum TimeAccuracy { /** 秒 */ SECOND("second"); - TimeAccuracy(String value) { + TimeUnit(String value) { this.value = value; } @@ -32,13 +32,13 @@ public enum TimeAccuracy { return value; } - public static TimeAccuracy find(String value) { - return Arrays.stream(TimeAccuracy.values()).filter(timeAccuracy -> timeAccuracy.value == value).findAny() + public static TimeUnit find(String value) { + return Arrays.stream(TimeUnit.values()).filter(timeUnit -> timeUnit.value == value).findAny() .orElseThrow(() -> new RuntimeException("Time precision must be one of year, month, day, hour, minute and second")); } public static boolean has(String value) { - return Arrays.stream(TimeAccuracy.values()).anyMatch(timeAccuracy -> timeAccuracy.value.equals(value)); + return Arrays.stream(TimeUnit.values()).anyMatch(timeUnit -> timeUnit.value.equals(value)); } diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java b/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java index cb8ff8b..9fa19c9 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java @@ -21,8 +21,8 @@ import java.util.function.Function; */ public class DateHandler extends TimeHandler { - public static final Map> Parse_Map = new ConcurrentHashMap<>(); - public static final Map> Format_Map = new ConcurrentHashMap<>(); + public static final Map> PARSE_MAP = new ConcurrentHashMap<>(); + public static final Map> FORMAT_MAP = new ConcurrentHashMap<>(); static { Field[] fields = DatePattern.class.getDeclaredFields(); @@ -30,7 +30,7 @@ public class DateHandler extends TimeHandler { try { String pattern = (String) field.get(DatePattern.class); - Parse_Map.put(pattern, (text) -> { + PARSE_MAP.put(pattern, (text) -> { try { return new SimpleDateFormat(pattern).parse(text); } catch (ParseException e) { @@ -39,7 +39,7 @@ public class DateHandler extends TimeHandler { return null; }); - Format_Map.put(pattern, (date) -> { + FORMAT_MAP.put(pattern, (date) -> { return new SimpleDateFormat(pattern).format(date); }); } catch (IllegalArgumentException | IllegalAccessException e) { @@ -57,7 +57,7 @@ public class DateHandler extends TimeHandler { * @throws ParseException */ public Date parse(String text, String pattern) throws ParseException { - Function func = Parse_Map.get(pattern); + Function func = PARSE_MAP.get(pattern); if (func != null) { return func.apply(text); } @@ -73,7 +73,7 @@ public class DateHandler extends TimeHandler { */ public LocalDateTime parseLocalDateTime(Date date) { Instant instant = date.toInstant(); - return LocalDateTime.ofInstant(instant, zone); + return LocalDateTime.ofInstant(instant, ZONE); } /** @@ -84,7 +84,7 @@ public class DateHandler extends TimeHandler { */ public LocalDate parseLocalDate(Date date) { Instant instant = date.toInstant(); - LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); + LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZONE); return localDateTime.toLocalDate(); } diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java b/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java index 6b27bb7..9ba9b7b 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java @@ -21,8 +21,8 @@ import cn.javaex.htool.date.constant.DatePattern; */ public class LocalDateHandler extends TimeHandler { - public static final Map> parseMap = new ConcurrentHashMap<>(); - public static final Map> formatMap = new ConcurrentHashMap<>(); + public static final Map> PARSE_MAP = new ConcurrentHashMap<>(); + public static final Map> FORMAT_MAP = new ConcurrentHashMap<>(); static { Field[] fields = DatePattern.class.getDeclaredFields(); @@ -30,11 +30,11 @@ public class LocalDateHandler extends TimeHandler { try { String pattern = (String) field.get(DatePattern.class); - parseMap.put(pattern, (text) -> { + PARSE_MAP.put(pattern, (text) -> { return LocalDate.parse(text, DateTimeFormatter.ofPattern(pattern)); }); - formatMap.put(pattern, (localDate) -> { + FORMAT_MAP.put(pattern, (localDate) -> { return localDate.format(DateTimeFormatter.ofPattern(pattern)); }); } catch (IllegalArgumentException | IllegalAccessException e) { @@ -50,7 +50,7 @@ public class LocalDateHandler extends TimeHandler { * @return */ public LocalDate parse(String text, String pattern) { - Function func = parseMap.get(pattern); + Function func = PARSE_MAP.get(pattern); if (func!=null) { return func.apply(text); } @@ -64,7 +64,7 @@ public class LocalDateHandler extends TimeHandler { * @return */ public Date parseDate(LocalDate localDate) { - Instant instant = localDate.atStartOfDay().atZone(zone).toInstant(); + Instant instant = localDate.atStartOfDay().atZone(ZONE).toInstant(); return Date.from(instant); } diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java b/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java index ad20c3e..e820fea 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java @@ -20,8 +20,8 @@ import cn.javaex.htool.date.constant.DatePattern; */ public class LocalDateTimeHandler extends TimeHandler { - public static final Map> parseMap = new ConcurrentHashMap<>(); - public static final Map> formatMap = new ConcurrentHashMap<>(); + public static final Map> PARSE_MAP = new ConcurrentHashMap<>(); + public static final Map> FORMAT_MAP = new ConcurrentHashMap<>(); static { Field[] fields = DatePattern.class.getDeclaredFields(); @@ -29,11 +29,11 @@ public class LocalDateTimeHandler extends TimeHandler { try { String pattern = (String) field.get(DatePattern.class); - parseMap.put(pattern, (text) -> { + PARSE_MAP.put(pattern, (text) -> { return LocalDateTime.parse(text, DateTimeFormatter.ofPattern(pattern)); }); - formatMap.put(pattern, (localDateTime) -> { + FORMAT_MAP.put(pattern, (localDateTime) -> { return localDateTime.format(DateTimeFormatter.ofPattern(pattern)); }); } catch (IllegalArgumentException | IllegalAccessException e) { @@ -49,7 +49,7 @@ public class LocalDateTimeHandler extends TimeHandler { * @return */ public LocalDateTime parse(String text, String pattern) { - Function func = parseMap.get(pattern); + Function func = PARSE_MAP.get(pattern); if (func!=null) { return func.apply(text); } @@ -63,7 +63,7 @@ public class LocalDateTimeHandler extends TimeHandler { * @return */ public Date parseDate(LocalDateTime localDateTime) { - Instant instant = localDateTime.atZone(zone).toInstant(); + Instant instant = localDateTime.atZone(ZONE).toInstant(); return Date.from(instant); } diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java b/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java index 0cb96e9..94988a3 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java @@ -20,7 +20,7 @@ import java.util.function.Function; */ public class TimeHandler { - public static final ZoneId zone = ZoneId.systemDefault(); + protected static final ZoneId ZONE = ZoneId.systemDefault(); /** * 时间类型 转 String @@ -34,21 +34,21 @@ public class TimeHandler { */ public String format(T date, String pattern) throws ParseException { if (date instanceof Date) { - Function func = DateHandler.Format_Map.get(pattern); + Function func = DateHandler.FORMAT_MAP.get(pattern); if (func != null) { return func.apply((Date) date); } return new SimpleDateFormat(pattern).format(date); } else if (date instanceof LocalDateTime) { - Function func = LocalDateTimeHandler.formatMap.get(pattern); + Function func = LocalDateTimeHandler.FORMAT_MAP.get(pattern); if (func != null) { return func.apply((LocalDateTime) date); } return ((DateFormat) date).format(DateTimeFormatter.ofPattern(pattern)); } else if (date instanceof LocalDate) { - Function func = LocalDateHandler.formatMap.get(pattern); + Function func = LocalDateHandler.FORMAT_MAP.get(pattern); if (func != null) { return func.apply((LocalDate) date); } diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index d10a77e..8e9f887 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -82,7 +82,7 @@ public class PictureUtils { ImageWriteParam imageWriteParam = writer.getDefaultWriteParam(); ColorModel colorModel = srcBuffer.getColorModel(); try { - String uuid = IdUtils.getUUID(); + String uuid = IdUtils.getUuid(); File tempFile = File.createTempFile("quality_" + uuid, ".jpg"); FileOutputStream fileOutputStream = new FileOutputStream(tempFile); ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(fileOutputStream); diff --git a/htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java b/htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java index 6ccc934..e36b5ac 100644 --- a/htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java +++ b/htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java @@ -15,7 +15,17 @@ import javax.servlet.http.HttpServletRequest; * @Date 2022年11月26日 */ public class AgentUtils { - + /** 未知的 */ + private static final String UNKNOWN = "unknown"; + + /** 移动设备 */ + private static final String ANDROID = "Android"; + private static final String IPHONE = "iPhone"; + private static final String IPAD = "iPad"; + + /** 浏览器 */ + private static final String MICROSOFT_EDGE = "Edg/"; + /** * 获取访问者的ip地址 * @@ -25,7 +35,7 @@ public class AgentUtils { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); if (request == null) { - return "unknown"; + return UNKNOWN; } String ip = null; @@ -33,19 +43,19 @@ public class AgentUtils { // X-Forwarded-For:Squid 服务代理 String ipAddresses = request.getHeader("X-Forwarded-For"); - if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { + if (ipAddresses == null || ipAddresses.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddresses)) { // Proxy-Client-IP:apache 服务代理 ipAddresses = request.getHeader("Proxy-Client-IP"); } - if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { + if (ipAddresses == null || ipAddresses.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddresses)) { // WL-Proxy-Client-IP:weblogic 服务代理 ipAddresses = request.getHeader("WL-Proxy-Client-IP"); } - if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { + if (ipAddresses == null || ipAddresses.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddresses)) { // HTTP_CLIENT_IP:有些代理服务器 ipAddresses = request.getHeader("HTTP_CLIENT_IP"); } - if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { + if (ipAddresses == null || ipAddresses.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddresses)) { // X-Real-IP:nginx服务代理 ipAddresses = request.getHeader("X-Real-IP"); } @@ -56,7 +66,7 @@ public class AgentUtils { } // 还是不能获取到,最后再通过request.getRemoteAddr();获取 - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { + if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddresses)) { ip = request.getRemoteAddr(); } @@ -72,7 +82,7 @@ public class AgentUtils { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String userAgent = request.getHeader("user-agent"); - if (userAgent.indexOf("Android") != -1 || userAgent.indexOf("iPhone") != -1 || userAgent.indexOf("iPad") != -1) { + if (userAgent.indexOf(ANDROID) != -1 || userAgent.indexOf(IPHONE) != -1 || userAgent.indexOf(IPAD) != -1) { return true; } @@ -88,8 +98,8 @@ public class AgentUtils { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); String userAgent = request.getHeader("user-agent"); - if (userAgent.contains("Edg/")) { - return userAgent.substring(userAgent.indexOf("Edg/"), userAgent.length()).replace("Edg/", "Edge "); + if (userAgent.contains(MICROSOFT_EDGE)) { + return userAgent.substring(userAgent.indexOf(MICROSOFT_EDGE), userAgent.length()).replace("Edg/", "Edge "); } Browser browser = UserAgent.parseUserAgentString(userAgent).getBrowser(); -- Gitee From db2572b1038943dc4c2d5f3e6aaf298463281b65 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Mon, 28 Nov 2022 01:12:00 +0800 Subject: [PATCH 12/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E7=9A=84=E6=96=87=E5=AD=97=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/javaex/htool/cache/task/CacheClearTask.java | 2 +- .../src/main/java/cn/javaex/htool/date/enums/TimeUnit.java | 3 +-- .../main/java/cn/javaex/htool/date/handler/TimeHandler.java | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/htool-cache/src/main/java/cn/javaex/htool/cache/task/CacheClearTask.java b/htool-cache/src/main/java/cn/javaex/htool/cache/task/CacheClearTask.java index 9f85fe5..2780652 100644 --- a/htool-cache/src/main/java/cn/javaex/htool/cache/task/CacheClearTask.java +++ b/htool-cache/src/main/java/cn/javaex/htool/cache/task/CacheClearTask.java @@ -20,7 +20,7 @@ public class CacheClearTask { } /** - * 删除过期缓存(5分钟一次循环检测一次) + * 删除过期缓存(每隔5分钟循环检测一次) */ public void clearSchedule() { new Timer().schedule(new TimerTask() { diff --git a/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java b/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java index d44387e..2b80c89 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java @@ -34,12 +34,11 @@ public enum TimeUnit { public static TimeUnit find(String value) { return Arrays.stream(TimeUnit.values()).filter(timeUnit -> timeUnit.value == value).findAny() - .orElseThrow(() -> new RuntimeException("Time precision must be one of year, month, day, hour, minute and second")); + .orElseThrow(() -> new RuntimeException("TimeUnit must be one of year, month, day, hour, minute and second")); } public static boolean has(String value) { return Arrays.stream(TimeUnit.values()).anyMatch(timeUnit -> timeUnit.value.equals(value)); } - } \ No newline at end of file diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java b/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java index 94988a3..b083478 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java @@ -117,7 +117,7 @@ public class TimeHandler { } /** - * 计算2个时间间隔多少时 + * 计算2个时间间隔多少小时 * * @param * @param time1 -- Gitee From 405aeb010f54800235dcf4ef00509d99f94ca77e Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Mon, 28 Nov 2022 09:23:22 +0800 Subject: [PATCH 13/44] =?UTF-8?q?=E5=9B=BE=E7=89=87=20=E6=B0=B4=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/picture/PictureUtils.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index 8e9f887..2dfc8b3 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -6,6 +6,9 @@ import cn.javaex.htool.picture.util.BufferedImageBuilder; import javax.imageio.*; import javax.imageio.stream.ImageOutputStream; import java.awt.*; +import java.awt.font.FontRenderContext; +import java.awt.font.TextLayout; +import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.io.File; @@ -25,6 +28,29 @@ public class PictureUtils { private static final int MIN_PIC_HEIGHT = 10; /** + * 旋转角度 + */ + private static final int PIC_ANGEL = 315; + /** + * 每个水印水平间隔 + */ + private static final int X_PADDING = 20; + /** + * 每个水印垂直间隔 + */ + private static final int Y_PADDING = 70; + /** + * 水印字体大小 + */ + private static final int FONT_SIZE = 50; + + /** + * 数值 2 + */ + private static final int NUM_TWO = 2; + + /** + * @author 韩建东 * 自定义修改图片 大小 * * @param srcBuffer 修改的 图片 的流 @@ -48,6 +74,7 @@ public class PictureUtils { } /** + * @author 韩建东 * 等比例 处理 图片大小尺寸 * * @param srcBuffer 需要处理的图片流 @@ -67,6 +94,7 @@ public class PictureUtils { } /** + * @author 韩建东 * 图片的压缩 算法 * * @param srcBuffer 图片流 @@ -108,6 +136,7 @@ public class PictureUtils { } /** + * @author 韩建东 * 获得图片的BufferedImage 处理 图片 变红 的bug * * @param file 图片路径 @@ -118,6 +147,59 @@ public class PictureUtils { return BufferedImageBuilder.toBufferedImage(src); } + /** + * @author 韩建东 + * @param srcBuffer 图片流 + * @param text 水印文字 + * @param color 水印颜色 + * @return BufferedImage + */ + public static BufferedImage addWaterMark(BufferedImage srcBuffer,String text,Color color){ + int width = srcBuffer.getWidth(); + int height = srcBuffer.getHeight(); + + Graphics2D g = srcBuffer.createGraphics(); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + float alpha = 1F; + AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); + g.setComposite(ac); + g.drawImage(srcBuffer, 0, 0, width, height, null); + g.setBackground(Color.BLACK); + Font oldfont = g.getFont(); + Font font = new Font( oldfont.getFamily(), Font.BOLD, FONT_SIZE); + g.setFont(font); + FontRenderContext frc = g.getFontRenderContext(); + TextLayout tl = new TextLayout(text, font, frc); + //水印串宽度 + int stringWidth = g.getFontMetrics(g.getFont()).charsWidth(text.toCharArray(), 0, text.length()); + + //旋转水印 + g.rotate(Math.toRadians(PIC_ANGEL), (double) width / NUM_TWO, (double) height / NUM_TWO); + //水印透明度 + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5F)); + // 字体色 + g.setColor(color); + + int x = -height / NUM_TWO; + int y = -width / NUM_TWO; + + //循环绘制 + while (x < width + height / NUM_TWO) { + y = -width / NUM_TWO; + while (y < height + width / NUM_TWO) { + Shape sha = tl.getOutline(AffineTransform.getTranslateInstance(x, y)); + g.fill(sha); + + y += Y_PADDING; + } + x += stringWidth + X_PADDING; + } + + //释放资源 + g.dispose(); + + return srcBuffer; + } /** * RGB转换成16进制 -- Gitee From 4d54ba04e87800ff36a3597a6fd7cf2037e7eb6e Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Mon, 28 Nov 2022 09:24:59 +0800 Subject: [PATCH 14/44] =?UTF-8?q?=E5=9B=BE=E7=89=87=20=E6=B0=B4=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/javaex/htool/picture/PictureUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index 2dfc8b3..27a78c2 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -204,10 +204,10 @@ public class PictureUtils { /** * RGB转换成16进制 * - * @param r - * @param g - * @param b - * @return + * @param r R + * @param g G + * @param b B + * @return String */ public static String rgb2Hex(int r, int g, int b) { return String.format("#%02X%02X%02X", r, g, b); -- Gitee From 61005987b1cf45dee7ef313beafa843678240990 Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Mon, 28 Nov 2022 13:48:54 +0800 Subject: [PATCH 15/44] =?UTF-8?q?1.=E5=9B=BE=E7=89=87=E8=A3=81=E5=89=AA=20?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/picture/PictureUtils.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index 27a78c2..a638f9d 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -11,6 +11,8 @@ import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; +import java.awt.image.CropImageFilter; +import java.awt.image.FilteredImageSource; import java.io.File; import java.io.FileOutputStream; @@ -194,12 +196,37 @@ public class PictureUtils { } x += stringWidth + X_PADDING; } - //释放资源 g.dispose(); - return srcBuffer; } + + /** + * @author 韩建东 + * @param srcBuffer 图 流 + * @param x 裁剪 x坐标 + * @param y 裁剪 y 坐标 + * @param width 裁剪 宽度 + * @param height 裁剪 高度 + * @return BufferedImage + */ + public static BufferedImage cut(BufferedImage srcBuffer,int x,int y,int width,int height) { + int picheight = srcBuffer.getHeight(); + int picwidth = srcBuffer.getWidth(); + if(picheight < y+height || picwidth < x+width) { + System.err.println("裁剪过高或者过宽"); + return null; + } + + CropImageFilter cropImageFilter = new CropImageFilter(x, y, width, height); + Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(srcBuffer.getSource(),cropImageFilter)); + BufferedImage destBuffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = destBuffer.createGraphics(); + //绘制切割后的图 + g2d.drawImage(img, 0, 0, width, height, null); + g2d.dispose(); + return destBuffer; + } /** * RGB转换成16进制 -- Gitee From 6785bb09814e36907ff8b65cf86fe0e1ccce5e96 Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Mon, 28 Nov 2022 13:50:57 +0800 Subject: [PATCH 16/44] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/picture/util/BufferedImageBuilder.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java b/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java index 7aa1ab7..9ab93ab 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java @@ -11,7 +11,6 @@ public class BufferedImageBuilder { public static BufferedImage toBufferedImage(Image image) { if (image instanceof BufferedImage) { - return (BufferedImage) image; } @@ -20,9 +19,7 @@ public class BufferedImageBuilder { BufferedImage bimage = null; - GraphicsEnvironment ge = GraphicsEnvironment - - .getLocalGraphicsEnvironment(); + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); try { -- Gitee From 8e7d0f2545e5a224626ba727f7e666def34efd74 Mon Sep 17 00:00:00 2001 From: hanjiandong <15261165083@163.com> Date: Mon, 28 Nov 2022 15:40:51 +0800 Subject: [PATCH 17/44] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=20base64=20=E5=88=B0?= =?UTF-8?q?=20core=20=E6=B7=BB=E5=8A=A0=20=E5=9B=BE=E7=89=87=20=E8=BD=AC?= =?UTF-8?q?=20base64=20string?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/core}/Base64Utils.java | 11 ++++++++- htool-picture/pom.xml | 1 - .../cn/javaex/htool/picture/PictureUtils.java | 24 ++++++++++++++++++- 3 files changed, 33 insertions(+), 3 deletions(-) rename {htool-crypto/src/main/java/cn/javaex/htool/crypto => htool-core/src/main/java/cn/javaex/htool/core}/Base64Utils.java (71%) diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/Base64Utils.java b/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java similarity index 71% rename from htool-crypto/src/main/java/cn/javaex/htool/crypto/Base64Utils.java rename to htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java index d1f0250..a5a45d6 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/Base64Utils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.crypto; +package cn.javaex.htool.core; import java.util.Base64; @@ -18,6 +18,15 @@ public class Base64Utils { public static String encode(String string) { return Base64.getEncoder().encodeToString(string.getBytes()); } + + /** + * + * @param bytes + * @return String + */ + public static String encode(byte[] bytes) { + return Base64.getEncoder().encodeToString(bytes); + } /** * 解密 diff --git a/htool-picture/pom.xml b/htool-picture/pom.xml index 0cbea05..3237c43 100644 --- a/htool-picture/pom.xml +++ b/htool-picture/pom.xml @@ -12,7 +12,6 @@ cn.javaex htool-core - 1.0.0 compile diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index a638f9d..00fdc66 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -1,6 +1,7 @@ package cn.javaex.htool.picture; import cn.javaex.htool.core.IdUtils; +import cn.javaex.htool.core.Base64Utils; import cn.javaex.htool.picture.util.BufferedImageBuilder; import javax.imageio.*; @@ -13,8 +14,10 @@ import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.CropImageFilter; import java.awt.image.FilteredImageSource; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; +import java.io.IOException; /** * @author 韩建东 2022年11月27日 @@ -183,7 +186,7 @@ public class PictureUtils { g.setColor(color); int x = -height / NUM_TWO; - int y = -width / NUM_TWO; + int y; //循环绘制 while (x < width + height / NUM_TWO) { @@ -228,6 +231,25 @@ public class PictureUtils { return destBuffer; } + /** + * 将图片转为 base64 string + * @author 韩建东 + * @param srcBuffer + * @return String + */ + public static String toBase64Str(BufferedImage srcBuffer){ + String base64Str = ""; + try { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + ImageIO.write(srcBuffer,"jpg",os); + byte[] bytes = os.toByteArray(); + return Base64Utils.encode(bytes); + } catch (IOException e) { + System.err.printf("转换base64错误"); + } + return base64Str; + } + /** * RGB转换成16进制 * -- Gitee From f36b39674231fd6bd35f817739c886df53462d88 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Wed, 30 Nov 2022 01:48:19 +0800 Subject: [PATCH 18/44] =?UTF-8?q?=E5=9B=BE=E7=89=87=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0dependencyManagement=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=EF=BC=8C=E9=98=B2=E6=AD=A2=E5=9C=A8eclipse=E4=B8=AD=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../htool/date/handler/LocalDateHandler.java | 2 +- .../date/handler/LocalDateTimeHandler.java | 2 +- htool-picture/pom.xml | 17 ++++++++++------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java b/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java index 9ba9b7b..869cb79 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java @@ -51,7 +51,7 @@ public class LocalDateHandler extends TimeHandler { */ public LocalDate parse(String text, String pattern) { Function func = PARSE_MAP.get(pattern); - if (func!=null) { + if (func != null) { return func.apply(text); } diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java b/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java index e820fea..7c4b161 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java @@ -50,7 +50,7 @@ public class LocalDateTimeHandler extends TimeHandler { */ public LocalDateTime parse(String text, String pattern) { Function func = PARSE_MAP.get(pattern); - if (func!=null) { + if (func != null) { return func.apply(text); } diff --git a/htool-picture/pom.xml b/htool-picture/pom.xml index 3237c43..6e5f456 100644 --- a/htool-picture/pom.xml +++ b/htool-picture/pom.xml @@ -8,11 +8,14 @@ htool-picture 图片处理 - - - cn.javaex - htool-core - compile - - + + + + + cn.javaex + htool-core + compile + + + \ No newline at end of file -- Gitee From 266da04fbfb1084ded496762934a8848aaa2e8f0 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Fri, 2 Dec 2022 00:06:37 +0800 Subject: [PATCH 19/44] 20221202 --- htool-core/pom.xml | 29 +- .../cn/javaex/htool/core/Base64Utils.java | 2 +- .../cn/javaex/htool/core/file/FileUtils.java | 416 + .../cn/javaex/htool/core/file/IOStream.java | 29 + .../cn/javaex/htool/core/file/PathUtils.java | 98 + .../cn/javaex/htool/core/string/ZHUtils.java | 49 + .../htool/core/string/zh/PinyinConverter.java | 112 + .../htool/core/string/zh/ZHConverter.java | 165 + .../htool/core/string/zh/zh2Hans.properties | 5384 ++++++++++ .../htool/core/string/zh/zh2Hant.properties | 9155 +++++++++++++++++ htool-picture/pom.xml | 16 +- htool-servlet/pom.xml | 3 - 12 files changed, 15438 insertions(+), 20 deletions(-) create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/file/IOStream.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/file/PathUtils.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/string/zh/PinyinConverter.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/string/zh/ZHConverter.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/string/zh/zh2Hans.properties create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/string/zh/zh2Hant.properties diff --git a/htool-core/pom.xml b/htool-core/pom.xml index 0e50c2a..9bbe29a 100644 --- a/htool-core/pom.xml +++ b/htool-core/pom.xml @@ -1,9 +1,24 @@ - 4.0.0 - - cn.javaex - htool - 1.0.0 - - htool-core + 4.0.0 + + cn.javaex + htool + 1.0.0 + + htool-core + + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + org.springframework + spring-webmvc + 5.3.18 + provided + + \ No newline at end of file diff --git a/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java b/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java index a5a45d6..8cf1105 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java @@ -20,7 +20,7 @@ public class Base64Utils { } /** - * + * byte[] 转 String * @param bytes * @return String */ diff --git a/htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java new file mode 100644 index 0000000..60bb98c --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java @@ -0,0 +1,416 @@ +package cn.javaex.htool.core.file; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * 文件操作工具类 + * + * @author 陈霓清 + * @Date 2022年12月1日 + */ +public class FileUtils extends IOStream { + /** 默认缓冲区大小 */ + private static final int BUFFER_SIZE = 2048; + + /** + * 下载resources文件夹下的文件(不重命名) + * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx + */ + public static void downloadFileFromResource(String filePath) { + downloadFileFromResource(filePath, null); + } + + /** + * 下载resources文件夹下的文件 + * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx + * @param newFileName 重命名文件名称(带后缀) + */ + public static void downloadFileFromResource(String filePath, String newFileName) { + if (newFileName==null || newFileName.length()==0) { + newFileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length()); + } + + InputStream in = PathUtils.getInputStreamFromResource(filePath); + downloadFile(in, newFileName); + } + + /** + * 下载文件 + * @param in InputStream流 + * @param newFileName 重命名文件名称(带后缀) + */ + public static void downloadFile(InputStream in, String newFileName) { + HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); + + OutputStream out = null; + + try { + response.setContentType("application/octet-stream"); + newFileName = java.net.URLEncoder.encode(newFileName, "UTF-8"); + response.setHeader("Content-disposition", "attachment; filename=" + newFileName); + out = response.getOutputStream(); + + int b = 0; + byte[] buffer = new byte[BUFFER_SIZE]; + while ((b = in.read(buffer)) != -1) { + out.write(buffer, 0, b); + } + + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + closeQuietly(out); + closeQuietly(in); + } + } + + /** + * 文件下载(不重命名) + * @param filePath 文件的路径(带具体的文件名) + * 如果是相对路径,则认为是项目的同级目录 + * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 + */ + public static void downloadFile(String filePath) { + downloadFile(filePath, null); + } + + /** + * 文件下载 + * @param filePath 文件的路径(带具体的文件名) + * 如果是相对路径,则认为是项目的同级目录 + * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 + * @param newFileName 重命名文件名称(带后缀) + */ + public static void downloadFile(String filePath, String newFileName) { + HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); + + // 传入的路径是否是绝对路径 + boolean isAbsolutePath = PathUtils.isAbsolutePath(filePath); + // 存储文件的物理路径 + String fileAbsolutePath = ""; + if (isAbsolutePath) { + fileAbsolutePath = filePath; + } else { + String projectPath = PathUtils.getProjectPath(); + fileAbsolutePath = projectPath + File.separator + filePath; + } + + File file = new File(fileAbsolutePath); + if (newFileName==null || newFileName.length()==0) { + newFileName = file.getName(); + } + + BufferedInputStream bis = null; + BufferedOutputStream bos = null; + + try { + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(newFileName, "UTF-8")); + response.setHeader("Content-Length", String.valueOf(file.length())); + + bis = new BufferedInputStream(new FileInputStream(file)); + bos = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[BUFFER_SIZE]; + while (true) { + int bytesRead; + + if (-1 == (bytesRead=bis.read(buff, 0, buff.length))) { + break; + } + + bos.write(buff, 0, bytesRead); + } + + bos.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + closeQuietly(bos); + closeQuietly(bis); + } + } + + /** + * 删除文件或目录(目录本身也删除) + * @param path 目录或文件的全路径 + * @return boolean + */ + public static boolean deleteFile(String path) { + File file = new File(path); + return deleteFile(file); + } + + /** + * 删除文件或目录 + * @param file File文件对象 + * @return boolean + */ + public static boolean deleteFile(File file) { + if (!file.exists()) { + return false; + } + + if (file.isDirectory()) { + File[] fileArr = file.listFiles(); + for (File f : fileArr) { + deleteFile(f); + } + } + + return file.delete(); + } + + /** + * 删除文件或目录 + * @param path 目录或文件的全路径 + * @param flag 是否删除目录本身 + * @return boolean + */ + public static boolean deleteFile(String path, boolean flag) { + File file = new File(path); + return deleteFile(file, flag); + } + + /** + * 删除文件或目录(是否删除目录本身) + * @param file File文件对象 + * @return boolean + */ + private static boolean deleteFile(File file, boolean flag) { + if (!file.exists()) { + return false; + } + + if (file.isDirectory()) { + File[] fileArr = file.listFiles(); + for (File f : fileArr) { + deleteFile(f); + } + } + + if (flag) { + return file.delete(); + } + + return true; + } + + /** + * 获取文件源中的所有文件 + * @param sourcePath + * @return + * @throws FileNotFoundException + */ + private static List getSourceAllFiles(String sourcePath) throws FileNotFoundException { + List fileList = new ArrayList(); + + File sourceFile = new File(sourcePath); + // 判断文件或目录是否存在 + if (!sourceFile.exists()) { + throw new FileNotFoundException("待压缩的文件或目录不存在:" + sourcePath); + } + + File[] fileArr = sourceFile.listFiles(); + for (File file : fileArr) { + if (file.isFile()) { + fileList.add(file); + } else { + // 递归,获取路径中子路径中的所有文件 + fileList.addAll(getSourceAllFiles(file.getPath())); + } + } + + return fileList; + } + + /** + * 得到文件在文件夹中的相对路径,保持原有结构 + * @param sourcePath + * @param file + * @return + */ + private static String getRealName(String sourcePath, File file) { + return file.getAbsolutePath().replace(sourcePath + File.separator, "").replace(sourcePath, ""); + } + + /** + * 创建一个zip压缩文件,并存放到新的路径中 + * @param sourcePath 源目录或文件的全路径,例如:D:\\Temp 或 D:\\Temp\\1.docx + * @param zipPath 压缩后的文件全路径,例如:D:\\Temp\\xx.zip + * @throws Exception + */ + public static void zip(String sourcePath, String zipPath) throws Exception { + zip(sourcePath, zipPath, true); + } + + /** + * 创建一个zip压缩文件,并存放到新的路径中 + * @param sourcePath 源目录或文件的全路径,例如:D:\\Temp 或 D:\\Temp\\1.docx + * @param zipPath 压缩后的文件全路径,例如:D:\\Temp\\xx.zip + * @param isKeepFolder 是否将目录名称也一起压缩 + * @throws Exception + */ + public static void zip(String sourcePath, String zipPath, boolean isKeepFolder) throws Exception { + byte[] buffer = new byte[1024*10]; + FileInputStream fis = null; + BufferedInputStream bis = null; + FileOutputStream fos = null; + ZipOutputStream zos = null; + + try { + File sourceFile = new File(sourcePath); + // 判断文件或目录是否存在 + if (!sourceFile.exists()) { + throw new FileNotFoundException("待压缩的文件或目录不存在:" + sourcePath); + } + + File zipFile = new File(zipPath); + if (zipFile.exists()) { + deleteFile(zipFile); // 如果压缩包已存在,则先删除 + } + + // 判断是否是一个具体的文件 + if (sourceFile.isFile()) { + fos = new FileOutputStream(zipFile); + zos = new ZipOutputStream(new BufferedOutputStream(fos)); + + // 创建zip实体,并添加进压缩包 + ZipEntry zipEntry = new ZipEntry(sourceFile.getName()); + zos.putNextEntry(zipEntry); + + fis = new FileInputStream(sourceFile); + bis = new BufferedInputStream(fis, 1024*10); + int read = 0; + while ((read=bis.read(buffer, 0, 1024*10)) != -1) { + zos.write(buffer, 0, read); + } + zos.flush(); + } + // 目录 + else if (sourceFile.isDirectory()) { + // 获取文件源中的所有文件 + List fileList = getSourceAllFiles(sourcePath); + + fos = new FileOutputStream(zipFile); + zos = new ZipOutputStream(new BufferedOutputStream(fos)); + + // 将每个文件放入zip流中 + for (File file : fileList) { + String name = getRealName(sourcePath, file); // 获取文件相对路径,保持文件原有结构 + ZipEntry zipEntry = null; + if (isKeepFolder) { + zipEntry = new ZipEntry(new File(sourcePath).getName() + File.separator + name); + } else { + zipEntry = new ZipEntry(name); + } + + zipEntry.setSize(file.length()); + zos.putNextEntry(zipEntry); + + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis, 1024*10); + int read = 0; + while ((read=bis.read(buffer, 0, 1024*10)) != -1) { + zos.write(buffer, 0, read); + } + + zos.flush(); + bis.close(); + fis.close(); + } + zos.close(); + } + } catch (FileNotFoundException e) { + throw new FileNotFoundException("待压缩的文件或目录不存在:" + sourcePath); + } catch (IOException e) { + throw new IOException(e); + } catch (Exception e) { + throw new Exception(e); + } finally { + closeQuietly(zos); + closeQuietly(fos); + closeQuietly(bis); + closeQuietly(fis); + } + } + + /** + * zip解压 + * @param zipPath zip文件的全路径,例如:D:\\Temp\\xx.zip + * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Tempxx + * @throws Exception + */ + public static void unZip(String zipPath, String destDirPath) throws Exception { + byte[] buffer = new byte[1024*10]; + ZipFile zipFile = null; + + try { + File file = new File(zipPath); + if (!file.exists()) { + throw new FileNotFoundException("待解压的文件不存在:" + zipPath); + } + + zipFile = new ZipFile(zipPath); + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = (ZipEntry) entries.nextElement(); + // 如果是文件夹,就创建个文件夹 + if (entry.isDirectory()) { + String dirPath = destDirPath + File.separator + entry.getName(); + File dir = new File(dirPath); + dir.mkdirs(); + } else { + // 如果是文件,就先创建一个文件,然后用io流把内容copy过去 + File targetFile = new File(destDirPath + File.separator + entry.getName()); + // 保证这个文件的父文件夹必须要存在 + if (!targetFile.getParentFile().exists()) { + targetFile.getParentFile().mkdirs(); + } + targetFile.createNewFile(); + // 将压缩文件内容写入到这个文件中 + InputStream in = zipFile.getInputStream(entry); + BufferedInputStream bis = new BufferedInputStream(in, 1024*10); + FileOutputStream fos = new FileOutputStream(targetFile); + + int read; + while ((read=bis.read(buffer, 0, 1024*10)) != -1) { + fos.write(buffer, 0, read); + } + + fos.close(); + in.close(); + } + } + } catch (FileNotFoundException e) { + throw new FileNotFoundException("待解压的文件不存在:" + zipPath); + } catch (IOException e) { + throw new IOException(e); + } catch (Exception e) { + throw new Exception(e); + } finally { + closeQuietly(zipFile); + } + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/file/IOStream.java b/htool-core/src/main/java/cn/javaex/htool/core/file/IOStream.java new file mode 100644 index 0000000..a3fb4d8 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/file/IOStream.java @@ -0,0 +1,29 @@ +package cn.javaex.htool.core.file; + +import java.io.Closeable; + +/** + * IO流 + * + * @author 陈霓清 + * @Date 2022年12月1日 + */ +public class IOStream { + + /** + * 关不资源 + * @param closeable + */ + public static void closeQuietly(final Closeable closeable) { + if (closeable == null) { + return; + } + + try { + closeable.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/file/PathUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/file/PathUtils.java new file mode 100644 index 0000000..5945f02 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/file/PathUtils.java @@ -0,0 +1,98 @@ +package cn.javaex.htool.core.file; + +import java.io.File; +import java.io.InputStream; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/*** + * 路径工具类 + * + * @author 陈霓清 + * @Date 2022年12月1日 + */ +public class PathUtils { + + /** + * 路径转换 + * @param str + * @return + */ + public static String slashify(String str) { + return str.replace('\\', '/'); + } + + /** + * 判断是否是绝对路径 + * @param path + * @return + */ + public static boolean isAbsolutePath(String path) { + path = path.substring(0, 2); + return path.startsWith("/") || path.endsWith(":"); + } + + /** + * 获取项目所在磁盘的文件夹路径,并设置临时目录 + * @return + */ + public static String getFolderPath() { + String projectPath = getProjectPath(); + String folderPath = projectPath + File.separator + "temp_download"; + File file = new File(folderPath); + file.mkdirs(); + + return folderPath; + } + + /** + * 获取项目所在磁盘的文件夹路径 + * @return + */ + public static String getProjectPath() { + try { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + // 获取地址内容,原路径(项目名) + String realPath = request.getSession().getServletContext().getRealPath("/"); + // tomcat webapps下部署 + if (realPath!=null && realPath.length()>0 && realPath.contains("apache-tomcat")) { + String path = request.getContextPath(); // 项目名 + path = path.replace("/", File.separator) + File.separator; + return realPath.replace(path, ""); + } + + return System.getProperty("user.dir"); + } catch (Exception e) { + return System.getProperty("user.dir"); + } + } + + /** + * 获取服务路径 + * @return + */ + public static String getServerPath() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + + String domain = request.getScheme() + "://" + request.getServerName(); + int port = request.getServerPort(); + + return port==80 ? domain : domain + ":" + port; + } + + /** + * 根据resources下的文件路径获取流 + * @param path 例如:template/excel/模板.xlsx + * @return + */ + public static InputStream getInputStreamFromResource(String path) { + if (path.startsWith("/")) { + path = path.substring(1); + } + + return Thread.currentThread().getContextClassLoader().getResourceAsStream(path); + } +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java new file mode 100644 index 0000000..917cd3c --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java @@ -0,0 +1,49 @@ +package cn.javaex.htool.core.string; + +import cn.javaex.htool.core.string.zh.PinyinConverter; +import cn.javaex.htool.core.string.zh.ZHConverter; + +/** + * 中文转换工具类 + * + * @author 陈霓清 + * @Date 2022年11月30日 + */ +public class ZHUtils { + + /** + * 简体转繁体 + * @param text + * @return + */ + public static String toTraditionalChar(String text) { + ZHConverter converter = ZHConverter.getInstance(ZHConverter.TRADITIONAL); + return converter.convert(text); + } + + /** + * 繁体转简体 + * @param text + * @return + */ + public static String toSimpleChar(String text) { + ZHConverter converter = ZHConverter.getInstance(ZHConverter.SIMPLIFIED); + return converter.convert(text); + } + + + /** + * 汉字转拼音首字母 + * @param text + * @return + */ + public static String toPinyin(String text) { + PinyinConverter converter = new PinyinConverter(); + return converter.toPinyin(text); + } + + public static void main(String[] args) { + System.out.println(ZHUtils.toPinyin("刘西瓜")); + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/zh/PinyinConverter.java b/htool-core/src/main/java/cn/javaex/htool/core/string/zh/PinyinConverter.java new file mode 100644 index 0000000..57c3439 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/zh/PinyinConverter.java @@ -0,0 +1,112 @@ +package cn.javaex.htool.core.string.zh; + +/** + * 拼音转换 + * + * @author 陈霓清 + * @Date 2022年11月30日 + */ +public class PinyinConverter { + + private static String GB2312 = "GB2312"; + /** 简体中文的编码范围从B0A1(45217)*/ + private static int BEGIN = 45217; + /** 简体中文的编码范围一直到F7FE(63486) */ + private static int END = 63486; + /** + * 按照声 母表示,这个表是在GB2312中的出现的第一个汉字,也就是说“啊”是代表首字母a的第一个汉字。 + * i, u, v都不做声母, 自定规则跟随前面的字母 + */ + private static char[] CHAR_TABLE = {'啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈', '哈', '击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然', '撒', '塌', '塌', '塌', '挖', '昔', '压', '匝'}; + /** + * 二十六个字母区间对应二十七个端点 + * GB2312码汉字区间十进制表示 + */ + private static int[] TABLE = new int[27]; + /** 对应首字母区间表 */ + private static char[] INITIALTABLE = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 't', 't', 'w', 'x', 'y', 'z'}; + + static { + for (int i=0; i<26; i++) { + TABLE[i] = gbValue(CHAR_TABLE[i]); // 得到GB2312码的首字母区间端点表,十进制 + } + + TABLE[26] = END; // 区间表结尾 + } + + /** + * 根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串 最重要的一个方法,思路如下:一个个字符读入、判断、输出 + * @param sourceStr + * @return + */ + public String toPinyin(String sourceStr) { + String result = ""; + int strLength = sourceStr.length(); + + try { + for (int i=0; i= 'a' && ch <= 'z') { + return (char) (ch - 'a' + 'A'); + } + if (ch >= 'A' && ch <= 'Z') { + return ch; + } + // 对非英文字母的处理:转化为首字母,然后判断是否在码表范围内, + // 若不是,则直接返回。 + // 若是,则在码表内的进行判断。 + int gb = gbValue(ch); // 汉字转换首字母 + + // 在码表区间之前,直接返回 + if ((gb < BEGIN) || (gb > END)) { + return ch; + } + + // 判断匹配码表区间,匹配到就break,判断区间形如“[,)” + int i; + for (i = 0; i < 26; i++) { + if ((gb >= TABLE[i]) && (gb < TABLE[i + 1])) { + break; + } + } + // 补上GB2312区间最右端 + if (gb == END) { + i = 25; + } + + return INITIALTABLE[i]; // 在码表区间中,返回首字母 + } + + /** + * 取出汉字的编码 cn 汉字 + * 将一个汉字(GB2312)转换为十进制表示。 + */ + private static int gbValue(char ch) { + String str = new String(); + str += ch; + try { + byte[] bytes = str.getBytes(GB2312); + if (bytes.length < 2) { + return 0; + } + return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff); + } catch (Exception e) { + return 0; + } + } + +} \ No newline at end of file diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/zh/ZHConverter.java b/htool-core/src/main/java/cn/javaex/htool/core/string/zh/ZHConverter.java new file mode 100644 index 0000000..e534b42 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/zh/ZHConverter.java @@ -0,0 +1,165 @@ +package cn.javaex.htool.core.string.zh; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +/** + * 中文转换 + * + * @author 陈霓清 + * @Date 2022年11月30日 + */ +public class ZHConverter { + + /** 繁体 */ + public static final int TRADITIONAL = 0; + /** 简体 */ + public static final int SIMPLIFIED = 1; + + private static final int NUM_OF_CONVERTERS = 2; + + private static final ZHConverter[] CONVERTERS = new ZHConverter[NUM_OF_CONVERTERS]; + private static final String[] PROPERTY_FILES = new String[2]; + + private Properties charMap = new Properties(); + private Set conflictingSets = new HashSet(); + + static { + PROPERTY_FILES[TRADITIONAL] = "zh2Hant.properties"; + PROPERTY_FILES[SIMPLIFIED] = "zh2Hans.properties"; + } + + /** + * @param converterType 0 for traditional and 1 for simplified + * @return + */ + public static ZHConverter getInstance(int converterType) { + if (converterType >= 0 && converterType < NUM_OF_CONVERTERS) { + if (CONVERTERS[converterType] == null) { + synchronized(ZHConverter.class) { + if (CONVERTERS[converterType] == null) { + CONVERTERS[converterType] = new ZHConverter(PROPERTY_FILES[converterType]); + } + } + } + + return CONVERTERS[converterType]; + } + + return null; + } + + public static String convert(String text, int converterType) { + ZHConverter instance = getInstance(converterType); + return instance.convert(text); + } + + private ZHConverter(String propertyFile) { + InputStream is = getClass().getResourceAsStream(propertyFile); + + if (is != null) { + BufferedReader reader = null; + try { + reader = new BufferedReader(new InputStreamReader(is)); + charMap.load(reader); + } catch (FileNotFoundException e) { + + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (reader != null) { + reader.close(); + } + if (is != null) { + is.close(); + } + } catch (IOException e) { + + } + } + } + initializeHelper(); + } + + private void initializeHelper() { + Map stringPossibilities = new HashMap<>(); + Iterator iter = charMap.keySet().iterator(); + while (iter.hasNext()) { + String key = (String) iter.next(); + if (key.length() >= 1) { + for (int i = 0; i < (key.length()); i++) { + String keySubstring = key.substring(0, i + 1); + if (stringPossibilities.containsKey(keySubstring)) { + Integer integer = (Integer)(stringPossibilities.get(keySubstring)); + stringPossibilities.put(keySubstring, new Integer(integer.intValue() + 1)); + } else { + stringPossibilities.put(keySubstring, new Integer(1)); + } + } + } + } + + iter = stringPossibilities.keySet().iterator(); + + while (iter.hasNext()) { + String key = (String) iter.next(); + if (((Integer) (stringPossibilities.get(key))).intValue() > 1) { + conflictingSets.add(key); + } + } + } + + /** + * 转换 + * @param in + * @return + */ + public String convert(String in) { + StringBuilder outString = new StringBuilder(); + StringBuilder stackString = new StringBuilder(); + + for (int i = 0; i < in.length(); i++) { + char c = in.charAt(i); + String key = "" + c; + stackString.append(key); + + if (conflictingSets.contains(stackString.toString())) { + + } else if (charMap.containsKey(stackString.toString())) { + outString.append(charMap.get(stackString.toString())); + stackString.setLength(0); + } else { + CharSequence sequence = stackString.subSequence(0, stackString.length() - 1); + stackString.delete(0, stackString.length()-1); + flushStack(outString, new StringBuilder(sequence)); + } + } + + flushStack(outString, stackString); + + return outString.toString(); + } + + private void flushStack(StringBuilder outString, StringBuilder stackString) { + while (stackString.length() > 0){ + if (charMap.containsKey(stackString.toString())) { + outString.append(charMap.get(stackString.toString())); + stackString.setLength(0); + } else { + outString.append("" + stackString.charAt(0)); + stackString.delete(0, 1); + } + } + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/zh/zh2Hans.properties b/htool-core/src/main/java/cn/javaex/htool/core/string/zh/zh2Hans.properties new file mode 100644 index 0000000..131bf56 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/zh/zh2Hans.properties @@ -0,0 +1,5384 @@ +\u3473=\u3447 +\u380f=\u37c6 +\u3a5c=\u3a2b +\u42b7=\u4336 +\u42d9=\u433a +\u42fb=\u433e +\u4308=\ud858\ude16 +\u477c=\u478d +\u4a8f=\ud864\udffc +\u4a97=\ud865\udc00 +\u4a98=\ud864\udfff +\u4af4=\ud865\udd97 +\u4b18=\ud865\ude6e +\u4b1d=\ud865\ude6f +\u4b40=\ud866\udc07 +\u4b43=\ud866\udc08 +\u4b7f=\ud866\udded +\u4b9d=\ud866\uddf0 +\u4b9e=\ud866\ude01 +\u4ba0=\ud866\uddff +\u4bb3=\ud866\ude0f +\u4bbe=\ud866\uddea +\u4bc0=\u4bc5 +\u4c3e=\u9c83 +\u4c59=\ud867\udf88 +\u4c6c=\ud867\udf8a +\u4c70=\ud867\udf8b +\u4c77=\u4ca3 +\u4c7d=\u4c9d +\u4c81=\u9cda +\u4cb0=\ud868\ude42 +\u4d2c=\ud868\udf88 +\u4d34=\ud868\udf8b +\u4e1f=\u4e22 +\u4e26=\u5e76 +\u4e7e=\u5e72 +\u4e82=\u4e71 +\u4e99=\u4e98 +\u4e9e=\u4e9a +\u4f47=\u4f2b +\u4f48=\u5e03 +\u4f54=\u5360 +\u4f75=\u5e76 +\u4f86=\u6765 +\u4f96=\u4ed1 +\u4fb6=\u4fa3 +\u4fc1=\u4fe3 +\u4fc2=\u7cfb +\u4fd4=\u4f23 +\u4fe0=\u4fa0 +\u5000=\u4f25 +\u5006=\u4fe9 +\u5008=\u4feb +\u5009=\u4ed3 +\u500b=\u4e2a +\u5011=\u4eec +\u5016=\u5e78 +\u502b=\u4f26 +\u5049=\u4f1f +\u5074=\u4fa7 +\u5075=\u4fa6 +\u507d=\u4f2a +\u5091=\u6770 +\u5096=\u4f27 +\u5098=\u4f1e +\u5099=\u5907 +\u50a2=\u5bb6 +\u50ad=\u4f63 +\u50af=\u506c +\u50b3=\u4f20 +\u50b4=\u4f1b +\u50b5=\u503a +\u50b7=\u4f24 +\u50be=\u503e +\u50c2=\u507b +\u50c5=\u4ec5 +\u50c9=\u4f65 +\u50d1=\u4fa8 +\u50d5=\u4ec6 +\u50de=\u4f2a +\u50e5=\u4fa5 +\u50e8=\u507e +\u50f1=\u96c7 +\u50f9=\u4ef7 +\u5100=\u4eea +\u5102=\u4fac +\u5104=\u4ebf +\u5108=\u4fa9 +\u5109=\u4fed +\u5110=\u50a7 +\u5114=\u4fe6 +\u5115=\u4faa +\u5118=\u5c3d +\u511f=\u507f +\u512a=\u4f18 +\u5132=\u50a8 +\u5137=\u4fea +\u5138=\u3469 +\u513a=\u50a9 +\u513b=\u50a5 +\u513c=\u4fe8 +\u5147=\u51f6 +\u514c=\u5151 +\u5152=\u513f +\u5157=\u5156 +\u5167=\u5185 +\u5169=\u4e24 +\u518a=\u518c +\u51aa=\u5e42 +\u51c8=\u51c0 +\u51cd=\u51bb +\u51dc=\u51db +\u51f1=\u51ef +\u5225=\u522b +\u522a=\u5220 +\u5244=\u522d +\u5247=\u5219 +\u524b=\u514b +\u524e=\u5239 +\u5257=\u522c +\u525b=\u521a +\u525d=\u5265 +\u526e=\u5250 +\u5274=\u5240 +\u5275=\u521b +\u5277=\u94f2 +\u5283=\u5212 +\u5287=\u5267 +\u5289=\u5218 +\u528a=\u523d +\u528c=\u523f +\u528d=\u5251 +\u528f=\u34e5 +\u5291=\u5242 +\u529a=\u3509 +\u52c1=\u52b2 +\u52d5=\u52a8 +\u52d9=\u52a1 +\u52db=\u52cb +\u52dd=\u80dc +\u52de=\u52b3 +\u52e2=\u52bf +\u52e9=\u52da +\u52f1=\u52a2 +\u52f3=\u52cb +\u52f5=\u52b1 +\u52f8=\u529d +\u52fb=\u5300 +\u532d=\u5326 +\u532f=\u6c47 +\u5331=\u532e +\u5340=\u533a +\u5354=\u534f +\u537b=\u5374 +\u537d=\u5373 +\u5399=\u538d +\u53a0=\u5395 +\u53a4=\u5386 +\u53ad=\u538c +\u53b2=\u5389 +\u53b4=\u53a3 +\u53c3=\u53c2 +\u53c4=\u53c1 +\u53e2=\u4e1b +\u5412=\u54a4 +\u5433=\u5434 +\u5436=\u5450 +\u5442=\u5415 +\u54bc=\u5459 +\u54e1=\u5458 +\u5504=\u5457 +\u551a=\u5423 +\u554f=\u95ee +\u5553=\u542f +\u555e=\u54d1 +\u555f=\u542f +\u5562=\u5521 +\u558e=\u359e +\u559a=\u5524 +\u55aa=\u4e27 +\u55ab=\u5403 +\u55ac=\u4e54 +\u55ae=\u5355 +\u55b2=\u54df +\u55c6=\u545b +\u55c7=\u556c +\u55ca=\u551d +\u55ce=\u5417 +\u55da=\u545c +\u55e9=\u5522 +\u55f0=\ud842\udfb6 +\u55f6=\u54d4 +\u5606=\u53f9 +\u560d=\u55bd +\u5614=\u5455 +\u5616=\u5567 +\u5617=\u5c1d +\u561c=\u551b +\u5629=\u54d7 +\u562e=\u5520 +\u562f=\u5578 +\u5630=\u53fd +\u5635=\u54d3 +\u5638=\u5452 +\u563d=\u5574 +\u5641=\u6076 +\u5653=\u5618 +\u565a=\u358a +\u565d=\u549d +\u5660=\u54d2 +\u5665=\u54dd +\u5666=\u54d5 +\u566f=\u55f3 +\u5672=\u54d9 +\u5674=\u55b7 +\u5678=\u5428 +\u5679=\u5f53 +\u5680=\u549b +\u5687=\u5413 +\u568c=\u54dc +\u5690=\u5c1d +\u5695=\u565c +\u5699=\u556e +\u56a5=\u54bd +\u56a6=\u5456 +\u56a8=\u5499 +\u56ae=\u5411 +\u56b2=\u4eb8 +\u56b3=\u55be +\u56b4=\u4e25 +\u56b6=\u5624 +\u56c0=\u556d +\u56c1=\u55eb +\u56c2=\u56a3 +\u56c5=\u5181 +\u56c8=\u5453 +\u56cc=\u82cf +\u56d1=\u5631 +\u56ea=\u56f1 +\u5707=\u56f5 +\u570b=\u56fd +\u570d=\u56f4 +\u5712=\u56ed +\u5713=\u5706 +\u5716=\u56fe +\u5718=\u56e2 +\u57b5=\u57ef +\u57e1=\u57ad +\u57f0=\u91c7 +\u57f7=\u6267 +\u5805=\u575a +\u580a=\u57a9 +\u5816=\u57b4 +\u581d=\u57da +\u582f=\u5c27 +\u5831=\u62a5 +\u5834=\u573a +\u584a=\u5757 +\u584b=\u8314 +\u584f=\u57b2 +\u5852=\u57d8 +\u5857=\u6d82 +\u585a=\u51a2 +\u5862=\u575e +\u5864=\u57d9 +\u5875=\u5c18 +\u5879=\u5811 +\u588a=\u57ab +\u589c=\u5760 +\u58ae=\u5815 +\u58b0=\u575b +\u58b3=\u575f +\u58bb=\u5899 +\u58be=\u57a6 +\u58c7=\u575b +\u58c8=\ud845\udc84 +\u58cb=\u57b1 +\u58d3=\u538b +\u58d8=\u5792 +\u58d9=\u5739 +\u58da=\u5786 +\u58dc=\u575b +\u58de=\u574f +\u58df=\u5784 +\u58e0=\u5785 +\u58e2=\u575c +\u58e9=\u575d +\u58ef=\u58ee +\u58fa=\u58f6 +\u58fc=\u58f8 +\u58fd=\u5bff +\u5920=\u591f +\u5922=\u68a6 +\u5925=\u4f19 +\u593e=\u5939 +\u5950=\u5942 +\u5967=\u5965 +\u5969=\u5941 +\u596a=\u593a +\u596c=\u5956 +\u596e=\u594b +\u597c=\u59f9 +\u599d=\u5986 +\u59cd=\u59d7 +\u59e6=\u5978 +\u5a1b=\u5a31 +\u5a41=\u5a04 +\u5a66=\u5987 +\u5a6d=\u5a05 +\u5aa7=\u5a32 +\u5aaf=\u59ab +\u5abc=\u5aaa +\u5abd=\u5988 +\u5ad7=\u59aa +\u5af5=\u59a9 +\u5afb=\u5a34 +\u5aff=\u5a73 +\u5b00=\u59ab +\u5b08=\u5a06 +\u5b0b=\u5a75 +\u5b0c=\u5a07 +\u5b19=\u5af1 +\u5b21=\u5ad2 +\u5b24=\u5b37 +\u5b2a=\u5ad4 +\u5b30=\u5a74 +\u5b38=\u5a76 +\u5b4c=\u5a08 +\u5b6b=\u5b59 +\u5b78=\u5b66 +\u5b7f=\u5b6a +\u5bae=\u5bab +\u5bc0=\u91c7 +\u5be2=\u5bdd +\u5be6=\u5b9e +\u5be7=\u5b81 +\u5be9=\u5ba1 +\u5beb=\u5199 +\u5bec=\u5bbd +\u5bf5=\u5ba0 +\u5bf6=\u5b9d +\u5c07=\u5c06 +\u5c08=\u4e13 +\u5c0b=\u5bfb +\u5c0d=\u5bf9 +\u5c0e=\u5bfc +\u5c37=\u5c34 +\u5c46=\u5c4a +\u5c4d=\u5c38 +\u5c53=\u5c43 +\u5c5c=\u5c49 +\u5c62=\u5c61 +\u5c64=\u5c42 +\u5c68=\u5c66 +\u5c6c=\u5c5e +\u5ca1=\u5188 +\u5cf4=\u5c98 +\u5cf6=\u5c9b +\u5cfd=\u5ce1 +\u5d0d=\u5d03 +\u5d11=\u6606 +\u5d17=\u5c97 +\u5d19=\u4ed1 +\u5d22=\u5ce5 +\u5d2c=\u5cbd +\u5d50=\u5c9a +\u5d57=\u5c81 +\u5d81=\u5d5d +\u5d84=\u5d2d +\u5d87=\u5c96 +\u5d94=\u5d5a +\u5d97=\u5d02 +\u5da0=\u5ce4 +\u5da2=\u5ce3 +\u5da7=\u5cc4 +\u5dae=\u5d04 +\u5db4=\u5c99 +\u5db8=\u5d58 +\u5dba=\u5cad +\u5dbc=\u5c7f +\u5dbd=\u5cb3 +\u5dcb=\u5cbf +\u5dd2=\u5ce6 +\u5dd4=\u5dc5 +\u5df0=\u5def +\u5df9=\u537a +\u5e25=\u5e05 +\u5e2b=\u5e08 +\u5e33=\u5e10 +\u5e36=\u5e26 +\u5e40=\u5e27 +\u5e43=\u5e0f +\u5e57=\u5e3c +\u5e58=\u5e3b +\u5e5f=\u5e1c +\u5e63=\u5e01 +\u5e6b=\u5e2e +\u5e6c=\u5e31 +\u5e79=\u5e72 +\u5e7a=\u4e48 +\u5e7e=\u51e0 +\u5eab=\u5e93 +\u5ec1=\u5395 +\u5ec2=\u53a2 +\u5ec4=\u53a9 +\u5ec8=\u53a6 +\u5eda=\u53a8 +\u5edd=\u53ae +\u5edf=\u5e99 +\u5ee0=\u5382 +\u5ee1=\u5e91 +\u5ee2=\u5e9f +\u5ee3=\u5e7f +\u5ee9=\u5eea +\u5eec=\u5e90 +\u5ef3=\u5385 +\u5f12=\u5f11 +\u5f14=\u540a +\u5f33=\u5f2a +\u5f35=\u5f20 +\u5f37=\u5f3a +\u5f46=\u522b +\u5f48=\u5f39 +\u5f4c=\u5f25 +\u5f4e=\u5f2f +\u5f59=\u6c47 +\u5f5e=\u5f5d +\u5f65=\u5f66 +\u5f8c=\u540e +\u5f91=\u5f84 +\u5f9e=\u4ece +\u5fa0=\u5f95 +\u5fa9=\u590d +\u5fb5=\u5f81 +\u5fb9=\u5f7b +\u6046=\u6052 +\u6065=\u803b +\u6085=\u60a6 +\u609e=\u60ae +\u60b5=\u6005 +\u60b6=\u95f7 +\u60e1=\u6076 +\u60f1=\u607c +\u60f2=\u607d +\u60fb=\u607b +\u611b=\u7231 +\u611c=\u60ec +\u6128=\u60ab +\u6134=\u6006 +\u6137=\u607a +\u613e=\u5ffe +\u6144=\u6817 +\u614b=\u6001 +\u614d=\u6120 +\u6158=\u60e8 +\u615a=\u60ed +\u615f=\u6078 +\u6163=\u60ef +\u6164=\u60ab +\u616a=\u6004 +\u616b=\u6002 +\u616e=\u8651 +\u6173=\u60ad +\u6176=\u5e86 +\u617c=\u621a +\u617e=\u6b32 +\u6182=\u5fe7 +\u618a=\u60eb +\u6190=\u601c +\u6191=\u51ed +\u6192=\u6126 +\u619a=\u60ee +\u61a4=\u6124 +\u61ab=\u60af +\u61ae=\u6003 +\u61b2=\u5baa +\u61b6=\u5fc6 +\u61c7=\u6073 +\u61c9=\u5e94 +\u61cc=\u603f +\u61cd=\u61d4 +\u61de=\u8499 +\u61df=\u603c +\u61e3=\u61d1 +\u61e8=\u6079 +\u61f2=\u60e9 +\u61f6=\u61d2 +\u61f7=\u6000 +\u61f8=\u60ac +\u61fa=\u5fcf +\u61fc=\u60e7 +\u61fe=\u6151 +\u6200=\u604b +\u6207=\u6206 +\u6214=\u620b +\u6227=\u6217 +\u6229=\u622c +\u6230=\u6218 +\u6231=\u622f +\u6232=\u620f +\u6236=\u6237 +\u62cb=\u629b +\u62da=\u62fc +\u6329=\u635d +\u6331=\u6332 +\u633e=\u631f +\u6368=\u820d +\u636b=\u626a +\u6371=\u6328 +\u6372=\u5377 +\u6383=\u626b +\u6384=\u62a1 +\u6397=\u631c +\u6399=\u6323 +\u639b=\u6302 +\u63a1=\u91c7 +\u63c0=\u62e3 +\u63da=\u626c +\u63db=\u6362 +\u63ee=\u6325 +\u640d=\u635f +\u6416=\u6447 +\u6417=\u6363 +\u6435=\u63fe +\u6436=\u62a2 +\u6451=\u63b4 +\u645c=\u63bc +\u645f=\u6402 +\u646f=\u631a +\u6473=\u62a0 +\u6476=\u629f +\u647a=\u6298 +\u647b=\u63ba +\u6488=\u635e +\u648f=\u6326 +\u6490=\u6491 +\u6493=\u6320 +\u649d=\u39d1 +\u649f=\u6322 +\u64a3=\u63b8 +\u64a5=\u62e8 +\u64ab=\u629a +\u64b2=\u6251 +\u64b3=\u63ff +\u64bb=\u631e +\u64be=\u631d +\u64bf=\u6361 +\u64c1=\u62e5 +\u64c4=\u63b3 +\u64c7=\u62e9 +\u64ca=\u51fb +\u64cb=\u6321 +\u64d3=\u39df +\u64d4=\u62c5 +\u64da=\u636e +\u64e0=\u6324 +\u64ec=\u62df +\u64ef=\u6448 +\u64f0=\u62e7 +\u64f1=\u6401 +\u64f2=\u63b7 +\u64f4=\u6269 +\u64f7=\u64b7 +\u64fa=\u6446 +\u64fb=\u64de +\u64fc=\u64b8 +\u64fe=\u6270 +\u6504=\u6445 +\u6506=\u64b5 +\u650f=\u62e2 +\u6514=\u62e6 +\u6516=\u6484 +\u6519=\u6400 +\u651b=\u64ba +\u651c=\u643a +\u651d=\u6444 +\u6522=\u6512 +\u6523=\u631b +\u6524=\u644a +\u652a=\u6405 +\u652c=\u63fd +\u6557=\u8d25 +\u6558=\u53d9 +\u6575=\u654c +\u6578=\u6570 +\u6582=\u655b +\u6583=\u6bd9 +\u6595=\u6593 +\u65ac=\u65a9 +\u65b7=\u65ad +\u65bc=\u4e8e +\u65c2=\u65d7 +\u65e3=\u65e2 +\u6607=\u5347 +\u6642=\u65f6 +\u6649=\u664b +\u665d=\u663c +\u6688=\u6655 +\u6689=\u6656 +\u6698=\u65f8 +\u66a2=\u7545 +\u66ab=\u6682 +\u66c4=\u6654 +\u66c6=\u5386 +\u66c7=\u6619 +\u66c9=\u6653 +\u66cf=\u5411 +\u66d6=\u66a7 +\u66e0=\u65f7 +\u66e8=\u663d +\u66ec=\u6652 +\u66f8=\u4e66 +\u6703=\u4f1a +\u6727=\u80e7 +\u672e=\u672f +\u6771=\u4e1c +\u6774=\u9528 +\u67f5=\u6805 +\u687f=\u6746 +\u6894=\u6800 +\u6898=\u67a7 +\u689d=\u6761 +\u689f=\u67ad +\u68b2=\u68c1 +\u68c4=\u5f03 +\u68ca=\u68cb +\u68d6=\u67a8 +\u68d7=\u67a3 +\u68df=\u680b +\u68e1=\ue82d +\u68e7=\u6808 +\u68f2=\u6816 +\u68f6=\u68be +\u690f=\u6860 +\u694a=\u6768 +\u6953=\u67ab +\u6968=\u6862 +\u696d=\u4e1a +\u6975=\u6781 +\u69a6=\u5e72 +\u69aa=\u6769 +\u69ae=\u8363 +\u69b2=\u6985 +\u69bf=\u6864 +\u69cb=\u6784 +\u69cd=\u67aa +\u69d3=\u6760 +\u69e4=\u68bf +\u69e7=\u6920 +\u69e8=\u6901 +\u69f3=\u6868 +\u6a01=\u6869 +\u6a02=\u4e50 +\u6a05=\u679e +\u6a11=\u6881 +\u6a13=\u697c +\u6a19=\u6807 +\u6a1e=\u67a2 +\u6a23=\u6837 +\u6a38=\u6734 +\u6a39=\u6811 +\u6a3a=\u6866 +\u6a48=\u6861 +\u6a4b=\u6865 +\u6a5f=\u673a +\u6a62=\u692d +\u6a6b=\u6a2a +\u6a81=\u6aa9 +\u6a89=\u67fd +\u6a94=\u6863 +\u6a9c=\u6867 +\u6a9f=\u69da +\u6aa2=\u68c0 +\u6aa3=\u6a2f +\u6aae=\u68bc +\u6aaf=\u53f0 +\u6ab3=\u69df +\u6ab8=\u67e0 +\u6abb=\u69db +\u6ac3=\u67dc +\u6ad3=\u6a79 +\u6ada=\u6988 +\u6adb=\u6809 +\u6add=\u691f +\u6ade=\u6a7c +\u6adf=\u680e +\u6ae5=\u6a71 +\u6ae7=\u69e0 +\u6ae8=\u680c +\u6aea=\u67a5 +\u6aeb=\u6a65 +\u6aec=\u6987 +\u6af1=\u8616 +\u6af3=\u680a +\u6af8=\u6989 +\u6afb=\u6a31 +\u6b04=\u680f +\u6b05=\u6989 +\u6b0a=\u6743 +\u6b0f=\u6924 +\u6b12=\u683e +\u6b16=\u6984 +\u6b1e=\u68c2 +\u6b3d=\u94a6 +\u6b4e=\u53f9 +\u6b50=\u6b27 +\u6b5f=\u6b24 +\u6b61=\u6b22 +\u6b72=\u5c81 +\u6b77=\u5386 +\u6b78=\u5f52 +\u6b7f=\u6b81 +\u6b98=\u6b8b +\u6b9e=\u6b92 +\u6ba4=\u6b87 +\u6ba8=\u3c6e +\u6bab=\u6b9a +\u6bad=\u50f5 +\u6bae=\u6b93 +\u6baf=\u6ba1 +\u6bb0=\u3c69 +\u6bb2=\u6b7c +\u6bba=\u6740 +\u6bbb=\u58f3 +\u6bbc=\u58f3 +\u6bc0=\u6bc1 +\u6bc6=\u6bb4 +\u6bff=\u6bf5 +\u6c02=\u7266 +\u6c08=\u6be1 +\u6c0c=\u6c07 +\u6c23=\u6c14 +\u6c2b=\u6c22 +\u6c2c=\u6c29 +\u6c33=\u6c32 +\u6c59=\u6c61 +\u6c7a=\u51b3 +\u6c92=\u6ca1 +\u6c96=\u51b2 +\u6cc1=\u51b5 +\u6cdd=\u6eaf +\u6d29=\u6cc4 +\u6d36=\u6c79 +\u6d79=\u6d43 +\u6d87=\u6cfe +\u6dbc=\u51c9 +\u6dd2=\u51c4 +\u6dda=\u6cea +\u6de5=\u6e0c +\u6de8=\u51c0 +\u6de9=\u51cc +\u6dea=\u6ca6 +\u6df5=\u6e0a +\u6df6=\u6d9e +\u6dfa=\u6d45 +\u6e19=\u6da3 +\u6e1b=\u51cf +\u6e26=\u6da1 +\u6e2c=\u6d4b +\u6e3e=\u6d51 +\u6e4a=\u51d1 +\u6e5e=\u6d48 +\u6e67=\u6d8c +\u6e6f=\u6c64 +\u6e88=\u6ca9 +\u6e96=\u51c6 +\u6e9d=\u6c9f +\u6eab=\u6e29 +\u6ec4=\u6ca7 +\u6ec5=\u706d +\u6ecc=\u6da4 +\u6ece=\u8365 +\u6ed9=\u6c47 +\u6eec=\u6caa +\u6eef=\u6ede +\u6ef2=\u6e17 +\u6ef7=\u5364 +\u6ef8=\u6d52 +\u6efb=\u6d50 +\u6efe=\u6eda +\u6eff=\u6ee1 +\u6f01=\u6e14 +\u6f1a=\u6ca4 +\u6f22=\u6c49 +\u6f23=\u6d9f +\u6f2c=\u6e0d +\u6f32=\u6da8 +\u6f35=\u6e86 +\u6f38=\u6e10 +\u6f3f=\u6d46 +\u6f41=\u988d +\u6f51=\u6cfc +\u6f54=\u6d01 +\u6f59=\u6ca9 +\u6f5b=\u6f5c +\u6f64=\u6da6 +\u6f6f=\u6d54 +\u6f70=\u6e83 +\u6f77=\u6ed7 +\u6f7f=\u6da0 +\u6f80=\u6da9 +\u6f86=\u6d47 +\u6f87=\u6d9d +\u6f90=\u6c84 +\u6f97=\u6da7 +\u6fa0=\u6e11 +\u6fa4=\u6cfd +\u6fa6=\u6eea +\u6fa9=\u6cf6 +\u6fae=\u6d4d +\u6fb1=\u6dc0 +\u6fbe=\u3ce0 +\u6fc1=\u6d4a +\u6fc3=\u6d53 +\u6fd5=\u6e7f +\u6fd8=\u6cde +\u6fdf=\u6d4e +\u6fe4=\u6d9b +\u6feb=\u6ee5 +\u6ff0=\u6f4d +\u6ff1=\u6ee8 +\u6ffa=\u6e85 +\u6ffc=\u6cfa +\u6ffe=\u6ee4 +\u7005=\u6ee2 +\u7006=\u6e0e +\u7007=\u3cbf +\u7009=\u6cfb +\u700b=\u6c88 +\u700f=\u6d4f +\u7015=\u6fd2 +\u7018=\u6cf8 +\u701d=\u6ca5 +\u701f=\u6f47 +\u7020=\u6f46 +\u7026=\u6f74 +\u7027=\u6cf7 +\u7028=\u6fd1 +\u7030=\u5f25 +\u7032=\u6f4b +\u703e=\u6f9c +\u7043=\u6ca3 +\u7044=\u6ee0 +\u7051=\u6d12 +\u7055=\u6f13 +\u7058=\u6ee9 +\u705d=\u704f +\u7060=\u6f24 +\u7063=\u6e7e +\u7064=\u6ee6 +\u7067=\u6edf +\u707d=\u707e +\u70ba=\u4e3a +\u70cf=\u4e4c +\u70f4=\u70c3 +\u7121=\u65e0 +\u7149=\u70bc +\u7152=\u709c +\u7159=\u70df +\u7162=\u8315 +\u7165=\u7115 +\u7169=\u70e6 +\u716c=\u7080 +\u7171=\u3dbd +\u7185=\u7174 +\u7192=\u8367 +\u7197=\u709d +\u71b1=\u70ed +\u71b2=\u988e +\u71be=\u70bd +\u71c1=\u70e8 +\u71c8=\u706f +\u71c9=\u7096 +\u71d2=\u70e7 +\u71d9=\u70eb +\u71dc=\u7116 +\u71df=\u8425 +\u71e6=\u707f +\u71ec=\u6bc1 +\u71ed=\u70db +\u71f4=\u70e9 +\u71f6=\u3db6 +\u71fc=\u70ec +\u71fe=\u7118 +\u720d=\u70c1 +\u7210=\u7089 +\u721b=\u70c2 +\u722d=\u4e89 +\u7232=\u4e3a +\u723a=\u7237 +\u723e=\u5c14 +\u7246=\u5899 +\u7258=\u724d +\u727d=\u7275 +\u7296=\u8366 +\u72a2=\u728a +\u72a7=\u727a +\u72c0=\u72b6 +\u72f9=\u72ed +\u72fd=\u72c8 +\u7319=\u72f0 +\u7336=\u72b9 +\u733b=\u72f2 +\u7341=\u72b8 +\u7343=\u5446 +\u7344=\u72f1 +\u7345=\u72ee +\u734e=\u5956 +\u7368=\u72ec +\u736a=\u72ef +\u736b=\u7303 +\u736e=\u72dd +\u7370=\u72de +\u7371=\u3e8d +\u7372=\u83b7 +\u7375=\u730e +\u7377=\u72b7 +\u7378=\u517d +\u737a=\u736d +\u737b=\u732e +\u737c=\u7315 +\u7380=\u7321 +\u73fe=\u73b0 +\u743a=\u73d0 +\u743f=\u73f2 +\u744b=\u73ae +\u7452=\u739a +\u7463=\u7410 +\u7464=\u7476 +\u7469=\u83b9 +\u746a=\u739b +\u7472=\u73b1 +\u7489=\u740f +\u74a3=\u7391 +\u74a6=\u7477 +\u74ab=\u73f0 +\u74b0=\u73af +\u74bd=\u73ba +\u74ca=\u743c +\u74cf=\u73d1 +\u74d4=\u748e +\u74da=\u74d2 +\u750c=\u74ef +\u7515=\u74ee +\u7522=\u4ea7 +\u7523=\u4ea7 +\u7526=\u82cf +\u755d=\u4ea9 +\u7562=\u6bd5 +\u756b=\u753b +\u7570=\u5f02 +\u7575=\u753b +\u7576=\u5f53 +\u7587=\u7574 +\u758a=\u53e0 +\u75d9=\u75c9 +\u75e0=\u9178 +\u75fe=\u75b4 +\u7602=\u75d6 +\u760b=\u75af +\u760d=\u75a1 +\u7613=\u75ea +\u761e=\u7617 +\u7621=\u75ae +\u7627=\u759f +\u762e=\u7606 +\u7632=\u75ad +\u763a=\u7618 +\u763b=\u7618 +\u7642=\u7597 +\u7646=\u75e8 +\u7647=\u75eb +\u7649=\u7605 +\u7652=\u6108 +\u7658=\u75a0 +\u765f=\u762a +\u7661=\u75f4 +\u7662=\u75d2 +\u7664=\u7596 +\u7665=\u75c7 +\u7667=\u75ac +\u7669=\u765e +\u766c=\u7663 +\u766d=\u763f +\u766e=\u763e +\u7670=\u75c8 +\u7671=\u762b +\u7672=\u766b +\u767c=\u53d1 +\u769a=\u7691 +\u76b0=\u75b1 +\u76b8=\u76b2 +\u76ba=\u76b1 +\u76c3=\u676f +\u76dc=\u76d7 +\u76de=\u76cf +\u76e1=\u5c3d +\u76e3=\u76d1 +\u76e4=\u76d8 +\u76e7=\u5362 +\u76ea=\u8361 +\u7725=\u7726 +\u773e=\u4f17 +\u774f=\u56f0 +\u775c=\u7741 +\u775e=\u7750 +\u7798=\u770d +\u779c=\u4056 +\u779e=\u7792 +\u77ad=\u4e86 +\u77b6=\u7786 +\u77bc=\u7751 +\u77c7=\u8499 +\u77d3=\u772c +\u77da=\u77a9 +\u77ef=\u77eb +\u7843=\u6731 +\u785c=\u7841 +\u7864=\u7856 +\u7868=\u7817 +\u786f=\u781a +\u7895=\u57fc +\u78a9=\u7855 +\u78ad=\u7800 +\u78b8=\u781c +\u78ba=\u786e +\u78bc=\u7801 +\u78d1=\u7859 +\u78da=\u7816 +\u78e3=\u789c +\u78e7=\u789b +\u78ef=\u77f6 +\u78fd=\u7857 +\u7906=\u7877 +\u790e=\u7840 +\u7919=\u788d +\u7926=\u77ff +\u792a=\u783a +\u792b=\u783e +\u792c=\u77fe +\u7931=\u783b +\u7958=\u7b97 +\u797f=\u7984 +\u798d=\u7978 +\u798e=\u796f +\u7995=\u794e +\u79a1=\u7943 +\u79a6=\u5fa1 +\u79aa=\u7985 +\u79ae=\u793c +\u79b0=\u7962 +\u79b1=\u7977 +\u79bf=\u79c3 +\u79c8=\u7c7c +\u7a05=\u7a0e +\u7a08=\u79c6 +\u7a0f=\u4149 +\u7a1c=\u68f1 +\u7a1f=\u7980 +\u7a2e=\u79cd +\u7a31=\u79f0 +\u7a40=\u8c37 +\u7a4c=\u7a23 +\u7a4d=\u79ef +\u7a4e=\u9896 +\u7a60=\u79fe +\u7a61=\u7a51 +\u7a62=\u79fd +\u7a69=\u7a33 +\u7a6b=\u83b7 +\u7a6d=\u7a06 +\u7aa9=\u7a9d +\u7aaa=\u6d3c +\u7aae=\u7a77 +\u7aaf=\u7a91 +\u7ab5=\u7a8e +\u7ab6=\u7aad +\u7aba=\u7aa5 +\u7ac4=\u7a9c +\u7ac5=\u7a8d +\u7ac7=\u7aa6 +\u7ac8=\u7076 +\u7aca=\u7a83 +\u7aea=\u7ad6 +\u7af6=\u7ade +\u7b46=\u7b14 +\u7b4d=\u7b0b +\u7b67=\u7b15 +\u7b74=\u41f2 +\u7b87=\u4e2a +\u7b8b=\u7b3a +\u7b8f=\u7b5d +\u7bc0=\u8282 +\u7bc4=\u8303 +\u7bc9=\u7b51 +\u7bcb=\u7ba7 +\u7bd4=\u7b7c +\u7be4=\u7b03 +\u7be9=\u7b5b +\u7bf3=\u7b5a +\u7c00=\u7ba6 +\u7c0d=\u7bd3 +\u7c11=\u84d1 +\u7c1e=\u7baa +\u7c21=\u7b80 +\u7c23=\u7bd1 +\u7c2b=\u7bab +\u7c39=\u7b5c +\u7c3d=\u7b7e +\u7c3e=\u5e18 +\u7c43=\u7bee +\u7c4c=\u7b79 +\u7c59=\u7b93 +\u7c5c=\u7ba8 +\u7c5f=\u7c41 +\u7c60=\u7b3c +\u7c64=\u7b7e +\u7c69=\u7b3e +\u7c6a=\u7c16 +\u7c6c=\u7bf1 +\u7c6e=\u7ba9 +\u7c72=\u5401 +\u7cb5=\u7ca4 +\u7cdd=\u7cc1 +\u7cde=\u7caa +\u7ce7=\u7cae +\u7cf0=\u56e2 +\u7cf2=\u7c9d +\u7cf4=\u7c74 +\u7cf6=\u7c9c +\u7cf9=\u7e9f +\u7cfe=\u7ea0 +\u7d00=\u7eaa +\u7d02=\u7ea3 +\u7d04=\u7ea6 +\u7d05=\u7ea2 +\u7d06=\u7ea1 +\u7d07=\u7ea5 +\u7d08=\u7ea8 +\u7d09=\u7eab +\u7d0b=\u7eb9 +\u7d0d=\u7eb3 +\u7d10=\u7ebd +\u7d13=\u7ebe +\u7d14=\u7eaf +\u7d15=\u7eb0 +\u7d16=\u7ebc +\u7d17=\u7eb1 +\u7d18=\u7eae +\u7d19=\u7eb8 +\u7d1a=\u7ea7 +\u7d1b=\u7eb7 +\u7d1c=\u7ead +\u7d1d=\u7eb4 +\u7d21=\u7eba +\u7d2c=\u4337 +\u7d2e=\u624e +\u7d30=\u7ec6 +\u7d31=\u7ec2 +\u7d32=\u7ec1 +\u7d33=\u7ec5 +\u7d35=\u7ebb +\u7d39=\u7ecd +\u7d3a=\u7ec0 +\u7d3c=\u7ecb +\u7d3f=\u7ed0 +\u7d40=\u7ecc +\u7d42=\u7ec8 +\u7d44=\u7ec4 +\u7d45=\u4339 +\u7d46=\u7eca +\u7d4e=\u7ed7 +\u7d50=\u7ed3 +\u7d55=\u7edd +\u7d5b=\u7ee6 +\u7d5d=\u7ed4 +\u7d5e=\u7ede +\u7d61=\u7edc +\u7d62=\u7eda +\u7d66=\u7ed9 +\u7d68=\u7ed2 +\u7d70=\u7ed6 +\u7d71=\u7edf +\u7d72=\u4e1d +\u7d73=\u7edb +\u7d76=\u7edd +\u7d79=\u7ee2 +\u7d81=\u7ed1 +\u7d83=\u7ee1 +\u7d86=\u7ee0 +\u7d88=\u7ee8 +\u7d89=\u7ee3 +\u7d8c=\u7ee4 +\u7d8f=\u7ee5 +\u7d90=\u433c +\u7d93=\u7ecf +\u7d9c=\u7efc +\u7d9e=\u7f0d +\u7da0=\u7eff +\u7da2=\u7ef8 +\u7da3=\u7efb +\u7dab=\u7ebf +\u7dac=\u7ef6 +\u7dad=\u7ef4 +\u7daf=\u7ef9 +\u7db0=\u7efe +\u7db1=\u7eb2 +\u7db2=\u7f51 +\u7db3=\u7ef7 +\u7db4=\u7f00 +\u7db5=\u5f69 +\u7db8=\u7eb6 +\u7db9=\u7efa +\u7dba=\u7eee +\u7dbb=\u7efd +\u7dbd=\u7ef0 +\u7dbe=\u7eeb +\u7dbf=\u7ef5 +\u7dc4=\u7ef2 +\u7dc7=\u7f01 +\u7dca=\u7d27 +\u7dcb=\u7eef +\u7dd1=\u7eff +\u7dd2=\u7eea +\u7dd3=\u7eec +\u7dd4=\u7ef1 +\u7dd7=\u7f03 +\u7dd8=\u7f04 +\u7dd9=\u7f02 +\u7dda=\u7ebf +\u7ddd=\u7f09 +\u7dde=\u7f0e +\u7de0=\u7f14 +\u7de1=\u7f17 +\u7de3=\u7f18 +\u7de6=\u7f0c +\u7de8=\u7f16 +\u7de9=\u7f13 +\u7dec=\u7f05 +\u7def=\u7eac +\u7df1=\u7f11 +\u7df2=\u7f08 +\u7df4=\u7ec3 +\u7df6=\u7f0f +\u7df9=\u7f07 +\u7dfb=\u81f4 +\u7e08=\u8426 +\u7e09=\u7f19 +\u7e0a=\u7f22 +\u7e0b=\u7f12 +\u7e10=\u7ec9 +\u7e11=\u7f23 +\u7e15=\u7f0a +\u7e17=\u7f1e +\u7e1b=\u7f1a +\u7e1d=\u7f1c +\u7e1e=\u7f1f +\u7e1f=\u7f1b +\u7e23=\u53bf +\u7e27=\u7ee6 +\u7e2b=\u7f1d +\u7e2d=\u7f21 +\u7e2e=\u7f29 +\u7e31=\u7eb5 +\u7e32=\u7f27 +\u7e33=\u4338 +\u7e34=\u7ea4 +\u7e35=\u7f26 +\u7e36=\u7d77 +\u7e37=\u7f15 +\u7e39=\u7f25 +\u7e3d=\u603b +\u7e3e=\u7ee9 +\u7e43=\u7ef7 +\u7e45=\u7f2b +\u7e46=\u7f2a +\u7e50=\u7a57 +\u7e52=\u7f2f +\u7e54=\u7ec7 +\u7e55=\u7f2e +\u7e5a=\u7f2d +\u7e5e=\u7ed5 +\u7e61=\u7ee3 +\u7e62=\u7f0b +\u7e69=\u7ef3 +\u7e6a=\u7ed8 +\u7e6b=\u7cfb +\u7e6d=\u8327 +\u7e6e=\u7f30 +\u7e6f=\u7f33 +\u7e70=\u7f32 +\u7e73=\u7f34 +\u7e78=\u4341 +\u7e79=\u7ece +\u7e7c=\u7ee7 +\u7e7d=\u7f24 +\u7e7e=\u7f31 +\u7e7f=\u4340 +\u7e88=\u7f2c +\u7e8a=\u7ea9 +\u7e8c=\u7eed +\u7e8d=\u7d2f +\u7e8f=\u7f20 +\u7e93=\u7f28 +\u7e94=\u624d +\u7e96=\u7ea4 +\u7e98=\u7f35 +\u7e9c=\u7f06 +\u7f3d=\u94b5 +\u7f48=\u575b +\u7f4c=\u7f42 +\u7f4e=\u575b +\u7f70=\u7f5a +\u7f75=\u9a82 +\u7f77=\u7f62 +\u7f85=\u7f57 +\u7f86=\u7f74 +\u7f88=\u7f81 +\u7f8b=\u8288 +\u7fa5=\u7f9f +\u7fa9=\u4e49 +\u7fd2=\u4e60 +\u7ff9=\u7fd8 +\u802c=\u8027 +\u802e=\u8022 +\u8056=\u5723 +\u805e=\u95fb +\u806f=\u8054 +\u8070=\u806a +\u8072=\u58f0 +\u8073=\u8038 +\u8075=\u8069 +\u8076=\u8042 +\u8077=\u804c +\u8079=\u804d +\u807d=\u542c +\u807e=\u804b +\u8085=\u8083 +\u8105=\u80c1 +\u8108=\u8109 +\u811b=\u80eb +\u8123=\u5507 +\u812b=\u8131 +\u8139=\u80c0 +\u814e=\u80be +\u8156=\u80e8 +\u8161=\u8136 +\u8166=\u8111 +\u816b=\u80bf +\u8173=\u811a +\u8178=\u80a0 +\u8183=\u817d +\u819a=\u80a4 +\u81a0=\u80f6 +\u81a9=\u817b +\u81bd=\u80c6 +\u81be=\u810d +\u81bf=\u8113 +\u81c9=\u8138 +\u81cd=\u8110 +\u81cf=\u8191 +\u81d8=\u814a +\u81da=\u80ea +\u81df=\u810f +\u81e0=\u8114 +\u81e2=\u81dc +\u81e5=\u5367 +\u81e8=\u4e34 +\u81fa=\u53f0 +\u8207=\u4e0e +\u8208=\u5174 +\u8209=\u4e3e +\u820a=\u65e7 +\u8259=\u8231 +\u8264=\u8223 +\u8266=\u8230 +\u826b=\u823b +\u8271=\u8270 +\u8277=\u8273 +\u82bb=\u520d +\u82e7=\u82ce +\u8332=\u5179 +\u834a=\u8346 +\u838a=\u5e84 +\u8396=\u830e +\u83a2=\u835a +\u83a7=\u82cb +\u83ef=\u534e +\u83f4=\u5eb5 +\u8407=\u82cc +\u840a=\u83b1 +\u842c=\u4e07 +\u8435=\u83b4 +\u8449=\u53f6 +\u8452=\u836d +\u8464=\u836e +\u8466=\u82c7 +\u846f=\u836f +\u8477=\u8364 +\u8493=\u83bc +\u8494=\u83b3 +\u849e=\u8385 +\u84bc=\u82cd +\u84c0=\u836a +\u84cb=\u76d6 +\u84ee=\u83b2 +\u84ef=\u82c1 +\u84f4=\u83bc +\u84fd=\u835c +\u8514=\u535c +\u8518=\u53c2 +\u851e=\u848c +\u8523=\u848b +\u8525=\u8471 +\u8526=\u8311 +\u852d=\u836b +\u8541=\u8368 +\u8546=\u8487 +\u854e=\u835e +\u8552=\u836c +\u8553=\u82b8 +\u8555=\u83b8 +\u8558=\u835b +\u8562=\u8489 +\u8569=\u8361 +\u856a=\u829c +\u856d=\u8427 +\u8577=\u84e3 +\u8580=\u8570 +\u8588=\u835f +\u858a=\u84df +\u858c=\u8297 +\u8591=\u59dc +\u8594=\u8537 +\u8598=\u8359 +\u859f=\u83b6 +\u85a6=\u8350 +\u85a9=\u8428 +\u85b3=\u44d5 +\u85b4=\u82e7 +\u85ba=\u8360 +\u85cd=\u84dd +\u85ce=\u8369 +\u85dd=\u827a +\u85e5=\u836f +\u85ea=\u85ae +\u85f4=\u8574 +\u85f6=\u82c8 +\u85f9=\u853c +\u85fa=\u853a +\u8604=\u8572 +\u8606=\u82a6 +\u8607=\u82cf +\u860a=\u8574 +\u860b=\u82f9 +\u861a=\u85d3 +\u861e=\u8539 +\u8622=\u830f +\u862d=\u5170 +\u863a=\u84e0 +\u863f=\u841d +\u8646=\u8502 +\u8655=\u5904 +\u865b=\u865a +\u865c=\u864f +\u865f=\u53f7 +\u8667=\u4e8f +\u866f=\u866c +\u86fa=\u86f1 +\u86fb=\u8715 +\u8706=\u86ac +\u8755=\u8680 +\u875f=\u732c +\u8766=\u867e +\u8778=\u8717 +\u8784=\u86f3 +\u879e=\u8682 +\u87a2=\u8424 +\u87ae=\u45d6 +\u87bb=\u877c +\u87bf=\u8780 +\u87c4=\u86f0 +\u87c8=\u8748 +\u87ce=\u87a8 +\u87e3=\u866e +\u87ec=\u8749 +\u87ef=\u86f2 +\u87f2=\u866b +\u87f6=\u86cf +\u87fb=\u8681 +\u8805=\u8747 +\u8806=\u867f +\u880d=\u874e +\u8810=\u86f4 +\u8811=\u877e +\u881f=\u8721 +\u8823=\u86ce +\u8828=\u87cf +\u8831=\u86ca +\u8836=\u8695 +\u883b=\u86ee +\u8846=\u4f17 +\u884a=\u8511 +\u8853=\u672f +\u8855=\u540c +\u885a=\u80e1 +\u885b=\u536b +\u885d=\u51b2 +\u8879=\u53ea +\u889e=\u886e +\u88ca=\u8885 +\u88cf=\u91cc +\u88dc=\u8865 +\u88dd=\u88c5 +\u88e1=\u91cc +\u88fd=\u5236 +\u8907=\u590d +\u890c=\u88c8 +\u8918=\u8886 +\u8932=\u88e4 +\u8933=\u88e2 +\u8938=\u891b +\u893b=\u4eb5 +\u8946=\u5e5e +\u8947=\u88e5 +\u894f=\u88af +\u8956=\u8884 +\u895d=\u88e3 +\u8960=\u88c6 +\u8964=\u8934 +\u896a=\u889c +\u896c=\u4653 +\u896f=\u886c +\u8972=\u88ad +\u898b=\u89c1 +\u898e=\u89c3 +\u898f=\u89c4 +\u8993=\u89c5 +\u8996=\u89c6 +\u8998=\u89c7 +\u89a1=\u89cb +\u89a5=\u89cd +\u89a6=\u89ce +\u89aa=\u4eb2 +\u89ac=\u89ca +\u89af=\u89cf +\u89b2=\u89d0 +\u89b7=\u89d1 +\u89ba=\u89c9 +\u89bd=\u89c8 +\u89bf=\u89cc +\u89c0=\u89c2 +\u89f4=\u89de +\u89f6=\u89ef +\u89f8=\u89e6 +\u8a01=\u8ba0 +\u8a02=\u8ba2 +\u8a03=\u8ba3 +\u8a08=\u8ba1 +\u8a0a=\u8baf +\u8a0c=\u8ba7 +\u8a0e=\u8ba8 +\u8a10=\u8ba6 +\u8a12=\u8bb1 +\u8a13=\u8bad +\u8a15=\u8baa +\u8a16=\u8bab +\u8a17=\u6258 +\u8a18=\u8bb0 +\u8a1b=\u8bb9 +\u8a1d=\u8bb6 +\u8a1f=\u8bbc +\u8a22=\u4723 +\u8a23=\u8bc0 +\u8a25=\u8bb7 +\u8a29=\u8bbb +\u8a2a=\u8bbf +\u8a2d=\u8bbe +\u8a31=\u8bb8 +\u8a34=\u8bc9 +\u8a36=\u8bc3 +\u8a3a=\u8bca +\u8a3b=\u6ce8 +\u8a41=\u8bc2 +\u8a46=\u8bcb +\u8a4e=\u8bb5 +\u8a50=\u8bc8 +\u8a52=\u8bd2 +\u8a54=\u8bcf +\u8a55=\u8bc4 +\u8a56=\u8bd0 +\u8a57=\u8bc7 +\u8a58=\u8bce +\u8a5b=\u8bc5 +\u8a5e=\u8bcd +\u8a60=\u548f +\u8a61=\u8be9 +\u8a62=\u8be2 +\u8a63=\u8be3 +\u8a66=\u8bd5 +\u8a69=\u8bd7 +\u8a6b=\u8be7 +\u8a6c=\u8bdf +\u8a6d=\u8be1 +\u8a6e=\u8be0 +\u8a70=\u8bd8 +\u8a71=\u8bdd +\u8a72=\u8be5 +\u8a73=\u8be6 +\u8a75=\u8bdc +\u8a7c=\u8bd9 +\u8a7f=\u8bd6 +\u8a84=\u8bd4 +\u8a85=\u8bdb +\u8a86=\u8bd3 +\u8a87=\u5938 +\u8a8c=\u5fd7 +\u8a8d=\u8ba4 +\u8a91=\u8bf3 +\u8a92=\u8bf6 +\u8a95=\u8bde +\u8a98=\u8bf1 +\u8a9a=\u8bee +\u8a9e=\u8bed +\u8aa0=\u8bda +\u8aa1=\u8beb +\u8aa3=\u8bec +\u8aa4=\u8bef +\u8aa5=\u8bf0 +\u8aa6=\u8bf5 +\u8aa8=\u8bf2 +\u8aaa=\u8bf4 +\u8aac=\u8bf4 +\u8ab0=\u8c01 +\u8ab2=\u8bfe +\u8ab6=\u8c07 +\u8ab9=\u8bfd +\u8abc=\u8c0a +\u8abe=\u8a1a +\u8abf=\u8c03 +\u8ac2=\u8c04 +\u8ac4=\u8c06 +\u8ac7=\u8c08 +\u8ac9=\u8bff +\u8acb=\u8bf7 +\u8acd=\u8be4 +\u8acf=\u8bf9 +\u8ad1=\u8bfc +\u8ad2=\u8c05 +\u8ad6=\u8bba +\u8ad7=\u8c02 +\u8adb=\u8c00 +\u8adc=\u8c0d +\u8add=\u8c1e +\u8ade=\u8c1d +\u8ae2=\u8be8 +\u8ae4=\u8c14 +\u8ae6=\u8c1b +\u8ae7=\u8c10 +\u8aeb=\u8c0f +\u8aed=\u8c15 +\u8aee=\u54a8 +\u8af1=\u8bb3 +\u8af3=\u8c19 +\u8af6=\u8c0c +\u8af7=\u8bbd +\u8af8=\u8bf8 +\u8afa=\u8c1a +\u8afc=\u8c16 +\u8afe=\u8bfa +\u8b00=\u8c0b +\u8b01=\u8c12 +\u8b02=\u8c13 +\u8b04=\u8a8a +\u8b05=\u8bcc +\u8b0a=\u8c0e +\u8b0e=\u8c1c +\u8b10=\u8c27 +\u8b14=\u8c11 +\u8b16=\u8c21 +\u8b17=\u8c24 +\u8b19=\u8c26 +\u8b1a=\u8c25 +\u8b1b=\u8bb2 +\u8b1d=\u8c22 +\u8b20=\u8c23 +\u8b21=\u8c23 +\u8b28=\u8c1f +\u8b2b=\u8c2a +\u8b2c=\u8c2c +\u8b2d=\u8c2b +\u8b33=\u8bb4 +\u8b39=\u8c28 +\u8b3e=\u8c29 +\u8b45=\u4727 +\u8b49=\u8bc1 +\u8b4e=\u8c32 +\u8b4f=\u8ba5 +\u8b56=\u8c2e +\u8b58=\u8bc6 +\u8b59=\u8c2f +\u8b5a=\u8c2d +\u8b5c=\u8c31 +\u8b6b=\u8c35 +\u8b6d=\u6bc1 +\u8b6f=\u8bd1 +\u8b70=\u8bae +\u8b74=\u8c34 +\u8b77=\u62a4 +\u8b78=\u8bea +\u8b7d=\u8a89 +\u8b7e=\u8c2b +\u8b80=\u8bfb +\u8b8a=\u53d8 +\u8b8e=\u4ec7 +\u8b92=\u8c17 +\u8b93=\u8ba9 +\u8b95=\u8c30 +\u8b96=\u8c36 +\u8b9a=\u8d5e +\u8b9c=\u8c20 +\u8b9e=\u8c33 +\u8c48=\u5c82 +\u8c4e=\u7ad6 +\u8c50=\u4e30 +\u8c54=\u8273 +\u8c6c=\u732a +\u8c76=\u8c6e +\u8c93=\u732b +\u8c99=\u4759 +\u8c9d=\u8d1d +\u8c9e=\u8d1e +\u8c9f=\u8d20 +\u8ca0=\u8d1f +\u8ca1=\u8d22 +\u8ca2=\u8d21 +\u8ca7=\u8d2b +\u8ca8=\u8d27 +\u8ca9=\u8d29 +\u8caa=\u8d2a +\u8cab=\u8d2f +\u8cac=\u8d23 +\u8caf=\u8d2e +\u8cb0=\u8d33 +\u8cb2=\u8d40 +\u8cb3=\u8d30 +\u8cb4=\u8d35 +\u8cb6=\u8d2c +\u8cb7=\u4e70 +\u8cb8=\u8d37 +\u8cba=\u8d36 +\u8cbb=\u8d39 +\u8cbc=\u8d34 +\u8cbd=\u8d3b +\u8cbf=\u8d38 +\u8cc0=\u8d3a +\u8cc1=\u8d32 +\u8cc2=\u8d42 +\u8cc3=\u8d41 +\u8cc4=\u8d3f +\u8cc5=\u8d45 +\u8cc7=\u8d44 +\u8cc8=\u8d3e +\u8cca=\u8d3c +\u8cd1=\u8d48 +\u8cd2=\u8d4a +\u8cd3=\u5bbe +\u8cd5=\u8d47 +\u8cd9=\u8d52 +\u8cda=\u8d49 +\u8cdc=\u8d50 +\u8cde=\u8d4f +\u8ce0=\u8d54 +\u8ce1=\u8d53 +\u8ce2=\u8d24 +\u8ce3=\u5356 +\u8ce4=\u8d31 +\u8ce6=\u8d4b +\u8ce7=\u8d55 +\u8cea=\u8d28 +\u8ceb=\u8d4d +\u8cec=\u8d26 +\u8ced=\u8d4c +\u8cf0=\u4790 +\u8cf4=\u8d56 +\u8cf5=\u8d57 +\u8cfa=\u8d5a +\u8cfb=\u8d59 +\u8cfc=\u8d2d +\u8cfd=\u8d5b +\u8cfe=\u8d5c +\u8d04=\u8d3d +\u8d05=\u8d58 +\u8d07=\u8d5f +\u8d08=\u8d60 +\u8d0a=\u8d5e +\u8d0b=\u8d5d +\u8d0d=\u8d61 +\u8d0f=\u8d62 +\u8d10=\u8d46 +\u8d13=\u8d43 +\u8d14=\u8d51 +\u8d16=\u8d4e +\u8d17=\u8d5d +\u8d1b=\u8d63 +\u8d1c=\u8d43 +\u8d6c=\u8d6a +\u8d95=\u8d76 +\u8d99=\u8d75 +\u8da8=\u8d8b +\u8db2=\u8db1 +\u8de1=\u8ff9 +\u8e10=\u8df5 +\u8e34=\u8e0a +\u8e4c=\u8dc4 +\u8e55=\u8df8 +\u8e63=\u8e52 +\u8e64=\u8e2a +\u8e7a=\u8df7 +\u8e82=\u8df6 +\u8e89=\u8db8 +\u8e8a=\u8e0c +\u8e8b=\u8dfb +\u8e8d=\u8dc3 +\u8e91=\u8e2f +\u8e92=\u8dde +\u8e93=\u8e2c +\u8e95=\u8e70 +\u8e9a=\u8df9 +\u8ea1=\u8e51 +\u8ea5=\u8e7f +\u8ea6=\u8e9c +\u8eaa=\u8e8f +\u8ec0=\u8eaf +\u8eca=\u8f66 +\u8ecb=\u8f67 +\u8ecc=\u8f68 +\u8ecd=\u519b +\u8ed1=\u8f6a +\u8ed2=\u8f69 +\u8ed4=\u8f6b +\u8edb=\u8f6d +\u8edf=\u8f6f +\u8ee4=\u8f77 +\u8eeb=\u8f78 +\u8ef2=\u8f71 +\u8ef8=\u8f74 +\u8ef9=\u8f75 +\u8efa=\u8f7a +\u8efb=\u8f72 +\u8efc=\u8f76 +\u8efe=\u8f7c +\u8f03=\u8f83 +\u8f05=\u8f82 +\u8f07=\u8f81 +\u8f08=\u8f80 +\u8f09=\u8f7d +\u8f0a=\u8f7e +\u8f12=\u8f84 +\u8f13=\u633d +\u8f14=\u8f85 +\u8f15=\u8f7b +\u8f1b=\u8f86 +\u8f1c=\u8f8e +\u8f1d=\u8f89 +\u8f1e=\u8f8b +\u8f1f=\u8f8d +\u8f25=\u8f8a +\u8f26=\u8f87 +\u8f29=\u8f88 +\u8f2a=\u8f6e +\u8f2c=\u8f8c +\u8f2f=\u8f91 +\u8f33=\u8f8f +\u8f38=\u8f93 +\u8f3b=\u8f90 +\u8f3e=\u8f97 +\u8f3f=\u8206 +\u8f40=\u8f92 +\u8f42=\u6bc2 +\u8f44=\u8f96 +\u8f45=\u8f95 +\u8f46=\u8f98 +\u8f49=\u8f6c +\u8f4d=\u8f99 +\u8f4e=\u8f7f +\u8f54=\u8f9a +\u8f5f=\u8f70 +\u8f61=\u8f94 +\u8f62=\u8f79 +\u8f64=\u8f73 +\u8fa6=\u529e +\u8fad=\u8f9e +\u8fae=\u8fab +\u8faf=\u8fa9 +\u8fb2=\u519c +\u8ff4=\u56de +\u9015=\u8ff3 +\u9019=\u8fd9 +\u9023=\u8fde +\u9031=\u5468 +\u9032=\u8fdb +\u904a=\u6e38 +\u904b=\u8fd0 +\u904e=\u8fc7 +\u9054=\u8fbe +\u9055=\u8fdd +\u9059=\u9065 +\u905c=\u900a +\u905e=\u9012 +\u9060=\u8fdc +\u9061=\u6eaf +\u9069=\u9002 +\u9072=\u8fdf +\u9077=\u8fc1 +\u9078=\u9009 +\u907a=\u9057 +\u907c=\u8fbd +\u9081=\u8fc8 +\u9084=\u8fd8 +\u9087=\u8fe9 +\u908a=\u8fb9 +\u908f=\u903b +\u9090=\u9026 +\u90df=\u90cf +\u90f5=\u90ae +\u9106=\u90d3 +\u9109=\u4e61 +\u9112=\u90b9 +\u9114=\u90ac +\u9116=\u90e7 +\u9127=\u9093 +\u912d=\u90d1 +\u9130=\u90bb +\u9132=\u90f8 +\u9134=\u90ba +\u9136=\u90d0 +\u913a=\u909d +\u9147=\u9142 +\u9148=\u90e6 +\u9196=\u915d +\u919c=\u4e11 +\u919e=\u915d +\u91a3=\u7cd6 +\u91ab=\u533b +\u91ac=\u9171 +\u91af=\u9170 +\u91b1=\u9166 +\u91c0=\u917f +\u91c1=\u8845 +\u91c3=\u917e +\u91c5=\u917d +\u91cb=\u91ca +\u91d0=\u5398 +\u91d2=\u9485 +\u91d3=\u9486 +\u91d4=\u9487 +\u91d5=\u948c +\u91d7=\u948a +\u91d8=\u9489 +\u91d9=\u948b +\u91dd=\u9488 +\u91e3=\u9493 +\u91e4=\u9490 +\u91e7=\u948f +\u91e9=\u9492 +\u91f3=\ud863\udc3f +\u91f5=\u9497 +\u91f7=\u948d +\u91f9=\u9495 +\u91fa=\u948e +\u91fe=\u497a +\u9200=\u94af +\u9201=\u94ab +\u9203=\u9498 +\u9204=\u94ad +\u9208=\u949a +\u9209=\u94a0 +\u920b=\ud863\udc42 +\u920d=\u949d +\u920e=\u94a9 +\u9210=\u94a4 +\u9211=\u94a3 +\u9212=\u9491 +\u9214=\u949e +\u9215=\u94ae +\u921e=\u94a7 +\u9220=\ud863\udc41 +\u9223=\u9499 +\u9225=\u94ac +\u9226=\u949b +\u9227=\u94aa +\u922e=\u94cc +\u922f=\ud863\udc44 +\u9230=\u94c8 +\u9232=\ud863\udc43 +\u9233=\u94b6 +\u9234=\u94c3 +\u9237=\u94b4 +\u9238=\u94b9 +\u9239=\u94cd +\u923a=\u94b0 +\u923d=\u94b8 +\u923e=\u94c0 +\u923f=\u94bf +\u9240=\u94be +\u9241=\ud863\udc45 +\u9245=\u949c +\u9248=\u94ca +\u9249=\u94c9 +\u924b=\u94c7 +\u924d=\u94cb +\u9251=\u94c2 +\u9255=\u94b7 +\u9257=\u94b3 +\u925a=\u94c6 +\u925b=\u94c5 +\u925e=\u94ba +\u9262=\u94b5 +\u9264=\u94a9 +\u9266=\u94b2 +\u926c=\u94bc +\u926d=\u94bd +\u9276=\u94cf +\u9278=\u94f0 +\u927a=\u94d2 +\u927b=\u94ec +\u927f=\u94ea +\u9280=\u94f6 +\u9283=\u94f3 +\u9285=\u94dc +\u928d=\u94da +\u9291=\u94e3 +\u9293=\u94e8 +\u9296=\u94e2 +\u9298=\u94ed +\u929a=\u94eb +\u929b=\u94e6 +\u929c=\u8854 +\u92a0=\u94d1 +\u92a3=\u94f7 +\u92a5=\u94f1 +\u92a6=\u94df +\u92a8=\u94f5 +\u92a9=\u94e5 +\u92aa=\u94d5 +\u92ab=\u94ef +\u92ac=\u94d0 +\u92b1=\u94de +\u92b3=\u9510 +\u92b6=\ud863\udc47 +\u92b7=\u9500 +\u92b9=\u9508 +\u92bb=\u9511 +\u92bc=\u9509 +\u92c1=\u94dd +\u92c3=\u9512 +\u92c5=\u950c +\u92c7=\u94a1 +\u92c9=\ud863\udc48 +\u92cc=\u94e4 +\u92cf=\u94d7 +\u92d2=\u950b +\u92d9=\u94fb +\u92dd=\u950a +\u92df=\u9513 +\u92e3=\u94d8 +\u92e4=\u9504 +\u92e5=\u9503 +\u92e6=\u9514 +\u92e8=\u9507 +\u92e9=\u94d3 +\u92ea=\u94fa +\u92ed=\u9510 +\u92ee=\u94d6 +\u92ef=\u9506 +\u92f0=\u9502 +\u92f1=\u94fd +\u92f6=\u950d +\u92f8=\u952f +\u92fc=\u94a2 +\u9301=\u951e +\u9302=\ud863\udc4b +\u9304=\u5f55 +\u9306=\u9516 +\u9307=\u952b +\u9308=\u9529 +\u930f=\u94d4 +\u9310=\u9525 +\u9312=\u9515 +\u9315=\u951f +\u9318=\u9524 +\u9319=\u9531 +\u931a=\u94ee +\u931b=\u951b +\u931f=\u952c +\u9320=\u952d +\u9321=\u951c +\u9322=\u94b1 +\u9326=\u9526 +\u9328=\u951a +\u9329=\u9520 +\u932b=\u9521 +\u932e=\u9522 +\u932f=\u9519 +\u9332=\u5f55 +\u9333=\u9530 +\u9336=\u8868 +\u9338=\u94fc +\u9340=\u951d +\u9341=\u9528 +\u9343=\u952a +\u9344=\ud863\udc49 +\u9346=\u9494 +\u9347=\u9534 +\u9348=\u9533 +\u934a=\u70bc +\u934b=\u9505 +\u934d=\u9540 +\u9354=\u9537 +\u9358=\u94e1 +\u935a=\u9496 +\u935b=\u953b +\u9360=\u953d +\u9364=\u9538 +\u9365=\u9532 +\u9369=\u9518 +\u936c=\u9539 +\u936e=\ud863\udc4e +\u9370=\u953e +\u9375=\u952e +\u9376=\u9536 +\u937a=\u9517 +\u937e=\u949f +\u9382=\u9541 +\u9384=\u953f +\u9387=\u9545 +\u938a=\u9551 +\u938c=\u9570 +\u9394=\u9555 +\u9396=\u9501 +\u9398=\u9549 +\u939a=\u9524 +\u939b=\u9548 +\u939d=\ud863\udc4f +\u93a1=\u9543 +\u93a2=\u94a8 +\u93a3=\u84e5 +\u93a6=\u954f +\u93a7=\u94e0 +\u93a9=\u94e9 +\u93aa=\u953c +\u93ac=\u9550 +\u93ae=\u9547 +\u93af=\ud863\udc4d +\u93b0=\u9552 +\u93b2=\u954b +\u93b3=\u954d +\u93b5=\u9553 +\u93b7=\ud863\udc3e +\u93b8=\u954c +\u93bf=\u954e +\u93c3=\u955e +\u93c6=\ud863\udc4c +\u93c7=\u955f +\u93c8=\u94fe +\u93c9=\ud863\udc52 +\u93cc=\u9546 +\u93cd=\u9559 +\u93d0=\u9560 +\u93d1=\u955d +\u93d7=\u94ff +\u93d8=\u9535 +\u93da=\u621a +\u93dc=\u9557 +\u93dd=\u9558 +\u93de=\u955b +\u93df=\u94f2 +\u93e1=\u955c +\u93e2=\u9556 +\u93e4=\u9542 +\u93e8=\u933e +\u93f0=\u955a +\u93f5=\u94e7 +\u93f7=\u9564 +\u93f9=\u956a +\u93fa=\u497d +\u93fd=\u9508 +\u9403=\u94d9 +\u940b=\u94f4 +\u940e=\ud863\udc53 +\u940f=\ud863\udc54 +\u9410=\u9563 +\u9412=\u94f9 +\u9413=\u9566 +\u9414=\u9561 +\u9418=\u949f +\u9419=\u956b +\u941d=\u9562 +\u9420=\u9568 +\u9425=\u4985 +\u9426=\u950e +\u9427=\u950f +\u9428=\u9544 +\u942b=\u954c +\u942e=\u9570 +\u942f=\u4983 +\u9432=\u956f +\u9433=\u956d +\u9435=\u94c1 +\u9436=\u956e +\u9438=\u94ce +\u943a=\u94db +\u943f=\u9571 +\u9444=\u94f8 +\u944a=\u956c +\u944c=\u9554 +\u9451=\u9274 +\u9452=\u9274 +\u9454=\u9572 +\u9455=\u9527 +\u945e=\u9574 +\u9460=\u94c4 +\u9463=\u9573 +\u9465=\u9565 +\u946d=\u9567 +\u9470=\u94a5 +\u9471=\u9575 +\u9472=\u9576 +\u9477=\u954a +\u9479=\u9569 +\u947c=\u9523 +\u947d=\u94bb +\u947e=\u92ae +\u947f=\u51ff +\u9481=\u9562 +\u955f=\u65cb +\u9577=\u957f +\u9580=\u95e8 +\u9582=\u95e9 +\u9583=\u95ea +\u9586=\u95eb +\u9588=\u95ec +\u9589=\u95ed +\u958b=\u5f00 +\u958c=\u95f6 +\u958d=\ud863\ude02 +\u958e=\u95f3 +\u958f=\u95f0 +\u9590=\ud863\ude03 +\u9591=\u95f2 +\u9592=\u95f2 +\u9593=\u95f4 +\u9594=\u95f5 +\u9598=\u95f8 +\u95a1=\u9602 +\u95a3=\u9601 +\u95a4=\u5408 +\u95a5=\u9600 +\u95a8=\u95fa +\u95a9=\u95fd +\u95ab=\u9603 +\u95ac=\u9606 +\u95ad=\u95fe +\u95b1=\u9605 +\u95b2=\u9605 +\u95b6=\u960a +\u95b9=\u9609 +\u95bb=\u960e +\u95bc=\u960f +\u95bd=\u960d +\u95be=\u9608 +\u95bf=\u960c +\u95c3=\u9612 +\u95c6=\u677f +\u95c8=\u95f1 +\u95ca=\u9614 +\u95cb=\u9615 +\u95cc=\u9611 +\u95cd=\u9607 +\u95d0=\u9617 +\u95d2=\u9618 +\u95d3=\u95ff +\u95d4=\u9616 +\u95d5=\u9619 +\u95d6=\u95ef +\u95dc=\u5173 +\u95de=\u961a +\u95e0=\u9613 +\u95e1=\u9610 +\u95e2=\u8f9f +\u95e4=\u961b +\u95e5=\u95fc +\u9658=\u9649 +\u965d=\u9655 +\u965e=\u5347 +\u9663=\u9635 +\u9670=\u9634 +\u9673=\u9648 +\u9678=\u9646 +\u967d=\u9633 +\u9689=\u9667 +\u968a=\u961f +\u968e=\u9636 +\u9695=\u9668 +\u969b=\u9645 +\u96a8=\u968f +\u96aa=\u9669 +\u96b1=\u9690 +\u96b4=\u9647 +\u96b8=\u96b6 +\u96bb=\u53ea +\u96cb=\u96bd +\u96d6=\u867d +\u96d9=\u53cc +\u96db=\u96cf +\u96dc=\u6742 +\u96de=\u9e21 +\u96e2=\u79bb +\u96e3=\u96be +\u96f2=\u4e91 +\u96fb=\u7535 +\u9722=\u9721 +\u9727=\u96fe +\u973d=\u9701 +\u9742=\u96f3 +\u9744=\u972d +\u9748=\u7075 +\u975a=\u9753 +\u975c=\u9759 +\u9766=\u817c +\u9768=\u9765 +\u9780=\u9f17 +\u978f=\u5de9 +\u979d=\u7ef1 +\u97a6=\u79cb +\u97bd=\u9792 +\u97c1=\u7f30 +\u97c3=\u9791 +\u97c6=\u5343 +\u97c9=\u97af +\u97cb=\u97e6 +\u97cc=\u97e7 +\u97cd=\u97e8 +\u97d3=\u97e9 +\u97d9=\u97ea +\u97dc=\u97ec +\u97dd=\u97b2 +\u97de=\u97eb +\u97fb=\u97f5 +\u97ff=\u54cd +\u9801=\u9875 +\u9802=\u9876 +\u9803=\u9877 +\u9805=\u9879 +\u9806=\u987a +\u9807=\u9878 +\u9808=\u987b +\u980a=\u987c +\u980c=\u9882 +\u980e=\u9880 +\u980f=\u9883 +\u9810=\u9884 +\u9811=\u987d +\u9812=\u9881 +\u9813=\u987f +\u9817=\u9887 +\u9818=\u9886 +\u981c=\u988c +\u9821=\u9889 +\u9824=\u9890 +\u9826=\u988f +\u982d=\u5934 +\u982e=\u9892 +\u9830=\u988a +\u9832=\u988b +\u9834=\u9895 +\u9837=\u9894 +\u9838=\u9888 +\u9839=\u9893 +\u983b=\u9891 +\u983d=\u9893 +\u9843=\ud865\udd96 +\u9846=\u9897 +\u984c=\u9898 +\u984d=\u989d +\u984e=\u989a +\u984f=\u989c +\u9852=\u9899 +\u9853=\u989b +\u9854=\u989c +\u9858=\u613f +\u9859=\u98a1 +\u985b=\u98a0 +\u985e=\u7c7b +\u9862=\u989f +\u9865=\u98a2 +\u9867=\u987e +\u986b=\u98a4 +\u986c=\u98a5 +\u986f=\u663e +\u9870=\u98a6 +\u9871=\u9885 +\u9873=\u989e +\u9874=\u98a7 +\u98a8=\u98ce +\u98ad=\u98d0 +\u98ae=\u98d1 +\u98af=\u98d2 +\u98b0=\ud865\ude65 +\u98b1=\u53f0 +\u98b3=\u522e +\u98b6=\u98d3 +\u98b7=\ud865\ude6a +\u98b8=\u98d4 +\u98ba=\u98cf +\u98bb=\u98d6 +\u98bc=\u98d5 +\u98be=\ud865\ude6b +\u98c0=\u98d7 +\u98c4=\u98d8 +\u98c6=\u98d9 +\u98c8=\u98da +\u98db=\u98de +\u98e0=\u9963 +\u98e2=\u9965 +\u98e3=\u9964 +\u98e5=\u9966 +\u98e9=\u9968 +\u98ea=\u996a +\u98eb=\u996b +\u98ed=\u996c +\u98ef=\u996d +\u98f1=\u98e7 +\u98f2=\u996e +\u98f4=\u9974 +\u98fc=\u9972 +\u98fd=\u9971 +\u98fe=\u9970 +\u98ff=\u9973 +\u9903=\u997a +\u9904=\u9978 +\u9905=\u997c +\u9909=\u9977 +\u990a=\u517b +\u990c=\u9975 +\u990e=\u9979 +\u990f=\u997b +\u9911=\u997d +\u9912=\u9981 +\u9913=\u997f +\u9915=\u9982 +\u9916=\u997e +\u9918=\u4f59 +\u991a=\u80b4 +\u991b=\u9984 +\u991c=\u9983 +\u991e=\u996f +\u9921=\u9985 +\u9928=\u9986 +\u9931=\u7cc7 +\u9933=\u9967 +\u9935=\u5582 +\u9936=\u9989 +\u9937=\u9987 +\u9938=\ud866\udc0c +\u993a=\u998e +\u993c=\u9969 +\u993e=\u998f +\u993f=\u998a +\u9941=\u998c +\u9943=\u998d +\u9945=\u9992 +\u9948=\u9990 +\u9949=\u9991 +\u994a=\u9993 +\u994b=\u9988 +\u994c=\u9994 +\u9951=\u9965 +\u9952=\u9976 +\u9957=\u98e8 +\u995c=\u990d +\u995e=\u998b +\u9962=\u9995 +\u99ac=\u9a6c +\u99ad=\u9a6d +\u99ae=\u51af +\u99b1=\u9a6e +\u99b3=\u9a70 +\u99b4=\u9a6f +\u99b9=\u9a72 +\u99c1=\u9a73 +\u99ce=\ud866\udde8 +\u99d0=\u9a7b +\u99d1=\u9a7d +\u99d2=\u9a79 +\u99d4=\u9a75 +\u99d5=\u9a7e +\u99d8=\u9a80 +\u99d9=\u9a78 +\u99da=\ud866\uddeb +\u99db=\u9a76 +\u99dd=\u9a7c +\u99df=\u9a77 +\u99e1=\u9a82 +\u99e2=\u9a88 +\u99e7=\ud866\uddf2 +\u99e9=\ud866\uddf4 +\u99ed=\u9a87 +\u99f0=\u9a83 +\u99f1=\u9a86 +\u99f6=\ud866\uddfa +\u99f8=\u9a8e +\u99ff=\u9a8f +\u9a01=\u9a8b +\u9a02=\u9a8d +\u9a05=\u9a93 +\u9a0c=\u9a94 +\u9a0d=\u9a92 +\u9a0e=\u9a91 +\u9a0f=\u9a90 +\u9a14=\ud866\ude00 +\u9a16=\u9a9b +\u9a19=\u9a97 +\u9a1a=\ud866\ude0a +\u9a1d=\ud866\ude03 +\u9a1f=\ud866\ude08 +\u9a24=\u9a99 +\u9a27=\u4bc4 +\u9a2a=\ud866\ude04 +\u9a2b=\u9a9e +\u9a2d=\u9a98 +\u9a2e=\u9a9d +\u9a30=\u817e +\u9a36=\u9a7a +\u9a37=\u9a9a +\u9a38=\u9a9f +\u9a3e=\u9aa1 +\u9a40=\u84e6 +\u9a41=\u9a9c +\u9a42=\u9a96 +\u9a43=\u9aa0 +\u9a44=\u9aa2 +\u9a45=\u9a71 +\u9a4a=\u9a85 +\u9a4b=\ud866\uddef +\u9a4c=\u9a95 +\u9a4d=\u9a81 +\u9a4f=\u9aa3 +\u9a55=\u9a84 +\u9a57=\u9a8c +\u9a5a=\u60ca +\u9a5b=\u9a7f +\u9a5f=\u9aa4 +\u9a62=\u9a74 +\u9a64=\u9aa7 +\u9a65=\u9aa5 +\u9a66=\u9aa6 +\u9a6a=\u9a8a +\u9a6b=\u9a89 +\u9aaf=\u80ae +\u9acf=\u9ac5 +\u9ad2=\u810f +\u9ad4=\u4f53 +\u9ad5=\u9acc +\u9ad6=\u9acb +\u9aee=\u53d1 +\u9b06=\u677e +\u9b0d=\u80e1 +\u9b1a=\u987b +\u9b22=\u9b13 +\u9b25=\u6597 +\u9b27=\u95f9 +\u9b28=\u54c4 +\u9b29=\u960b +\u9b2e=\u9604 +\u9b31=\u90c1 +\u9b4e=\u9b49 +\u9b58=\u9b47 +\u9b5a=\u9c7c +\u9b5b=\u9c7d +\u9b62=\u9c7e +\u9b65=\ud867\udf79 +\u9b68=\u9c80 +\u9b6f=\u9c81 +\u9b74=\u9c82 +\u9b77=\u9c7f +\u9b7a=\u9c84 +\u9b81=\u9c85 +\u9b83=\u9c86 +\u9b8a=\u9c8c +\u9b8b=\u9c89 +\u9b8d=\u9c8f +\u9b8e=\u9c87 +\u9b90=\u9c90 +\u9b91=\u9c8d +\u9b92=\u9c8b +\u9b93=\u9c8a +\u9b95=\ud867\udf80 +\u9b9a=\u9c92 +\u9b9c=\u9c98 +\u9b9d=\u9c9e +\u9b9e=\u9c95 +\u9b9f=\ud867\udf7e +\u9ba3=\u4c9f +\u9ba6=\u9c96 +\u9baa=\u9c94 +\u9bab=\u9c9b +\u9bad=\u9c91 +\u9bae=\u9c9c +\u9bb3=\u9c93 +\u9bb6=\u9caa +\u9bb8=\ud867\udf83 +\u9bba=\u9c9d +\u9bc0=\u9ca7 +\u9bc1=\u9ca0 +\u9bc4=\ud867\udf81 +\u9bc7=\u9ca9 +\u9bc9=\u9ca4 +\u9bca=\u9ca8 +\u9bd2=\u9cac +\u9bd4=\u9cbb +\u9bd5=\u9caf +\u9bd6=\u9cad +\u9bd7=\u9c9e +\u9bdb=\u9cb7 +\u9bdd=\u9cb4 +\u9be1=\u9cb1 +\u9be2=\u9cb5 +\u9be4=\u9cb2 +\u9be7=\u9cb3 +\u9be8=\u9cb8 +\u9bea=\u9cae +\u9beb=\u9cb0 +\u9bf0=\u9c87 +\u9bf1=\ud867\udf87 +\u9bf4=\u9cba +\u9bf6=\ud867\udf7c +\u9bf7=\u9cc0 +\u9bfd=\u9cab +\u9bff=\u9cca +\u9c01=\u9cc8 +\u9c02=\u9c97 +\u9c03=\u9cc2 +\u9c06=\u4ca0 +\u9c08=\u9cbd +\u9c09=\u9cc7 +\u9c0c=\u4ca1 +\u9c0d=\u9cc5 +\u9c0f=\u9cbe +\u9c10=\u9cc4 +\u9c12=\u9cc6 +\u9c13=\u9cc3 +\u9c1c=\u9cd2 +\u9c1f=\u9cd1 +\u9c20=\u9ccb +\u9c23=\u9ca5 +\u9c25=\u9ccf +\u9c27=\u4ca2 +\u9c28=\u9cce +\u9c29=\u9cd0 +\u9c2d=\u9ccd +\u9c2e=\u9cc1 +\u9c31=\u9ca2 +\u9c32=\u9ccc +\u9c33=\u9cd3 +\u9c35=\u9cd8 +\u9c37=\u9ca6 +\u9c39=\u9ca3 +\u9c3a=\u9cb9 +\u9c3b=\u9cd7 +\u9c3c=\u9cdb +\u9c3e=\u9cd4 +\u9c42=\u9cc9 +\u9c45=\u9cd9 +\u9c47=\ud867\udf8c +\u9c48=\u9cd5 +\u9c49=\u9cd6 +\u9c52=\u9cdf +\u9c54=\u9cdd +\u9c56=\u9cdc +\u9c57=\u9cde +\u9c58=\u9c9f +\u9c5d=\u9cbc +\u9c5f=\u9c8e +\u9c60=\u9c99 +\u9c63=\u9ce3 +\u9c64=\u9ce1 +\u9c67=\u9ce2 +\u9c68=\u9cbf +\u9c6d=\u9c9a +\u9c6f=\u9ce0 +\u9c77=\u9cc4 +\u9c78=\u9c88 +\u9c7a=\u9ca1 +\u9ce5=\u9e1f +\u9ce7=\u51eb +\u9ce9=\u9e20 +\u9cec=\u51eb +\u9cf2=\u9e24 +\u9cf3=\u51e4 +\u9cf4=\u9e23 +\u9cf6=\u9e22 +\u9cfc=\ud868\ude43 +\u9cfe=\u4d13 +\u9d06=\u9e29 +\u9d07=\u9e28 +\u9d09=\u9e26 +\u9d12=\u9e30 +\u9d15=\u9e35 +\u9d1b=\u9e33 +\u9d1c=\ud868\ude48 +\u9d1d=\u9e32 +\u9d1e=\u9e2e +\u9d1f=\u9e31 +\u9d23=\u9e2a +\u9d26=\u9e2f +\u9d28=\u9e2d +\u9d2f=\u9e38 +\u9d30=\u9e39 +\u9d32=\ud868\ude46 +\u9d34=\u9e3b +\u9d37=\u4d15 +\u9d3b=\u9e3f +\u9d3f=\u9e3d +\u9d41=\u4d14 +\u9d42=\u9e3a +\u9d43=\u9e3c +\u9d50=\u9e40 +\u9d51=\u9e43 +\u9d52=\u9e46 +\u9d53=\u9e41 +\u9d5a=\ud868\ude4d +\u9d5c=\u9e48 +\u9d5d=\u9e45 +\u9d60=\u9e44 +\u9d61=\u9e49 +\u9d6a=\u9e4c +\u9d6c=\u9e4f +\u9d6e=\u9e50 +\u9d6f=\u9e4e +\u9d70=\u96d5 +\u9d72=\u9e4a +\u9d77=\u9e53 +\u9d7e=\u9e4d +\u9d84=\u4d16 +\u9d87=\u9e2b +\u9d89=\u9e51 +\u9d8a=\u9e52 +\u9d93=\u9e4b +\u9d96=\u9e59 +\u9d98=\u9e55 +\u9d9a=\u9e57 +\u9da1=\u9e56 +\u9da5=\u9e5b +\u9da9=\u9e5c +\u9daa=\u4d17 +\u9dac=\u9e27 +\u9daf=\u83ba +\u9db2=\u9e5f +\u9db4=\u9e64 +\u9db9=\u9e60 +\u9dba=\u9e61 +\u9dbb=\u9e58 +\u9dbc=\u9e63 +\u9dbf=\u9e5a +\u9dc0=\u9e5a +\u9dc1=\u9e62 +\u9dc2=\u9e5e +\u9dc4=\u9e21 +\u9dc8=\u4d18 +\u9dca=\u9e5d +\u9dd3=\u9e67 +\u9dd4=\ud868\ude51 +\u9dd6=\u9e65 +\u9dd7=\u9e25 +\u9dd9=\u9e37 +\u9dda=\u9e68 +\u9de5=\u9e36 +\u9de6=\u9e6a +\u9de8=\ud868\ude4a +\u9deb=\u9e54 +\u9def=\u9e69 +\u9df2=\u9e6b +\u9df3=\u9e47 +\u9df8=\u9e6c +\u9df9=\u9e70 +\u9dfa=\u9e6d +\u9dfd=\u9e34 +\u9dff=\u4d19 +\u9e02=\u3d89 +\u9e07=\u9e6f +\u9e0c=\u9e71 +\u9e0f=\u9e72 +\u9e15=\u9e2c +\u9e18=\u9e74 +\u9e1a=\u9e66 +\u9e1b=\u9e73 +\u9e1d=\u9e42 +\u9e1e=\u9e3e +\u9e75=\u5364 +\u9e79=\u54b8 +\u9e7a=\u9e7e +\u9e7c=\u78b1 +\u9e7d=\u76d0 +\u9e97=\u4e3d +\u9ea5=\u9ea6 +\u9ea8=\ud868\udf8a +\u9ea9=\u9eb8 +\u9eaa=\u9762 +\u9eab=\u9762 +\u9eaf=\u66f2 +\u9eb2=\ud868\udf89 +\u9eb3=\ud868\udf8c +\u9eb4=\u66f2 +\u9eb5=\u9762 +\u9ebc=\u4e48 +\u9ebd=\u4e48 +\u9ec3=\u9ec4 +\u9ecc=\u9ec9 +\u9ede=\u70b9 +\u9ee8=\u515a +\u9ef2=\u9eea +\u9ef4=\u9709 +\u9ef6=\u9ee1 +\u9ef7=\u9ee9 +\u9efd=\u9efe +\u9eff=\u9f0b +\u9f09=\u9f0d +\u9f15=\u51ac +\u9f34=\u9f39 +\u9f47=\u9f44 +\u9f4a=\u9f50 +\u9f4b=\u658b +\u9f4e=\u8d4d +\u9f4f=\u9f51 +\u9f52=\u9f7f +\u9f54=\u9f80 +\u9f55=\u9f81 +\u9f57=\u9f82 +\u9f59=\u9f85 +\u9f5c=\u9f87 +\u9f5f=\u9f83 +\u9f60=\u9f86 +\u9f61=\u9f84 +\u9f63=\u51fa +\u9f66=\u9f88 +\u9f6a=\u9f8a +\u9f6c=\u9f89 +\u9f72=\u9f8b +\u9f76=\u816d +\u9f77=\u9f8c +\u9f8d=\u9f99 +\u9f8e=\u5390 +\u9f90=\u5e9e +\u9f94=\u9f9a +\u9f95=\u9f9b +\u9f9c=\u9f9f +\ud845\udfb5=\u36df +\ud846\udc39=\u36ff +\ud846\udc83=\u36e0 +\ud847\uded5=\u5c81 +\ud852\udeba=\u3ed8 +\ud852\udee9=\u3ecf +\ud85a\ude99=\u447d +\ud85d\udf35=\u464a +\ud85d\udf5e=\u461b +\ud85e\ude59=\u4725 +\ud85f\udd73=\u478c +\ud860\udee2=\u4882 +\ud862\udd5b=\ud863\udc40 +\ud862\uddab=\u4980 +\ud862\udddc=\u4981 +\ud862\uddf1=\ud863\udc4a +\ud862\uded2=\ud863\udc50 +\ud862\udf82=\ud863\udc55 +\ud862\udfc5=\u497f +\ud864\udfa2=\ud864\udffe +\ud864\udfea=\ud864\udffd +\ud865\udce3=\ud865\udd95 +\ud865\uddc0=\ud865\ude66 +\ud865\udde1=\ud865\ude67 +\ud865\ude00=\ud865\ude69 +\ud865\ude1d=\ud865\ude6d +\ud865\ude39=\ud865\ude68 +\ud865\ude3a=\ud865\ude6c +\ud865\ude48=\ud865\ude70 +\ud865\udf26=\ud866\udc06 +\ud865\udf54=\ud866\udc0b +\ud865\udfaf=\u4b6a +\ud865\udfd0=\ud866\udc05 +\ud866\udc7a=\ud866\udde6 +\ud866\udca1=\ud866\uddec +\ud866\udcb4=\ud866\uddf5 +\ud866\udcb8=\ud866\uddf3 +\ud866\udcbe=\ud866\uddee +\ud866\udccf=\ud866\uddf6 +\ud866\udcd1=\u4bc3 +\ud866\udcf5=\ud866\uddfb +\ud866\udcfa=\ud866\uddfc +\ud866\udd0a=\ud866\udde9 +\ud866\udd19=\ud866\ude06 +\ud866\udd32=\ud866\ude09 +\ud866\udd38=\ud866\ude05 +\ud866\udd44=\ud866\ude0b +\ud866\udd47=\ud866\ude0d +\ud866\udd49=\ud866\uddf1 +\ud866\udd51=\ud866\ude0c +\ud866\uddc6=\ud866\ude10 +\ud867\udd69=\ud867\udf7a +\ud867\udd79=\ud867\udf7b +\ud867\udd98=\u4c9e +\ud867\uddb0=\ud867\udf7f +\ud867\uddb1=\ud867\udf7d +\ud867\uddf0=\ud867\udf84 +\ud867\ude03=\ud867\udf85 +\ud867\ude26=\ud867\udf86 +\ud867\udf47=\ud867\udf8e +\ud867\udfea=\ud868\ude44 +\ud868\udc26=\ud868\ude45 +\ud868\udc3e=\ud868\ude4b +\ud868\udc48=\ud868\ude49 +\ud868\udc56=\ud868\ude4c +\ud868\udc86=\ud868\ude4e +\ud868\udccd=\ud868\ude50 +\ud868\udccf=\ud868\ude4f +\ud868\udd06=\ud868\ude54 +\ud868\udd15=\ud868\ude52 +\ud868\uddf3=\ud868\ude55 +\ud869\ude00=\ud869\ude8f +\ud869\ude2f=\ud869\ude90 +\u300a\u6613\u4e7e=\u300a\u6613\u4e7e +\u4e0d\u8457\u75d5\u8de1=\u4e0d\u7740\u75d5\u8ff9 +\u4e0d\u8457\u908a\u969b=\u4e0d\u7740\u8fb9\u9645 +\u8207\u8457=\u4e0e\u7740 +\u8207\u8457\u66f8=\u4e0e\u8457\u4e66 +\u8207\u8457\u4f5c=\u4e0e\u8457\u4f5c +\u8207\u8457\u540d=\u4e0e\u8457\u540d +\u8207\u8457\u9304=\u4e0e\u8457\u5f55 +\u8207\u8457\u7a31=\u4e0e\u8457\u79f0 +\u8207\u8457\u8005=\u4e0e\u8457\u8005 +\u8207\u8457\u8ff0=\u4e0e\u8457\u8ff0 +\u4e11\u8457=\u4e11\u7740 +\u4e11\u8457\u66f8=\u4e11\u8457\u4e66 +\u4e11\u8457\u4f5c=\u4e11\u8457\u4f5c +\u4e11\u8457\u540d=\u4e11\u8457\u540d +\u4e11\u8457\u9304=\u4e11\u8457\u5f55 +\u4e11\u8457\u7a31=\u4e11\u8457\u79f0 +\u4e11\u8457\u8005=\u4e11\u8457\u8005 +\u4e11\u8457\u8ff0=\u4e11\u8457\u8ff0 +\u5c08\u8457=\u4e13\u8457 +\u81e8\u8457=\u4e34\u7740 +\u81e8\u8457\u66f8=\u4e34\u8457\u4e66 +\u81e8\u8457\u4f5c=\u4e34\u8457\u4f5c +\u81e8\u8457\u540d=\u4e34\u8457\u540d +\u81e8\u8457\u9304=\u4e34\u8457\u5f55 +\u81e8\u8457\u7a31=\u4e34\u8457\u79f0 +\u81e8\u8457\u8005=\u4e34\u8457\u8005 +\u81e8\u8457\u8ff0=\u4e34\u8457\u8ff0 +\u9e97\u8457=\u4e3d\u7740 +\u9e97\u8457\u66f8=\u4e3d\u8457\u4e66 +\u9e97\u8457\u4f5c=\u4e3d\u8457\u4f5c +\u9e97\u8457\u540d=\u4e3d\u8457\u540d +\u9e97\u8457\u9304=\u4e3d\u8457\u5f55 +\u9e97\u8457\u7a31=\u4e3d\u8457\u79f0 +\u9e97\u8457\u8005=\u4e3d\u8457\u8005 +\u9e97\u8457\u8ff0=\u4e3d\u8457\u8ff0 +\u6a02\u8457=\u4e50\u7740 +\u6a02\u8457\u66f8=\u4e50\u8457\u4e66 +\u6a02\u8457\u4f5c=\u4e50\u8457\u4f5c +\u6a02\u8457\u540d=\u4e50\u8457\u540d +\u6a02\u8457\u9304=\u4e50\u8457\u5f55 +\u6a02\u8457\u7a31=\u4e50\u8457\u79f0 +\u6a02\u8457\u8005=\u4e50\u8457\u8005 +\u6a02\u8457\u8ff0=\u4e50\u8457\u8ff0 +\u4e58\u8457=\u4e58\u7740 +\u4e58\u8457\u66f8=\u4e58\u8457\u4e66 +\u4e58\u8457\u4f5c=\u4e58\u8457\u4f5c +\u4e58\u8457\u540d=\u4e58\u8457\u540d +\u4e58\u8457\u9304=\u4e58\u8457\u5f55 +\u4e58\u8457\u7a31=\u4e58\u8457\u79f0 +\u4e58\u8457\u8005=\u4e58\u8457\u8005 +\u4e58\u8457\u8ff0=\u4e58\u8457\u8ff0 +\u4e7e\u4e0a\u4e7e\u4e0b=\u4e7e\u4e0a\u4e7e\u4e0b +\u4e7e\u70ba\u5929=\u4e7e\u4e3a\u5929 +\u4e7e\u70ba\u967d=\u4e7e\u4e3a\u9633 +\u4e7e\u4e5d=\u4e7e\u4e5d +\u4e7e\u4e7e=\u4e7e\u4e7e +\u4e7e\u4ea8=\u4e7e\u4ea8 +\u4e7e\u5100=\u4e7e\u4eea +\u4e7e\u4eea=\u4e7e\u4eea +\u4e7e\u4f4d=\u4e7e\u4f4d +\u4e7e\u5065=\u4e7e\u5065 +\u4e7e\u5065\u4e5f=\u4e7e\u5065\u4e5f +\u4e7e\u5143=\u4e7e\u5143 +\u4e7e\u5149=\u4e7e\u5149 +\u4e7e\u5174=\u4e7e\u5174 +\u4e7e\u8208=\u4e7e\u5174 +\u4e7e\u5188=\u4e7e\u5188 +\u4e7e\u5ca1=\u4e7e\u5188 +\u4e7e\u5289=\u4e7e\u5218 +\u4e7e\u5218=\u4e7e\u5218 +\u4e7e\u525b=\u4e7e\u521a +\u4e7e\u521a=\u4e7e\u521a +\u4e7e\u52d9=\u4e7e\u52a1 +\u4e7e\u52a1=\u4e7e\u52a1 +\u4e7e\u5316=\u4e7e\u5316 +\u4e7e\u5366=\u4e7e\u5366 +\u4e7e\u53bf=\u4e7e\u53bf +\u4e7e\u7e23=\u4e7e\u53bf +\u4e7e\u53f0=\u4e7e\u53f0 +\u4e7e\u5409=\u4e7e\u5409 +\u4e7e\u555f=\u4e7e\u542f +\u4e7e\u542f=\u4e7e\u542f +\u4e7e\u547d=\u4e7e\u547d +\u4e7e\u548c=\u4e7e\u548c +\u4e7e\u5609=\u4e7e\u5609 +\u4e7e\u5716=\u4e7e\u56fe +\u4e7e\u56fe=\u4e7e\u56fe +\u4e7e\u5764=\u4e7e\u5764 +\u4e7e\u57ce=\u4e7e\u57ce +\u4e7e\u57fa=\u4e7e\u57fa +\u4e7e\u5929\u4e5f=\u4e7e\u5929\u4e5f +\u4e7e\u59cb=\u4e7e\u59cb +\u4e7e\u59d3=\u4e7e\u59d3 +\u4e7e\u5be7=\u4e7e\u5b81 +\u4e7e\u5b81=\u4e7e\u5b81 +\u4e7e\u5b85=\u4e7e\u5b85 +\u4e7e\u5b87=\u4e7e\u5b87 +\u4e7e\u5b89=\u4e7e\u5b89 +\u4e7e\u5b9a=\u4e7e\u5b9a +\u4e7e\u5c01=\u4e7e\u5c01 +\u4e7e\u5c45=\u4e7e\u5c45 +\u4e7e\u5d17=\u4e7e\u5c97 +\u4e7e\u5c97=\u4e7e\u5c97 +\u4e7e\u5ddb=\u4e7e\u5ddb +\u4e7e\u5dde=\u4e7e\u5dde +\u4e7e\u5f0f=\u4e7e\u5f0f +\u4e7e\u9304=\u4e7e\u5f55 +\u4e7e\u5f55=\u4e7e\u5f55 +\u4e7e\u5f8b=\u4e7e\u5f8b +\u4e7e\u5fb7=\u4e7e\u5fb7 +\u4e7e\u5fc3=\u4e7e\u5fc3 +\u4e7e\u5fe0=\u4e7e\u5fe0 +\u4e7e\u6587=\u4e7e\u6587 +\u4e7e\u65b7=\u4e7e\u65ad +\u4e7e\u65ad=\u4e7e\u65ad +\u4e7e\u65b9=\u4e7e\u65b9 +\u4e7e\u65bd=\u4e7e\u65bd +\u4e7e\u65e6=\u4e7e\u65e6 +\u4e7e\u660e=\u4e7e\u660e +\u4e7e\u6627=\u4e7e\u6627 +\u4e7e\u6689=\u4e7e\u6656 +\u4e7e\u6656=\u4e7e\u6656 +\u4e7e\u666f=\u4e7e\u666f +\u4e7e\u6677=\u4e7e\u6677 +\u4e7e\u66dc=\u4e7e\u66dc +\u4e7e\u6784=\u4e7e\u6784 +\u4e7e\u69cb=\u4e7e\u6784 +\u4e7e\u67a2=\u4e7e\u67a2 +\u4e7e\u6a1e=\u4e7e\u67a2 +\u4e7e\u680b=\u4e7e\u680b +\u4e7e\u68df=\u4e7e\u680b +\u4e7e\u6b65=\u4e7e\u6b65 +\u4e7e\u6c0f=\u4e7e\u6c0f +\u4e7e\u6c93\u548c=\u4e7e\u6c93\u548c +\u4e7e\u6c93\u5a46=\u4e7e\u6c93\u5a46 +\u4e7e\u6cc9=\u4e7e\u6cc9 +\u4e7e\u6df3=\u4e7e\u6df3 +\u4e7e\u6e05\u5bae=\u4e7e\u6e05\u5bab +\u4e7e\u6e05\u5bab=\u4e7e\u6e05\u5bab +\u4e7e\u6e25=\u4e7e\u6e25 +\u4e7e\u9748=\u4e7e\u7075 +\u4e7e\u7075=\u4e7e\u7075 +\u4e7e\u7537=\u4e7e\u7537 +\u4e7e\u768b=\u4e7e\u768b +\u4e7e\u76db\u4e16=\u4e7e\u76db\u4e16 +\u4e7e\u77e2=\u4e7e\u77e2 +\u4e7e\u7950=\u4e7e\u7950 +\u4e7e\u7a79=\u4e7e\u7a79 +\u4e7e\u7ac7=\u4e7e\u7aa6 +\u4e7e\u7aa6=\u4e7e\u7aa6 +\u4e7e\u7afa=\u4e7e\u7afa +\u4e7e\u7be4=\u4e7e\u7b03 +\u4e7e\u7b03=\u4e7e\u7b03 +\u4e7e\u7b26=\u4e7e\u7b26 +\u4e7e\u7b56=\u4e7e\u7b56 +\u4e7e\u7cbe=\u4e7e\u7cbe +\u4e7e\u7d05=\u4e7e\u7ea2 +\u4e7e\u7ea2=\u4e7e\u7ea2 +\u4e7e\u7db1=\u4e7e\u7eb2 +\u4e7e\u7eb2=\u4e7e\u7eb2 +\u4e7e\u7ebd=\u4e7e\u7ebd +\u4e7e\u7d10=\u4e7e\u7ebd +\u4e7e\u7d61=\u4e7e\u7edc +\u4e7e\u7edc=\u4e7e\u7edc +\u4e7e\u7d71=\u4e7e\u7edf +\u4e7e\u7edf=\u4e7e\u7edf +\u4e7e\u7dad=\u4e7e\u7ef4 +\u4e7e\u7ef4=\u4e7e\u7ef4 +\u4e7e\u7f85=\u4e7e\u7f57 +\u4e7e\u7f57=\u4e7e\u7f57 +\u4e7e\u82b1=\u4e7e\u82b1 +\u4e7e\u852d=\u4e7e\u836b +\u4e7e\u836b=\u4e7e\u836b +\u4e7e\u884c=\u4e7e\u884c +\u4e7e\u8861=\u4e7e\u8861 +\u4e7e\u8986=\u4e7e\u8986 +\u4e7e\u8c61=\u4e7e\u8c61 +\u4e7e\u8c61\u6b77=\u4e7e\u8c61\u5386 +\u4e7e\u8c61\u5386=\u4e7e\u8c61\u5386 +\u4e7e\u8c9e=\u4e7e\u8d1e +\u4e7e\u8d1e=\u4e7e\u8d1e +\u4e7e\u8cba=\u4e7e\u8d36 +\u4e7e\u8d36=\u4e7e\u8d36 +\u4e7e\u8f66=\u4e7e\u8f66 +\u4e7e\u8eca=\u4e7e\u8f66 +\u4e7e\u8f74=\u4e7e\u8f74 +\u4e7e\u8ef8=\u4e7e\u8f74 +\u4e7e\u901a=\u4e7e\u901a +\u4e7e\u9020=\u4e7e\u9020 +\u4e7e\u9053=\u4e7e\u9053 +\u4e7e\u9452=\u4e7e\u9274 +\u4e7e\u9274=\u4e7e\u9274 +\u4e7e\u94a7=\u4e7e\u94a7 +\u4e7e\u921e=\u4e7e\u94a7 +\u4e7e\u95fc=\u4e7e\u95fc +\u4e7e\u95e5=\u4e7e\u95fc +\u4e7e\u9640=\u4e7e\u9640 +\u4e7e\u9675=\u4e7e\u9675 +\u4e7e\u9686=\u4e7e\u9686 +\u4e7e\u97f3=\u4e7e\u97f3 +\u4e7e\u987e=\u4e7e\u987e +\u4e7e\u9867=\u4e7e\u987e +\u4e7e\u98ce=\u4e7e\u98ce +\u4e7e\u98a8=\u4e7e\u98ce +\u4e7e\u9996=\u4e7e\u9996 +\u4e7e\u99ac=\u4e7e\u9a6c +\u4e7e\u9a6c=\u4e7e\u9a6c +\u4e7e\u9d60=\u4e7e\u9e44 +\u4e7e\u9e44=\u4e7e\u9e44 +\u4e7e\u9d72=\u4e7e\u9e4a +\u4e7e\u9e4a=\u4e7e\u9e4a +\u4e7e\u9f8d=\u4e7e\u9f99 +\u4e7e\u9f99=\u4e7e\u9f99 +\u4e7e\uff0c\u5065\u4e5f=\u4e7e\uff0c\u5065\u4e5f +\u4e7e\uff0c\u5929\u4e5f=\u4e7e\uff0c\u5929\u4e5f +\u722d\u8457=\u4e89\u7740 +\u722d\u8457\u66f8=\u4e89\u8457\u4e66 +\u722d\u8457\u4f5c=\u4e89\u8457\u4f5c +\u722d\u8457\u540d=\u4e89\u8457\u540d +\u722d\u8457\u9304=\u4e89\u8457\u5f55 +\u722d\u8457\u7a31=\u4e89\u8457\u79f0 +\u722d\u8457\u8005=\u4e89\u8457\u8005 +\u722d\u8457\u8ff0=\u4e89\u8457\u8ff0 +\u4e94\u7b87\u5c71=\u4e94\u7b87\u5c71 +\u4eae\u8457=\u4eae\u7740 +\u4eae\u8457\u66f8=\u4eae\u8457\u4e66 +\u4eae\u8457\u4f5c=\u4eae\u8457\u4f5c +\u4eae\u8457\u540d=\u4eae\u8457\u540d +\u4eae\u8457\u9304=\u4eae\u8457\u5f55 +\u4eae\u8457\u7a31=\u4eae\u8457\u79f0 +\u4eae\u8457\u8005=\u4eae\u8457\u8005 +\u4eae\u8457\u8ff0=\u4eae\u8457\u8ff0 +\u4ed7\u8457=\u4ed7\u7740 +\u4ed7\u8457\u66f8=\u4ed7\u8457\u4e66 +\u4ed7\u8457\u4f5c=\u4ed7\u8457\u4f5c +\u4ed7\u8457\u540d=\u4ed7\u8457\u540d +\u4ed7\u8457\u9304=\u4ed7\u8457\u5f55 +\u4ed7\u8457\u7a31=\u4ed7\u8457\u79f0 +\u4ed7\u8457\u8005=\u4ed7\u8457\u8005 +\u4ed7\u8457\u8ff0=\u4ed7\u8457\u8ff0 +\u4ee3\u8868\u8457=\u4ee3\u8868\u7740 +\u4ee3\u8868\u8457\u66f8=\u4ee3\u8868\u8457\u4e66 +\u4ee3\u8868\u8457\u4f5c=\u4ee3\u8868\u8457\u4f5c +\u4ee3\u8868\u8457\u540d=\u4ee3\u8868\u8457\u540d +\u4ee3\u8868\u8457\u9304=\u4ee3\u8868\u8457\u5f55 +\u4ee3\u8868\u8457\u7a31=\u4ee3\u8868\u8457\u79f0 +\u4ee3\u8868\u8457\u8005=\u4ee3\u8868\u8457\u8005 +\u4ee3\u8868\u8457\u8ff0=\u4ee3\u8868\u8457\u8ff0 +\u4ee5\u5fae\u77e5\u8457=\u4ee5\u5fae\u77e5\u8457 +\u4ef0\u5c4b\u8457\u66f8=\u4ef0\u5c4b\u8457\u4e66 +\u5f77\u5f7f=\u4eff\u4f5b +\u5925\u8a08=\u4f19\u8ba1 +\u50b3\u8457=\u4f20\u7740 +\u50b3\u8457\u66f8=\u4f20\u8457\u4e66 +\u50b3\u8457\u4f5c=\u4f20\u8457\u4f5c +\u50b3\u8457\u540d=\u4f20\u8457\u540d +\u50b3\u8457\u9304=\u4f20\u8457\u5f55 +\u50b3\u8457\u7a31=\u4f20\u8457\u79f0 +\u50b3\u8457\u8005=\u4f20\u8457\u8005 +\u50b3\u8457\u8ff0=\u4f20\u8457\u8ff0 +\u4f34\u8457=\u4f34\u7740 +\u4f34\u8457\u66f8=\u4f34\u8457\u4e66 +\u4f34\u8457\u4f5c=\u4f34\u8457\u4f5c +\u4f34\u8457\u540d=\u4f34\u8457\u540d +\u4f34\u8457\u9304=\u4f34\u8457\u5f55 +\u4f34\u8457\u7a31=\u4f34\u8457\u79f0 +\u4f34\u8457\u8005=\u4f34\u8457\u8005 +\u4f34\u8457\u8ff0=\u4f34\u8457\u8ff0 +\u4f4e\u8457=\u4f4e\u7740 +\u4f4e\u8457\u66f8=\u4f4e\u8457\u4e66 +\u4f4e\u8457\u4f5c=\u4f4e\u8457\u4f5c +\u4f4e\u8457\u540d=\u4f4e\u8457\u540d +\u4f4e\u8457\u9304=\u4f4e\u8457\u5f55 +\u4f4e\u8457\u7a31=\u4f4e\u8457\u79f0 +\u4f4e\u8457\u8005=\u4f4e\u8457\u8005 +\u4f4e\u8457\u8ff0=\u4f4e\u8457\u8ff0 +\u4f4f\u8457=\u4f4f\u7740 +\u4f4f\u8457\u66f8=\u4f4f\u8457\u4e66 +\u4f4f\u8457\u4f5c=\u4f4f\u8457\u4f5c +\u4f4f\u8457\u540d=\u4f4f\u8457\u540d +\u4f4f\u8457\u9304=\u4f4f\u8457\u5f55 +\u4f4f\u8457\u7a31=\u4f4f\u8457\u79f0 +\u4f4f\u8457\u8005=\u4f4f\u8457\u8005 +\u4f4f\u8457\u8ff0=\u4f4f\u8457\u8ff0 +\u4f5b\u982d\u8457\u7cde=\u4f5b\u5934\u8457\u7caa +\u4f8f\u5138\u7d00=\u4f8f\u7f57\u7eaa +\u5074\u8457=\u4fa7\u7740 +\u5074\u8457\u66f8=\u4fa7\u8457\u4e66 +\u5074\u8457\u4f5c=\u4fa7\u8457\u4f5c +\u5074\u8457\u540d=\u4fa7\u8457\u540d +\u5074\u8457\u9304=\u4fa7\u8457\u5f55 +\u5074\u8457\u7a31=\u4fa7\u8457\u79f0 +\u5074\u8457\u8005=\u4fa7\u8457\u8005 +\u5074\u8457\u8ff0=\u4fa7\u8457\u8ff0 +\u4fdd\u8b77\u8457=\u4fdd\u62a4\u7740 +\u4fdd\u969c\u8457=\u4fdd\u969c\u7740 +\u4fdd\u969c\u8457\u66f8=\u4fdd\u969c\u8457\u4e66 +\u4fdd\u969c\u8457\u4f5c=\u4fdd\u969c\u8457\u4f5c +\u4fdd\u969c\u8457\u540d=\u4fdd\u969c\u8457\u540d +\u4fdd\u969c\u8457\u9304=\u4fdd\u969c\u8457\u5f55 +\u4fdd\u969c\u8457\u7a31=\u4fdd\u969c\u8457\u79f0 +\u4fdd\u969c\u8457\u8005=\u4fdd\u969c\u8457\u8005 +\u4fdd\u969c\u8457\u8ff0=\u4fdd\u969c\u8457\u8ff0 +\u4fe1\u8457=\u4fe1\u7740 +\u4fe1\u8457\u66f8=\u4fe1\u8457\u4e66 +\u4fe1\u8457\u4f5c=\u4fe1\u8457\u4f5c +\u4fe1\u8457\u540d=\u4fe1\u8457\u540d +\u4fe1\u8457\u9304=\u4fe1\u8457\u5f55 +\u4fe1\u8457\u7a31=\u4fe1\u8457\u79f0 +\u4fe1\u8457\u8005=\u4fe1\u8457\u8005 +\u4fe1\u8457\u8ff0=\u4fe1\u8457\u8ff0 +\u5019\u8457=\u5019\u7740 +\u5019\u8457\u66f8=\u5019\u8457\u4e66 +\u5019\u8457\u4f5c=\u5019\u8457\u4f5c +\u5019\u8457\u540d=\u5019\u8457\u540d +\u5019\u8457\u9304=\u5019\u8457\u5f55 +\u5019\u8457\u7a31=\u5019\u8457\u79f0 +\u5019\u8457\u8005=\u5019\u8457\u8005 +\u5019\u8457\u8ff0=\u5019\u8457\u8ff0 +\u85c9\u52a9=\u501f\u52a9 +\u85c9\u53e3=\u501f\u53e3 +\u85c9\u624b=\u501f\u624b +\u85c9\u6545=\u501f\u6545 +\u85c9\u6a5f=\u501f\u673a +\u85c9\u6b64=\u501f\u6b64 +\u85c9\u7531=\u501f\u7531 +\u501f\u8457=\u501f\u7740 +\u85c9\u7aef=\u501f\u7aef +\u501f\u8457\u66f8=\u501f\u8457\u4e66 +\u501f\u8457\u4f5c=\u501f\u8457\u4f5c +\u501f\u8457\u540d=\u501f\u8457\u540d +\u501f\u8457\u9304=\u501f\u8457\u5f55 +\u501f\u8457\u7a31=\u501f\u8457\u79f0 +\u501f\u8457\u8005=\u501f\u8457\u8005 +\u501f\u8457\u8ff0=\u501f\u8457\u8ff0 +\u85c9\u8a5e=\u501f\u8bcd +\u505a\u8457=\u505a\u7740 +\u505a\u8457\u66f8=\u505a\u8457\u4e66 +\u505a\u8457\u4f5c=\u505a\u8457\u4f5c +\u505a\u8457\u540d=\u505a\u8457\u540d +\u505a\u8457\u9304=\u505a\u8457\u5f55 +\u505a\u8457\u7a31=\u505a\u8457\u79f0 +\u505a\u8457\u8005=\u505a\u8457\u8005 +\u505a\u8457\u8ff0=\u505a\u8457\u8ff0 +\u5077\u8457=\u5077\u7740 +\u5077\u8457\u66f8=\u5077\u8457\u4e66 +\u5077\u8457\u4f5c=\u5077\u8457\u4f5c +\u5077\u8457\u540d=\u5077\u8457\u540d +\u5077\u8457\u9304=\u5077\u8457\u5f55 +\u5077\u8457\u7a31=\u5077\u8457\u79f0 +\u5077\u8457\u8005=\u5077\u8457\u8005 +\u5077\u8457\u8ff0=\u5077\u8457\u8ff0 +\u50a2\u4fec=\u50a2\u4fec +\u5149\u8457=\u5149\u7740 +\u5149\u8457\u66f8=\u5149\u8457\u4e66 +\u5149\u8457\u4f5c=\u5149\u8457\u4f5c +\u5149\u8457\u540d=\u5149\u8457\u540d +\u5149\u8457\u9304=\u5149\u8457\u5f55 +\u5149\u8457\u7a31=\u5149\u8457\u79f0 +\u5149\u8457\u8005=\u5149\u8457\u8005 +\u5149\u8457\u8ff0=\u5149\u8457\u8ff0 +\u95dc\u8457=\u5173\u7740 +\u95dc\u8457\u66f8=\u5173\u8457\u4e66 +\u95dc\u8457\u4f5c=\u5173\u8457\u4f5c +\u95dc\u8457\u540d=\u5173\u8457\u540d +\u95dc\u8457\u9304=\u5173\u8457\u5f55 +\u95dc\u8457\u7a31=\u5173\u8457\u79f0 +\u95dc\u8457\u8005=\u5173\u8457\u8005 +\u95dc\u8457\u8ff0=\u5173\u8457\u8ff0 +\u5180\u8457=\u5180\u7740 +\u5180\u8457\u66f8=\u5180\u8457\u4e66 +\u5180\u8457\u4f5c=\u5180\u8457\u4f5c +\u5180\u8457\u540d=\u5180\u8457\u540d +\u5180\u8457\u9304=\u5180\u8457\u5f55 +\u5180\u8457\u7a31=\u5180\u8457\u79f0 +\u5180\u8457\u8005=\u5180\u8457\u8005 +\u5180\u8457\u8ff0=\u5180\u8457\u8ff0 +\u5192\u8457=\u5192\u7740 +\u5192\u8457\u66f8=\u5192\u8457\u4e66 +\u5192\u8457\u4f5c=\u5192\u8457\u4f5c +\u5192\u8457\u540d=\u5192\u8457\u540d +\u5192\u8457\u9304=\u5192\u8457\u5f55 +\u5192\u8457\u7a31=\u5192\u8457\u79f0 +\u5192\u8457\u8005=\u5192\u8457\u8005 +\u5192\u8457\u8ff0=\u5192\u8457\u8ff0 +\u5beb\u8457=\u5199\u7740 +\u5beb\u8457\u66f8=\u5199\u8457\u4e66 +\u5beb\u8457\u4f5c=\u5199\u8457\u4f5c +\u5beb\u8457\u540d=\u5199\u8457\u540d +\u5beb\u8457\u9304=\u5199\u8457\u5f55 +\u5beb\u8457\u7a31=\u5199\u8457\u79f0 +\u5beb\u8457\u8005=\u5199\u8457\u8005 +\u5beb\u8457\u8ff0=\u5199\u8457\u8ff0 +\u6dbc\u8457=\u51c9\u7740 +\u6dbc\u8457\u66f8=\u51c9\u8457\u4e66 +\u6dbc\u8457\u4f5c=\u51c9\u8457\u4f5c +\u6dbc\u8457\u540d=\u51c9\u8457\u540d +\u6dbc\u8457\u9304=\u51c9\u8457\u5f55 +\u6dbc\u8457\u7a31=\u51c9\u8457\u79f0 +\u6dbc\u8457\u8005=\u51c9\u8457\u8005 +\u6dbc\u8457\u8ff0=\u51c9\u8457\u8ff0 +\u6191\u85c9=\u51ed\u501f +\u5236\u8457=\u5236\u7740 +\u5236\u8457\u66f8=\u5236\u8457\u4e66 +\u5236\u8457\u4f5c=\u5236\u8457\u4f5c +\u5236\u8457\u540d=\u5236\u8457\u540d +\u5236\u8457\u9304=\u5236\u8457\u5f55 +\u5236\u8457\u7a31=\u5236\u8457\u79f0 +\u5236\u8457\u8005=\u5236\u8457\u8005 +\u5236\u8457\u8ff0=\u5236\u8457\u8ff0 +\u523b\u8457=\u523b\u7740 +\u523b\u8457\u66f8=\u523b\u8457\u4e66 +\u523b\u8457\u4f5c=\u523b\u8457\u4f5c +\u523b\u8457\u540d=\u523b\u8457\u540d +\u523b\u8457\u9304=\u523b\u8457\u5f55 +\u523b\u8457\u7a31=\u523b\u8457\u79f0 +\u523b\u8457\u8005=\u523b\u8457\u8005 +\u523b\u8457\u8ff0=\u523b\u8457\u8ff0 +\u8fa6\u8457=\u529e\u7740 +\u8fa6\u8457\u66f8=\u529e\u8457\u4e66 +\u8fa6\u8457\u4f5c=\u529e\u8457\u4f5c +\u8fa6\u8457\u540d=\u529e\u8457\u540d +\u8fa6\u8457\u9304=\u529e\u8457\u5f55 +\u8fa6\u8457\u7a31=\u529e\u8457\u79f0 +\u8fa6\u8457\u8005=\u529e\u8457\u8005 +\u8fa6\u8457\u8ff0=\u529e\u8457\u8ff0 +\u52d5\u8457=\u52a8\u7740 +\u52d5\u8457\u66f8=\u52a8\u8457\u4e66 +\u52d5\u8457\u4f5c=\u52a8\u8457\u4f5c +\u52d5\u8457\u540d=\u52a8\u8457\u540d +\u52d5\u8457\u9304=\u52a8\u8457\u5f55 +\u52d5\u8457\u7a31=\u52a8\u8457\u79f0 +\u52d5\u8457\u8005=\u52a8\u8457\u8005 +\u52d5\u8457\u8ff0=\u52a8\u8457\u8ff0 +\u52aa\u529b\u8457=\u52aa\u529b\u7740 +\u52aa\u529b\u8457\u66f8=\u52aa\u529b\u8457\u4e66 +\u52aa\u529b\u8457\u4f5c=\u52aa\u529b\u8457\u4f5c +\u52aa\u529b\u8457\u540d=\u52aa\u529b\u8457\u540d +\u52aa\u529b\u8457\u9304=\u52aa\u529b\u8457\u5f55 +\u52aa\u529b\u8457\u7a31=\u52aa\u529b\u8457\u79f0 +\u52aa\u529b\u8457\u8005=\u52aa\u529b\u8457\u8005 +\u52aa\u529b\u8457\u8ff0=\u52aa\u529b\u8457\u8ff0 +\u52aa\u8457=\u52aa\u7740 +\u52aa\u8457\u66f8=\u52aa\u8457\u4e66 +\u52aa\u8457\u4f5c=\u52aa\u8457\u4f5c +\u52aa\u8457\u540d=\u52aa\u8457\u540d +\u52aa\u8457\u9304=\u52aa\u8457\u5f55 +\u52aa\u8457\u7a31=\u52aa\u8457\u79f0 +\u52aa\u8457\u8005=\u52aa\u8457\u8005 +\u52aa\u8457\u8ff0=\u52aa\u8457\u8ff0 +\u5353\u8457=\u5353\u8457 +\u5370\u8457=\u5370\u7740 +\u5370\u8457\u66f8=\u5370\u8457\u4e66 +\u5370\u8457\u4f5c=\u5370\u8457\u4f5c +\u5370\u8457\u540d=\u5370\u8457\u540d +\u5370\u8457\u9304=\u5370\u8457\u5f55 +\u5370\u8457\u7a31=\u5370\u8457\u79f0 +\u5370\u8457\u8005=\u5370\u8457\u8005 +\u5370\u8457\u8ff0=\u5370\u8457\u8ff0 +\u5377\u820c=\u5377\u820c +\u58d3\u8457=\u538b\u7740 +\u58d3\u8457\u66f8=\u538b\u8457\u4e66 +\u58d3\u8457\u4f5c=\u538b\u8457\u4f5c +\u58d3\u8457\u540d=\u538b\u8457\u540d +\u58d3\u8457\u9304=\u538b\u8457\u5f55 +\u58d3\u8457\u7a31=\u538b\u8457\u79f0 +\u58d3\u8457\u8005=\u538b\u8457\u8005 +\u58d3\u8457\u8ff0=\u538b\u8457\u8ff0 +\u539f\u8457=\u539f\u8457 +\u53bb\u8457=\u53bb\u7740 +\u53bb\u8457\u66f8=\u53bb\u8457\u4e66 +\u53bb\u8457\u4f5c=\u53bb\u8457\u4f5c +\u53bb\u8457\u540d=\u53bb\u8457\u540d +\u53bb\u8457\u9304=\u53bb\u8457\u5f55 +\u53bb\u8457\u7a31=\u53bb\u8457\u79f0 +\u53bb\u8457\u8005=\u53bb\u8457\u8005 +\u53bb\u8457\u8ff0=\u53bb\u8457\u8ff0 +\u53cd\u53cd\u8986\u8986=\u53cd\u53cd\u590d\u590d +\u53cd\u8986=\u53cd\u590d +\u53d7\u8457=\u53d7\u7740 +\u53d7\u8457\u66f8=\u53d7\u8457\u4e66 +\u53d7\u8457\u4f5c=\u53d7\u8457\u4f5c +\u53d7\u8457\u540d=\u53d7\u8457\u540d +\u53d7\u8457\u9304=\u53d7\u8457\u5f55 +\u53d7\u8457\u7a31=\u53d7\u8457\u79f0 +\u53d7\u8457\u8005=\u53d7\u8457\u8005 +\u53d7\u8457\u8ff0=\u53d7\u8457\u8ff0 +\u8b8a\u8457=\u53d8\u7740 +\u8b8a\u8457\u66f8=\u53d8\u8457\u4e66 +\u8b8a\u8457\u4f5c=\u53d8\u8457\u4f5c +\u8b8a\u8457\u540d=\u53d8\u8457\u540d +\u8b8a\u8457\u9304=\u53d8\u8457\u5f55 +\u8b8a\u8457\u7a31=\u53d8\u8457\u79f0 +\u8b8a\u8457\u8005=\u53d8\u8457\u8005 +\u8b8a\u8457\u8ff0=\u53d8\u8457\u8ff0 +\u53eb\u8457=\u53eb\u7740 +\u53eb\u8457\u66f8=\u53eb\u8457\u4e66 +\u53eb\u8457\u4f5c=\u53eb\u8457\u4f5c +\u53eb\u8457\u540d=\u53eb\u8457\u540d +\u53eb\u8457\u9304=\u53eb\u8457\u5f55 +\u53eb\u8457\u7a31=\u53eb\u8457\u79f0 +\u53eb\u8457\u8005=\u53eb\u8457\u8005 +\u53eb\u8457\u8ff0=\u53eb\u8457\u8ff0 +\u53ef\u7a7f\u8457=\u53ef\u7a7f\u8457 +\u53f1\u5412=\u53f1\u5412 +\u5403\u8863\u8457\u98ef=\u5403\u8863\u8457\u996d +\u5408\u8457=\u5408\u8457 +\u540d\u8457=\u540d\u8457 +\u5411\u8457=\u5411\u7740 +\u5411\u8457\u66f8=\u5411\u8457\u4e66 +\u5411\u8457\u4f5c=\u5411\u8457\u4f5c +\u5411\u8457\u540d=\u5411\u8457\u540d +\u5411\u8457\u9304=\u5411\u8457\u5f55 +\u5411\u8457\u7a31=\u5411\u8457\u79f0 +\u5411\u8457\u8005=\u5411\u8457\u8005 +\u5411\u8457\u8ff0=\u5411\u8457\u8ff0 +\u542b\u8457=\u542b\u7740 +\u542b\u8457\u66f8=\u542b\u8457\u4e66 +\u542b\u8457\u4f5c=\u542b\u8457\u4f5c +\u542b\u8457\u540d=\u542b\u8457\u540d +\u542b\u8457\u9304=\u542b\u8457\u5f55 +\u542b\u8457\u7a31=\u542b\u8457\u79f0 +\u542b\u8457\u8005=\u542b\u8457\u8005 +\u542b\u8457\u8ff0=\u542b\u8457\u8ff0 +\u807d\u8457=\u542c\u7740 +\u807d\u8457\u66f8=\u542c\u8457\u4e66 +\u807d\u8457\u4f5c=\u542c\u8457\u4f5c +\u807d\u8457\u540d=\u542c\u8457\u540d +\u807d\u8457\u9304=\u542c\u8457\u5f55 +\u807d\u8457\u7a31=\u542c\u8457\u79f0 +\u807d\u8457\u8005=\u542c\u8457\u8005 +\u807d\u8457\u8ff0=\u542c\u8457\u8ff0 +\u5434\u5176\u6fec=\u5434\u5176\u6fec +\u5433\u5176\u6fec=\u5434\u5176\u6fec +\u5439\u8457=\u5439\u7740 +\u5439\u8457\u66f8=\u5439\u8457\u4e66 +\u5439\u8457\u4f5c=\u5439\u8457\u4f5c +\u5439\u8457\u540d=\u5439\u8457\u540d +\u5439\u8457\u9304=\u5439\u8457\u5f55 +\u5439\u8457\u7a31=\u5439\u8457\u79f0 +\u5439\u8457\u8005=\u5439\u8457\u8005 +\u5439\u8457\u8ff0=\u5439\u8457\u8ff0 +\u5468\u6613\u4e7e=\u5468\u6613\u4e7e +\u5473\u8457=\u5473\u7740 +\u5473\u8457\u66f8=\u5473\u8457\u4e66 +\u5473\u8457\u4f5c=\u5473\u8457\u4f5c +\u5473\u8457\u540d=\u5473\u8457\u540d +\u5473\u8457\u9304=\u5473\u8457\u5f55 +\u5473\u8457\u7a31=\u5473\u8457\u79f0 +\u5473\u8457\u8005=\u5473\u8457\u8005 +\u5473\u8457\u8ff0=\u5473\u8457\u8ff0 +\u547c\u5e7a\u559d\u516d=\u547c\u5e7a\u559d\u516d +\u97ff\u8457=\u54cd\u7740 +\u97ff\u8457\u66f8=\u54cd\u8457\u4e66 +\u97ff\u8457\u4f5c=\u54cd\u8457\u4f5c +\u97ff\u8457\u540d=\u54cd\u8457\u540d +\u97ff\u8457\u9304=\u54cd\u8457\u5f55 +\u97ff\u8457\u7a31=\u54cd\u8457\u79f0 +\u97ff\u8457\u8005=\u54cd\u8457\u8005 +\u97ff\u8457\u8ff0=\u54cd\u8457\u8ff0 +\u54ea\u5412=\u54ea\u5412 +\u54ed\u8457=\u54ed\u7740 +\u54ed\u8457\u66f8=\u54ed\u8457\u4e66 +\u54ed\u8457\u4f5c=\u54ed\u8457\u4f5c +\u54ed\u8457\u540d=\u54ed\u8457\u540d +\u54ed\u8457\u9304=\u54ed\u8457\u5f55 +\u54ed\u8457\u7a31=\u54ed\u8457\u79f0 +\u54ed\u8457\u8005=\u54ed\u8457\u8005 +\u54ed\u8457\u8ff0=\u54ed\u8457\u8ff0 +\u5531\u8457=\u5531\u7740 +\u5531\u8457\u66f8=\u5531\u8457\u4e66 +\u5531\u8457\u4f5c=\u5531\u8457\u4f5c +\u5531\u8457\u540d=\u5531\u8457\u540d +\u5531\u8457\u9304=\u5531\u8457\u5f55 +\u5531\u8457\u7a31=\u5531\u8457\u79f0 +\u5531\u8457\u8005=\u5531\u8457\u8005 +\u5531\u8457\u8ff0=\u5531\u8457\u8ff0 +\u559d\u8457=\u559d\u7740 +\u559d\u8457\u66f8=\u559d\u8457\u4e66 +\u559d\u8457\u4f5c=\u559d\u8457\u4f5c +\u559d\u8457\u540d=\u559d\u8457\u540d +\u559d\u8457\u9304=\u559d\u8457\u5f55 +\u559d\u8457\u7a31=\u559d\u8457\u79f0 +\u559d\u8457\u8005=\u559d\u8457\u8005 +\u559d\u8457\u8ff0=\u559d\u8457\u8ff0 +\u56b7\u8457=\u56b7\u7740 +\u56b7\u8457\u66f8=\u56b7\u8457\u4e66 +\u56b7\u8457\u4f5c=\u56b7\u8457\u4f5c +\u56b7\u8457\u540d=\u56b7\u8457\u540d +\u56b7\u8457\u9304=\u56b7\u8457\u5f55 +\u56b7\u8457\u7a31=\u56b7\u8457\u79f0 +\u56b7\u8457\u8005=\u56b7\u8457\u8005 +\u56b7\u8457\u8ff0=\u56b7\u8457\u8ff0 +\u56de\u8986=\u56de\u590d +\u56e0\u8457=\u56e0\u7740 +\u56e0\u8457\u3008=\u56e0\u8457\u3008 +\u56e0\u8457\u300a=\u56e0\u8457\u300a +\u56e0\u8457\u66f8=\u56e0\u8457\u4e66 +\u56e0\u8457\u4f5c=\u56e0\u8457\u4f5c +\u56e0\u8457\u540d=\u56e0\u8457\u540d +\u56e0\u8457\u9304=\u56e0\u8457\u5f55 +\u56e0\u8457\u7a31=\u56e0\u8457\u79f0 +\u56e0\u8457\u8005=\u56e0\u8457\u8005 +\u56e0\u8457\u8ff0=\u56e0\u8457\u8ff0 +\u56f0\u8457=\u56f0\u7740 +\u56f0\u8457\u66f8=\u56f0\u8457\u4e66 +\u56f0\u8457\u4f5c=\u56f0\u8457\u4f5c +\u56f0\u8457\u540d=\u56f0\u8457\u540d +\u56f0\u8457\u9304=\u56f0\u8457\u5f55 +\u56f0\u8457\u7a31=\u56f0\u8457\u79f0 +\u56f0\u8457\u8005=\u56f0\u8457\u8005 +\u56f0\u8457\u8ff0=\u56f0\u8457\u8ff0 +\u570d\u8457=\u56f4\u7740 +\u570d\u8457\u66f8=\u56f4\u8457\u4e66 +\u570d\u8457\u4f5c=\u56f4\u8457\u4f5c +\u570d\u8457\u540d=\u56f4\u8457\u540d +\u570d\u8457\u9304=\u56f4\u8457\u5f55 +\u570d\u8457\u7a31=\u56f4\u8457\u79f0 +\u570d\u8457\u8005=\u56f4\u8457\u8005 +\u570d\u8457\u8ff0=\u56f4\u8457\u8ff0 +\u571f\u8457=\u571f\u8457 +\u5728\u8457=\u5728\u7740 +\u5728\u8457\u66f8=\u5728\u8457\u4e66 +\u5728\u8457\u4f5c=\u5728\u8457\u4f5c +\u5728\u8457\u540d=\u5728\u8457\u540d +\u5728\u8457\u9304=\u5728\u8457\u5f55 +\u5728\u8457\u7a31=\u5728\u8457\u79f0 +\u5728\u8457\u8005=\u5728\u8457\u8005 +\u5728\u8457\u8ff0=\u5728\u8457\u8ff0 +\u5750\u8457=\u5750\u7740 +\u5750\u8457\u66f8=\u5750\u8457\u4e66 +\u5750\u8457\u4f5c=\u5750\u8457\u4f5c +\u5750\u8457\u540d=\u5750\u8457\u540d +\u5750\u8457\u9304=\u5750\u8457\u5f55 +\u5750\u8457\u7a31=\u5750\u8457\u79f0 +\u5750\u8457\u8005=\u5750\u8457\u8005 +\u5750\u8457\u8ff0=\u5750\u8457\u8ff0 +\u5764\u4e7e=\u5764\u4e7e +\u5099\u8457=\u5907\u7740 +\u5099\u8457\u66f8=\u5907\u8457\u4e66 +\u5099\u8457\u4f5c=\u5907\u8457\u4f5c +\u5099\u8457\u540d=\u5907\u8457\u540d +\u5099\u8457\u9304=\u5907\u8457\u5f55 +\u5099\u8457\u7a31=\u5907\u8457\u79f0 +\u5099\u8457\u8005=\u5907\u8457\u8005 +\u5099\u8457\u8ff0=\u5907\u8457\u8ff0 +\u5929\u9053\u4e3a\u4e7e=\u5929\u9053\u4e3a\u4e7e +\u5929\u9053\u70ba\u4e7e=\u5929\u9053\u4e3a\u4e7e +\u593e\u8457=\u5939\u7740 +\u593e\u8457\u66f8=\u5939\u8457\u4e66 +\u593e\u8457\u4f5c=\u5939\u8457\u4f5c +\u593e\u8457\u540d=\u5939\u8457\u540d +\u593e\u8457\u9304=\u5939\u8457\u5f55 +\u593e\u8457\u7a31=\u5939\u8457\u79f0 +\u593e\u8457\u8005=\u5939\u8457\u8005 +\u593e\u8457\u8ff0=\u5939\u8457\u8ff0 +\u5967\u5340=\u5967\u533a +\u59d3\u5e7a=\u59d3\u5e7a +\u5b58\u647a=\u5b58\u647a +\u5b64\u8457=\u5b64\u7740 +\u5b64\u8457\u66f8=\u5b64\u8457\u4e66 +\u5b64\u8457\u4f5c=\u5b64\u8457\u4f5c +\u5b64\u8457\u540d=\u5b64\u8457\u540d +\u5b64\u8457\u9304=\u5b64\u8457\u5f55 +\u5b64\u8457\u7a31=\u5b64\u8457\u79f0 +\u5b64\u8457\u8005=\u5b64\u8457\u8005 +\u5b64\u8457\u8ff0=\u5b64\u8457\u8ff0 +\u5b78\u8457=\u5b66\u7740 +\u5b78\u8457\u66f8=\u5b66\u8457\u4e66 +\u5b78\u8457\u4f5c=\u5b66\u8457\u4f5c +\u5b78\u8457\u540d=\u5b66\u8457\u540d +\u5b78\u8457\u9304=\u5b66\u8457\u5f55 +\u5b78\u8457\u7a31=\u5b66\u8457\u79f0 +\u5b78\u8457\u8005=\u5b66\u8457\u8005 +\u5b78\u8457\u8ff0=\u5b66\u8457\u8ff0 +\u5b88\u8457=\u5b88\u7740 +\u5b88\u8457\u66f8=\u5b88\u8457\u4e66 +\u5b88\u8457\u4f5c=\u5b88\u8457\u4f5c +\u5b88\u8457\u540d=\u5b88\u8457\u540d +\u5b88\u8457\u9304=\u5b88\u8457\u5f55 +\u5b88\u8457\u7a31=\u5b88\u8457\u79f0 +\u5b88\u8457\u8005=\u5b88\u8457\u8005 +\u5b88\u8457\u8ff0=\u5b88\u8457\u8ff0 +\u5b9a\u8457=\u5b9a\u7740 +\u5b9a\u8457\u66f8=\u5b9a\u8457\u4e66 +\u5b9a\u8457\u4f5c=\u5b9a\u8457\u4f5c +\u5b9a\u8457\u540d=\u5b9a\u8457\u540d +\u5b9a\u8457\u9304=\u5b9a\u8457\u5f55 +\u5b9a\u8457\u7a31=\u5b9a\u8457\u79f0 +\u5b9a\u8457\u8005=\u5b9a\u8457\u8005 +\u5b9a\u8457\u8ff0=\u5b9a\u8457\u8ff0 +\u5c0d\u8457=\u5bf9\u7740 +\u5c0d\u8457\u66f8=\u5bf9\u8457\u4e66 +\u5c0d\u8457\u4f5c=\u5bf9\u8457\u4f5c +\u5c0d\u8457\u540d=\u5bf9\u8457\u540d +\u5c0d\u8457\u9304=\u5bf9\u8457\u5f55 +\u5c0d\u8457\u7a31=\u5bf9\u8457\u79f0 +\u5c0d\u8457\u8005=\u5bf9\u8457\u8005 +\u5c0d\u8457\u8ff0=\u5bf9\u8457\u8ff0 +\u5c0b\u8457=\u5bfb\u7740 +\u5c0b\u8457\u66f8=\u5bfb\u8457\u4e66 +\u5c0b\u8457\u4f5c=\u5bfb\u8457\u4f5c +\u5c0b\u8457\u540d=\u5bfb\u8457\u540d +\u5c0b\u8457\u9304=\u5bfb\u8457\u5f55 +\u5c0b\u8457\u7a31=\u5bfb\u8457\u79f0 +\u5c0b\u8457\u8005=\u5bfb\u8457\u8005 +\u5c0b\u8457\u8ff0=\u5bfb\u8457\u8ff0 +\u5c07\u8ecd\u62bd\u8eca=\u5c06\u519b\u62bd\u8eca +\u5c3c\u4e7e\u9640=\u5c3c\u4e7e\u9640 +\u5c55\u8457=\u5c55\u7740 +\u5c55\u8457\u66f8=\u5c55\u8457\u4e66 +\u5c55\u8457\u4f5c=\u5c55\u8457\u4f5c +\u5c55\u8457\u540d=\u5c55\u8457\u540d +\u5c55\u8457\u9304=\u5c55\u8457\u5f55 +\u5c55\u8457\u7a31=\u5c55\u8457\u79f0 +\u5c55\u8457\u8005=\u5c55\u8457\u8005 +\u5c55\u8457\u8ff0=\u5c55\u8457\u8ff0 +\u5de8\u8457=\u5de8\u8457 +\u5e36\u8457=\u5e26\u7740 +\u5e36\u8457\u66f8=\u5e26\u8457\u4e66 +\u5e36\u8457\u4f5c=\u5e26\u8457\u4f5c +\u5e36\u8457\u540d=\u5e26\u8457\u540d +\u5e36\u8457\u9304=\u5e26\u8457\u5f55 +\u5e36\u8457\u7a31=\u5e26\u8457\u79f0 +\u5e36\u8457\u8005=\u5e26\u8457\u8005 +\u5e36\u8457\u8ff0=\u5e26\u8457\u8ff0 +\u5e6b\u8457=\u5e2e\u7740 +\u5e6b\u8457\u66f8=\u5e2e\u8457\u4e66 +\u5e6b\u8457\u4f5c=\u5e2e\u8457\u4f5c +\u5e6b\u8457\u540d=\u5e2e\u8457\u540d +\u5e6b\u8457\u9304=\u5e2e\u8457\u5f55 +\u5e6b\u8457\u7a31=\u5e2e\u8457\u79f0 +\u5e6b\u8457\u8005=\u5e2e\u8457\u8005 +\u5e6b\u8457\u8ff0=\u5e2e\u8457\u8ff0 +\u4e7e\u4e7e\u6de8\u6de8=\u5e72\u5e72\u51c0\u51c0 +\u4e7e\u4e7e\u8106\u8106=\u5e72\u5e72\u8106\u8106 +\u4e7e\u6cc9\u6c34=\u5e72\u6cc9\u6c34 +\u4e48\u4e8c\u4e09=\u5e7a\u4e8c\u4e09 +\u5e7a\u4e8c\u4e09=\u5e7a\u4e8c\u4e09 +\u4e48\u5143=\u5e7a\u5143 +\u5e7a\u5143=\u5e7a\u5143 +\u5e7a\u9cf3=\u5e7a\u51e4 +\u4e48\u9cf3=\u5e7a\u51e4 +\u4e48\u534a\u7fa4=\u5e7a\u534a\u7fa4 +\u5e7a\u534a\u7fa4=\u5e7a\u534a\u7fa4 +\u5e7a\u5edd=\u5e7a\u53ae +\u5e7a\u53ae=\u5e7a\u53ae +\u4e48\u53d4=\u5e7a\u53d4 +\u5e7a\u53d4=\u5e7a\u53d4 +\u4e48\u5abd=\u5e7a\u5988 +\u5e7a\u5abd=\u5e7a\u5988 +\u4e48\u59b9=\u5e7a\u59b9 +\u5e7a\u59b9=\u5e7a\u59b9 +\u4e48\u59d3=\u5e7a\u59d3 +\u5e7a\u59d3=\u5e7a\u59d3 +\u4e48\u59e8=\u5e7a\u59e8 +\u5e7a\u59e8=\u5e7a\u59e8 +\u4e48\u5a18=\u5e7a\u5a18 +\u4e48\u5b43=\u5e7a\u5a18 +\u5e7a\u5a18=\u5e7a\u5a18 +\u5e7a\u5b43=\u5e7a\u5a18 +\u5e7a\u5c0f=\u5e7a\u5c0f +\u4e48\u5c0f=\u5e7a\u5c0f +\u5e7a\u6c0f=\u5e7a\u6c0f +\u4e48\u6c0f=\u5e7a\u6c0f +\u4e48\u7238=\u5e7a\u7238 +\u5e7a\u7238=\u5e7a\u7238 +\u5e7a\u7239=\u5e7a\u7239 +\u4e48\u7239=\u5e7a\u7239 +\u4e48\u7bc7=\u5e7a\u7bc7 +\u5e7a\u7bc7=\u5e7a\u7bc7 +\u4e48\u8205=\u5e7a\u8205 +\u5e7a\u8205=\u5e7a\u8205 +\u4e48\u86fe\u5b50=\u5e7a\u86fe\u5b50 +\u5e7a\u86fe\u5b50=\u5e7a\u86fe\u5b50 +\u4e48\u8b19=\u5e7a\u8c26 +\u5e7a\u8b19=\u5e7a\u8c26 +\u5e7a\u9ebd=\u5e7a\u9ebd +\u4e48\u9ebc=\u5e7a\u9ebd +\u5e7a\u9ebd\u5c0f\u4e11=\u5e7a\u9ebd\u5c0f\u4e11 +\u4e48\u9ebc\u5c0f\u4e11=\u5e7a\u9ebd\u5c0f\u4e11 +\u5e87\u8b77\u8457=\u5e87\u62a4\u7740 +\u61c9\u8457=\u5e94\u7740 +\u61c9\u8457\u66f8=\u5e94\u8457\u4e66 +\u61c9\u8457\u4f5c=\u5e94\u8457\u4f5c +\u61c9\u8457\u540d=\u5e94\u8457\u540d +\u61c9\u8457\u9304=\u5e94\u8457\u5f55 +\u61c9\u8457\u7a31=\u5e94\u8457\u79f0 +\u61c9\u8457\u8005=\u5e94\u8457\u8005 +\u61c9\u8457\u8ff0=\u5e94\u8457\u8ff0 +\u5eb7\u4e7e=\u5eb7\u4e7e +\u5eb7\u8457=\u5eb7\u7740 +\u5eb7\u8457\u66f8=\u5eb7\u8457\u4e66 +\u5eb7\u8457\u4f5c=\u5eb7\u8457\u4f5c +\u5eb7\u8457\u540d=\u5eb7\u8457\u540d +\u5eb7\u8457\u9304=\u5eb7\u8457\u5f55 +\u5eb7\u8457\u7a31=\u5eb7\u8457\u79f0 +\u5eb7\u8457\u8005=\u5eb7\u8457\u8005 +\u5eb7\u8457\u8ff0=\u5eb7\u8457\u8ff0 +\u958b\u8457=\u5f00\u7740 +\u958b\u8457\u66f8=\u5f00\u8457\u4e66 +\u958b\u8457\u4f5c=\u5f00\u8457\u4f5c +\u958b\u8457\u540d=\u5f00\u8457\u540d +\u958b\u8457\u9304=\u5f00\u8457\u5f55 +\u958b\u8457\u7a31=\u5f00\u8457\u79f0 +\u958b\u8457\u8005=\u5f00\u8457\u8005 +\u958b\u8457\u8ff0=\u5f00\u8457\u8ff0 +\u5f35\u6cd5\u4e7e=\u5f20\u6cd5\u4e7e +\u7576\u8457=\u5f53\u7740 +\u7576\u8457\u66f8=\u5f53\u8457\u4e66 +\u7576\u8457\u4f5c=\u5f53\u8457\u4f5c +\u7576\u8457\u540d=\u5f53\u8457\u540d +\u7576\u8457\u9304=\u5f53\u8457\u5f55 +\u7576\u8457\u7a31=\u5f53\u8457\u79f0 +\u7576\u8457\u8005=\u5f53\u8457\u8005 +\u7576\u8457\u8ff0=\u5f53\u8457\u8ff0 +\u5f70\u660e\u8f03\u8457=\u5f70\u660e\u8f83\u8457 +\u5f85\u8457=\u5f85\u7740 +\u5f85\u8457\u66f8=\u5f85\u8457\u4e66 +\u5f85\u8457\u4f5c=\u5f85\u8457\u4f5c +\u5f85\u8457\u540d=\u5f85\u8457\u540d +\u5f85\u8457\u9304=\u5f85\u8457\u5f55 +\u5f85\u8457\u7a31=\u5f85\u8457\u79f0 +\u5f85\u8457\u8005=\u5f85\u8457\u8005 +\u5f85\u8457\u8ff0=\u5f85\u8457\u8ff0 +\u5f97\u8457=\u5f97\u7740 +\u5f97\u8457\u66f8=\u5f97\u8457\u4e66 +\u5f97\u8457\u4f5c=\u5f97\u8457\u4f5c +\u5f97\u8457\u540d=\u5f97\u8457\u540d +\u5f97\u8457\u9304=\u5f97\u8457\u5f55 +\u5f97\u8457\u7a31=\u5f97\u8457\u79f0 +\u5f97\u8457\u8005=\u5f97\u8457\u8005 +\u5f97\u8457\u8ff0=\u5f97\u8457\u8ff0 +\u5faa\u8457=\u5faa\u7740 +\u5faa\u8457\u66f8=\u5faa\u8457\u4e66 +\u5faa\u8457\u4f5c=\u5faa\u8457\u4f5c +\u5faa\u8457\u540d=\u5faa\u8457\u540d +\u5faa\u8457\u9304=\u5faa\u8457\u5f55 +\u5faa\u8457\u7a31=\u5faa\u8457\u79f0 +\u5faa\u8457\u8005=\u5faa\u8457\u8005 +\u5faa\u8457\u8ff0=\u5faa\u8457\u8ff0 +\u5fc3\u8457=\u5fc3\u7740 +\u5fc3\u8457\u66f8=\u5fc3\u8457\u4e66 +\u5fc3\u8457\u4f5c=\u5fc3\u8457\u4f5c +\u5fc3\u8457\u540d=\u5fc3\u8457\u540d +\u5fc3\u8457\u9304=\u5fc3\u8457\u5f55 +\u5fc3\u8457\u7a31=\u5fc3\u8457\u79f0 +\u5fc3\u8457\u8005=\u5fc3\u8457\u8005 +\u5fc3\u8457\u8ff0=\u5fc3\u8457\u8ff0 +\u5fcd\u8457=\u5fcd\u7740 +\u5fcd\u8457\u66f8=\u5fcd\u8457\u4e66 +\u5fcd\u8457\u4f5c=\u5fcd\u8457\u4f5c +\u5fcd\u8457\u540d=\u5fcd\u8457\u540d +\u5fcd\u8457\u9304=\u5fcd\u8457\u5f55 +\u5fcd\u8457\u7a31=\u5fcd\u8457\u79f0 +\u5fcd\u8457\u8005=\u5fcd\u8457\u8005 +\u5fcd\u8457\u8ff0=\u5fcd\u8457\u8ff0 +\u5fd7\u8457=\u5fd7\u7740 +\u5fd7\u8457\u66f8=\u5fd7\u8457\u4e66 +\u5fd7\u8457\u4f5c=\u5fd7\u8457\u4f5c +\u5fd7\u8457\u540d=\u5fd7\u8457\u540d +\u5fd7\u8457\u9304=\u5fd7\u8457\u5f55 +\u5fd7\u8457\u7a31=\u5fd7\u8457\u79f0 +\u5fd7\u8457\u8005=\u5fd7\u8457\u8005 +\u5fd7\u8457\u8ff0=\u5fd7\u8457\u8ff0 +\u5fd9\u8457=\u5fd9\u7740 +\u5fd9\u8457\u66f8=\u5fd9\u8457\u4e66 +\u5fd9\u8457\u4f5c=\u5fd9\u8457\u4f5c +\u5fd9\u8457\u540d=\u5fd9\u8457\u540d +\u5fd9\u8457\u9304=\u5fd9\u8457\u5f55 +\u5fd9\u8457\u7a31=\u5fd9\u8457\u79f0 +\u5fd9\u8457\u8005=\u5fd9\u8457\u8005 +\u5fd9\u8457\u8ff0=\u5fd9\u8457\u8ff0 +\u61f7\u8457=\u6000\u7740 +\u61f7\u8457\u66f8=\u6000\u8457\u4e66 +\u61f7\u8457\u4f5c=\u6000\u8457\u4f5c +\u61f7\u8457\u540d=\u6000\u8457\u540d +\u61f7\u8457\u9304=\u6000\u8457\u5f55 +\u61f7\u8457\u7a31=\u6000\u8457\u79f0 +\u61f7\u8457\u8005=\u6000\u8457\u8005 +\u61f7\u8457\u8ff0=\u6000\u8457\u8ff0 +\u6025\u8457=\u6025\u7740 +\u6025\u8457\u66f8=\u6025\u8457\u4e66 +\u6025\u8457\u4f5c=\u6025\u8457\u4f5c +\u6025\u8457\u540d=\u6025\u8457\u540d +\u6025\u8457\u9304=\u6025\u8457\u5f55 +\u6025\u8457\u7a31=\u6025\u8457\u79f0 +\u6025\u8457\u8005=\u6025\u8457\u8005 +\u6025\u8457\u8ff0=\u6025\u8457\u8ff0 +\u6027\u8457=\u6027\u7740 +\u6027\u8457\u66f8=\u6027\u8457\u4e66 +\u6027\u8457\u4f5c=\u6027\u8457\u4f5c +\u6027\u8457\u540d=\u6027\u8457\u540d +\u6027\u8457\u9304=\u6027\u8457\u5f55 +\u6027\u8457\u7a31=\u6027\u8457\u79f0 +\u6027\u8457\u8005=\u6027\u8457\u8005 +\u6027\u8457\u8ff0=\u6027\u8457\u8ff0 +\u6200\u8457=\u604b\u7740 +\u6200\u8457\u66f8=\u604b\u8457\u4e66 +\u6200\u8457\u4f5c=\u604b\u8457\u4f5c +\u6200\u8457\u540d=\u604b\u8457\u540d +\u6200\u8457\u9304=\u604b\u8457\u5f55 +\u6200\u8457\u7a31=\u604b\u8457\u79f0 +\u6200\u8457\u8005=\u604b\u8457\u8005 +\u6200\u8457\u8ff0=\u604b\u8457\u8ff0 +\u6069\u5a01\u4e26\u8457=\u6069\u5a01\u5e76\u8457 +\u60a0\u8457=\u60a0\u7740 +\u60a0\u8457\u66f8=\u60a0\u8457\u4e66 +\u60a0\u8457\u4f5c=\u60a0\u8457\u4f5c +\u60a0\u8457\u540d=\u60a0\u8457\u540d +\u60a0\u8457\u9304=\u60a0\u8457\u5f55 +\u60a0\u8457\u7a31=\u60a0\u8457\u79f0 +\u60a0\u8457\u8005=\u60a0\u8457\u8005 +\u60a0\u8457\u8ff0=\u60a0\u8457\u8ff0 +\u6163\u8457=\u60ef\u7740 +\u6163\u8457\u66f8=\u60ef\u8457\u4e66 +\u6163\u8457\u4f5c=\u60ef\u8457\u4f5c +\u6163\u8457\u540d=\u60ef\u8457\u540d +\u6163\u8457\u9304=\u60ef\u8457\u5f55 +\u6163\u8457\u7a31=\u60ef\u8457\u79f0 +\u6163\u8457\u8005=\u60ef\u8457\u8005 +\u6163\u8457\u8ff0=\u60ef\u8457\u8ff0 +\u60f3\u8457=\u60f3\u7740 +\u60f3\u8457\u66f8=\u60f3\u8457\u4e66 +\u60f3\u8457\u4f5c=\u60f3\u8457\u4f5c +\u60f3\u8457\u540d=\u60f3\u8457\u540d +\u60f3\u8457\u9304=\u60f3\u8457\u5f55 +\u60f3\u8457\u7a31=\u60f3\u8457\u79f0 +\u60f3\u8457\u8005=\u60f3\u8457\u8005 +\u60f3\u8457\u8ff0=\u60f3\u8457\u8ff0 +\u6210\u6548\u986f\u8457=\u6210\u6548\u663e\u8457 +\u6210\u7e3e\u986f\u8457=\u6210\u7ee9\u663e\u8457 +\u6230\u8457=\u6218\u7740 +\u6230\u8457\u66f8=\u6218\u8457\u4e66 +\u6230\u8457\u4f5c=\u6218\u8457\u4f5c +\u6230\u8457\u540d=\u6218\u8457\u540d +\u6230\u8457\u9304=\u6218\u8457\u5f55 +\u6230\u8457\u7a31=\u6218\u8457\u79f0 +\u6230\u8457\u8005=\u6218\u8457\u8005 +\u6230\u8457\u8ff0=\u6218\u8457\u8ff0 +\u6234\u8457=\u6234\u7740 +\u6234\u8457\u66f8=\u6234\u8457\u4e66 +\u6234\u8457\u4f5c=\u6234\u8457\u4f5c +\u6234\u8457\u540d=\u6234\u8457\u540d +\u6234\u8457\u9304=\u6234\u8457\u5f55 +\u6234\u8457\u7a31=\u6234\u8457\u79f0 +\u6234\u8457\u8005=\u6234\u8457\u8005 +\u6234\u8457\u8ff0=\u6234\u8457\u8ff0 +\u624e\u8457=\u624e\u7740 +\u624e\u8457\u66f8=\u624e\u8457\u4e66 +\u624e\u8457\u4f5c=\u624e\u8457\u4f5c +\u624e\u8457\u540d=\u624e\u8457\u540d +\u624e\u8457\u9304=\u624e\u8457\u5f55 +\u624e\u8457\u7a31=\u624e\u8457\u79f0 +\u624e\u8457\u8005=\u624e\u8457\u8005 +\u624e\u8457\u8ff0=\u624e\u8457\u8ff0 +\u6253\u8457=\u6253\u7740 +\u6253\u8457\u66f8=\u6253\u8457\u4e66 +\u6253\u8457\u4f5c=\u6253\u8457\u4f5c +\u6253\u8457\u540d=\u6253\u8457\u540d +\u6253\u8457\u9304=\u6253\u8457\u5f55 +\u6253\u8457\u7a31=\u6253\u8457\u79f0 +\u6253\u8457\u8005=\u6253\u8457\u8005 +\u6253\u8457\u8ff0=\u6253\u8457\u8ff0 +\u625b\u8457=\u625b\u7740 +\u625b\u8457\u66f8=\u625b\u8457\u4e66 +\u625b\u8457\u4f5c=\u625b\u8457\u4f5c +\u625b\u8457\u540d=\u625b\u8457\u540d +\u625b\u8457\u9304=\u625b\u8457\u5f55 +\u625b\u8457\u7a31=\u625b\u8457\u79f0 +\u625b\u8457\u8005=\u625b\u8457\u8005 +\u625b\u8457\u8ff0=\u625b\u8457\u8ff0 +\u57f7\u8457=\u6267\u8457 +\u627e\u4e0d\u8457=\u627e\u4e0d\u7740 +\u627e\u4e0d\u8457\u66f8=\u627e\u4e0d\u8457\u4e66 +\u627e\u4e0d\u8457\u4f5c=\u627e\u4e0d\u8457\u4f5c +\u627e\u4e0d\u8457\u540d=\u627e\u4e0d\u8457\u540d +\u627e\u4e0d\u8457\u9304=\u627e\u4e0d\u8457\u5f55 +\u627e\u4e0d\u8457\u7a31=\u627e\u4e0d\u8457\u79f0 +\u627e\u4e0d\u8457\u8005=\u627e\u4e0d\u8457\u8005 +\u627e\u4e0d\u8457\u8ff0=\u627e\u4e0d\u8457\u8ff0 +\u6293\u8457=\u6293\u7740 +\u6293\u8457\u66f8=\u6293\u8457\u4e66 +\u6293\u8457\u4f5c=\u6293\u8457\u4f5c +\u6293\u8457\u540d=\u6293\u8457\u540d +\u6293\u8457\u9304=\u6293\u8457\u5f55 +\u6293\u8457\u7a31=\u6293\u8457\u79f0 +\u6293\u8457\u8005=\u6293\u8457\u8005 +\u6293\u8457\u8ff0=\u6293\u8457\u8ff0 +\u8b77\u8457=\u62a4\u7740 +\u8b77\u8457\u66f8=\u62a4\u8457\u4e66 +\u8b77\u8457\u4f5c=\u62a4\u8457\u4f5c +\u8b77\u8457\u540d=\u62a4\u8457\u540d +\u8b77\u8457\u9304=\u62a4\u8457\u5f55 +\u8b77\u8457\u7a31=\u62a4\u8457\u79f0 +\u8b77\u8457\u8005=\u62a4\u8457\u8005 +\u8b77\u8457\u8ff0=\u62a4\u8457\u8ff0 +\u62ab\u8457=\u62ab\u7740 +\u62ab\u8457\u66f8=\u62ab\u8457\u4e66 +\u62ab\u8457\u4f5c=\u62ab\u8457\u4f5c +\u62ab\u8457\u540d=\u62ab\u8457\u540d +\u62ab\u8457\u9304=\u62ab\u8457\u5f55 +\u62ab\u8457\u7a31=\u62ab\u8457\u79f0 +\u62ab\u8457\u8005=\u62ab\u8457\u8005 +\u62ab\u8457\u8ff0=\u62ab\u8457\u8ff0 +\u62ac\u8457=\u62ac\u7740 +\u62ac\u8457\u66f8=\u62ac\u8457\u4e66 +\u62ac\u8457\u4f5c=\u62ac\u8457\u4f5c +\u62ac\u8457\u540d=\u62ac\u8457\u540d +\u62ac\u8457\u9304=\u62ac\u8457\u5f55 +\u62ac\u8457\u7a31=\u62ac\u8457\u79f0 +\u62ac\u8457\u8005=\u62ac\u8457\u8005 +\u62ac\u8457\u8ff0=\u62ac\u8457\u8ff0 +\u62b1\u8457=\u62b1\u7740 +\u62b1\u8457\u66f8=\u62b1\u8457\u4e66 +\u62b1\u8457\u4f5c=\u62b1\u8457\u4f5c +\u62b1\u8457\u540d=\u62b1\u8457\u540d +\u62b1\u8457\u9304=\u62b1\u8457\u5f55 +\u62b1\u8457\u7a31=\u62b1\u8457\u79f0 +\u62b1\u8457\u8005=\u62b1\u8457\u8005 +\u62b1\u8457\u8ff0=\u62b1\u8457\u8ff0 +\u62c9\u8457=\u62c9\u7740 +\u62c9\u8457\u66f8=\u62c9\u8457\u4e66 +\u62c9\u8457\u4f5c=\u62c9\u8457\u4f5c +\u62c9\u8457\u540d=\u62c9\u8457\u540d +\u62c9\u8457\u9304=\u62c9\u8457\u5f55 +\u62c9\u8457\u7a31=\u62c9\u8457\u79f0 +\u62c9\u8457\u8005=\u62c9\u8457\u8005 +\u62c9\u8457\u8ff0=\u62c9\u8457\u8ff0 +\u62c9\u934a=\u62c9\u94fe +\u62ce\u8457=\u62ce\u7740 +\u62ce\u8457\u66f8=\u62ce\u8457\u4e66 +\u62ce\u8457\u4f5c=\u62ce\u8457\u4f5c +\u62ce\u8457\u540d=\u62ce\u8457\u540d +\u62ce\u8457\u9304=\u62ce\u8457\u5f55 +\u62ce\u8457\u7a31=\u62ce\u8457\u79f0 +\u62ce\u8457\u8005=\u62ce\u8457\u8005 +\u62ce\u8457\u8ff0=\u62ce\u8457\u8ff0 +\u62d6\u8457=\u62d6\u7740 +\u62d6\u8457\u66f8=\u62d6\u8457\u4e66 +\u62d6\u8457\u4f5c=\u62d6\u8457\u4f5c +\u62d6\u8457\u540d=\u62d6\u8457\u540d +\u62d6\u8457\u9304=\u62d6\u8457\u5f55 +\u62d6\u8457\u7a31=\u62d6\u8457\u79f0 +\u62d6\u8457\u8005=\u62d6\u8457\u8005 +\u62d6\u8457\u8ff0=\u62d6\u8457\u8ff0 +\u62d9\u8457=\u62d9\u8457 +\u62da\u547d=\u62da\u547d +\u62da\u640f=\u62da\u640f +\u62da\u6b7b=\u62da\u6b7b +\u62fc\u8457=\u62fc\u7740 +\u62fc\u8457\u66f8=\u62fc\u8457\u4e66 +\u62fc\u8457\u4f5c=\u62fc\u8457\u4f5c +\u62fc\u8457\u540d=\u62fc\u8457\u540d +\u62fc\u8457\u9304=\u62fc\u8457\u5f55 +\u62fc\u8457\u7a31=\u62fc\u8457\u79f0 +\u62fc\u8457\u8005=\u62fc\u8457\u8005 +\u62fc\u8457\u8ff0=\u62fc\u8457\u8ff0 +\u62ff\u8457=\u62ff\u7740 +\u62ff\u8457\u66f8=\u62ff\u8457\u4e66 +\u62ff\u8457\u4f5c=\u62ff\u8457\u4f5c +\u62ff\u8457\u540d=\u62ff\u8457\u540d +\u62ff\u8457\u9304=\u62ff\u8457\u5f55 +\u62ff\u8457\u7a31=\u62ff\u8457\u79f0 +\u62ff\u8457\u8005=\u62ff\u8457\u8005 +\u62ff\u8457\u8ff0=\u62ff\u8457\u8ff0 +\u6301\u8457=\u6301\u7740 +\u6301\u8457\u66f8=\u6301\u8457\u4e66 +\u6301\u8457\u4f5c=\u6301\u8457\u4f5c +\u6301\u8457\u540d=\u6301\u8457\u540d +\u6301\u8457\u9304=\u6301\u8457\u5f55 +\u6301\u8457\u7a31=\u6301\u8457\u79f0 +\u6301\u8457\u8005=\u6301\u8457\u8005 +\u6301\u8457\u8ff0=\u6301\u8457\u8ff0 +\u6311\u8457=\u6311\u7740 +\u6311\u8457\u66f8=\u6311\u8457\u4e66 +\u6311\u8457\u4f5c=\u6311\u8457\u4f5c +\u6311\u8457\u540d=\u6311\u8457\u540d +\u6311\u8457\u9304=\u6311\u8457\u5f55 +\u6311\u8457\u7a31=\u6311\u8457\u79f0 +\u6311\u8457\u8005=\u6311\u8457\u8005 +\u6311\u8457\u8ff0=\u6311\u8457\u8ff0 +\u64cb\u8457=\u6321\u7740 +\u64cb\u8457\u66f8=\u6321\u8457\u4e66 +\u64cb\u8457\u4f5c=\u6321\u8457\u4f5c +\u64cb\u8457\u540d=\u6321\u8457\u540d +\u64cb\u8457\u9304=\u6321\u8457\u5f55 +\u64cb\u8457\u7a31=\u6321\u8457\u79f0 +\u64cb\u8457\u8005=\u6321\u8457\u8005 +\u64cb\u8457\u8ff0=\u6321\u8457\u8ff0 +\u6399\u8457=\u6323\u7740 +\u6399\u8457\u66f8=\u6323\u8457\u4e66 +\u6399\u8457\u4f5c=\u6323\u8457\u4f5c +\u6399\u8457\u540d=\u6323\u8457\u540d +\u6399\u8457\u9304=\u6323\u8457\u5f55 +\u6399\u8457\u7a31=\u6323\u8457\u79f0 +\u6399\u8457\u8005=\u6323\u8457\u8005 +\u6399\u8457\u8ff0=\u6323\u8457\u8ff0 +\u63ee\u8457=\u6325\u7740 +\u63ee\u8457\u66f8=\u6325\u8457\u4e66 +\u63ee\u8457\u4f5c=\u6325\u8457\u4f5c +\u63ee\u8457\u540d=\u6325\u8457\u540d +\u63ee\u8457\u9304=\u6325\u8457\u5f55 +\u63ee\u8457\u7a31=\u6325\u8457\u79f0 +\u63ee\u8457\u8005=\u6325\u8457\u8005 +\u63ee\u8457\u8ff0=\u6325\u8457\u8ff0 +\u6328\u8457=\u6328\u7740 +\u6328\u8457\u66f8=\u6328\u8457\u4e66 +\u6328\u8457\u4f5c=\u6328\u8457\u4f5c +\u6328\u8457\u540d=\u6328\u8457\u540d +\u6328\u8457\u9304=\u6328\u8457\u5f55 +\u6328\u8457\u7a31=\u6328\u8457\u79f0 +\u6328\u8457\u8005=\u6328\u8457\u8005 +\u6328\u8457\u8ff0=\u6328\u8457\u8ff0 +\u6346\u8457=\u6346\u7740 +\u6346\u8457\u66f8=\u6346\u8457\u4e66 +\u6346\u8457\u4f5c=\u6346\u8457\u4f5c +\u6346\u8457\u540d=\u6346\u8457\u540d +\u6346\u8457\u9304=\u6346\u8457\u5f55 +\u6346\u8457\u7a31=\u6346\u8457\u79f0 +\u6346\u8457\u8005=\u6346\u8457\u8005 +\u6346\u8457\u8ff0=\u6346\u8457\u8ff0 +\u64da\u8457=\u636e\u7740 +\u64da\u8457\u66f8=\u636e\u8457\u4e66 +\u64da\u8457\u4f5c=\u636e\u8457\u4f5c +\u64da\u8457\u540d=\u636e\u8457\u540d +\u64da\u8457\u9304=\u636e\u8457\u5f55 +\u64da\u8457\u7a31=\u636e\u8457\u79f0 +\u64da\u8457\u8005=\u636e\u8457\u8005 +\u64da\u8457\u8ff0=\u636e\u8457\u8ff0 +\u6396\u8457=\u6396\u7740 +\u6396\u8457\u66f8=\u6396\u8457\u4e66 +\u6396\u8457\u4f5c=\u6396\u8457\u4f5c +\u6396\u8457\u540d=\u6396\u8457\u540d +\u6396\u8457\u9304=\u6396\u8457\u5f55 +\u6396\u8457\u7a31=\u6396\u8457\u79f0 +\u6396\u8457\u8005=\u6396\u8457\u8005 +\u6396\u8457\u8ff0=\u6396\u8457\u8ff0 +\u63a5\u8457=\u63a5\u7740 +\u63a5\u8457\u66f8=\u63a5\u8457\u4e66 +\u63a5\u8457\u4f5c=\u63a5\u8457\u4f5c +\u63a5\u8457\u540d=\u63a5\u8457\u540d +\u63a5\u8457\u9304=\u63a5\u8457\u5f55 +\u63a5\u8457\u7a31=\u63a5\u8457\u79f0 +\u63a5\u8457\u8005=\u63a5\u8457\u8005 +\u63a5\u8457\u8ff0=\u63a5\u8457\u8ff0 +\u63c9\u8457=\u63c9\u7740 +\u63c9\u8457\u66f8=\u63c9\u8457\u4e66 +\u63c9\u8457\u4f5c=\u63c9\u8457\u4f5c +\u63c9\u8457\u540d=\u63c9\u8457\u540d +\u63c9\u8457\u9304=\u63c9\u8457\u5f55 +\u63c9\u8457\u7a31=\u63c9\u8457\u79f0 +\u63c9\u8457\u8005=\u63c9\u8457\u8005 +\u63c9\u8457\u8ff0=\u63c9\u8457\u8ff0 +\u63d0\u8457=\u63d0\u7740 +\u63d0\u8457\u66f8=\u63d0\u8457\u4e66 +\u63d0\u8457\u4f5c=\u63d0\u8457\u4f5c +\u63d0\u8457\u540d=\u63d0\u8457\u540d +\u63d0\u8457\u9304=\u63d0\u8457\u5f55 +\u63d0\u8457\u7a31=\u63d0\u8457\u79f0 +\u63d0\u8457\u8005=\u63d0\u8457\u8005 +\u63d0\u8457\u8ff0=\u63d0\u8457\u8ff0 +\u645f\u8457=\u6402\u7740 +\u645f\u8457\u66f8=\u6402\u8457\u4e66 +\u645f\u8457\u4f5c=\u6402\u8457\u4f5c +\u645f\u8457\u540d=\u6402\u8457\u540d +\u645f\u8457\u9304=\u6402\u8457\u5f55 +\u645f\u8457\u7a31=\u6402\u8457\u79f0 +\u645f\u8457\u8005=\u6402\u8457\u8005 +\u645f\u8457\u8ff0=\u6402\u8457\u8ff0 +\u64fa\u8457=\u6446\u7740 +\u64fa\u8457\u66f8=\u6446\u8457\u4e66 +\u64fa\u8457\u4f5c=\u6446\u8457\u4f5c +\u64fa\u8457\u540d=\u6446\u8457\u540d +\u64fa\u8457\u9304=\u6446\u8457\u5f55 +\u64fa\u8457\u7a31=\u6446\u8457\u79f0 +\u64fa\u8457\u8005=\u6446\u8457\u8005 +\u64fa\u8457\u8ff0=\u6446\u8457\u8ff0 +\u647a\u758a=\u647a\u53e0 +\u64b0\u8457=\u64b0\u8457 +\u64bc\u8457=\u64bc\u7740 +\u64bc\u8457\u66f8=\u64bc\u8457\u4e66 +\u64bc\u8457\u4f5c=\u64bc\u8457\u4f5c +\u64bc\u8457\u540d=\u64bc\u8457\u540d +\u64bc\u8457\u9304=\u64bc\u8457\u5f55 +\u64bc\u8457\u7a31=\u64bc\u8457\u79f0 +\u64bc\u8457\u8005=\u64bc\u8457\u8005 +\u64bc\u8457\u8ff0=\u64bc\u8457\u8ff0 +\u6548\u679c\u986f\u8457=\u6548\u679c\u663e\u8457 +\u655e\u8457=\u655e\u7740 +\u655e\u8457\u66f8=\u655e\u8457\u4e66 +\u655e\u8457\u4f5c=\u655e\u8457\u4f5c +\u655e\u8457\u540d=\u655e\u8457\u540d +\u655e\u8457\u9304=\u655e\u8457\u5f55 +\u655e\u8457\u7a31=\u655e\u8457\u79f0 +\u655e\u8457\u8005=\u655e\u8457\u8005 +\u655e\u8457\u8ff0=\u655e\u8457\u8ff0 +\u6578\u8457=\u6570\u7740 +\u6578\u8457\u66f8=\u6570\u8457\u4e66 +\u6578\u8457\u4f5c=\u6570\u8457\u4f5c +\u6578\u8457\u540d=\u6570\u8457\u540d +\u6578\u8457\u9304=\u6570\u8457\u5f55 +\u6578\u8457\u7a31=\u6570\u8457\u79f0 +\u6578\u8457\u8005=\u6570\u8457\u8005 +\u6578\u8457\u8ff0=\u6570\u8457\u8ff0 +\u6597\u8457=\u6597\u7740 +\u6597\u8457\u66f8=\u6597\u8457\u4e66 +\u6597\u8457\u4f5c=\u6597\u8457\u4f5c +\u6597\u8457\u540d=\u6597\u8457\u540d +\u6597\u8457\u9304=\u6597\u8457\u5f55 +\u6597\u8457\u7a31=\u6597\u8457\u79f0 +\u6597\u8457\u8005=\u6597\u8457\u8005 +\u6597\u8457\u8ff0=\u6597\u8457\u8ff0 +\u65a5\u8457=\u65a5\u7740 +\u65a5\u8457\u66f8=\u65a5\u8457\u4e66 +\u65a5\u8457\u4f5c=\u65a5\u8457\u4f5c +\u65a5\u8457\u540d=\u65a5\u8457\u540d +\u65a5\u8457\u9304=\u65a5\u8457\u5f55 +\u65a5\u8457\u7a31=\u65a5\u8457\u79f0 +\u65a5\u8457\u8005=\u65a5\u8457\u8005 +\u65a5\u8457\u8ff0=\u65a5\u8457\u8ff0 +\u65b0\u8457=\u65b0\u8457 +\u65b0\u8457\u9f8d\u864e\u9580=\u65b0\u8457\u9f99\u864e\u95e8 +\u65bc\u4e16\u6210=\u65bc\u4e16\u6210 +\u65bc\u4e4e=\u65bc\u4e4e +\u65bc\u4e59\u4e8e\u540c=\u65bc\u4e59\u4e8e\u540c +\u65bc\u4e59\u5b87\u540c=\u65bc\u4e59\u5b87\u540c +\u65bc\u4e8e\u540c=\u65bc\u4e8e\u540c +\u65bc\u54f2=\u65bc\u54f2 +\u65bc\u592b\u7f57=\u65bc\u592b\u7f57 +\u65bc\u592b\u7f85=\u65bc\u592b\u7f57 +\u65bc\u59d3=\u65bc\u59d3 +\u65bc\u5b87\u540c=\u65bc\u5b87\u540c +\u65bc\u5d07\u6587=\u65bc\u5d07\u6587 +\u65bc\u5fd7\u8cc0=\u65bc\u5fd7\u8d3a +\u65bc\u5fd7\u8d3a=\u65bc\u5fd7\u8d3a +\u65bc\u6232=\u65bc\u620f +\u65bc\u68a8\u83ef=\u65bc\u68a8\u534e +\u65bc\u68a8\u534e=\u65bc\u68a8\u534e +\u65bc\u6c0f=\u65bc\u6c0f +\u65bc\u6f5b\u7e23=\u65bc\u6f5c\u53bf +\u65bc\u6f5c\u53bf=\u65bc\u6f5c\u53bf +\u65bc\u7965\u7389=\u65bc\u7965\u7389 +\u65bc\u83df=\u65bc\u83df +\u65bc\u8ce2\u5fb7=\u65bc\u8d24\u5fb7 +\u65bc\u9664\u97ac=\u65bc\u9664\u97ac +\u65cb\u4e7e\u8f49\u5764=\u65cb\u4e7e\u8f6c\u5764 +\u66e0\u82e5\u767c\u77c7=\u65f7\u82e5\u53d1\u77c7 +\u6602\u8457=\u6602\u7740 +\u6602\u8457\u66f8=\u6602\u8457\u4e66 +\u6602\u8457\u4f5c=\u6602\u8457\u4f5c +\u6602\u8457\u540d=\u6602\u8457\u540d +\u6602\u8457\u9304=\u6602\u8457\u5f55 +\u6602\u8457\u7a31=\u6602\u8457\u79f0 +\u6602\u8457\u8005=\u6602\u8457\u8005 +\u6602\u8457\u8ff0=\u6602\u8457\u8ff0 +\u6613\u00b7\u4e7e=\u6613\u00b7\u4e7e +\u6613\u7d93\u00b7\u4e7e=\u6613\u7ecf\u00b7\u4e7e +\u6613\u7ecf\u00b7\u4e7e=\u6613\u7ecf\u00b7\u4e7e +\u6613\u7d93\u4e7e=\u6613\u7ecf\u4e7e +\u6613\u7ecf\u4e7e=\u6613\u7ecf\u4e7e +\u6620\u8457=\u6620\u7740 +\u6620\u8457\u66f8=\u6620\u8457\u4e66 +\u6620\u8457\u4f5c=\u6620\u8457\u4f5c +\u6620\u8457\u540d=\u6620\u8457\u540d +\u6620\u8457\u9304=\u6620\u8457\u5f55 +\u6620\u8457\u7a31=\u6620\u8457\u79f0 +\u6620\u8457\u8005=\u6620\u8457\u8005 +\u6620\u8457\u8ff0=\u6620\u8457\u8ff0 +\u662d\u8457=\u662d\u8457 +\u986f\u8457=\u663e\u8457 +\u986f\u8457\u5730=\u663e\u8457\u5730 +\u986f\u8457\u5730\u4f4d=\u663e\u8457\u5730\u4f4d +\u986f\u8457\u6027=\u663e\u8457\u6027 +\u986f\u8457\u6210\u7e3e=\u663e\u8457\u6210\u7ee9 +\u986f\u8457\u6548\u679c=\u663e\u8457\u6548\u679c +\u986f\u8457\u7279\u9ede=\u663e\u8457\u7279\u70b9 +\u6643\u8457=\u6643\u7740 +\u6643\u8457\u66f8=\u6643\u8457\u4e66 +\u6643\u8457\u4f5c=\u6643\u8457\u4f5c +\u6643\u8457\u540d=\u6643\u8457\u540d +\u6643\u8457\u9304=\u6643\u8457\u5f55 +\u6643\u8457\u7a31=\u6643\u8457\u79f0 +\u6643\u8457\u8005=\u6643\u8457\u8005 +\u6643\u8457\u8ff0=\u6643\u8457\u8ff0 +\u6697\u8457=\u6697\u7740 +\u6697\u8457\u66f8=\u6697\u8457\u4e66 +\u6697\u8457\u4f5c=\u6697\u8457\u4f5c +\u6697\u8457\u540d=\u6697\u8457\u540d +\u6697\u8457\u9304=\u6697\u8457\u5f55 +\u6697\u8457\u7a31=\u6697\u8457\u79f0 +\u6697\u8457\u8005=\u6697\u8457\u8005 +\u6697\u8457\u8ff0=\u6697\u8457\u8ff0 +\u6709\u8457=\u6709\u7740 +\u6709\u8457\u66f8=\u6709\u8457\u4e66 +\u6709\u8457\u4f5c=\u6709\u8457\u4f5c +\u6709\u8457\u540d=\u6709\u8457\u540d +\u6709\u8457\u9304=\u6709\u8457\u5f55 +\u6709\u8457\u7a31=\u6709\u8457\u79f0 +\u6709\u8457\u8005=\u6709\u8457\u8005 +\u6709\u8457\u8ff0=\u6709\u8457\u8ff0 +\u671b\u8457=\u671b\u7740 +\u671b\u8457\u66f8=\u671b\u8457\u4e66 +\u671b\u8457\u4f5c=\u671b\u8457\u4f5c +\u671b\u8457\u540d=\u671b\u8457\u540d +\u671b\u8457\u9304=\u671b\u8457\u5f55 +\u671b\u8457\u7a31=\u671b\u8457\u79f0 +\u671b\u8457\u8005=\u671b\u8457\u8005 +\u671b\u8457\u8ff0=\u671b\u8457\u8ff0 +\u671d\u4e7e\u5915\u60d5=\u671d\u4e7e\u5915\u60d5 +\u671d\u8457=\u671d\u7740 +\u671d\u8457\u66f8=\u671d\u8457\u4e66 +\u671d\u8457\u4f5c=\u671d\u8457\u4f5c +\u671d\u8457\u540d=\u671d\u8457\u540d +\u671d\u8457\u9304=\u671d\u8457\u5f55 +\u671d\u8457\u7a31=\u671d\u8457\u79f0 +\u671d\u8457\u8005=\u671d\u8457\u8005 +\u671d\u8457\u8ff0=\u671d\u8457\u8ff0 +\u672c\u8457=\u672c\u7740 +\u672c\u8457\u66f8=\u672c\u8457\u4e66 +\u672c\u8457\u4f5c=\u672c\u8457\u4f5c +\u672c\u8457\u540d=\u672c\u8457\u540d +\u672c\u8457\u9304=\u672c\u8457\u5f55 +\u672c\u8457\u7a31=\u672c\u8457\u79f0 +\u672c\u8457\u8005=\u672c\u8457\u8005 +\u672c\u8457\u8ff0=\u672c\u8457\u8ff0 +\u6734\u65bc\u5b87\u540c=\u6734\u65bc\u5b87\u540c +\u6bba\u8457=\u6740\u7740 +\u6bba\u8457\u66f8=\u6740\u8457\u4e66 +\u6bba\u8457\u4f5c=\u6740\u8457\u4f5c +\u6bba\u8457\u540d=\u6740\u8457\u540d +\u6bba\u8457\u9304=\u6740\u8457\u5f55 +\u6bba\u8457\u7a31=\u6740\u8457\u79f0 +\u6bba\u8457\u8005=\u6740\u8457\u8005 +\u6bba\u8457\u8ff0=\u6740\u8457\u8ff0 +\u96dc\u8457=\u6742\u7740 +\u96dc\u8457\u66f8=\u6742\u8457\u4e66 +\u96dc\u8457\u4f5c=\u6742\u8457\u4f5c +\u96dc\u8457\u540d=\u6742\u8457\u540d +\u96dc\u8457\u9304=\u6742\u8457\u5f55 +\u96dc\u8457\u7a31=\u6742\u8457\u79f0 +\u96dc\u8457\u8005=\u6742\u8457\u8005 +\u96dc\u8457\u8ff0=\u6742\u8457\u8ff0 +\u674e\u4e7e\u5fb7=\u674e\u4e7e\u5fb7 +\u674e\u4e7e\u9806=\u674e\u4e7e\u987a +\u674e\u4e7e\u987a=\u674e\u4e7e\u987a +\u674e\u6fa4\u9245=\u674e\u6cfd\u949c +\u4f86\u8457=\u6765\u7740 +\u4f86\u8457\u66f8=\u6765\u8457\u4e66 +\u4f86\u8457\u4f5c=\u6765\u8457\u4f5c +\u4f86\u8457\u540d=\u6765\u8457\u540d +\u4f86\u8457\u9304=\u6765\u8457\u5f55 +\u4f86\u8457\u7a31=\u6765\u8457\u79f0 +\u4f86\u8457\u8005=\u6765\u8457\u8005 +\u4f86\u8457\u8ff0=\u6765\u8457\u8ff0 +\u694a\u5e7a=\u6768\u5e7a +\u6795\u8457=\u6795\u7740 +\u6795\u8457\u66f8=\u6795\u8457\u4e66 +\u6795\u8457\u4f5c=\u6795\u8457\u4f5c +\u6795\u8457\u540d=\u6795\u8457\u540d +\u6795\u8457\u9304=\u6795\u8457\u5f55 +\u6795\u8457\u7a31=\u6795\u8457\u79f0 +\u6795\u8457\u8005=\u6795\u8457\u8005 +\u6795\u8457\u8ff0=\u6795\u8457\u8ff0 +\u67f3\u8a52\u5fb5=\u67f3\u8bd2\u5fb5 +\u67f3\u8bd2\u5fb5=\u67f3\u8bd2\u5fb5 +\u5922\u8457=\u68a6\u7740 +\u5922\u8457\u66f8=\u68a6\u8457\u4e66 +\u5922\u8457\u4f5c=\u68a6\u8457\u4f5c +\u5922\u8457\u540d=\u68a6\u8457\u540d +\u5922\u8457\u9304=\u68a6\u8457\u5f55 +\u5922\u8457\u7a31=\u68a6\u8457\u79f0 +\u5922\u8457\u8005=\u68a6\u8457\u8005 +\u5922\u8457\u8ff0=\u68a6\u8457\u8ff0 +\u68b3\u8457=\u68b3\u7740 +\u68b3\u8457\u66f8=\u68b3\u8457\u4e66 +\u68b3\u8457\u4f5c=\u68b3\u8457\u4f5c +\u68b3\u8457\u540d=\u68b3\u8457\u540d +\u68b3\u8457\u9304=\u68b3\u8457\u5f55 +\u68b3\u8457\u7a31=\u68b3\u8457\u79f0 +\u68b3\u8457\u8005=\u68b3\u8457\u8005 +\u68b3\u8457\u8ff0=\u68b3\u8457\u8ff0 +\u6a0a\u65bc\u671f=\u6a0a\u65bc\u671f +\u6bd4\u8f03\u986f\u8457=\u6bd4\u8f83\u663e\u8457 +\u6c06\u6c0c=\u6c06\u6c0c +\u6c42\u8457=\u6c42\u7740 +\u6c42\u8457\u66f8=\u6c42\u8457\u4e66 +\u6c42\u8457\u4f5c=\u6c42\u8457\u4f5c +\u6c42\u8457\u540d=\u6c42\u8457\u540d +\u6c42\u8457\u9304=\u6c42\u8457\u5f55 +\u6c42\u8457\u7a31=\u6c42\u8457\u79f0 +\u6c42\u8457\u8005=\u6c42\u8457\u8005 +\u6c42\u8457\u8ff0=\u6c42\u8457\u8ff0 +\u6c88\u6c92=\u6c89\u6ca1 +\u6c89\u8457=\u6c89\u7740 +\u6c88\u7a4d=\u6c89\u79ef +\u6c88\u8239=\u6c89\u8239 +\u6c89\u8457\u66f8=\u6c89\u8457\u4e66 +\u6c89\u8457\u4f5c=\u6c89\u8457\u4f5c +\u6c89\u8457\u540d=\u6c89\u8457\u540d +\u6c89\u8457\u9304=\u6c89\u8457\u5f55 +\u6c89\u8457\u7a31=\u6c89\u8457\u79f0 +\u6c89\u8457\u8005=\u6c89\u8457\u8005 +\u6c89\u8457\u8ff0=\u6c89\u8457\u8ff0 +\u6c88\u9ed8=\u6c89\u9ed8 +\u6cbf\u8457=\u6cbf\u7740 +\u6cbf\u8457\u66f8=\u6cbf\u8457\u4e66 +\u6cbf\u8457\u4f5c=\u6cbf\u8457\u4f5c +\u6cbf\u8457\u540d=\u6cbf\u8457\u540d +\u6cbf\u8457\u9304=\u6cbf\u8457\u5f55 +\u6cbf\u8457\u7a31=\u6cbf\u8457\u79f0 +\u6cbf\u8457\u8005=\u6cbf\u8457\u8005 +\u6cbf\u8457\u8ff0=\u6cbf\u8457\u8ff0 +\u6d17\u934a=\u6d17\u7ec3 +\u6d3b\u8457=\u6d3b\u7740 +\u6d3b\u8457\u66f8=\u6d3b\u8457\u4e66 +\u6d3b\u8457\u4f5c=\u6d3b\u8457\u4f5c +\u6d3b\u8457\u540d=\u6d3b\u8457\u540d +\u6d3b\u8457\u9304=\u6d3b\u8457\u5f55 +\u6d3b\u8457\u7a31=\u6d3b\u8457\u79f0 +\u6d3b\u8457\u8005=\u6d3b\u8457\u8005 +\u6d3b\u8457\u8ff0=\u6d3b\u8457\u8ff0 +\u6d41\u8457=\u6d41\u7740 +\u6d41\u8457\u66f8=\u6d41\u8457\u4e66 +\u6d41\u8457\u4f5c=\u6d41\u8457\u4f5c +\u6d41\u8457\u540d=\u6d41\u8457\u540d +\u6d41\u8457\u9304=\u6d41\u8457\u5f55 +\u6d41\u8457\u7a31=\u6d41\u8457\u79f0 +\u6d41\u8457\u8005=\u6d41\u8457\u8005 +\u6d41\u8457\u8ff0=\u6d41\u8457\u8ff0 +\u6d6e\u8457=\u6d6e\u7740 +\u6d6e\u8457\u66f8=\u6d6e\u8457\u4e66 +\u6d6e\u8457\u4f5c=\u6d6e\u8457\u4f5c +\u6d6e\u8457\u540d=\u6d6e\u8457\u540d +\u6d6e\u8457\u9304=\u6d6e\u8457\u5f55 +\u6d6e\u8457\u7a31=\u6d6e\u8457\u79f0 +\u6d6e\u8457\u8005=\u6d6e\u8457\u8005 +\u6d6e\u8457\u8ff0=\u6d6e\u8457\u8ff0 +\u6f64\u8457=\u6da6\u7740 +\u6f64\u8457\u66f8=\u6da6\u8457\u4e66 +\u6f64\u8457\u4f5c=\u6da6\u8457\u4f5c +\u6f64\u8457\u540d=\u6da6\u8457\u540d +\u6f64\u8457\u9304=\u6da6\u8457\u5f55 +\u6f64\u8457\u7a31=\u6da6\u8457\u79f0 +\u6f64\u8457\u8005=\u6da6\u8457\u8005 +\u6f64\u8457\u8ff0=\u6da6\u8457\u8ff0 +\u6db5\u8457=\u6db5\u7740 +\u6db5\u8457\u66f8=\u6db5\u8457\u4e66 +\u6db5\u8457\u4f5c=\u6db5\u8457\u4f5c +\u6db5\u8457\u540d=\u6db5\u8457\u540d +\u6db5\u8457\u9304=\u6db5\u8457\u5f55 +\u6db5\u8457\u7a31=\u6db5\u8457\u79f0 +\u6db5\u8457\u8005=\u6db5\u8457\u8005 +\u6db5\u8457\u8ff0=\u6db5\u8457\u8ff0 +\u6e34\u8457=\u6e34\u7740 +\u6e34\u8457\u66f8=\u6e34\u8457\u4e66 +\u6e34\u8457\u4f5c=\u6e34\u8457\u4f5c +\u6e34\u8457\u540d=\u6e34\u8457\u540d +\u6e34\u8457\u9304=\u6e34\u8457\u5f55 +\u6e34\u8457\u7a31=\u6e34\u8457\u79f0 +\u6e34\u8457\u8005=\u6e34\u8457\u8005 +\u6e34\u8457\u8ff0=\u6e34\u8457\u8ff0 +\u6ea2\u8457=\u6ea2\u7740 +\u6ea2\u8457\u66f8=\u6ea2\u8457\u4e66 +\u6ea2\u8457\u4f5c=\u6ea2\u8457\u4f5c +\u6ea2\u8457\u540d=\u6ea2\u8457\u540d +\u6ea2\u8457\u9304=\u6ea2\u8457\u5f55 +\u6ea2\u8457\u7a31=\u6ea2\u8457\u79f0 +\u6ea2\u8457\u8005=\u6ea2\u8457\u8005 +\u6ea2\u8457\u8ff0=\u6ea2\u8457\u8ff0 +\u6f14\u8457=\u6f14\u7740 +\u6f14\u8457\u66f8=\u6f14\u8457\u4e66 +\u6f14\u8457\u4f5c=\u6f14\u8457\u4f5c +\u6f14\u8457\u540d=\u6f14\u8457\u540d +\u6f14\u8457\u9304=\u6f14\u8457\u5f55 +\u6f14\u8457\u7a31=\u6f14\u8457\u79f0 +\u6f14\u8457\u8005=\u6f14\u8457\u8005 +\u6f14\u8457\u8ff0=\u6f14\u8457\u8ff0 +\u6f2b\u8457=\u6f2b\u7740 +\u6f2b\u8457\u66f8=\u6f2b\u8457\u4e66 +\u6f2b\u8457\u4f5c=\u6f2b\u8457\u4f5c +\u6f2b\u8457\u540d=\u6f2b\u8457\u540d +\u6f2b\u8457\u9304=\u6f2b\u8457\u5f55 +\u6f2b\u8457\u7a31=\u6f2b\u8457\u79f0 +\u6f2b\u8457\u8005=\u6f2b\u8457\u8005 +\u6f2b\u8457\u8ff0=\u6f2b\u8457\u8ff0 +\u9ede\u8457=\u70b9\u7740 +\u9ede\u8457\u4f5c=\u70b9\u8457\u4f5c +\u9ede\u8457\u540d=\u70b9\u8457\u540d +\u9ede\u8457\u9304=\u70b9\u8457\u5f55 +\u9ede\u8457\u7a31=\u70b9\u8457\u79f0 +\u9ede\u8457\u8005=\u70b9\u8457\u8005 +\u9ede\u8457\u8ff0=\u70b9\u8457\u8ff0 +\u71d2\u8457=\u70e7\u7740 +\u71d2\u8457\u4f5c=\u70e7\u8457\u4f5c +\u71d2\u8457\u540d=\u70e7\u8457\u540d +\u71d2\u8457\u9304=\u70e7\u8457\u5f55 +\u71d2\u8457\u7a31=\u70e7\u8457\u79f0 +\u71d2\u8457\u8005=\u70e7\u8457\u8005 +\u71d2\u8457\u8ff0=\u70e7\u8457\u8ff0 +\u7167\u8457=\u7167\u7740 +\u7167\u8457\u66f8=\u7167\u8457\u4e66 +\u7167\u8457\u4f5c=\u7167\u8457\u4f5c +\u7167\u8457\u540d=\u7167\u8457\u540d +\u7167\u8457\u9304=\u7167\u8457\u5f55 +\u7167\u8457\u7a31=\u7167\u8457\u79f0 +\u7167\u8457\u8005=\u7167\u8457\u8005 +\u7167\u8457\u8ff0=\u7167\u8457\u8ff0 +\u611b\u8b77\u8457=\u7231\u62a4\u7740 +\u611b\u8457=\u7231\u7740 +\u611b\u8457\u66f8=\u7231\u8457\u4e66 +\u611b\u8457\u4f5c=\u7231\u8457\u4f5c +\u611b\u8457\u540d=\u7231\u8457\u540d +\u611b\u8457\u9304=\u7231\u8457\u5f55 +\u611b\u8457\u7a31=\u7231\u8457\u79f0 +\u611b\u8457\u8005=\u7231\u8457\u8005 +\u611b\u8457\u8ff0=\u7231\u8457\u8ff0 +\u727d\u8457=\u7275\u7740 +\u727d\u8457\u66f8=\u7275\u8457\u4e66 +\u727d\u8457\u4f5c=\u7275\u8457\u4f5c +\u727d\u8457\u540d=\u7275\u8457\u540d +\u727d\u8457\u9304=\u7275\u8457\u5f55 +\u727d\u8457\u7a31=\u7275\u8457\u79f0 +\u727d\u8457\u8005=\u7275\u8457\u8005 +\u727d\u8457\u8ff0=\u7275\u8457\u8ff0 +\u72af\u4e0d\u8457=\u72af\u4e0d\u7740 +\u7368\u8457=\u72ec\u7740 +\u7368\u8457\u66f8=\u72ec\u8457\u4e66 +\u7368\u8457\u4f5c=\u72ec\u8457\u4f5c +\u7368\u8457\u540d=\u72ec\u8457\u540d +\u7368\u8457\u9304=\u72ec\u8457\u5f55 +\u7368\u8457\u7a31=\u72ec\u8457\u79f0 +\u7368\u8457\u8005=\u72ec\u8457\u8005 +\u7368\u8457\u8ff0=\u72ec\u8457\u8ff0 +\u731c\u8457=\u731c\u7740 +\u731c\u8457\u66f8=\u731c\u7740\u4e66 +\u731c\u8457\u4f5c=\u731c\u8457\u4f5c +\u731c\u8457\u540d=\u731c\u8457\u540d +\u731c\u8457\u9304=\u731c\u8457\u5f55 +\u731c\u8457\u7a31=\u731c\u8457\u79f0 +\u731c\u8457\u8005=\u731c\u8457\u8005 +\u731c\u8457\u8ff0=\u731c\u8457\u8ff0 +\u751c\u8457=\u751c\u7740 +\u751c\u8457\u66f8=\u751c\u8457\u4e66 +\u751c\u8457\u4f5c=\u751c\u8457\u4f5c +\u751c\u8457\u540d=\u751c\u8457\u540d +\u751c\u8457\u9304=\u751c\u8457\u5f55 +\u751c\u8457\u7a31=\u751c\u8457\u79f0 +\u751c\u8457\u8005=\u751c\u8457\u8005 +\u751c\u8457\u8ff0=\u751c\u8457\u8ff0 +\u7528\u4e0d\u8457=\u7528\u4e0d\u7740 +\u7528\u4e0d\u8457\u66f8=\u7528\u4e0d\u7740\u4e66 +\u7528\u4e0d\u8457\u4f5c=\u7528\u4e0d\u8457\u4f5c +\u7528\u4e0d\u8457\u540d=\u7528\u4e0d\u8457\u540d +\u7528\u4e0d\u8457\u9304=\u7528\u4e0d\u8457\u5f55 +\u7528\u4e0d\u8457\u7a31=\u7528\u4e0d\u8457\u79f0 +\u7528\u4e0d\u8457\u8005=\u7528\u4e0d\u8457\u8005 +\u7528\u4e0d\u8457\u8ff0=\u7528\u4e0d\u8457\u8ff0 +\u7528\u8457=\u7528\u7740 +\u7528\u8457\u66f8=\u7528\u8457\u4e66 +\u7528\u8457\u4f5c=\u7528\u8457\u4f5c +\u7528\u8457\u540d=\u7528\u8457\u540d +\u7528\u8457\u9304=\u7528\u8457\u5f55 +\u7528\u8457\u7a31=\u7528\u8457\u79f0 +\u7528\u8457\u8005=\u7528\u8457\u8005 +\u7528\u8457\u8ff0=\u7528\u8457\u8ff0 +\u7559\u8457=\u7559\u7740 +\u7559\u8457\u66f8=\u7559\u7740\u4e66 +\u7559\u8457\u4f5c=\u7559\u8457\u4f5c +\u7559\u8457\u540d=\u7559\u8457\u540d +\u7559\u8457\u9304=\u7559\u8457\u5f55 +\u7559\u8457\u7a31=\u7559\u8457\u79f0 +\u7559\u8457\u8005=\u7559\u8457\u8005 +\u7559\u8457\u8ff0=\u7559\u8457\u8ff0 +\u7591\u8457=\u7591\u7740 +\u7591\u8457\u66f8=\u7591\u8457\u4e66 +\u7591\u8457\u4f5c=\u7591\u8457\u4f5c +\u7591\u8457\u540d=\u7591\u8457\u540d +\u7591\u8457\u9304=\u7591\u8457\u5f55 +\u7591\u8457\u7a31=\u7591\u8457\u79f0 +\u7591\u8457\u8005=\u7591\u8457\u8005 +\u7591\u8457\u8ff0=\u7591\u8457\u8ff0 +\u7642\u6548\u986f\u8457=\u7597\u6548\u663e\u8457 +\u7665\u7615=\u7665\u7615 +\u76ba\u8457=\u76b1\u7740 +\u76ba\u8457\u66f8=\u76b1\u8457\u4e66 +\u76ba\u8457\u4f5c=\u76b1\u8457\u4f5c +\u76ba\u8457\u540d=\u76b1\u8457\u540d +\u76ba\u8457\u9304=\u76b1\u8457\u5f55 +\u76ba\u8457\u7a31=\u76b1\u8457\u79f0 +\u76ba\u8457\u8005=\u76b1\u8457\u8005 +\u76ba\u8457\u8ff0=\u76b1\u8457\u8ff0 +\u76db\u8457=\u76db\u7740 +\u76db\u8457\u66f8=\u76db\u8457\u4e66 +\u76db\u8457\u4f5c=\u76db\u8457\u4f5c +\u76db\u8457\u540d=\u76db\u8457\u540d +\u76db\u8457\u9304=\u76db\u8457\u5f55 +\u76db\u8457\u7a31=\u76db\u8457\u79f0 +\u76db\u8457\u8005=\u76db\u8457\u8005 +\u76db\u8457\u8ff0=\u76db\u8457\u8ff0 +\u76ef\u8457=\u76ef\u7740 +\u76ef\u8457\u66f8=\u76ef\u7740\u4e66 +\u76ef\u8457\u4f5c=\u76ef\u8457\u4f5c +\u76ef\u8457\u540d=\u76ef\u8457\u540d +\u76ef\u8457\u9304=\u76ef\u8457\u5f55 +\u76ef\u8457\u7a31=\u76ef\u8457\u79f0 +\u76ef\u8457\u8005=\u76ef\u8457\u8005 +\u76ef\u8457\u8ff0=\u76ef\u8457\u8ff0 +\u76fe\u8457=\u76fe\u7740 +\u76fe\u8457\u66f8=\u76fe\u8457\u4e66 +\u76fe\u8457\u4f5c=\u76fe\u8457\u4f5c +\u76fe\u8457\u540d=\u76fe\u8457\u540d +\u76fe\u8457\u9304=\u76fe\u8457\u5f55 +\u76fe\u8457\u7a31=\u76fe\u8457\u79f0 +\u76fe\u8457\u8005=\u76fe\u8457\u8005 +\u76fe\u8457\u8ff0=\u76fe\u8457\u8ff0 +\u770b\u8457=\u770b\u7740 +\u770b\u8457\u66f8=\u770b\u7740\u4e66 +\u770b\u8457\u4f5c=\u770b\u8457\u4f5c +\u770b\u8457\u540d=\u770b\u8457\u540d +\u770b\u8457\u9304=\u770b\u8457\u5f55 +\u770b\u8457\u7a31=\u770b\u8457\u79f0 +\u770b\u8457\u8005=\u770b\u8457\u8005 +\u770b\u8457\u8ff0=\u770b\u8457\u8ff0 +\u8457\u696d=\u7740\u4e1a +\u8457\u7d72=\u7740\u4e1d +\u8457\u4e48=\u7740\u4e48 +\u8457\u4eba=\u7740\u4eba +\u8457\u4ec0\u4e48\u6025=\u7740\u4ec0\u4e48\u6025 +\u8457\u4ed6=\u7740\u4ed6 +\u8457\u4ee4=\u7740\u4ee4 +\u8457\u4f4d=\u7740\u4f4d +\u8457\u9ad4=\u7740\u4f53 +\u8457\u4f60=\u7740\u4f60 +\u8457\u4fbf=\u7740\u4fbf +\u8457\u6dbc=\u7740\u51c9 +\u8457\u529b=\u7740\u529b +\u8457\u52c1=\u7740\u52b2 +\u8457\u865f=\u7740\u53f7 +\u8457\u5462=\u7740\u5462 +\u8457\u54e9=\u7740\u54e9 +\u8457\u5730=\u7740\u5730 +\u8457\u58a8=\u7740\u58a8 +\u8457\u8072=\u7740\u58f0 +\u8457\u8655=\u7740\u5904 +\u8457\u5979=\u7740\u5979 +\u8457\u59b3=\u7740\u59b3 +\u8457\u59d3=\u7740\u59d3 +\u8457\u5b83=\u7740\u5b83 +\u8457\u5b9a=\u7740\u5b9a +\u8457\u5be6=\u7740\u5b9e +\u8457\u5df1=\u7740\u5df1 +\u8457\u5e33=\u7740\u5e10 +\u8457\u5e8a=\u7740\u5e8a +\u8457\u5eb8=\u7740\u5eb8 +\u8457\u5f0f=\u7740\u5f0f +\u8457\u9304=\u7740\u5f55 +\u8457\u5fc3=\u7740\u5fc3 +\u8457\u5fd7=\u7740\u5fd7 +\u8457\u5fd9=\u7740\u5fd9 +\u8457\u6025=\u7740\u6025 +\u8457\u60f1=\u7740\u607c +\u8457\u9a5a=\u7740\u60ca +\u8457\u60f3=\u7740\u60f3 +\u8457\u610f=\u7740\u610f +\u8457\u614c=\u7740\u614c +\u8457\u6211=\u7740\u6211 +\u8457\u624b=\u7740\u624b +\u8457\u62b9=\u7740\u62b9 +\u8457\u6478=\u7740\u6478 +\u8457\u64b0=\u7740\u64b0 +\u8457\u6578=\u7740\u6570 +\u8457\u660e=\u7740\u660e +\u8457\u672b=\u7740\u672b +\u8457\u6975=\u7740\u6781 +\u8457\u683c=\u7740\u683c +\u8457\u68cb=\u7740\u68cb +\u8457\u69c1=\u7740\u69c1 +\u8457\u6c23=\u7740\u6c14 +\u8457\u6cd5=\u7740\u6cd5 +\u8457\u6dfa=\u7740\u6d45 +\u8457\u706b=\u7740\u706b +\u8457\u7136=\u7740\u7136 +\u8457\u751a=\u7740\u751a +\u8457\u751f=\u7740\u751f +\u8457\u7591=\u7740\u7591 +\u8457\u767d=\u7740\u767d +\u8457\u76f8=\u7740\u76f8 +\u8457\u773c=\u7740\u773c +\u8457\u8457=\u7740\u7740 +\u8457\u7942=\u7740\u7942 +\u8457\u7a4d=\u7740\u79ef +\u8457\u7a3f=\u7740\u7a3f +\u8457\u7b46=\u7740\u7b14 +\u8457\u7c4d=\u7740\u7c4d +\u8457\u7dca=\u7740\u7d27 +\u8457\u7dd1=\u7740\u7dd1 +\u8457\u7d46=\u7740\u7eca +\u8457\u7e3e=\u7740\u7ee9 +\u8457\u7dcb=\u7740\u7eef +\u8457\u7da0=\u7740\u7eff +\u8457\u8089=\u7740\u8089 +\u8457\u8173=\u7740\u811a +\u8457\u8266=\u7740\u8230 +\u8457\u8272=\u7740\u8272 +\u8457\u7bc0=\u7740\u8282 +\u8457\u82b1=\u7740\u82b1 +\u8457\u83ab=\u7740\u83ab +\u8457\u843d=\u7740\u843d +\u8457\u85c1=\u7740\u85c1 +\u8457\u8863=\u7740\u8863 +\u8457\u88dd=\u7740\u88c5 +\u8457\u8981=\u7740\u8981 +\u8457\u8b66=\u7740\u8b66 +\u8457\u8da3=\u7740\u8da3 +\u8457\u908a=\u7740\u8fb9 +\u8457\u8ff7=\u7740\u8ff7 +\u8457\u8de1=\u7740\u8ff9 +\u8457\u91cd=\u7740\u91cd +\u8457\u9332=\u7740\u9332 +\u8457\u805e=\u7740\u95fb +\u8457\u9678=\u7740\u9646 +\u8457\u96dd=\u7740\u96dd +\u8457\u97ad=\u7740\u97ad +\u8457\u984c=\u7740\u9898 +\u8457\u9b54=\u7740\u9b54 +\u7761\u4e0d\u8457=\u7761\u4e0d\u7740 +\u7761\u4e0d\u8457\u66f8=\u7761\u4e0d\u8457\u4e66 +\u7761\u4e0d\u8457\u4f5c=\u7761\u4e0d\u8457\u4f5c +\u7761\u4e0d\u8457\u540d=\u7761\u4e0d\u8457\u540d +\u7761\u4e0d\u8457\u9304=\u7761\u4e0d\u8457\u5f55 +\u7761\u4e0d\u8457\u7a31=\u7761\u4e0d\u8457\u79f0 +\u7761\u4e0d\u8457\u8005=\u7761\u4e0d\u8457\u8005 +\u7761\u4e0d\u8457\u8ff0=\u7761\u4e0d\u8457\u8ff0 +\u7761\u8457=\u7761\u7740 +\u7761\u8457\u66f8=\u7761\u8457\u4e66 +\u7761\u8457\u4f5c=\u7761\u8457\u4f5c +\u7761\u8457\u540d=\u7761\u8457\u540d +\u7761\u8457\u9304=\u7761\u8457\u5f55 +\u7761\u8457\u7a31=\u7761\u8457\u79f0 +\u7761\u8457\u8005=\u7761\u8457\u8005 +\u7761\u8457\u8ff0=\u7761\u8457\u8ff0 +\u7779\u5fae\u77e5\u8457=\u7779\u5fae\u77e5\u8457 +\u776a\u4e38=\u777e\u4e38 +\u779e\u8457=\u7792\u7740 +\u779e\u8457\u66f8=\u7792\u8457\u4e66 +\u779e\u8457\u4f5c=\u7792\u8457\u4f5c +\u779e\u8457\u540d=\u7792\u8457\u540d +\u779e\u8457\u9304=\u7792\u8457\u5f55 +\u779e\u8457\u7a31=\u7792\u8457\u79f0 +\u779e\u8457\u8005=\u7792\u8457\u8005 +\u779e\u8457\u8ff0=\u7792\u8457\u8ff0 +\u77a7\u8457=\u77a7\u7740 +\u77a7\u8457\u66f8=\u77a7\u7740\u4e66 +\u77a7\u8457\u4f5c=\u77a7\u8457\u4f5c +\u77a7\u8457\u540d=\u77a7\u8457\u540d +\u77a7\u8457\u9304=\u77a7\u8457\u5f55 +\u77a7\u8457\u7a31=\u77a7\u8457\u79f0 +\u77a7\u8457\u8005=\u77a7\u8457\u8005 +\u77a7\u8457\u8ff0=\u77a7\u8457\u8ff0 +\u77aa\u8457=\u77aa\u7740 +\u77aa\u8457\u66f8=\u77aa\u8457\u4e66 +\u77aa\u8457\u4f5c=\u77aa\u8457\u4f5c +\u77aa\u8457\u540d=\u77aa\u8457\u540d +\u77aa\u8457\u9304=\u77aa\u8457\u5f55 +\u77aa\u8457\u7a31=\u77aa\u8457\u79f0 +\u77aa\u8457\u8005=\u77aa\u8457\u8005 +\u77aa\u8457\u8ff0=\u77aa\u8457\u8ff0 +\u77ad\u671b=\u77ad\u671b +\u77f3\u7881\u9547=\u77f3\u7881\u9547 +\u77f3\u7881\u93ae=\u77f3\u7881\u9547 +\u798f\u8457=\u798f\u7740 +\u798f\u8457\u66f8=\u798f\u8457\u4e66 +\u798f\u8457\u4f5c=\u798f\u8457\u4f5c +\u798f\u8457\u540d=\u798f\u8457\u540d +\u798f\u8457\u9304=\u798f\u8457\u5f55 +\u798f\u8457\u7a31=\u798f\u8457\u79f0 +\u798f\u8457\u8005=\u798f\u8457\u8005 +\u798f\u8457\u8ff0=\u798f\u8457\u8ff0 +\u7a40\u6881=\u7a40\u6881 +\u7a7a\u8457=\u7a7a\u7740 +\u7a7a\u8457\u66f8=\u7a7a\u8457\u4e66 +\u7a7a\u8457\u4f5c=\u7a7a\u8457\u4f5c +\u7a7a\u8457\u540d=\u7a7a\u8457\u540d +\u7a7a\u8457\u9304=\u7a7a\u8457\u5f55 +\u7a7a\u8457\u7a31=\u7a7a\u8457\u79f0 +\u7a7a\u8457\u8005=\u7a7a\u8457\u8005 +\u7a7a\u8457\u8ff0=\u7a7a\u8457\u8ff0 +\u7a7f\u8457=\u7a7f\u7740 +\u7a7f\u8457\u66f8=\u7a7f\u8457\u4e66 +\u7a7f\u8457\u4f5c=\u7a7f\u8457\u4f5c +\u7a7f\u8457\u540d=\u7a7f\u8457\u540d +\u7a7f\u8457\u9304=\u7a7f\u8457\u5f55 +\u7a7f\u8457\u7a31=\u7a7f\u8457\u79f0 +\u7a7f\u8457\u8005=\u7a7f\u8457\u8005 +\u7a7f\u8457\u8ff0=\u7a7f\u8457\u8ff0 +\u8c4e\u8457=\u7ad6\u7740 +\u8c4e\u8457\u66f8=\u7ad6\u8457\u4e66 +\u8c4e\u8457\u4f5c=\u7ad6\u8457\u4f5c +\u8c4e\u8457\u540d=\u7ad6\u8457\u540d +\u8c4e\u8457\u9304=\u7ad6\u8457\u5f55 +\u8c4e\u8457\u7a31=\u7ad6\u8457\u79f0 +\u8c4e\u8457\u8005=\u7ad6\u8457\u8005 +\u8c4e\u8457\u8ff0=\u7ad6\u8457\u8ff0 +\u7ad9\u8457=\u7ad9\u7740 +\u7ad9\u8457\u66f8=\u7ad9\u8457\u4e66 +\u7ad9\u8457\u4f5c=\u7ad9\u8457\u4f5c +\u7ad9\u8457\u540d=\u7ad9\u8457\u540d +\u7ad9\u8457\u9304=\u7ad9\u8457\u5f55 +\u7ad9\u8457\u7a31=\u7ad9\u8457\u79f0 +\u7ad9\u8457\u8005=\u7ad9\u8457\u8005 +\u7ad9\u8457\u8ff0=\u7ad9\u8457\u8ff0 +\u7b11\u8457=\u7b11\u7740 +\u7b11\u8457\u66f8=\u7b11\u8457\u4e66 +\u7b11\u8457\u4f5c=\u7b11\u8457\u4f5c +\u7b11\u8457\u540d=\u7b11\u8457\u540d +\u7b11\u8457\u9304=\u7b11\u8457\u5f55 +\u7b11\u8457\u7a31=\u7b11\u8457\u79f0 +\u7b11\u8457\u8005=\u7b11\u8457\u8005 +\u7b11\u8457\u8ff0=\u7b11\u8457\u8ff0 +\u7b54\u8986=\u7b54\u590d +\u7ba1\u8457=\u7ba1\u7740 +\u7ba1\u8457\u66f8=\u7ba1\u8457\u4e66 +\u7ba1\u8457\u4f5c=\u7ba1\u8457\u4f5c +\u7ba1\u8457\u540d=\u7ba1\u8457\u540d +\u7ba1\u8457\u9304=\u7ba1\u8457\u5f55 +\u7ba1\u8457\u7a31=\u7ba1\u8457\u79f0 +\u7ba1\u8457\u8005=\u7ba1\u8457\u8005 +\u7ba1\u8457\u8ff0=\u7ba1\u8457\u8ff0 +\u7d81\u8457=\u7ed1\u7740 +\u7d81\u8457\u66f8=\u7ed1\u8457\u4e66 +\u7d81\u8457\u4f5c=\u7ed1\u8457\u4f5c +\u7d81\u8457\u540d=\u7ed1\u8457\u540d +\u7d81\u8457\u9304=\u7ed1\u8457\u5f55 +\u7d81\u8457\u7a31=\u7ed1\u8457\u79f0 +\u7d81\u8457\u8005=\u7ed1\u8457\u8005 +\u7d81\u8457\u8ff0=\u7ed1\u8457\u8ff0 +\u7e5e\u8457=\u7ed5\u7740 +\u7e5e\u8457\u66f8=\u7ed5\u8457\u4e66 +\u7e5e\u8457\u4f5c=\u7ed5\u8457\u4f5c +\u7e5e\u8457\u540d=\u7ed5\u8457\u540d +\u7e5e\u8457\u9304=\u7ed5\u8457\u5f55 +\u7e5e\u8457\u7a31=\u7ed5\u8457\u79f0 +\u7e5e\u8457\u8005=\u7ed5\u8457\u8005 +\u7e5e\u8457\u8ff0=\u7ed5\u8457\u8ff0 +\u7de8\u8457=\u7f16\u8457 +\u7e8f\u8457=\u7f20\u7740 +\u7e8f\u8457\u66f8=\u7f20\u8457\u4e66 +\u7e8f\u8457\u4f5c=\u7f20\u8457\u4f5c +\u7e8f\u8457\u540d=\u7f20\u8457\u540d +\u7e8f\u8457\u9304=\u7f20\u8457\u5f55 +\u7e8f\u8457\u7a31=\u7f20\u8457\u79f0 +\u7e8f\u8457\u8005=\u7f20\u8457\u8005 +\u7e8f\u8457\u8ff0=\u7f20\u8457\u8ff0 +\u7f69\u8457=\u7f69\u7740 +\u7f69\u8457\u66f8=\u7f69\u8457\u4e66 +\u7f69\u8457\u4f5c=\u7f69\u8457\u4f5c +\u7f69\u8457\u540d=\u7f69\u8457\u540d +\u7f69\u8457\u9304=\u7f69\u8457\u5f55 +\u7f69\u8457\u7a31=\u7f69\u8457\u79f0 +\u7f69\u8457\u8005=\u7f69\u8457\u8005 +\u7f69\u8457\u8ff0=\u7f69\u8457\u8ff0 +\u7f8e\u8457=\u7f8e\u7740 +\u7f8e\u8457\u66f8=\u7f8e\u8457\u4e66 +\u7f8e\u8457\u4f5c=\u7f8e\u8457\u4f5c +\u7f8e\u8457\u540d=\u7f8e\u8457\u540d +\u7f8e\u8457\u9304=\u7f8e\u8457\u5f55 +\u7f8e\u8457\u7a31=\u7f8e\u8457\u79f0 +\u7f8e\u8457\u8005=\u7f8e\u8457\u8005 +\u7f8e\u8457\u8ff0=\u7f8e\u8457\u8ff0 +\u8000\u8457=\u8000\u7740 +\u8000\u8457\u66f8=\u8000\u8457\u4e66 +\u8000\u8457\u4f5c=\u8000\u8457\u4f5c +\u8000\u8457\u540d=\u8000\u8457\u540d +\u8000\u8457\u9304=\u8000\u8457\u5f55 +\u8000\u8457\u7a31=\u8000\u8457\u79f0 +\u8000\u8457\u8005=\u8000\u8457\u8005 +\u8000\u8457\u8ff0=\u8000\u8457\u8ff0 +\u8001\u5e7a=\u8001\u5e7a +\u8003\u8457=\u8003\u7740 +\u8003\u8457\u66f8=\u8003\u8457\u4e66 +\u8003\u8457\u4f5c=\u8003\u8457\u4f5c +\u8003\u8457\u540d=\u8003\u8457\u540d +\u8003\u8457\u9304=\u8003\u8457\u5f55 +\u8003\u8457\u7a31=\u8003\u8457\u79f0 +\u8003\u8457\u8005=\u8003\u8457\u8005 +\u8003\u8457\u8ff0=\u8003\u8457\u8ff0 +\u8089\u4e7e\u4e7e=\u8089\u5e72\u5e72 +\u8098\u624b\u934a\u8db3=\u8098\u624b\u94fe\u8db3 +\u80cc\u8457=\u80cc\u7740 +\u80cc\u8457\u66f8=\u80cc\u8457\u4e66 +\u80cc\u8457\u4f5c=\u80cc\u8457\u4f5c +\u80cc\u8457\u540d=\u80cc\u8457\u540d +\u80cc\u8457\u9304=\u80cc\u8457\u5f55 +\u80cc\u8457\u7a31=\u80cc\u8457\u79f0 +\u80cc\u8457\u8005=\u80cc\u8457\u8005 +\u80cc\u8457\u8ff0=\u80cc\u8457\u8ff0 +\u81a0\u8457=\u80f6\u7740 +\u81a0\u8457\u66f8=\u80f6\u8457\u4e66 +\u81a0\u8457\u4f5c=\u80f6\u8457\u4f5c +\u81a0\u8457\u540d=\u80f6\u8457\u540d +\u81a0\u8457\u9304=\u80f6\u8457\u5f55 +\u81a0\u8457\u7a31=\u80f6\u8457\u79f0 +\u81a0\u8457\u8005=\u80f6\u8457\u8005 +\u81a0\u8457\u8ff0=\u80f6\u8457\u8ff0 +\u85dd\u8457=\u827a\u7740 +\u85dd\u8457\u66f8=\u827a\u8457\u4e66 +\u85dd\u8457\u4f5c=\u827a\u8457\u4f5c +\u85dd\u8457\u540d=\u827a\u8457\u540d +\u85dd\u8457\u9304=\u827a\u8457\u5f55 +\u85dd\u8457\u7a31=\u827a\u8457\u79f0 +\u85dd\u8457\u8005=\u827a\u8457\u8005 +\u85dd\u8457\u8ff0=\u827a\u8457\u8ff0 +\u82e6\u8457=\u82e6\u7740 +\u82e6\u8457\u66f8=\u82e6\u8457\u4e66 +\u82e6\u8457\u4f5c=\u82e6\u8457\u4f5c +\u82e6\u8457\u540d=\u82e6\u8457\u540d +\u82e6\u8457\u9304=\u82e6\u8457\u5f55 +\u82e6\u8457\u7a31=\u82e6\u8457\u79f0 +\u82e6\u8457\u8005=\u82e6\u8457\u8005 +\u82e6\u8457\u8ff0=\u82e6\u8457\u8ff0 +\u82e7\u70ef=\u82e7\u70ef +\u85b4\u70ef=\u82e7\u70ef +\u7372\u8457=\u83b7\u7740 +\u7372\u8457\u66f8=\u83b7\u8457\u4e66 +\u7372\u8457\u4f5c=\u83b7\u8457\u4f5c +\u7372\u8457\u540d=\u83b7\u8457\u540d +\u7372\u8457\u9304=\u83b7\u8457\u5f55 +\u7372\u8457\u7a31=\u83b7\u8457\u79f0 +\u7372\u8457\u8005=\u83b7\u8457\u8005 +\u7372\u8457\u8ff0=\u83b7\u8457\u8ff0 +\u856d\u4e7e=\u8427\u4e7e +\u8427\u4e7e=\u8427\u4e7e +\u843d\u8457=\u843d\u7740 +\u843d\u8457\u66f8=\u843d\u8457\u4e66 +\u843d\u8457\u4f5c=\u843d\u8457\u4f5c +\u843d\u8457\u540d=\u843d\u8457\u540d +\u843d\u8457\u9304=\u843d\u8457\u5f55 +\u843d\u8457\u7a31=\u843d\u8457\u79f0 +\u843d\u8457\u8005=\u843d\u8457\u8005 +\u843d\u8457\u8ff0=\u843d\u8457\u8ff0 +\u8457\u66f8=\u8457\u4e66 +\u8457\u66f8\u7acb\u8aaa=\u8457\u4e66\u7acb\u8bf4 +\u8457\u4f5c=\u8457\u4f5c +\u8457\u540d=\u8457\u540d +\u8457\u9304\u898f\u5247=\u8457\u5f55\u89c4\u5219 +\u8457\u6587=\u8457\u6587 +\u8457\u6709=\u8457\u6709 +\u8457\u7a31=\u8457\u79f0 +\u8457\u8005=\u8457\u8005 +\u8457\u8eab=\u8457\u8eab +\u8457\u8ff0=\u8457\u8ff0 +\u8499\u8457=\u8499\u7740 +\u8499\u8457\u66f8=\u8499\u8457\u4e66 +\u8499\u8457\u4f5c=\u8499\u8457\u4f5c +\u8499\u8457\u540d=\u8499\u8457\u540d +\u8499\u8457\u9304=\u8499\u8457\u5f55 +\u8499\u8457\u7a31=\u8499\u8457\u79f0 +\u8499\u8457\u8005=\u8499\u8457\u8005 +\u8499\u8457\u8ff0=\u8499\u8457\u8ff0 +\u85cf\u8457=\u85cf\u7740 +\u85cf\u8457\u66f8=\u85cf\u8457\u4e66 +\u85cf\u8457\u4f5c=\u85cf\u8457\u4f5c +\u85cf\u8457\u540d=\u85cf\u8457\u540d +\u85cf\u8457\u9304=\u85cf\u8457\u5f55 +\u85cf\u8457\u7a31=\u85cf\u8457\u79f0 +\u85cf\u8457\u8005=\u85cf\u8457\u8005 +\u85cf\u8457\u8ff0=\u85cf\u8457\u8ff0 +\u8638\u8457=\u8638\u7740 +\u8638\u8457\u66f8=\u8638\u8457\u4e66 +\u8638\u8457\u4f5c=\u8638\u8457\u4f5c +\u8638\u8457\u540d=\u8638\u8457\u540d +\u8638\u8457\u9304=\u8638\u8457\u5f55 +\u8638\u8457\u7a31=\u8638\u8457\u79f0 +\u8638\u8457\u8005=\u8638\u8457\u8005 +\u8638\u8457\u8ff0=\u8638\u8457\u8ff0 +\u884c\u8457=\u884c\u7740 +\u884c\u8457\u66f8=\u884c\u8457\u4e66 +\u884c\u8457\u4f5c=\u884c\u8457\u4f5c +\u884c\u8457\u540d=\u884c\u8457\u540d +\u884c\u8457\u9304=\u884c\u8457\u5f55 +\u884c\u8457\u7a31=\u884c\u8457\u79f0 +\u884c\u8457\u8005=\u884c\u8457\u8005 +\u884c\u8457\u8ff0=\u884c\u8457\u8ff0 +\u8863\u8457=\u8863\u7740 +\u8863\u8457\u66f8=\u8863\u8457\u4e66 +\u8863\u8457\u4f5c=\u8863\u8457\u4f5c +\u8863\u8457\u540d=\u8863\u8457\u540d +\u8863\u8457\u9304=\u8863\u8457\u5f55 +\u8863\u8457\u7a31=\u8863\u8457\u79f0 +\u8863\u8457\u8005=\u8863\u8457\u8005 +\u8863\u8457\u8ff0=\u8863\u8457\u8ff0 +\u88dd\u8457=\u88c5\u7740 +\u88dd\u8457\u66f8=\u88c5\u8457\u4e66 +\u88dd\u8457\u4f5c=\u88c5\u8457\u4f5c +\u88dd\u8457\u540d=\u88c5\u8457\u540d +\u88dd\u8457\u9304=\u88c5\u8457\u5f55 +\u88dd\u8457\u7a31=\u88c5\u8457\u79f0 +\u88dd\u8457\u8005=\u88c5\u8457\u8005 +\u88dd\u8457\u8ff0=\u88c5\u8457\u8ff0 +\u88f9\u8457=\u88f9\u7740 +\u88f9\u8457\u66f8=\u88f9\u8457\u4e66 +\u88f9\u8457\u4f5c=\u88f9\u8457\u4f5c +\u88f9\u8457\u540d=\u88f9\u8457\u540d +\u88f9\u8457\u9304=\u88f9\u8457\u5f55 +\u88f9\u8457\u7a31=\u88f9\u8457\u79f0 +\u88f9\u8457\u8005=\u88f9\u8457\u8005 +\u88f9\u8457\u8ff0=\u88f9\u8457\u8ff0 +\u8986\u84cb=\u8986\u84cb +\u898b\u5fae\u77e5\u8457=\u89c1\u5fae\u77e5\u8457 +\u898b\u8457=\u89c1\u7740 +\u898b\u8457\u66f8=\u89c1\u8457\u4e66 +\u898b\u8457\u4f5c=\u89c1\u8457\u4f5c +\u898b\u8457\u540d=\u89c1\u8457\u540d +\u898b\u8457\u9304=\u89c1\u8457\u5f55 +\u898b\u8457\u7a31=\u89c1\u8457\u79f0 +\u898b\u8457\u8005=\u89c1\u8457\u8005 +\u898b\u8457\u8ff0=\u89c1\u8457\u8ff0 +\u8996\u5fae\u77e5\u8457=\u89c6\u5fae\u77e5\u8457 +\u8a00\u5e7e\u6790\u7406=\u8a00\u5e7e\u6790\u7406 +\u8a18\u8457=\u8bb0\u7740 +\u8a18\u8457\u66f8=\u8bb0\u8457\u4e66 +\u8a18\u8457\u4f5c=\u8bb0\u8457\u4f5c +\u8a18\u8457\u540d=\u8bb0\u8457\u540d +\u8a18\u8457\u9304=\u8bb0\u8457\u5f55 +\u8a18\u8457\u7a31=\u8bb0\u8457\u79f0 +\u8a18\u8457\u8005=\u8bb0\u8457\u8005 +\u8a18\u8457\u8ff0=\u8bb0\u8457\u8ff0 +\u8ad6\u8457=\u8bba\u8457 +\u8b6f\u8457=\u8bd1\u8457 +\u8a66\u8457=\u8bd5\u7740 +\u8a66\u8457\u66f8=\u8bd5\u8457\u4e66 +\u8a66\u8457\u4f5c=\u8bd5\u8457\u4f5c +\u8a66\u8457\u540d=\u8bd5\u8457\u540d +\u8a66\u8457\u9304=\u8bd5\u8457\u5f55 +\u8a66\u8457\u7a31=\u8bd5\u8457\u79f0 +\u8a66\u8457\u8005=\u8bd5\u8457\u8005 +\u8a66\u8457\u8ff0=\u8bd5\u8457\u8ff0 +\u8a9e\u8457=\u8bed\u7740 +\u8a9e\u8457\u66f8=\u8bed\u8457\u4e66 +\u8a9e\u8457\u4f5c=\u8bed\u8457\u4f5c +\u8a9e\u8457\u540d=\u8bed\u8457\u540d +\u8a9e\u8457\u9304=\u8bed\u8457\u5f55 +\u8a9e\u8457\u7a31=\u8bed\u8457\u79f0 +\u8a9e\u8457\u8005=\u8bed\u8457\u8005 +\u8a9e\u8457\u8ff0=\u8bed\u8457\u8ff0 +\u8c6b\u8457=\u8c6b\u7740 +\u8c6b\u8457\u66f8=\u8c6b\u8457\u4e66 +\u8c6b\u8457\u4f5c=\u8c6b\u8457\u4f5c +\u8c6b\u8457\u540d=\u8c6b\u8457\u540d +\u8c6b\u8457\u9304=\u8c6b\u8457\u5f55 +\u8c6b\u8457\u7a31=\u8c6b\u8457\u79f0 +\u8c6b\u8457\u8005=\u8c6b\u8457\u8005 +\u8c6b\u8457\u8ff0=\u8c6b\u8457\u8ff0 +\u8c9e\u8457=\u8d1e\u7740 +\u8c9e\u8457\u66f8=\u8d1e\u8457\u4e66 +\u8c9e\u8457\u4f5c=\u8d1e\u8457\u4f5c +\u8c9e\u8457\u540d=\u8d1e\u8457\u540d +\u8c9e\u8457\u9304=\u8d1e\u8457\u5f55 +\u8c9e\u8457\u7a31=\u8d1e\u8457\u79f0 +\u8c9e\u8457\u8005=\u8d1e\u8457\u8005 +\u8c9e\u8457\u8ff0=\u8d1e\u8457\u8ff0 +\u8d70\u8457=\u8d70\u7740 +\u8d70\u8457\u66f8=\u8d70\u8457\u4e66 +\u8d70\u8457\u4f5c=\u8d70\u8457\u4f5c +\u8d70\u8457\u540d=\u8d70\u8457\u540d +\u8d70\u8457\u9304=\u8d70\u8457\u5f55 +\u8d70\u8457\u7a31=\u8d70\u8457\u79f0 +\u8d70\u8457\u8005=\u8d70\u8457\u8005 +\u8d70\u8457\u8ff0=\u8d70\u8457\u8ff0 +\u8d95\u8457=\u8d76\u7740 +\u8d95\u8457\u66f8=\u8d76\u8457\u4e66 +\u8d95\u8457\u4f5c=\u8d76\u8457\u4f5c +\u8d95\u8457\u540d=\u8d76\u8457\u540d +\u8d95\u8457\u9304=\u8d76\u8457\u5f55 +\u8d95\u8457\u7a31=\u8d76\u8457\u79f0 +\u8d95\u8457\u8005=\u8d76\u8457\u8005 +\u8d95\u8457\u8ff0=\u8d76\u8457\u8ff0 +\u8db4\u8457=\u8db4\u7740 +\u8db4\u8457\u66f8=\u8db4\u8457\u4e66 +\u8db4\u8457\u4f5c=\u8db4\u8457\u4f5c +\u8db4\u8457\u540d=\u8db4\u8457\u540d +\u8db4\u8457\u9304=\u8db4\u8457\u5f55 +\u8db4\u8457\u7a31=\u8db4\u8457\u79f0 +\u8db4\u8457\u8005=\u8db4\u8457\u8005 +\u8db4\u8457\u8ff0=\u8db4\u8457\u8ff0 +\u8e8d\u8457=\u8dc3\u7740 +\u8e8d\u8457\u66f8=\u8dc3\u8457\u4e66 +\u8e8d\u8457\u4f5c=\u8dc3\u8457\u4f5c +\u8e8d\u8457\u540d=\u8dc3\u8457\u540d +\u8e8d\u8457\u9304=\u8dc3\u8457\u5f55 +\u8e8d\u8457\u7a31=\u8dc3\u8457\u79f0 +\u8e8d\u8457\u8005=\u8dc3\u8457\u8005 +\u8e8d\u8457\u8ff0=\u8dc3\u8457\u8ff0 +\u8dd1\u8457=\u8dd1\u7740 +\u8dd1\u8457\u66f8=\u8dd1\u8457\u4e66 +\u8dd1\u8457\u4f5c=\u8dd1\u8457\u4f5c +\u8dd1\u8457\u540d=\u8dd1\u8457\u540d +\u8dd1\u8457\u9304=\u8dd1\u8457\u5f55 +\u8dd1\u8457\u7a31=\u8dd1\u8457\u79f0 +\u8dd1\u8457\u8005=\u8dd1\u8457\u8005 +\u8dd1\u8457\u8ff0=\u8dd1\u8457\u8ff0 +\u8ddf\u8457=\u8ddf\u7740 +\u8ddf\u8457\u66f8=\u8ddf\u8457\u4e66 +\u8ddf\u8457\u4f5c=\u8ddf\u8457\u4f5c +\u8ddf\u8457\u540d=\u8ddf\u8457\u540d +\u8ddf\u8457\u9304=\u8ddf\u8457\u5f55 +\u8ddf\u8457\u7a31=\u8ddf\u8457\u79f0 +\u8ddf\u8457\u8005=\u8ddf\u8457\u8005 +\u8ddf\u8457\u8ff0=\u8ddf\u8457\u8ff0 +\u8dea\u8457=\u8dea\u7740 +\u8dea\u8457\u66f8=\u8dea\u8457\u4e66 +\u8dea\u8457\u4f5c=\u8dea\u8457\u4f5c +\u8dea\u8457\u540d=\u8dea\u8457\u540d +\u8dea\u8457\u9304=\u8dea\u8457\u5f55 +\u8dea\u8457\u7a31=\u8dea\u8457\u79f0 +\u8dea\u8457\u8005=\u8dea\u8457\u8005 +\u8dea\u8457\u8ff0=\u8dea\u8457\u8ff0 +\u8df3\u8457=\u8df3\u7740 +\u8df3\u8457\u66f8=\u8df3\u8457\u4e66 +\u8df3\u8457\u4f5c=\u8df3\u8457\u4f5c +\u8df3\u8457\u540d=\u8df3\u8457\u540d +\u8df3\u8457\u9304=\u8df3\u8457\u5f55 +\u8df3\u8457\u7a31=\u8df3\u8457\u79f0 +\u8df3\u8457\u8005=\u8df3\u8457\u8005 +\u8df3\u8457\u8ff0=\u8df3\u8457\u8ff0 +\u8e8a\u8e87\u6eff\u5fd7=\u8e0c\u8e87\u6eff\u5fd7 +\u8e0f\u8457=\u8e0f\u7740 +\u8e0f\u8457\u66f8=\u8e0f\u8457\u4e66 +\u8e0f\u8457\u4f5c=\u8e0f\u8457\u4f5c +\u8e0f\u8457\u540d=\u8e0f\u8457\u540d +\u8e0f\u8457\u9304=\u8e0f\u8457\u5f55 +\u8e0f\u8457\u7a31=\u8e0f\u8457\u79f0 +\u8e0f\u8457\u8005=\u8e0f\u8457\u8005 +\u8e0f\u8457\u8ff0=\u8e0f\u8457\u8ff0 +\u8e29\u8457=\u8e29\u7740 +\u8e29\u8457\u66f8=\u8e29\u8457\u4e66 +\u8e29\u8457\u4f5c=\u8e29\u8457\u4f5c +\u8e29\u8457\u540d=\u8e29\u8457\u540d +\u8e29\u8457\u9304=\u8e29\u8457\u5f55 +\u8e29\u8457\u7a31=\u8e29\u8457\u79f0 +\u8e29\u8457\u8005=\u8e29\u8457\u8005 +\u8e29\u8457\u8ff0=\u8e29\u8457\u8ff0 +\u8eab\u8457=\u8eab\u7740 +\u8eab\u8457\u66f8=\u8eab\u8457\u4e66 +\u8eab\u8457\u4f5c=\u8eab\u8457\u4f5c +\u8eab\u8457\u540d=\u8eab\u8457\u540d +\u8eab\u8457\u9304=\u8eab\u8457\u5f55 +\u8eab\u8457\u7a31=\u8eab\u8457\u79f0 +\u8eab\u8457\u8005=\u8eab\u8457\u8005 +\u8eab\u8457\u8ff0=\u8eab\u8457\u8ff0 +\u8eba\u8457=\u8eba\u7740 +\u8eba\u8457\u66f8=\u8eba\u8457\u4e66 +\u8eba\u8457\u4f5c=\u8eba\u8457\u4f5c +\u8eba\u8457\u540d=\u8eba\u8457\u540d +\u8eba\u8457\u9304=\u8eba\u8457\u5f55 +\u8eba\u8457\u7a31=\u8eba\u8457\u79f0 +\u8eba\u8457\u8005=\u8eba\u8457\u8005 +\u8eba\u8457\u8ff0=\u8eba\u8457\u8ff0 +\u8f49\u8457=\u8f6c\u7740 +\u8f49\u8457\u66f8=\u8f6c\u8457\u4e66 +\u8f49\u8457\u4f5c=\u8f6c\u8457\u4f5c +\u8f49\u8457\u540d=\u8f6c\u8457\u540d +\u8f49\u8457\u9304=\u8f6c\u8457\u5f55 +\u8f49\u8457\u7a31=\u8f6c\u8457\u79f0 +\u8f49\u8457\u8005=\u8f6c\u8457\u8005 +\u8f49\u8457\u8ff0=\u8f6c\u8457\u8ff0 +\u8f09\u8457=\u8f7d\u7740 +\u8f09\u8457\u66f8=\u8f7d\u8457\u4e66 +\u8f09\u8457\u4f5c=\u8f7d\u8457\u4f5c +\u8f09\u8457\u540d=\u8f7d\u8457\u540d +\u8f09\u8457\u9304=\u8f7d\u8457\u5f55 +\u8f09\u8457\u7a31=\u8f7d\u8457\u79f0 +\u8f09\u8457\u8005=\u8f7d\u8457\u8005 +\u8f09\u8457\u8ff0=\u8f7d\u8457\u8ff0 +\u8f03\u8457=\u8f83\u8457 +\u9054\u8457=\u8fbe\u7740 +\u9054\u8457\u66f8=\u8fbe\u8457\u4e66 +\u9054\u8457\u4f5c=\u8fbe\u8457\u4f5c +\u9054\u8457\u540d=\u8fbe\u8457\u540d +\u9054\u8457\u9304=\u8fbe\u8457\u5f55 +\u9054\u8457\u7a31=\u8fbe\u8457\u79f0 +\u9054\u8457\u8005=\u8fbe\u8457\u8005 +\u9054\u8457\u8ff0=\u8fbe\u8457\u8ff0 +\u9060\u8457=\u8fdc\u7740 +\u9060\u8457\u66f8=\u8fdc\u8457\u4e66 +\u9060\u8457\u4f5c=\u8fdc\u8457\u4f5c +\u9060\u8457\u540d=\u8fdc\u8457\u540d +\u9060\u8457\u9304=\u8fdc\u8457\u5f55 +\u9060\u8457\u7a31=\u8fdc\u8457\u79f0 +\u9060\u8457\u8005=\u8fdc\u8457\u8005 +\u9060\u8457\u8ff0=\u8fdc\u8457\u8ff0 +\u9023\u8457=\u8fde\u7740 +\u9023\u8457\u66f8=\u8fde\u8457\u4e66 +\u9023\u8457\u4f5c=\u8fde\u8457\u4f5c +\u9023\u8457\u540d=\u8fde\u8457\u540d +\u9023\u8457\u9304=\u8fde\u8457\u5f55 +\u9023\u8457\u7a31=\u8fde\u8457\u79f0 +\u9023\u8457\u8005=\u8fde\u8457\u8005 +\u9023\u8457\u8ff0=\u8fde\u8457\u8ff0 +\u8ffd\u8457=\u8ffd\u7740 +\u8ffd\u8457\u66f8=\u8ffd\u8457\u4e66 +\u8ffd\u8457\u4f5c=\u8ffd\u8457\u4f5c +\u8ffd\u8457\u540d=\u8ffd\u8457\u540d +\u8ffd\u8457\u9304=\u8ffd\u8457\u5f55 +\u8ffd\u8457\u7a31=\u8ffd\u8457\u79f0 +\u8ffd\u8457\u8005=\u8ffd\u8457\u8005 +\u8ffd\u8457\u8ff0=\u8ffd\u8457\u8ff0 +\u9006\u8457=\u9006\u7740 +\u9006\u8457\u66f8=\u9006\u8457\u4e66 +\u9006\u8457\u4f5c=\u9006\u8457\u4f5c +\u9006\u8457\u540d=\u9006\u8457\u540d +\u9006\u8457\u9304=\u9006\u8457\u5f55 +\u9006\u8457\u7a31=\u9006\u8457\u79f0 +\u9006\u8457\u8005=\u9006\u8457\u8005 +\u9006\u8457\u8ff0=\u9006\u8457\u8ff0 +\u903c\u8457=\u903c\u7740 +\u903c\u8457\u66f8=\u903c\u8457\u4e66 +\u903c\u8457\u4f5c=\u903c\u8457\u4f5c +\u903c\u8457\u540d=\u903c\u8457\u540d +\u903c\u8457\u9304=\u903c\u8457\u5f55 +\u903c\u8457\u7a31=\u903c\u8457\u79f0 +\u903c\u8457\u8005=\u903c\u8457\u8005 +\u903c\u8457\u8ff0=\u903c\u8457\u8ff0 +\u9047\u8457=\u9047\u7740 +\u9047\u8457\u66f8=\u9047\u8457\u4e66 +\u9047\u8457\u4f5c=\u9047\u8457\u4f5c +\u9047\u8457\u540d=\u9047\u8457\u540d +\u9047\u8457\u9304=\u9047\u8457\u5f55 +\u9047\u8457\u7a31=\u9047\u8457\u79f0 +\u9047\u8457\u8005=\u9047\u8457\u8005 +\u9047\u8457\u8ff0=\u9047\u8457\u8ff0 +\u907a\u8457=\u9057\u8457 +\u90a3\u9ebd=\u90a3\u9ebd +\u90ed\u5b50\u4e7e=\u90ed\u5b50\u4e7e +\u914d\u8457=\u914d\u7740 +\u914d\u8457\u66f8=\u914d\u8457\u4e66 +\u914d\u8457\u4f5c=\u914d\u8457\u4f5c +\u914d\u8457\u540d=\u914d\u8457\u540d +\u914d\u8457\u9304=\u914d\u8457\u5f55 +\u914d\u8457\u7a31=\u914d\u8457\u79f0 +\u914d\u8457\u8005=\u914d\u8457\u8005 +\u914d\u8457\u8ff0=\u914d\u8457\u8ff0 +\u91c0\u8457=\u917f\u7740 +\u91c0\u8457\u66f8=\u917f\u8457\u4e66 +\u91c0\u8457\u4f5c=\u917f\u8457\u4f5c +\u91c0\u8457\u540d=\u917f\u8457\u540d +\u91c0\u8457\u9304=\u917f\u8457\u5f55 +\u91c0\u8457\u7a31=\u917f\u8457\u79f0 +\u91c0\u8457\u8005=\u917f\u8457\u8005 +\u91c0\u8457\u8ff0=\u917f\u8457\u8ff0 +\u91af\u58fa=\u91af\u58f6 +\u91af\u58f6=\u91af\u58f6 +\u91af\u9171=\u91af\u9171 +\u91af\u91ac=\u91af\u9171 +\u91af\u918b=\u91af\u918b +\u91af\u91a2=\u91af\u91a2 +\u91af\u9e21=\u91af\u9e21 +\u91af\u96de=\u91af\u9e21 +\u91cd\u8986=\u91cd\u590d +\u91d1\u934a=\u91d1\u94fe +\u9435\u934a=\u94c1\u94fe +\u9278\u934a=\u94f0\u94fe +\u9280\u934a=\u94f6\u94fe +\u92ea\u8457=\u94fa\u7740 +\u92ea\u8457\u66f8=\u94fa\u8457\u4e66 +\u92ea\u8457\u4f5c=\u94fa\u8457\u4f5c +\u92ea\u8457\u540d=\u94fa\u8457\u540d +\u92ea\u8457\u9304=\u94fa\u8457\u5f55 +\u92ea\u8457\u7a31=\u94fa\u8457\u79f0 +\u92ea\u8457\u8005=\u94fa\u8457\u8005 +\u92ea\u8457\u8ff0=\u94fa\u8457\u8ff0 +\u934a\u5b50=\u94fe\u5b50 +\u934a\u689d=\u94fe\u6761 +\u934a\u9396=\u94fe\u9501 +\u934a\u9318=\u94fe\u9524 +\u9396\u934a=\u9501\u94fe +\u937e\u935b=\u953a\u953b +\u935b\u937e=\u953b\u953a +\u95bb\u61f7\u79ae=\u95eb\u6000\u793c +\u9589\u8457=\u95ed\u7740 +\u9589\u8457\u66f8=\u95ed\u8457\u4e66 +\u9589\u8457\u4f5c=\u95ed\u8457\u4f5c +\u9589\u8457\u540d=\u95ed\u8457\u540d +\u9589\u8457\u9304=\u95ed\u8457\u5f55 +\u9589\u8457\u7a31=\u95ed\u8457\u79f0 +\u9589\u8457\u8005=\u95ed\u8457\u8005 +\u9589\u8457\u8ff0=\u95ed\u8457\u8ff0 +\u9591\u8457=\u95f2\u7740 +\u9591\u8457\u66f8=\u95f2\u8457\u4e66 +\u9591\u8457\u4f5c=\u95f2\u8457\u4f5c +\u9591\u8457\u540d=\u95f2\u8457\u540d +\u9591\u8457\u9304=\u95f2\u8457\u5f55 +\u9591\u8457\u7a31=\u95f2\u8457\u79f0 +\u9591\u8457\u8005=\u95f2\u8457\u8005 +\u9591\u8457\u8ff0=\u95f2\u8457\u8ff0 +\u963f\u90e8\u6b63\u77ad=\u963f\u90e8\u6b63\u77ad +\u9644\u8457=\u9644\u7740 +\u9644\u776a=\u9644\u777e +\u9644\u8457\u66f8=\u9644\u8457\u4e66 +\u9644\u8457\u4f5c=\u9644\u8457\u4f5c +\u9644\u8457\u540d=\u9644\u8457\u540d +\u9644\u8457\u9304=\u9644\u8457\u5f55 +\u9644\u8457\u7a31=\u9644\u8457\u79f0 +\u9644\u8457\u8005=\u9644\u8457\u8005 +\u9644\u8457\u8ff0=\u9644\u8457\u8ff0 +\u964b\u8457=\u964b\u7740 +\u964b\u8457\u66f8=\u964b\u8457\u4e66 +\u964b\u8457\u4f5c=\u964b\u8457\u4f5c +\u964b\u8457\u540d=\u964b\u8457\u540d +\u964b\u8457\u9304=\u964b\u8457\u5f55 +\u964b\u8457\u7a31=\u964b\u8457\u79f0 +\u964b\u8457\u8005=\u964b\u8457\u8005 +\u964b\u8457\u8ff0=\u964b\u8457\u8ff0 +\u966a\u8457=\u966a\u7740 +\u966a\u8457\u66f8=\u966a\u8457\u4e66 +\u966a\u8457\u4f5c=\u966a\u8457\u4f5c +\u966a\u8457\u540d=\u966a\u8457\u540d +\u966a\u8457\u9304=\u966a\u8457\u5f55 +\u966a\u8457\u7a31=\u966a\u8457\u79f0 +\u966a\u8457\u8005=\u966a\u8457\u8005 +\u966a\u8457\u8ff0=\u966a\u8457\u8ff0 +\u9673\u5835=\u9673\u5835 +\u9673\u7995=\u9673\u7995 +\u96a8\u8457=\u968f\u7740 +\u96a8\u8457\u66f8=\u968f\u8457\u4e66 +\u96a8\u8457\u4f5c=\u968f\u8457\u4f5c +\u96a8\u8457\u540d=\u968f\u8457\u540d +\u96a8\u8457\u9304=\u968f\u8457\u5f55 +\u96a8\u8457\u7a31=\u968f\u8457\u79f0 +\u96a8\u8457\u8005=\u968f\u8457\u8005 +\u96a8\u8457\u8ff0=\u968f\u8457\u8ff0 +\u9694\u8457=\u9694\u7740 +\u9694\u8457\u66f8=\u9694\u8457\u4e66 +\u9694\u8457\u4f5c=\u9694\u8457\u4f5c +\u9694\u8457\u540d=\u9694\u8457\u540d +\u9694\u8457\u9304=\u9694\u8457\u5f55 +\u9694\u8457\u7a31=\u9694\u8457\u79f0 +\u9694\u8457\u8005=\u9694\u8457\u8005 +\u9694\u8457\u8ff0=\u9694\u8457\u8ff0 +\u96b1\u776a=\u96b1\u777e +\u96c5\u8457=\u96c5\u7740 +\u96c5\u8457\u66f8=\u96c5\u8457\u4e66 +\u96c5\u8457\u4f5c=\u96c5\u8457\u4f5c +\u96c5\u8457\u540d=\u96c5\u8457\u540d +\u96c5\u8457\u9304=\u96c5\u8457\u5f55 +\u96c5\u8457\u7a31=\u96c5\u8457\u79f0 +\u96c5\u8457\u8005=\u96c5\u8457\u8005 +\u96c5\u8457\u8ff0=\u96c5\u8457\u8ff0 +\u96cd\u4e7e=\u96cd\u4e7e +\u9802\u8457=\u9876\u7740 +\u9802\u8457\u66f8=\u9876\u8457\u4e66 +\u9802\u8457\u4f5c=\u9876\u8457\u4f5c +\u9802\u8457\u540d=\u9876\u8457\u540d +\u9802\u8457\u9304=\u9876\u8457\u5f55 +\u9802\u8457\u7a31=\u9876\u8457\u79f0 +\u9802\u8457\u8005=\u9876\u8457\u8005 +\u9802\u8457\u8ff0=\u9876\u8457\u8ff0 +\u9805\u934a=\u9879\u94fe +\u9806\u8457=\u987a\u7740 +\u9806\u8457\u66f8=\u987a\u8457\u4e66 +\u9806\u8457\u4f5c=\u987a\u8457\u4f5c +\u9806\u8457\u540d=\u987a\u8457\u540d +\u9806\u8457\u9304=\u987a\u8457\u5f55 +\u9806\u8457\u7a31=\u987a\u8457\u79f0 +\u9806\u8457\u8005=\u987a\u8457\u8005 +\u9806\u8457\u8ff0=\u987a\u8457\u8ff0 +\u9818\u8457=\u9886\u7740 +\u9818\u8457\u66f8=\u9886\u8457\u4e66 +\u9818\u8457\u4f5c=\u9886\u8457\u4f5c +\u9818\u8457\u540d=\u9886\u8457\u540d +\u9818\u8457\u9304=\u9886\u8457\u5f55 +\u9818\u8457\u7a31=\u9886\u8457\u79f0 +\u9818\u8457\u8005=\u9886\u8457\u8005 +\u9818\u8457\u8ff0=\u9886\u8457\u8ff0 +\u98c4\u8457=\u98d8\u7740 +\u98c4\u8457\u66f8=\u98d8\u8457\u4e66 +\u98c4\u8457\u4f5c=\u98d8\u8457\u4f5c +\u98c4\u8457\u540d=\u98d8\u8457\u540d +\u98c4\u8457\u9304=\u98d8\u8457\u5f55 +\u98c4\u8457\u7a31=\u98d8\u8457\u79f0 +\u98c4\u8457\u8005=\u98d8\u8457\u8005 +\u98c4\u8457\u8ff0=\u98d8\u8457\u8ff0 +\u98ed\u4ee4=\u98ed\u4ee4 +\u99d5\u8457=\u9a7e\u7740 +\u99d5\u8457\u66f8=\u9a7e\u8457\u4e66 +\u99d5\u8457\u4f5c=\u9a7e\u8457\u4f5c +\u99d5\u8457\u540d=\u9a7e\u8457\u540d +\u99d5\u8457\u9304=\u9a7e\u8457\u5f55 +\u99d5\u8457\u7a31=\u9a7e\u8457\u79f0 +\u99d5\u8457\u8005=\u9a7e\u8457\u8005 +\u99d5\u8457\u8ff0=\u9a7e\u8457\u8ff0 +\u7f75\u8457=\u9a82\u7740 +\u7f75\u8457\u66f8=\u9a82\u8457\u4e66 +\u7f75\u8457\u4f5c=\u9a82\u8457\u4f5c +\u7f75\u8457\u540d=\u9a82\u8457\u540d +\u7f75\u8457\u9304=\u9a82\u8457\u5f55 +\u7f75\u8457\u7a31=\u9a82\u8457\u79f0 +\u7f75\u8457\u8005=\u9a82\u8457\u8005 +\u7f75\u8457\u8ff0=\u9a82\u8457\u8ff0 +\u9a0e\u8457=\u9a91\u7740 +\u9a0e\u8457\u66f8=\u9a91\u8457\u4e66 +\u9a0e\u8457\u4f5c=\u9a91\u8457\u4f5c +\u9a0e\u8457\u540d=\u9a91\u8457\u540d +\u9a0e\u8457\u9304=\u9a91\u8457\u5f55 +\u9a0e\u8457\u7a31=\u9a91\u8457\u79f0 +\u9a0e\u8457\u8005=\u9a91\u8457\u8005 +\u9a0e\u8457\u8ff0=\u9a91\u8457\u8ff0 +\u9a19\u8457=\u9a97\u7740 +\u9a19\u8457\u66f8=\u9a97\u8457\u4e66 +\u9a19\u8457\u4f5c=\u9a97\u8457\u4f5c +\u9a19\u8457\u540d=\u9a97\u8457\u540d +\u9a19\u8457\u9304=\u9a97\u8457\u5f55 +\u9a19\u8457\u7a31=\u9a97\u8457\u79f0 +\u9a19\u8457\u8005=\u9a97\u8457\u8005 +\u9a19\u8457\u8ff0=\u9a97\u8457\u8ff0 +\u9ad8\u8457=\u9ad8\u7740 +\u9ad8\u8457\u66f8=\u9ad8\u8457\u4e66 +\u9ad8\u8457\u4f5c=\u9ad8\u8457\u4f5c +\u9ad8\u8457\u540d=\u9ad8\u8457\u540d +\u9ad8\u8457\u9304=\u9ad8\u8457\u5f55 +\u9ad8\u8457\u7a31=\u9ad8\u8457\u79f0 +\u9ad8\u8457\u8005=\u9ad8\u8457\u8005 +\u9ad8\u8457\u8ff0=\u9ad8\u8457\u8ff0 +\u9aed\u8457=\u9aed\u7740 +\u9aed\u8457\u66f8=\u9aed\u8457\u4e66 +\u9aed\u8457\u4f5c=\u9aed\u8457\u4f5c +\u9aed\u8457\u540d=\u9aed\u8457\u540d +\u9aed\u8457\u9304=\u9aed\u8457\u5f55 +\u9aed\u8457\u7a31=\u9aed\u8457\u79f0 +\u9aed\u8457\u8005=\u9aed\u8457\u8005 +\u9aed\u8457\u8ff0=\u9aed\u8457\u8ff0 +\u9b31\u59d3=\u9b31\u59d3 +\u9b31\u6c0f=\u9b31\u6c0f +\u9b4f\u5fb5=\u9b4f\u5fb5 +\u9b5a\u4e7e\u4e7e=\u9c7c\u5e72\u5e72 +\u9bf0\u9b5a=\u9cb6\u9c7c +\u9eaf\u5d07\u88d5=\u9eaf\u5d07\u88d5 +\u9eb4\u7fa9=\u9eb4\u4e49 +\u9eb4\u4e49=\u9eb4\u4e49 +\u9eb4\u82f1=\u9eb4\u82f1 +\u9ebd\u6c0f=\u9ebd\u6c0f +\u9ebd\u9ebd=\u9ebd\u9ebd +\u9ebc\u9ebc=\u9ebd\u9ebd +\u9ecf\u8457=\u9ecf\u7740 +\u9ecf\u8457\u66f8=\u9ecf\u8457\u4e66 +\u9ecf\u8457\u4f5c=\u9ecf\u8457\u4f5c +\u9ecf\u8457\u540d=\u9ecf\u8457\u540d +\u9ecf\u8457\u9304=\u9ecf\u8457\u5f55 +\u9ecf\u8457\u7a31=\u9ecf\u8457\u79f0 +\u9ecf\u8457\u8005=\u9ecf\u8457\u8005 +\u9ecf\u8457\u8ff0=\u9ecf\u8457\u8ff0 diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/zh/zh2Hant.properties b/htool-core/src/main/java/cn/javaex/htool/core/string/zh/zh2Hant.properties new file mode 100644 index 0000000..bbabb43 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/zh/zh2Hant.properties @@ -0,0 +1,9155 @@ +\u3469=\u5138 +\u34e5=\u528f +\u3509=\u529a +\u358a=\u565a +\u359e=\u558e +\u36df=\ud845\udfb5 +\u36e0=\ud846\udc83 +\u36ff=\ud846\udc39 +\u37c6=\u380f +\u39d1=\u649d +\u39df=\u64d3 +\u3a2b=\u3a5c +\u3c69=\u6bb0 +\u3c6e=\u6ba8 +\u3cbf=\u7007 +\u3ce0=\u6fbe +\u3d89=\u9e02 +\u3db6=\u71f6 +\u3dbd=\u7171 +\u3e8d=\u7371 +\u3ecf=\ud852\udee9 +\u3ed8=\ud852\udeba +\u4056=\u779c +\u4149=\u7a0f +\u41f2=\u7b74 +\u4336=\u42b7 +\u4337=\u7d2c +\u4338=\u7e33 +\u4339=\u7d45 +\u433a=\u42d9 +\u433c=\u7d90 +\u433d=\u7db5 +\u433e=\u42fb +\u4340=\u7e7f +\u4341=\u7e78 +\u447d=\ud85a\ude99 +\u44d5=\u85b3 +\u45d6=\u87ae +\u461b=\ud85d\udf5e +\u464a=\ud85d\udf35 +\u4653=\u896c +\u4723=\u8a22 +\u4725=\ud85e\ude59 +\u4727=\u8b45 +\u4759=\u8c99 +\u478c=\ud85f\udd73 +\u478d=\u477c +\u4790=\u8cf0 +\u4882=\ud860\udee2 +\u497a=\u91fe +\u497d=\u93fa +\u497f=\ud862\udfc5 +\u4980=\ud862\uddab +\u4981=\ud862\udddc +\u4983=\u942f +\u4985=\u9425 +\u4a44=\u9766 +\u4b6a=\ud865\udfaf +\u4bc3=\ud866\udcd1 +\u4bc4=\u9a27 +\u4bc5=\u4bc0 +\u4c9d=\u4c7d +\u4c9e=\ud867\udd98 +\u4c9f=\u9ba3 +\u4ca0=\u9c06 +\u4ca1=\u9c0c +\u4ca2=\u9c27 +\u4ca3=\u4c77 +\u4d13=\u9cfe +\u4d14=\u9d41 +\u4d15=\u9d37 +\u4d16=\u9d84 +\u4d17=\u9daa +\u4d18=\u9dc8 +\u4d19=\u9dff +\u4e07=\u842c +\u4e0e=\u8207 +\u4e13=\u5c08 +\u4e1a=\u696d +\u4e1b=\u53e2 +\u4e1c=\u6771 +\u4e1d=\u7d72 +\u4e22=\u4e1f +\u4e24=\u5169 +\u4e25=\u56b4 +\u4e27=\u55aa +\u4e2a=\u500b +\u4e30=\u8c50 +\u4e34=\u81e8 +\u4e3a=\u70ba +\u4e3d=\u9e97 +\u4e3e=\u8209 +\u4e49=\u7fa9 +\u4e4c=\u70cf +\u4e50=\u6a02 +\u4e54=\u55ac +\u4e60=\u7fd2 +\u4e61=\u9109 +\u4e66=\u66f8 +\u4e70=\u8cb7 +\u4e71=\u4e82 +\u4e89=\u722d +\u4e8e=\u65bc +\u4e8f=\u8667 +\u4e91=\u96f2 +\u4e9a=\u4e9e +\u4ea7=\u7522 +\u4ea9=\u755d +\u4eb2=\u89aa +\u4eb5=\u893b +\u4eb8=\u56b2 +\u4ebf=\u5104 +\u4ec5=\u50c5 +\u4ece=\u5f9e +\u4ed1=\u4f96 +\u4ed3=\u5009 +\u4eea=\u5100 +\u4eec=\u5011 +\u4ef7=\u50f9 +\u4f17=\u773e +\u4f18=\u512a +\u4f1a=\u6703 +\u4f1b=\u50b4 +\u4f1e=\u5098 +\u4f1f=\u5049 +\u4f20=\u50b3 +\u4f23=\u4fd4 +\u4f24=\u50b7 +\u4f25=\u5000 +\u4f26=\u502b +\u4f27=\u5096 +\u4f2a=\u507d +\u4f2b=\u4f47 +\u4f53=\u9ad4 +\u4f65=\u50c9 +\u4fa0=\u4fe0 +\u4fa3=\u4fb6 +\u4fa5=\u50e5 +\u4fa6=\u5075 +\u4fa7=\u5074 +\u4fa8=\u50d1 +\u4fa9=\u5108 +\u4faa=\u5115 +\u4fac=\u5102 +\u4fe3=\u4fc1 +\u4fe6=\u5114 +\u4fe8=\u513c +\u4fe9=\u5006 +\u4fea=\u5137 +\u4feb=\u5008 +\u4fed=\u5109 +\u503a=\u50b5 +\u503e=\u50be +\u506c=\u50af +\u507b=\u50c2 +\u507e=\u50e8 +\u507f=\u511f +\u50a5=\u513b +\u50a7=\u5110 +\u50a8=\u5132 +\u50a9=\u513a +\u513f=\u5152 +\u5151=\u514c +\u5156=\u5157 +\u515a=\u9ee8 +\u5170=\u862d +\u5173=\u95dc +\u5174=\u8208 +\u5179=\u8332 +\u517b=\u990a +\u517d=\u7378 +\u5181=\u56c5 +\u5185=\u5167 +\u5188=\u5ca1 +\u518c=\u518a +\u5199=\u5beb +\u519b=\u8ecd +\u519c=\u8fb2 +\u51af=\u99ae +\u51b2=\u6c96 +\u51b3=\u6c7a +\u51b5=\u6cc1 +\u51bb=\u51cd +\u51c0=\u51c8 +\u51c9=\u6dbc +\u51cf=\u6e1b +\u51d1=\u6e4a +\u51db=\u51dc +\u51e0=\u5e7e +\u51e4=\u9cf3 +\u51eb=\u9ce7 +\u51ed=\u6191 +\u51ef=\u51f1 +\u51fb=\u64ca +\u51ff=\u947f +\u520d=\u82bb +\u5218=\u5289 +\u5219=\u5247 +\u521a=\u525b +\u521b=\u5275 +\u5220=\u522a +\u522b=\u5225 +\u522c=\u5257 +\u522d=\u5244 +\u5239=\u524e +\u523d=\u528a +\u523f=\u528c +\u5240=\u5274 +\u5242=\u5291 +\u5250=\u526e +\u5251=\u528d +\u5265=\u525d +\u5267=\u5287 +\u529d=\u52f8 +\u529e=\u8fa6 +\u52a1=\u52d9 +\u52a2=\u52f1 +\u52a8=\u52d5 +\u52b1=\u52f5 +\u52b2=\u52c1 +\u52b3=\u52de +\u52bf=\u52e2 +\u52cb=\u52db +\u52da=\u52e9 +\u5300=\u52fb +\u5326=\u532d +\u532e=\u5331 +\u533a=\u5340 +\u533b=\u91ab +\u534e=\u83ef +\u534f=\u5354 +\u5355=\u55ae +\u5356=\u8ce3 +\u5362=\u76e7 +\u5364=\u9e75 +\u536b=\u885b +\u5374=\u537b +\u537a=\u5df9 +\u5382=\u5ee0 +\u5385=\u5ef3 +\u5386=\u6b77 +\u5389=\u53b2 +\u538b=\u58d3 +\u538c=\u53ad +\u538d=\u5399 +\u5390=\u9f8e +\u5395=\u5ec1 +\u53a2=\u5ec2 +\u53a3=\u53b4 +\u53a6=\u5ec8 +\u53a8=\u5eda +\u53a9=\u5ec4 +\u53ae=\u5edd +\u53bf=\u7e23 +\u53c1=\u53c4 +\u53c2=\u53c3 +\u53cc=\u96d9 +\u53d1=\u767c +\u53d8=\u8b8a +\u53d9=\u6558 +\u53e0=\u758a +\u53f6=\u8449 +\u53f7=\u865f +\u53f9=\u5606 +\u53fd=\u5630 +\u5413=\u5687 +\u5415=\u5442 +\u5417=\u55ce +\u5423=\u551a +\u5428=\u5678 +\u542c=\u807d +\u542f=\u555f +\u5434=\u5433 +\u5450=\u5436 +\u5452=\u5638 +\u5453=\u56c8 +\u5455=\u5614 +\u5456=\u56a6 +\u5457=\u5504 +\u5458=\u54e1 +\u5459=\u54bc +\u545b=\u55c6 +\u545c=\u55da +\u548f=\u8a60 +\u5499=\u56a8 +\u549b=\u5680 +\u549d=\u565d +\u54a4=\u5412 +\u54cd=\u97ff +\u54d1=\u555e +\u54d2=\u5660 +\u54d3=\u5635 +\u54d4=\u55f6 +\u54d5=\u5666 +\u54d7=\u5629 +\u54d9=\u5672 +\u54dc=\u568c +\u54dd=\u5665 +\u54df=\u55b2 +\u551b=\u561c +\u551d=\u55ca +\u5520=\u562e +\u5521=\u5562 +\u5522=\u55e9 +\u5524=\u559a +\u5567=\u5616 +\u556c=\u55c7 +\u556d=\u56c0 +\u556e=\u5699 +\u5574=\u563d +\u5578=\u562f +\u55b7=\u5674 +\u55bd=\u560d +\u55be=\u56b3 +\u55eb=\u56c1 +\u55f3=\u566f +\u5618=\u5653 +\u5624=\u56b6 +\u5631=\u56d1 +\u565c=\u5695 +\u56a3=\u56c2 +\u56e2=\u5718 +\u56ed=\u5712 +\u56f1=\u56ea +\u56f4=\u570d +\u56f5=\u5707 +\u56fd=\u570b +\u56fe=\u5716 +\u5706=\u5713 +\u5723=\u8056 +\u5739=\u58d9 +\u573a=\u5834 +\u574f=\u58de +\u5757=\u584a +\u575a=\u5805 +\u575b=\u58c7 +\u575c=\u58e2 +\u575d=\u58e9 +\u575e=\u5862 +\u575f=\u58b3 +\u5760=\u589c +\u5784=\u58df +\u5785=\u58e0 +\u5786=\u58da +\u5792=\u58d8 +\u57a6=\u58be +\u57a9=\u580a +\u57ab=\u588a +\u57ad=\u57e1 +\u57b1=\u58cb +\u57b2=\u584f +\u57b4=\u5816 +\u57d8=\u5852 +\u57d9=\u5864 +\u57da=\u581d +\u57ef=\u57b5 +\u5811=\u5879 +\u5815=\u58ae +\u5899=\u7246 +\u58ee=\u58ef +\u58f0=\u8072 +\u58f3=\u6bbc +\u58f6=\u58fa +\u58f8=\u58fc +\u5904=\u8655 +\u5907=\u5099 +\u590d=\u5fa9 +\u591f=\u5920 +\u5934=\u982d +\u5938=\u8a87 +\u5939=\u593e +\u593a=\u596a +\u5941=\u5969 +\u5942=\u5950 +\u594b=\u596e +\u5956=\u734e +\u5965=\u5967 +\u5986=\u599d +\u5987=\u5a66 +\u5988=\u5abd +\u59a9=\u5af5 +\u59aa=\u5ad7 +\u59ab=\u5aaf +\u59d7=\u59cd +\u59f9=\u597c +\u5a04=\u5a41 +\u5a05=\u5a6d +\u5a06=\u5b08 +\u5a07=\u5b0c +\u5a08=\u5b4c +\u5a31=\u5a1b +\u5a32=\u5aa7 +\u5a34=\u5afb +\u5a73=\u5aff +\u5a74=\u5b30 +\u5a75=\u5b0b +\u5a76=\u5b38 +\u5aaa=\u5abc +\u5ad2=\u5b21 +\u5ad4=\u5b2a +\u5af1=\u5b19 +\u5b37=\u5b24 +\u5b59=\u5b6b +\u5b66=\u5b78 +\u5b6a=\u5b7f +\u5b81=\u5be7 +\u5b9d=\u5bf6 +\u5b9e=\u5be6 +\u5ba0=\u5bf5 +\u5ba1=\u5be9 +\u5baa=\u61b2 +\u5bab=\u5bae +\u5bbd=\u5bec +\u5bbe=\u8cd3 +\u5bdd=\u5be2 +\u5bf9=\u5c0d +\u5bfb=\u5c0b +\u5bfc=\u5c0e +\u5bff=\u58fd +\u5c06=\u5c07 +\u5c14=\u723e +\u5c18=\u5875 +\u5c1d=\u5617 +\u5c27=\u582f +\u5c34=\u5c37 +\u5c38=\u5c4d +\u5c3d=\u76e1 +\u5c42=\u5c64 +\u5c43=\u5c53 +\u5c49=\u5c5c +\u5c4a=\u5c46 +\u5c5e=\u5c6c +\u5c61=\u5c62 +\u5c66=\u5c68 +\u5c7f=\u5dbc +\u5c81=\u6b72 +\u5c82=\u8c48 +\u5c96=\u5d87 +\u5c97=\u5d17 +\u5c98=\u5cf4 +\u5c99=\u5db4 +\u5c9a=\u5d50 +\u5c9b=\u5cf6 +\u5cad=\u5dba +\u5cbd=\u5d2c +\u5cbf=\u5dcb +\u5cc4=\u5da7 +\u5ce1=\u5cfd +\u5ce3=\u5da2 +\u5ce4=\u5da0 +\u5ce5=\u5d22 +\u5ce6=\u5dd2 +\u5d02=\u5d97 +\u5d03=\u5d0d +\u5d04=\u5dae +\u5d2d=\u5d84 +\u5d58=\u5db8 +\u5d5a=\u5d94 +\u5d5d=\u5d81 +\u5dc5=\u5dd4 +\u5de9=\u978f +\u5def=\u5df0 +\u5e01=\u5e63 +\u5e05=\u5e25 +\u5e08=\u5e2b +\u5e0f=\u5e43 +\u5e10=\u5e33 +\u5e18=\u7c3e +\u5e1c=\u5e5f +\u5e26=\u5e36 +\u5e27=\u5e40 +\u5e2e=\u5e6b +\u5e31=\u5e6c +\u5e3b=\u5e58 +\u5e3c=\u5e57 +\u5e42=\u51aa +\u5e5e=\u8946 +\u5e76=\u4e26 +\u5e7f=\u5ee3 +\u5e86=\u6176 +\u5e90=\u5eec +\u5e91=\u5ee1 +\u5e93=\u5eab +\u5e94=\u61c9 +\u5e99=\u5edf +\u5e9e=\u9f90 +\u5e9f=\u5ee2 +\u5eea=\u5ee9 +\u5f00=\u958b +\u5f02=\u7570 +\u5f03=\u68c4 +\u5f11=\u5f12 +\u5f20=\u5f35 +\u5f25=\u5f4c +\u5f2a=\u5f33 +\u5f2f=\u5f4e +\u5f39=\u5f48 +\u5f3a=\u5f37 +\u5f52=\u6b78 +\u5f53=\u7576 +\u5f55=\u9304 +\u5f66=\u5f65 +\u5f7b=\u5fb9 +\u5f84=\u5f91 +\u5f95=\u5fa0 +\u5fc6=\u61b6 +\u5fcf=\u61fa +\u5fe7=\u6182 +\u5ffe=\u613e +\u6000=\u61f7 +\u6001=\u614b +\u6002=\u616b +\u6003=\u61ae +\u6004=\u616a +\u6005=\u60b5 +\u6006=\u6134 +\u601c=\u6190 +\u603b=\u7e3d +\u603c=\u61df +\u603f=\u61cc +\u604b=\u6200 +\u6052=\u6046 +\u6073=\u61c7 +\u6076=\u60e1 +\u6078=\u615f +\u6079=\u61e8 +\u607a=\u6137 +\u607b=\u60fb +\u607c=\u60f1 +\u607d=\u60f2 +\u60a6=\u6085 +\u60ab=\u6128 +\u60ac=\u61f8 +\u60ad=\u6173 +\u60ae=\u609e +\u60af=\u61ab +\u60ca=\u9a5a +\u60e7=\u61fc +\u60e8=\u6158 +\u60e9=\u61f2 +\u60eb=\u618a +\u60ec=\u611c +\u60ed=\u615a +\u60ee=\u619a +\u60ef=\u6163 +\u6120=\u614d +\u6124=\u61a4 +\u6126=\u6192 +\u613f=\u9858 +\u6151=\u61fe +\u61d1=\u61e3 +\u61d2=\u61f6 +\u61d4=\u61cd +\u6206=\u6207 +\u620b=\u6214 +\u620f=\u6232 +\u6217=\u6227 +\u6218=\u6230 +\u622c=\u6229 +\u622f=\u6231 +\u6237=\u6236 +\u6251=\u64b2 +\u6267=\u57f7 +\u6269=\u64f4 +\u626a=\u636b +\u626b=\u6383 +\u626c=\u63da +\u6270=\u64fe +\u629a=\u64ab +\u629b=\u62cb +\u629f=\u6476 +\u62a0=\u6473 +\u62a1=\u6384 +\u62a2=\u6436 +\u62a4=\u8b77 +\u62a5=\u5831 +\u62c5=\u64d4 +\u62df=\u64ec +\u62e2=\u650f +\u62e3=\u63c0 +\u62e5=\u64c1 +\u62e6=\u6514 +\u62e7=\u64f0 +\u62e8=\u64a5 +\u62e9=\u64c7 +\u6302=\u639b +\u631a=\u646f +\u631b=\u6523 +\u631c=\u6397 +\u631d=\u64be +\u631e=\u64bb +\u631f=\u633e +\u6320=\u6493 +\u6321=\u64cb +\u6322=\u649f +\u6323=\u6399 +\u6324=\u64e0 +\u6325=\u63ee +\u6326=\u648f +\u635d=\u6329 +\u635e=\u6488 +\u635f=\u640d +\u6361=\u64bf +\u6362=\u63db +\u6363=\u6417 +\u636e=\u64da +\u63b3=\u64c4 +\u63b4=\u6451 +\u63b7=\u64f2 +\u63b8=\u64a3 +\u63ba=\u647b +\u63bc=\u645c +\u63fd=\u652c +\u63fe=\u6435 +\u63ff=\u64b3 +\u6400=\u6519 +\u6401=\u64f1 +\u6402=\u645f +\u6405=\u652a +\u643a=\u651c +\u6444=\u651d +\u6445=\u6504 +\u6446=\u64fa +\u6447=\u6416 +\u6448=\u64ef +\u644a=\u6524 +\u6484=\u6516 +\u6491=\u6490 +\u64b5=\u6506 +\u64b7=\u64f7 +\u64b8=\u64fc +\u64ba=\u651b +\u64de=\u64fb +\u6512=\u6522 +\u654c=\u6575 +\u655b=\u6582 +\u6570=\u6578 +\u658b=\u9f4b +\u6593=\u6595 +\u65a9=\u65ac +\u65ad=\u65b7 +\u65e0=\u7121 +\u65e7=\u820a +\u65f6=\u6642 +\u65f7=\u66e0 +\u65f8=\u6698 +\u6619=\u66c7 +\u663c=\u665d +\u663d=\u66e8 +\u663e=\u986f +\u664b=\u6649 +\u6652=\u66ec +\u6653=\u66c9 +\u6654=\u66c4 +\u6655=\u6688 +\u6656=\u6689 +\u6682=\u66ab +\u66a7=\u66d6 +\u672f=\u8853 +\u673a=\u6a5f +\u6740=\u6bba +\u6742=\u96dc +\u6743=\u6b0a +\u6746=\u687f +\u6761=\u689d +\u6765=\u4f86 +\u6768=\u694a +\u6769=\u69aa +\u6770=\u5091 +\u6781=\u6975 +\u6784=\u69cb +\u679e=\u6a05 +\u67a2=\u6a1e +\u67a3=\u68d7 +\u67a5=\u6aea +\u67a7=\u6898 +\u67a8=\u68d6 +\u67aa=\u69cd +\u67ab=\u6953 +\u67ad=\u689f +\u67dc=\u6ac3 +\u67e0=\u6ab8 +\u67fd=\u6a89 +\u6800=\u6894 +\u6805=\u67f5 +\u6807=\u6a19 +\u6808=\u68e7 +\u6809=\u6adb +\u680a=\u6af3 +\u680b=\u68df +\u680c=\u6ae8 +\u680e=\u6adf +\u680f=\u6b04 +\u6811=\u6a39 +\u6816=\u68f2 +\u6837=\u6a23 +\u683e=\u6b12 +\u6860=\u690f +\u6861=\u6a48 +\u6862=\u6968 +\u6863=\u6a94 +\u6864=\u69bf +\u6865=\u6a4b +\u6866=\u6a3a +\u6867=\u6a9c +\u6868=\u69f3 +\u6869=\u6a01 +\u68a6=\u5922 +\u68bc=\u6aae +\u68be=\u68f6 +\u68bf=\u69e4 +\u68c0=\u6aa2 +\u68c1=\u68b2 +\u68c2=\u6b1e +\u6901=\u69e8 +\u691f=\u6add +\u6920=\u69e7 +\u6924=\u6b0f +\u692d=\u6a62 +\u697c=\u6a13 +\u6984=\u6b16 +\u6985=\u69b2 +\u6987=\u6aec +\u6988=\u6ada +\u6989=\u6af8 +\u69da=\u6a9f +\u69db=\u6abb +\u69df=\u6ab3 +\u69e0=\u6ae7 +\u6a2a=\u6a6b +\u6a2f=\u6aa3 +\u6a31=\u6afb +\u6a65=\u6aeb +\u6a71=\u6ae5 +\u6a79=\u6ad3 +\u6a7c=\u6ade +\u6aa9=\u6a81 +\u6b22=\u6b61 +\u6b24=\u6b5f +\u6b27=\u6b50 +\u6b7c=\u6bb2 +\u6b81=\u6b7f +\u6b87=\u6ba4 +\u6b8b=\u6b98 +\u6b92=\u6b9e +\u6b93=\u6bae +\u6b9a=\u6bab +\u6ba1=\u6baf +\u6bb4=\u6bc6 +\u6bc1=\u6bc0 +\u6bc2=\u8f42 +\u6bd5=\u7562 +\u6bd9=\u6583 +\u6be1=\u6c08 +\u6bf5=\u6bff +\u6c07=\u6c0c +\u6c14=\u6c23 +\u6c22=\u6c2b +\u6c29=\u6c2c +\u6c32=\u6c33 +\u6c47=\u532f +\u6c49=\u6f22 +\u6c64=\u6e6f +\u6c79=\u6d36 +\u6c9f=\u6e9d +\u6ca1=\u6c92 +\u6ca3=\u7043 +\u6ca4=\u6f1a +\u6ca5=\u701d +\u6ca6=\u6dea +\u6ca7=\u6ec4 +\u6ca9=\u6e88 +\u6caa=\u6eec +\u6cde=\u6fd8 +\u6cea=\u6dda +\u6cf6=\u6fa9 +\u6cf7=\u7027 +\u6cf8=\u7018 +\u6cfa=\u6ffc +\u6cfb=\u7009 +\u6cfc=\u6f51 +\u6cfd=\u6fa4 +\u6cfe=\u6d87 +\u6d01=\u6f54 +\u6d12=\u7051 +\u6d3c=\u7aaa +\u6d43=\u6d79 +\u6d45=\u6dfa +\u6d46=\u6f3f +\u6d47=\u6f86 +\u6d48=\u6e5e +\u6d4a=\u6fc1 +\u6d4b=\u6e2c +\u6d4d=\u6fae +\u6d4e=\u6fdf +\u6d4f=\u700f +\u6d50=\u6efb +\u6d51=\u6e3e +\u6d52=\u6ef8 +\u6d53=\u6fc3 +\u6d54=\u6f6f +\u6d82=\u5857 +\u6d9b=\u6fe4 +\u6d9d=\u6f87 +\u6d9e=\u6df6 +\u6d9f=\u6f23 +\u6da0=\u6f7f +\u6da1=\u6e26 +\u6da3=\u6e19 +\u6da4=\u6ecc +\u6da6=\u6f64 +\u6da7=\u6f97 +\u6da8=\u6f32 +\u6da9=\u6f80 +\u6e0a=\u6df5 +\u6e0c=\u6de5 +\u6e0d=\u6f2c +\u6e0e=\u7006 +\u6e10=\u6f38 +\u6e11=\u6fa0 +\u6e14=\u6f01 +\u6e16=\u700b +\u6e17=\u6ef2 +\u6e29=\u6eab +\u6e7e=\u7063 +\u6e7f=\u6fd5 +\u6e83=\u6f70 +\u6e85=\u6ffa +\u6e86=\u6f35 +\u6ed7=\u6f77 +\u6eda=\u6efe +\u6ede=\u6eef +\u6edf=\u7067 +\u6ee0=\u7044 +\u6ee1=\u6eff +\u6ee2=\u7005 +\u6ee4=\u6ffe +\u6ee5=\u6feb +\u6ee6=\u7064 +\u6ee8=\u6ff1 +\u6ee9=\u7058 +\u6eea=\u6fa6 +\u6f24=\u7060 +\u6f46=\u7020 +\u6f47=\u701f +\u6f4b=\u7032 +\u6f4d=\u6ff0 +\u6f5c=\u6f5b +\u6f74=\u7026 +\u6f9c=\u703e +\u6fd1=\u7028 +\u6fd2=\u7015 +\u704f=\u705d +\u706d=\u6ec5 +\u706f=\u71c8 +\u7075=\u9748 +\u707e=\u707d +\u707f=\u71e6 +\u7080=\u716c +\u7089=\u7210 +\u7096=\u71c9 +\u709c=\u7152 +\u709d=\u7197 +\u70b9=\u9ede +\u70bc=\u7149 +\u70bd=\u71be +\u70c1=\u720d +\u70c2=\u721b +\u70c3=\u70f4 +\u70db=\u71ed +\u70df=\u7159 +\u70e6=\u7169 +\u70e7=\u71d2 +\u70e8=\u71c1 +\u70e9=\u71f4 +\u70eb=\u71d9 +\u70ec=\u71fc +\u70ed=\u71b1 +\u7115=\u7165 +\u7116=\u71dc +\u7118=\u71fe +\u7174=\u7185 +\u7231=\u611b +\u7237=\u723a +\u724d=\u7258 +\u7266=\u6c02 +\u7275=\u727d +\u727a=\u72a7 +\u728a=\u72a2 +\u72b6=\u72c0 +\u72b7=\u7377 +\u72b8=\u7341 +\u72b9=\u7336 +\u72c8=\u72fd +\u72dd=\u736e +\u72de=\u7370 +\u72ec=\u7368 +\u72ed=\u72f9 +\u72ee=\u7345 +\u72ef=\u736a +\u72f0=\u7319 +\u72f1=\u7344 +\u72f2=\u733b +\u7303=\u736b +\u730e=\u7375 +\u7315=\u737c +\u7321=\u7380 +\u732a=\u8c6c +\u732b=\u8c93 +\u732c=\u875f +\u732e=\u737b +\u736d=\u737a +\u7391=\u74a3 +\u739a=\u7452 +\u739b=\u746a +\u73ae=\u744b +\u73af=\u74b0 +\u73b0=\u73fe +\u73b1=\u7472 +\u73ba=\u74bd +\u73d0=\u743a +\u73d1=\u74cf +\u73f0=\u74ab +\u73f2=\u743f +\u740f=\u7489 +\u7410=\u7463 +\u743c=\u74ca +\u7476=\u7464 +\u7477=\u74a6 +\u748e=\u74d4 +\u74d2=\u74da +\u74ef=\u750c +\u7535=\u96fb +\u753b=\u756b +\u7545=\u66a2 +\u7574=\u7587 +\u7596=\u7664 +\u7597=\u7642 +\u759f=\u7627 +\u75a0=\u7658 +\u75a1=\u760d +\u75ac=\u7667 +\u75ad=\u7632 +\u75ae=\u7621 +\u75af=\u760b +\u75b1=\u76b0 +\u75b4=\u75fe +\u75c8=\u7670 +\u75c9=\u75d9 +\u75d2=\u7662 +\u75d6=\u7602 +\u75e8=\u7646 +\u75ea=\u7613 +\u75eb=\u7647 +\u7605=\u7649 +\u7606=\u762e +\u7617=\u761e +\u7618=\u763a +\u762a=\u765f +\u762b=\u7671 +\u763e=\u766e +\u763f=\u766d +\u765e=\u7669 +\u7663=\u766c +\u766b=\u7672 +\u7691=\u769a +\u76b1=\u76ba +\u76b2=\u76b8 +\u76cf=\u76de +\u76d0=\u9e7d +\u76d1=\u76e3 +\u76d6=\u84cb +\u76d7=\u76dc +\u76d8=\u76e4 +\u770d=\u7798 +\u7726=\u7725 +\u772c=\u77d3 +\u7741=\u775c +\u7750=\u775e +\u7751=\u77bc +\u7786=\u77b6 +\u7792=\u779e +\u77a9=\u77da +\u77eb=\u77ef +\u77f6=\u78ef +\u77fe=\u792c +\u77ff=\u7926 +\u7800=\u78ad +\u7801=\u78bc +\u7816=\u78da +\u7817=\u7868 +\u781a=\u786f +\u781c=\u78b8 +\u783a=\u792a +\u783b=\u7931 +\u783e=\u792b +\u7840=\u790e +\u7841=\u785c +\u7855=\u78a9 +\u7856=\u7864 +\u7857=\u78fd +\u7859=\u78d1 +\u786e=\u78ba +\u7877=\u7906 +\u788d=\u7919 +\u789b=\u78e7 +\u789c=\u78e3 +\u78b1=\u9e7c +\u793c=\u79ae +\u7943=\u79a1 +\u794e=\u7995 +\u7962=\u79b0 +\u796f=\u798e +\u7977=\u79b1 +\u7978=\u798d +\u7980=\u7a1f +\u7984=\u797f +\u7985=\u79aa +\u79bb=\u96e2 +\u79c3=\u79bf +\u79c6=\u7a08 +\u79cd=\u7a2e +\u79ef=\u7a4d +\u79f0=\u7a31 +\u79fd=\u7a62 +\u79fe=\u7a60 +\u7a06=\u7a6d +\u7a0e=\u7a05 +\u7a23=\u7a4c +\u7a33=\u7a69 +\u7a51=\u7a61 +\u7a77=\u7aae +\u7a83=\u7aca +\u7a8d=\u7ac5 +\u7a8e=\u7ab5 +\u7a91=\u7aaf +\u7a9c=\u7ac4 +\u7a9d=\u7aa9 +\u7aa5=\u7aba +\u7aa6=\u7ac7 +\u7aad=\u7ab6 +\u7ad6=\u8c4e +\u7ade=\u7af6 +\u7b03=\u7be4 +\u7b0b=\u7b4d +\u7b14=\u7b46 +\u7b15=\u7b67 +\u7b3a=\u7b8b +\u7b3c=\u7c60 +\u7b3e=\u7c69 +\u7b51=\u7bc9 +\u7b5a=\u7bf3 +\u7b5b=\u7be9 +\u7b5c=\u7c39 +\u7b5d=\u7b8f +\u7b79=\u7c4c +\u7b7c=\u7bd4 +\u7b7e=\u7c3d +\u7b80=\u7c21 +\u7b93=\u7c59 +\u7ba6=\u7c00 +\u7ba7=\u7bcb +\u7ba8=\u7c5c +\u7ba9=\u7c6e +\u7baa=\u7c1e +\u7bab=\u7c2b +\u7bd1=\u7c23 +\u7bd3=\u7c0d +\u7bee=\u7c43 +\u7bf1=\u7c6c +\u7c16=\u7c6a +\u7c41=\u7c5f +\u7c74=\u7cf4 +\u7c7b=\u985e +\u7c7c=\u79c8 +\u7c9c=\u7cf6 +\u7c9d=\u7cf2 +\u7ca4=\u7cb5 +\u7caa=\u7cde +\u7cae=\u7ce7 +\u7cc1=\u7cdd +\u7cc7=\u9931 +\u7d27=\u7dca +\u7d77=\u7e36 +\u7e9f=\u7cf9 +\u7ea0=\u7cfe +\u7ea1=\u7d06 +\u7ea2=\u7d05 +\u7ea3=\u7d02 +\u7ea4=\u7e96 +\u7ea5=\u7d07 +\u7ea6=\u7d04 +\u7ea7=\u7d1a +\u7ea8=\u7d08 +\u7ea9=\u7e8a +\u7eaa=\u7d00 +\u7eab=\u7d09 +\u7eac=\u7def +\u7ead=\u7d1c +\u7eae=\u7d18 +\u7eaf=\u7d14 +\u7eb0=\u7d15 +\u7eb1=\u7d17 +\u7eb2=\u7db1 +\u7eb3=\u7d0d +\u7eb4=\u7d1d +\u7eb5=\u7e31 +\u7eb6=\u7db8 +\u7eb7=\u7d1b +\u7eb8=\u7d19 +\u7eb9=\u7d0b +\u7eba=\u7d21 +\u7ebb=\u7d35 +\u7ebc=\u7d16 +\u7ebd=\u7d10 +\u7ebe=\u7d13 +\u7ebf=\u7dda +\u7ec0=\u7d3a +\u7ec1=\u7d32 +\u7ec2=\u7d31 +\u7ec3=\u7df4 +\u7ec4=\u7d44 +\u7ec5=\u7d33 +\u7ec6=\u7d30 +\u7ec7=\u7e54 +\u7ec8=\u7d42 +\u7ec9=\u7e10 +\u7eca=\u7d46 +\u7ecb=\u7d3c +\u7ecc=\u7d40 +\u7ecd=\u7d39 +\u7ece=\u7e79 +\u7ecf=\u7d93 +\u7ed0=\u7d3f +\u7ed1=\u7d81 +\u7ed2=\u7d68 +\u7ed3=\u7d50 +\u7ed4=\u7d5d +\u7ed5=\u7e5e +\u7ed6=\u7d70 +\u7ed7=\u7d4e +\u7ed8=\u7e6a +\u7ed9=\u7d66 +\u7eda=\u7d62 +\u7edb=\u7d73 +\u7edc=\u7d61 +\u7edd=\u7d55 +\u7ede=\u7d5e +\u7edf=\u7d71 +\u7ee0=\u7d86 +\u7ee1=\u7d83 +\u7ee2=\u7d79 +\u7ee3=\u7d89 +\u7ee4=\u7d8c +\u7ee5=\u7d8f +\u7ee6=\u7d5b +\u7ee7=\u7e7c +\u7ee8=\u7d88 +\u7ee9=\u7e3e +\u7eea=\u7dd2 +\u7eeb=\u7dbe +\u7eec=\u7dd3 +\u7eed=\u7e8c +\u7eee=\u7dba +\u7eef=\u7dcb +\u7ef0=\u7dbd +\u7ef1=\u7dd4 +\u7ef2=\u7dc4 +\u7ef3=\u7e69 +\u7ef4=\u7dad +\u7ef5=\u7dbf +\u7ef6=\u7dac +\u7ef7=\u7db3 +\u7ef8=\u7da2 +\u7ef9=\u7daf +\u7efa=\u7db9 +\u7efb=\u7da3 +\u7efc=\u7d9c +\u7efd=\u7dbb +\u7efe=\u7db0 +\u7eff=\u7da0 +\u7f00=\u7db4 +\u7f01=\u7dc7 +\u7f02=\u7dd9 +\u7f03=\u7dd7 +\u7f04=\u7dd8 +\u7f05=\u7dec +\u7f06=\u7e9c +\u7f07=\u7df9 +\u7f08=\u7df2 +\u7f09=\u7ddd +\u7f0a=\u7e15 +\u7f0b=\u7e62 +\u7f0c=\u7de6 +\u7f0d=\u7d9e +\u7f0e=\u7dde +\u7f0f=\u7df6 +\u7f11=\u7df1 +\u7f12=\u7e0b +\u7f13=\u7de9 +\u7f14=\u7de0 +\u7f15=\u7e37 +\u7f16=\u7de8 +\u7f17=\u7de1 +\u7f18=\u7de3 +\u7f19=\u7e09 +\u7f1a=\u7e1b +\u7f1b=\u7e1f +\u7f1c=\u7e1d +\u7f1d=\u7e2b +\u7f1e=\u7e17 +\u7f1f=\u7e1e +\u7f20=\u7e8f +\u7f21=\u7e2d +\u7f22=\u7e0a +\u7f23=\u7e11 +\u7f24=\u7e7d +\u7f25=\u7e39 +\u7f26=\u7e35 +\u7f27=\u7e32 +\u7f28=\u7e93 +\u7f29=\u7e2e +\u7f2a=\u7e46 +\u7f2b=\u7e45 +\u7f2c=\u7e88 +\u7f2d=\u7e5a +\u7f2e=\u7e55 +\u7f2f=\u7e52 +\u7f30=\u97c1 +\u7f31=\u7e7e +\u7f32=\u7e70 +\u7f33=\u7e6f +\u7f34=\u7e73 +\u7f35=\u7e98 +\u7f42=\u7f4c +\u7f51=\u7db2 +\u7f57=\u7f85 +\u7f5a=\u7f70 +\u7f62=\u7f77 +\u7f74=\u7f86 +\u7f81=\u7f88 +\u7f9f=\u7fa5 +\u7fd8=\u7ff9 +\u8022=\u802e +\u8027=\u802c +\u8038=\u8073 +\u803b=\u6065 +\u8042=\u8076 +\u804b=\u807e +\u804c=\u8077 +\u804d=\u8079 +\u8054=\u806f +\u8069=\u8075 +\u806a=\u8070 +\u8083=\u8085 +\u80a0=\u8178 +\u80a4=\u819a +\u80ae=\u9aaf +\u80b4=\u991a +\u80be=\u814e +\u80bf=\u816b +\u80c0=\u8139 +\u80c1=\u8105 +\u80c6=\u81bd +\u80dc=\u52dd +\u80e7=\u6727 +\u80e8=\u8156 +\u80ea=\u81da +\u80eb=\u811b +\u80f6=\u81a0 +\u8109=\u8108 +\u810d=\u81be +\u810f=\u81df +\u8110=\u81cd +\u8111=\u8166 +\u8113=\u81bf +\u8114=\u81e0 +\u811a=\u8173 +\u8131=\u812b +\u8136=\u8161 +\u8138=\u81c9 +\u814a=\u81d8 +\u816d=\u9f76 +\u817b=\u81a9 +\u817c=\u9766 +\u817d=\u8183 +\u817e=\u9a30 +\u8191=\u81cf +\u81dc=\u81e2 +\u8206=\u8f3f +\u8223=\u8264 +\u8230=\u8266 +\u8231=\u8259 +\u823b=\u826b +\u8270=\u8271 +\u8273=\u8277 +\u827a=\u85dd +\u8282=\u7bc0 +\u8288=\u7f8b +\u8297=\u858c +\u829c=\u856a +\u82a6=\u8606 +\u82c1=\u84ef +\u82c7=\u8466 +\u82c8=\u85f6 +\u82cb=\u83a7 +\u82cc=\u8407 +\u82cd=\u84bc +\u82ce=\u82e7 +\u82cf=\u8607 +\u82e7=\u85b4 +\u82f9=\u860b +\u830e=\u8396 +\u830f=\u8622 +\u8311=\u8526 +\u8314=\u584b +\u8315=\u7162 +\u8327=\u7e6d +\u8346=\u834a +\u8350=\u85a6 +\u8359=\u8598 +\u835a=\u83a2 +\u835b=\u8558 +\u835c=\u84fd +\u835e=\u854e +\u835f=\u8588 +\u8360=\u85ba +\u8361=\u76ea +\u8363=\u69ae +\u8364=\u8477 +\u8365=\u6ece +\u8366=\u7296 +\u8367=\u7192 +\u8368=\u8541 +\u8369=\u85ce +\u836a=\u84c0 +\u836b=\u852d +\u836c=\u8552 +\u836d=\u8452 +\u836e=\u8464 +\u836f=\u846f +\u8385=\u849e +\u83b1=\u840a +\u83b2=\u84ee +\u83b3=\u8494 +\u83b4=\u8435 +\u83b6=\u859f +\u83b7=\u7372 +\u83b8=\u8555 +\u83b9=\u7469 +\u83ba=\u9daf +\u83bc=\u8493 +\u841d=\u863f +\u8424=\u87a2 +\u8425=\u71df +\u8426=\u7e08 +\u8427=\u856d +\u8428=\u85a9 +\u8471=\u8525 +\u8487=\u8546 +\u8489=\u8562 +\u848b=\u8523 +\u848c=\u851e +\u84dd=\u85cd +\u84df=\u858a +\u84e0=\u863a +\u84e3=\u8577 +\u84e5=\u93a3 +\u84e6=\u9a40 +\u8502=\u8646 +\u8537=\u8594 +\u8539=\u861e +\u853a=\u85fa +\u853c=\u85f9 +\u8570=\u8580 +\u8572=\u8604 +\u8574=\u860a +\u85ae=\u85ea +\u85d3=\u861a +\u8616=\u6af1 +\u864f=\u865c +\u8651=\u616e +\u865a=\u865b +\u866b=\u87f2 +\u866c=\u866f +\u866e=\u87e3 +\u867d=\u96d6 +\u867e=\u8766 +\u867f=\u8806 +\u8680=\u8755 +\u8681=\u87fb +\u8682=\u879e +\u8695=\u8836 +\u86ac=\u8706 +\u86ca=\u8831 +\u86ce=\u8823 +\u86cf=\u87f6 +\u86ee=\u883b +\u86f0=\u87c4 +\u86f1=\u86fa +\u86f2=\u87ef +\u86f3=\u8784 +\u86f4=\u8810 +\u8715=\u86fb +\u8717=\u8778 +\u8721=\u881f +\u8747=\u8805 +\u8748=\u87c8 +\u8749=\u87ec +\u874e=\u880d +\u877c=\u87bb +\u877e=\u8811 +\u8780=\u87bf +\u87a8=\u87ce +\u87cf=\u8828 +\u8845=\u91c1 +\u8854=\u929c +\u8865=\u88dc +\u886c=\u896f +\u886e=\u889e +\u8884=\u8956 +\u8885=\u88ca +\u8886=\u8918 +\u889c=\u896a +\u88ad=\u8972 +\u88af=\u894f +\u88c5=\u88dd +\u88c6=\u8960 +\u88c8=\u890c +\u88e2=\u8933 +\u88e3=\u895d +\u88e4=\u8932 +\u88e5=\u8947 +\u891b=\u8938 +\u8934=\u8964 +\u89c1=\u898b +\u89c2=\u89c0 +\u89c3=\u898e +\u89c4=\u898f +\u89c5=\u8993 +\u89c6=\u8996 +\u89c7=\u8998 +\u89c8=\u89bd +\u89c9=\u89ba +\u89ca=\u89ac +\u89cb=\u89a1 +\u89cc=\u89bf +\u89cd=\u89a5 +\u89ce=\u89a6 +\u89cf=\u89af +\u89d0=\u89b2 +\u89d1=\u89b7 +\u89de=\u89f4 +\u89e6=\u89f8 +\u89ef=\u89f6 +\u8a1a=\u8abe +\u8a89=\u8b7d +\u8a8a=\u8b04 +\u8ba0=\u8a01 +\u8ba1=\u8a08 +\u8ba2=\u8a02 +\u8ba3=\u8a03 +\u8ba4=\u8a8d +\u8ba5=\u8b4f +\u8ba6=\u8a10 +\u8ba7=\u8a0c +\u8ba8=\u8a0e +\u8ba9=\u8b93 +\u8baa=\u8a15 +\u8bab=\u8a16 +\u8bac=\u8a17 +\u8bad=\u8a13 +\u8bae=\u8b70 +\u8baf=\u8a0a +\u8bb0=\u8a18 +\u8bb1=\u8a12 +\u8bb2=\u8b1b +\u8bb3=\u8af1 +\u8bb4=\u8b33 +\u8bb5=\u8a4e +\u8bb6=\u8a1d +\u8bb7=\u8a25 +\u8bb8=\u8a31 +\u8bb9=\u8a1b +\u8bba=\u8ad6 +\u8bbb=\u8a29 +\u8bbc=\u8a1f +\u8bbd=\u8af7 +\u8bbe=\u8a2d +\u8bbf=\u8a2a +\u8bc0=\u8a23 +\u8bc1=\u8b49 +\u8bc2=\u8a41 +\u8bc3=\u8a36 +\u8bc4=\u8a55 +\u8bc5=\u8a5b +\u8bc6=\u8b58 +\u8bc7=\u8a57 +\u8bc8=\u8a50 +\u8bc9=\u8a34 +\u8bca=\u8a3a +\u8bcb=\u8a46 +\u8bcc=\u8b05 +\u8bcd=\u8a5e +\u8bce=\u8a58 +\u8bcf=\u8a54 +\u8bd0=\u8a56 +\u8bd1=\u8b6f +\u8bd2=\u8a52 +\u8bd3=\u8a86 +\u8bd4=\u8a84 +\u8bd5=\u8a66 +\u8bd6=\u8a7f +\u8bd7=\u8a69 +\u8bd8=\u8a70 +\u8bd9=\u8a7c +\u8bda=\u8aa0 +\u8bdb=\u8a85 +\u8bdc=\u8a75 +\u8bdd=\u8a71 +\u8bde=\u8a95 +\u8bdf=\u8a6c +\u8be0=\u8a6e +\u8be1=\u8a6d +\u8be2=\u8a62 +\u8be3=\u8a63 +\u8be4=\u8acd +\u8be5=\u8a72 +\u8be6=\u8a73 +\u8be7=\u8a6b +\u8be8=\u8ae2 +\u8be9=\u8a61 +\u8bea=\u8b78 +\u8beb=\u8aa1 +\u8bec=\u8aa3 +\u8bed=\u8a9e +\u8bee=\u8a9a +\u8bef=\u8aa4 +\u8bf0=\u8aa5 +\u8bf1=\u8a98 +\u8bf2=\u8aa8 +\u8bf3=\u8a91 +\u8bf4=\u8aaa +\u8bf5=\u8aa6 +\u8bf6=\u8a92 +\u8bf7=\u8acb +\u8bf8=\u8af8 +\u8bf9=\u8acf +\u8bfa=\u8afe +\u8bfb=\u8b80 +\u8bfc=\u8ad1 +\u8bfd=\u8ab9 +\u8bfe=\u8ab2 +\u8bff=\u8ac9 +\u8c00=\u8adb +\u8c01=\u8ab0 +\u8c02=\u8ad7 +\u8c03=\u8abf +\u8c04=\u8ac2 +\u8c05=\u8ad2 +\u8c06=\u8ac4 +\u8c07=\u8ab6 +\u8c08=\u8ac7 +\u8c0a=\u8abc +\u8c0b=\u8b00 +\u8c0c=\u8af6 +\u8c0d=\u8adc +\u8c0e=\u8b0a +\u8c0f=\u8aeb +\u8c10=\u8ae7 +\u8c11=\u8b14 +\u8c12=\u8b01 +\u8c13=\u8b02 +\u8c14=\u8ae4 +\u8c15=\u8aed +\u8c16=\u8afc +\u8c17=\u8b92 +\u8c18=\u8aee +\u8c19=\u8af3 +\u8c1a=\u8afa +\u8c1b=\u8ae6 +\u8c1c=\u8b0e +\u8c1d=\u8ade +\u8c1e=\u8add +\u8c1f=\u8b28 +\u8c20=\u8b9c +\u8c21=\u8b16 +\u8c22=\u8b1d +\u8c23=\u8b20 +\u8c24=\u8b17 +\u8c25=\u8b1a +\u8c26=\u8b19 +\u8c27=\u8b10 +\u8c28=\u8b39 +\u8c29=\u8b3e +\u8c2a=\u8b2b +\u8c2b=\u8b7e +\u8c2c=\u8b2c +\u8c2d=\u8b5a +\u8c2e=\u8b56 +\u8c2f=\u8b59 +\u8c30=\u8b95 +\u8c31=\u8b5c +\u8c32=\u8b4e +\u8c33=\u8b9e +\u8c34=\u8b74 +\u8c35=\u8b6b +\u8c36=\u8b96 +\u8c6e=\u8c76 +\u8d1d=\u8c9d +\u8d1e=\u8c9e +\u8d1f=\u8ca0 +\u8d20=\u8c9f +\u8d21=\u8ca2 +\u8d22=\u8ca1 +\u8d23=\u8cac +\u8d24=\u8ce2 +\u8d25=\u6557 +\u8d26=\u8cec +\u8d27=\u8ca8 +\u8d28=\u8cea +\u8d29=\u8ca9 +\u8d2a=\u8caa +\u8d2b=\u8ca7 +\u8d2c=\u8cb6 +\u8d2d=\u8cfc +\u8d2e=\u8caf +\u8d2f=\u8cab +\u8d30=\u8cb3 +\u8d31=\u8ce4 +\u8d32=\u8cc1 +\u8d33=\u8cb0 +\u8d34=\u8cbc +\u8d35=\u8cb4 +\u8d36=\u8cba +\u8d37=\u8cb8 +\u8d38=\u8cbf +\u8d39=\u8cbb +\u8d3a=\u8cc0 +\u8d3b=\u8cbd +\u8d3c=\u8cca +\u8d3d=\u8d04 +\u8d3e=\u8cc8 +\u8d3f=\u8cc4 +\u8d40=\u8cb2 +\u8d41=\u8cc3 +\u8d42=\u8cc2 +\u8d43=\u8d13 +\u8d44=\u8cc7 +\u8d45=\u8cc5 +\u8d46=\u8d10 +\u8d47=\u8cd5 +\u8d48=\u8cd1 +\u8d49=\u8cda +\u8d4a=\u8cd2 +\u8d4b=\u8ce6 +\u8d4c=\u8ced +\u8d4d=\u9f4e +\u8d4e=\u8d16 +\u8d4f=\u8cde +\u8d50=\u8cdc +\u8d51=\u8d14 +\u8d52=\u8cd9 +\u8d53=\u8ce1 +\u8d54=\u8ce0 +\u8d55=\u8ce7 +\u8d56=\u8cf4 +\u8d57=\u8cf5 +\u8d58=\u8d05 +\u8d59=\u8cfb +\u8d5a=\u8cfa +\u8d5b=\u8cfd +\u8d5c=\u8cfe +\u8d5d=\u8d17 +\u8d5e=\u8d0a +\u8d5f=\u8d07 +\u8d60=\u8d08 +\u8d61=\u8d0d +\u8d62=\u8d0f +\u8d63=\u8d1b +\u8d6a=\u8d6c +\u8d75=\u8d99 +\u8d76=\u8d95 +\u8d8b=\u8da8 +\u8db1=\u8db2 +\u8db8=\u8e89 +\u8dc3=\u8e8d +\u8dc4=\u8e4c +\u8dde=\u8e92 +\u8df5=\u8e10 +\u8df6=\u8e82 +\u8df7=\u8e7a +\u8df8=\u8e55 +\u8df9=\u8e9a +\u8dfb=\u8e8b +\u8e0a=\u8e34 +\u8e0c=\u8e8a +\u8e2a=\u8e64 +\u8e2c=\u8e93 +\u8e2f=\u8e91 +\u8e51=\u8ea1 +\u8e52=\u8e63 +\u8e70=\u8e95 +\u8e7f=\u8ea5 +\u8e8f=\u8eaa +\u8e9c=\u8ea6 +\u8eaf=\u8ec0 +\u8f66=\u8eca +\u8f67=\u8ecb +\u8f68=\u8ecc +\u8f69=\u8ed2 +\u8f6a=\u8ed1 +\u8f6b=\u8ed4 +\u8f6c=\u8f49 +\u8f6d=\u8edb +\u8f6e=\u8f2a +\u8f6f=\u8edf +\u8f70=\u8f5f +\u8f71=\u8ef2 +\u8f72=\u8efb +\u8f73=\u8f64 +\u8f74=\u8ef8 +\u8f75=\u8ef9 +\u8f76=\u8efc +\u8f77=\u8ee4 +\u8f78=\u8eeb +\u8f79=\u8f62 +\u8f7a=\u8efa +\u8f7b=\u8f15 +\u8f7c=\u8efe +\u8f7d=\u8f09 +\u8f7e=\u8f0a +\u8f7f=\u8f4e +\u8f80=\u8f08 +\u8f81=\u8f07 +\u8f82=\u8f05 +\u8f83=\u8f03 +\u8f84=\u8f12 +\u8f85=\u8f14 +\u8f86=\u8f1b +\u8f87=\u8f26 +\u8f88=\u8f29 +\u8f89=\u8f1d +\u8f8a=\u8f25 +\u8f8b=\u8f1e +\u8f8c=\u8f2c +\u8f8d=\u8f1f +\u8f8e=\u8f1c +\u8f8f=\u8f33 +\u8f90=\u8f3b +\u8f91=\u8f2f +\u8f92=\u8f40 +\u8f93=\u8f38 +\u8f94=\u8f61 +\u8f95=\u8f45 +\u8f96=\u8f44 +\u8f97=\u8f3e +\u8f98=\u8f46 +\u8f99=\u8f4d +\u8f9a=\u8f54 +\u8f9e=\u8fad +\u8fa9=\u8faf +\u8fab=\u8fae +\u8fb9=\u908a +\u8fbd=\u907c +\u8fbe=\u9054 +\u8fc1=\u9077 +\u8fc7=\u904e +\u8fc8=\u9081 +\u8fd0=\u904b +\u8fd8=\u9084 +\u8fd9=\u9019 +\u8fdb=\u9032 +\u8fdc=\u9060 +\u8fdd=\u9055 +\u8fde=\u9023 +\u8fdf=\u9072 +\u8fe9=\u9087 +\u8ff3=\u9015 +\u8ff9=\u8de1 +\u9002=\u9069 +\u9009=\u9078 +\u900a=\u905c +\u9012=\u905e +\u9026=\u9090 +\u903b=\u908f +\u9057=\u907a +\u9065=\u9059 +\u9093=\u9127 +\u909d=\u913a +\u90ac=\u9114 +\u90ae=\u90f5 +\u90b9=\u9112 +\u90ba=\u9134 +\u90bb=\u9130 +\u90cf=\u90df +\u90d0=\u9136 +\u90d1=\u912d +\u90d3=\u9106 +\u90e6=\u9148 +\u90e7=\u9116 +\u90f8=\u9132 +\u9142=\u9147 +\u915d=\u919e +\u9166=\u91b1 +\u9171=\u91ac +\u917d=\u91c5 +\u917e=\u91c3 +\u917f=\u91c0 +\u91ca=\u91cb +\u9274=\u9452 +\u92ae=\u947e +\u933e=\u93e8 +\u9485=\u91d2 +\u9486=\u91d3 +\u9487=\u91d4 +\u9488=\u91dd +\u9489=\u91d8 +\u948a=\u91d7 +\u948b=\u91d9 +\u948c=\u91d5 +\u948d=\u91f7 +\u948e=\u91fa +\u948f=\u91e7 +\u9490=\u91e4 +\u9491=\u9212 +\u9492=\u91e9 +\u9493=\u91e3 +\u9494=\u9346 +\u9495=\u91f9 +\u9496=\u935a +\u9497=\u91f5 +\u9498=\u9203 +\u9499=\u9223 +\u949a=\u9208 +\u949b=\u9226 +\u949c=\u9245 +\u949d=\u920d +\u949e=\u9214 +\u949f=\u937e +\u94a0=\u9209 +\u94a1=\u92c7 +\u94a2=\u92fc +\u94a3=\u9211 +\u94a4=\u9210 +\u94a5=\u9470 +\u94a6=\u6b3d +\u94a7=\u921e +\u94a8=\u93a2 +\u94a9=\u920e +\u94aa=\u9227 +\u94ab=\u9201 +\u94ac=\u9225 +\u94ad=\u9204 +\u94ae=\u9215 +\u94af=\u9200 +\u94b0=\u923a +\u94b1=\u9322 +\u94b2=\u9266 +\u94b3=\u9257 +\u94b4=\u9237 +\u94b5=\u7f3d +\u94b6=\u9233 +\u94b7=\u9255 +\u94b8=\u923d +\u94b9=\u9238 +\u94ba=\u925e +\u94bb=\u947d +\u94bc=\u926c +\u94bd=\u926d +\u94be=\u9240 +\u94bf=\u923f +\u94c0=\u923e +\u94c1=\u9435 +\u94c2=\u9251 +\u94c3=\u9234 +\u94c4=\u9460 +\u94c5=\u925b +\u94c6=\u925a +\u94c7=\u924b +\u94c8=\u9230 +\u94c9=\u9249 +\u94ca=\u9248 +\u94cb=\u924d +\u94cc=\u922e +\u94cd=\u9239 +\u94ce=\u9438 +\u94cf=\u9276 +\u94d0=\u92ac +\u94d1=\u92a0 +\u94d2=\u927a +\u94d3=\u92e9 +\u94d4=\u930f +\u94d5=\u92aa +\u94d6=\u92ee +\u94d7=\u92cf +\u94d8=\u92e3 +\u94d9=\u9403 +\u94da=\u928d +\u94db=\u943a +\u94dc=\u9285 +\u94dd=\u92c1 +\u94de=\u92b1 +\u94df=\u92a6 +\u94e0=\u93a7 +\u94e1=\u9358 +\u94e2=\u9296 +\u94e3=\u9291 +\u94e4=\u92cc +\u94e5=\u92a9 +\u94e6=\u929b +\u94e7=\u93f5 +\u94e8=\u9293 +\u94e9=\u93a9 +\u94ea=\u927f +\u94eb=\u929a +\u94ec=\u927b +\u94ed=\u9298 +\u94ee=\u931a +\u94ef=\u92ab +\u94f0=\u9278 +\u94f1=\u92a5 +\u94f2=\u93df +\u94f3=\u9283 +\u94f4=\u940b +\u94f5=\u92a8 +\u94f6=\u9280 +\u94f7=\u92a3 +\u94f8=\u9444 +\u94f9=\u9412 +\u94fa=\u92ea +\u94fb=\u92d9 +\u94fc=\u9338 +\u94fd=\u92f1 +\u94fe=\u93c8 +\u94ff=\u93d7 +\u9500=\u92b7 +\u9501=\u9396 +\u9502=\u92f0 +\u9503=\u92e5 +\u9504=\u92e4 +\u9505=\u934b +\u9506=\u92ef +\u9507=\u92e8 +\u9508=\u92b9 +\u9509=\u92bc +\u950a=\u92dd +\u950b=\u92d2 +\u950c=\u92c5 +\u950d=\u92f6 +\u950e=\u9426 +\u950f=\u9427 +\u9510=\u92b3 +\u9511=\u92bb +\u9512=\u92c3 +\u9513=\u92df +\u9514=\u92e6 +\u9515=\u9312 +\u9516=\u9306 +\u9517=\u937a +\u9518=\u9369 +\u9519=\u932f +\u951a=\u9328 +\u951b=\u931b +\u951c=\u9321 +\u951d=\u9340 +\u951e=\u9301 +\u951f=\u9315 +\u9520=\u9329 +\u9521=\u932b +\u9522=\u932e +\u9523=\u947c +\u9524=\u9318 +\u9525=\u9310 +\u9526=\u9326 +\u9527=\u9455 +\u9528=\u6774 +\u9529=\u9308 +\u952a=\u9343 +\u952b=\u9307 +\u952c=\u931f +\u952d=\u9320 +\u952e=\u9375 +\u952f=\u92f8 +\u9530=\u9333 +\u9531=\u9319 +\u9532=\u9365 +\u9533=\u9348 +\u9534=\u9347 +\u9535=\u93d8 +\u9536=\u9376 +\u9537=\u9354 +\u9538=\u9364 +\u9539=\u936c +\u953a=\u937e +\u953b=\u935b +\u953c=\u93aa +\u953d=\u9360 +\u953e=\u9370 +\u953f=\u9384 +\u9540=\u934d +\u9541=\u9382 +\u9542=\u93e4 +\u9543=\u93a1 +\u9544=\u9428 +\u9545=\u9387 +\u9546=\u93cc +\u9547=\u93ae +\u9548=\u939b +\u9549=\u9398 +\u954a=\u9477 +\u954b=\u93b2 +\u954c=\u942b +\u954d=\u93b3 +\u954e=\u93bf +\u954f=\u93a6 +\u9550=\u93ac +\u9551=\u938a +\u9552=\u93b0 +\u9553=\u93b5 +\u9554=\u944c +\u9555=\u9394 +\u9556=\u93e2 +\u9557=\u93dc +\u9558=\u93dd +\u9559=\u93cd +\u955a=\u93f0 +\u955b=\u93de +\u955c=\u93e1 +\u955d=\u93d1 +\u955e=\u93c3 +\u955f=\u93c7 +\u9560=\u93d0 +\u9561=\u9414 +\u9562=\u9481 +\u9563=\u9410 +\u9564=\u93f7 +\u9565=\u9465 +\u9566=\u9413 +\u9567=\u946d +\u9568=\u9420 +\u9569=\u9479 +\u956a=\u93f9 +\u956b=\u9419 +\u956c=\u944a +\u956d=\u9433 +\u956e=\u9436 +\u956f=\u9432 +\u9570=\u942e +\u9571=\u943f +\u9572=\u9454 +\u9573=\u9463 +\u9574=\u945e +\u9575=\u9471 +\u9576=\u9472 +\u957f=\u9577 +\u95e8=\u9580 +\u95e9=\u9582 +\u95ea=\u9583 +\u95eb=\u9586 +\u95ec=\u9588 +\u95ed=\u9589 +\u95ee=\u554f +\u95ef=\u95d6 +\u95f0=\u958f +\u95f1=\u95c8 +\u95f2=\u9591 +\u95f3=\u958e +\u95f4=\u9593 +\u95f5=\u9594 +\u95f6=\u958c +\u95f7=\u60b6 +\u95f8=\u9598 +\u95f9=\u9b27 +\u95fa=\u95a8 +\u95fb=\u805e +\u95fc=\u95e5 +\u95fd=\u95a9 +\u95fe=\u95ad +\u95ff=\u95d3 +\u9600=\u95a5 +\u9601=\u95a3 +\u9602=\u95a1 +\u9603=\u95ab +\u9604=\u9b2e +\u9605=\u95b1 +\u9606=\u95ac +\u9607=\u95cd +\u9608=\u95be +\u9609=\u95b9 +\u960a=\u95b6 +\u960b=\u9b29 +\u960c=\u95bf +\u960d=\u95bd +\u960e=\u95bb +\u960f=\u95bc +\u9610=\u95e1 +\u9611=\u95cc +\u9612=\u95c3 +\u9613=\u95e0 +\u9614=\u95ca +\u9615=\u95cb +\u9616=\u95d4 +\u9617=\u95d0 +\u9618=\u95d2 +\u9619=\u95d5 +\u961a=\u95de +\u961b=\u95e4 +\u961f=\u968a +\u9633=\u967d +\u9634=\u9670 +\u9635=\u9663 +\u9636=\u968e +\u9645=\u969b +\u9646=\u9678 +\u9647=\u96b4 +\u9648=\u9673 +\u9649=\u9658 +\u9655=\u965d +\u9667=\u9689 +\u9668=\u9695 +\u9669=\u96aa +\u968f=\u96a8 +\u9690=\u96b1 +\u96b6=\u96b8 +\u96bd=\u96cb +\u96be=\u96e3 +\u96cf=\u96db +\u96e0=\u8b8e +\u96f3=\u9742 +\u96fe=\u9727 +\u9701=\u973d +\u9721=\u9722 +\u972d=\u9744 +\u9753=\u975a +\u9759=\u975c +\u9765=\u9768 +\u9791=\u97c3 +\u9792=\u97bd +\u97af=\u97c9 +\u97b2=\u97dd +\u97e6=\u97cb +\u97e7=\u97cc +\u97e8=\u97cd +\u97e9=\u97d3 +\u97ea=\u97d9 +\u97eb=\u97de +\u97ec=\u97dc +\u97f5=\u97fb +\u9875=\u9801 +\u9876=\u9802 +\u9877=\u9803 +\u9878=\u9807 +\u9879=\u9805 +\u987a=\u9806 +\u987b=\u9808 +\u987c=\u980a +\u987d=\u9811 +\u987e=\u9867 +\u987f=\u9813 +\u9880=\u980e +\u9881=\u9812 +\u9882=\u980c +\u9883=\u980f +\u9884=\u9810 +\u9885=\u9871 +\u9886=\u9818 +\u9887=\u9817 +\u9888=\u9838 +\u9889=\u9821 +\u988a=\u9830 +\u988b=\u9832 +\u988c=\u981c +\u988d=\u6f41 +\u988e=\u71b2 +\u988f=\u9826 +\u9890=\u9824 +\u9891=\u983b +\u9892=\u982e +\u9893=\u9839 +\u9894=\u9837 +\u9895=\u9834 +\u9896=\u7a4e +\u9897=\u9846 +\u9898=\u984c +\u9899=\u9852 +\u989a=\u984e +\u989b=\u9853 +\u989c=\u984f +\u989d=\u984d +\u989e=\u9873 +\u989f=\u9862 +\u98a0=\u985b +\u98a1=\u9859 +\u98a2=\u9865 +\u98a4=\u986b +\u98a5=\u986c +\u98a6=\u9870 +\u98a7=\u9874 +\u98ce=\u98a8 +\u98cf=\u98ba +\u98d0=\u98ad +\u98d1=\u98ae +\u98d2=\u98af +\u98d3=\u98b6 +\u98d4=\u98b8 +\u98d5=\u98bc +\u98d6=\u98bb +\u98d7=\u98c0 +\u98d8=\u98c4 +\u98d9=\u98c6 +\u98da=\u98c8 +\u98de=\u98db +\u98e8=\u9957 +\u990d=\u995c +\u9963=\u98e0 +\u9964=\u98e3 +\u9965=\u98e2 +\u9966=\u98e5 +\u9967=\u9933 +\u9968=\u98e9 +\u9969=\u993c +\u996a=\u98ea +\u996b=\u98eb +\u996c=\u98ed +\u996d=\u98ef +\u996e=\u98f2 +\u996f=\u991e +\u9970=\u98fe +\u9971=\u98fd +\u9972=\u98fc +\u9973=\u98ff +\u9974=\u98f4 +\u9975=\u990c +\u9976=\u9952 +\u9977=\u9909 +\u9978=\u9904 +\u9979=\u990e +\u997a=\u9903 +\u997b=\u990f +\u997c=\u9905 +\u997d=\u9911 +\u997e=\u9916 +\u997f=\u9913 +\u9980=\u9918 +\u9981=\u9912 +\u9982=\u9915 +\u9983=\u991c +\u9984=\u991b +\u9985=\u9921 +\u9986=\u9928 +\u9987=\u9937 +\u9988=\u994b +\u9989=\u9936 +\u998a=\u993f +\u998b=\u995e +\u998c=\u9941 +\u998d=\u9943 +\u998e=\u993a +\u998f=\u993e +\u9990=\u9948 +\u9991=\u9949 +\u9992=\u9945 +\u9993=\u994a +\u9994=\u994c +\u9995=\u9962 +\u9a6c=\u99ac +\u9a6d=\u99ad +\u9a6e=\u99b1 +\u9a6f=\u99b4 +\u9a70=\u99b3 +\u9a71=\u9a45 +\u9a72=\u99b9 +\u9a73=\u99c1 +\u9a74=\u9a62 +\u9a75=\u99d4 +\u9a76=\u99db +\u9a77=\u99df +\u9a78=\u99d9 +\u9a79=\u99d2 +\u9a7a=\u9a36 +\u9a7b=\u99d0 +\u9a7c=\u99dd +\u9a7d=\u99d1 +\u9a7e=\u99d5 +\u9a7f=\u9a5b +\u9a80=\u99d8 +\u9a81=\u9a4d +\u9a82=\u7f75 +\u9a83=\u99f0 +\u9a84=\u9a55 +\u9a85=\u9a4a +\u9a86=\u99f1 +\u9a87=\u99ed +\u9a88=\u99e2 +\u9a89=\u9a6b +\u9a8a=\u9a6a +\u9a8b=\u9a01 +\u9a8c=\u9a57 +\u9a8d=\u9a02 +\u9a8e=\u99f8 +\u9a8f=\u99ff +\u9a90=\u9a0f +\u9a91=\u9a0e +\u9a92=\u9a0d +\u9a93=\u9a05 +\u9a94=\u9a0c +\u9a95=\u9a4c +\u9a96=\u9a42 +\u9a97=\u9a19 +\u9a98=\u9a2d +\u9a99=\u9a24 +\u9a9a=\u9a37 +\u9a9b=\u9a16 +\u9a9c=\u9a41 +\u9a9d=\u9a2e +\u9a9e=\u9a2b +\u9a9f=\u9a38 +\u9aa0=\u9a43 +\u9aa1=\u9a3e +\u9aa2=\u9a44 +\u9aa3=\u9a4f +\u9aa4=\u9a5f +\u9aa5=\u9a65 +\u9aa6=\u9a66 +\u9aa7=\u9a64 +\u9ac5=\u9acf +\u9acb=\u9ad6 +\u9acc=\u9ad5 +\u9b13=\u9b22 +\u9b47=\u9b58 +\u9b49=\u9b4e +\u9c7c=\u9b5a +\u9c7d=\u9b5b +\u9c7e=\u9b62 +\u9c7f=\u9b77 +\u9c80=\u9b68 +\u9c81=\u9b6f +\u9c82=\u9b74 +\u9c83=\u4c3e +\u9c84=\u9b7a +\u9c85=\u9b81 +\u9c86=\u9b83 +\u9c87=\u9bf0 +\u9c88=\u9c78 +\u9c89=\u9b8b +\u9c8a=\u9b93 +\u9c8b=\u9b92 +\u9c8c=\u9b8a +\u9c8d=\u9b91 +\u9c8e=\u9c5f +\u9c8f=\u9b8d +\u9c90=\u9b90 +\u9c91=\u9bad +\u9c92=\u9b9a +\u9c93=\u9bb3 +\u9c94=\u9baa +\u9c95=\u9b9e +\u9c96=\u9ba6 +\u9c97=\u9c02 +\u9c98=\u9b9c +\u9c99=\u9c60 +\u9c9a=\u9c6d +\u9c9b=\u9bab +\u9c9c=\u9bae +\u9c9d=\u9bba +\u9c9e=\u9bd7 +\u9c9f=\u9c58 +\u9ca0=\u9bc1 +\u9ca1=\u9c7a +\u9ca2=\u9c31 +\u9ca3=\u9c39 +\u9ca4=\u9bc9 +\u9ca5=\u9c23 +\u9ca6=\u9c37 +\u9ca7=\u9bc0 +\u9ca8=\u9bca +\u9ca9=\u9bc7 +\u9caa=\u9bb6 +\u9cab=\u9bfd +\u9cac=\u9bd2 +\u9cad=\u9bd6 +\u9cae=\u9bea +\u9caf=\u9bd5 +\u9cb0=\u9beb +\u9cb1=\u9be1 +\u9cb2=\u9be4 +\u9cb3=\u9be7 +\u9cb4=\u9bdd +\u9cb5=\u9be2 +\u9cb6=\u9bf0 +\u9cb7=\u9bdb +\u9cb8=\u9be8 +\u9cb9=\u9c3a +\u9cba=\u9bf4 +\u9cbb=\u9bd4 +\u9cbc=\u9c5d +\u9cbd=\u9c08 +\u9cbe=\u9c0f +\u9cbf=\u9c68 +\u9cc0=\u9bf7 +\u9cc1=\u9c2e +\u9cc2=\u9c03 +\u9cc3=\u9c13 +\u9cc4=\u9c77 +\u9cc5=\u9c0d +\u9cc6=\u9c12 +\u9cc7=\u9c09 +\u9cc8=\u9c01 +\u9cc9=\u9c42 +\u9cca=\u9bff +\u9ccb=\u9c20 +\u9ccc=\u9c32 +\u9ccd=\u9c2d +\u9cce=\u9c28 +\u9ccf=\u9c25 +\u9cd0=\u9c29 +\u9cd1=\u9c1f +\u9cd2=\u9c1c +\u9cd3=\u9c33 +\u9cd4=\u9c3e +\u9cd5=\u9c48 +\u9cd6=\u9c49 +\u9cd7=\u9c3b +\u9cd8=\u9c35 +\u9cd9=\u9c45 +\u9cda=\u4c81 +\u9cdb=\u9c3c +\u9cdc=\u9c56 +\u9cdd=\u9c54 +\u9cde=\u9c57 +\u9cdf=\u9c52 +\u9ce0=\u9c6f +\u9ce1=\u9c64 +\u9ce2=\u9c67 +\u9ce3=\u9c63 +\u9e1f=\u9ce5 +\u9e20=\u9ce9 +\u9e21=\u96de +\u9e22=\u9cf6 +\u9e23=\u9cf4 +\u9e24=\u9cf2 +\u9e25=\u9dd7 +\u9e26=\u9d09 +\u9e27=\u9dac +\u9e28=\u9d07 +\u9e29=\u9d06 +\u9e2a=\u9d23 +\u9e2b=\u9d87 +\u9e2c=\u9e15 +\u9e2d=\u9d28 +\u9e2e=\u9d1e +\u9e2f=\u9d26 +\u9e30=\u9d12 +\u9e31=\u9d1f +\u9e32=\u9d1d +\u9e33=\u9d1b +\u9e34=\u9dfd +\u9e35=\u9d15 +\u9e36=\u9de5 +\u9e37=\u9dd9 +\u9e38=\u9d2f +\u9e39=\u9d30 +\u9e3a=\u9d42 +\u9e3b=\u9d34 +\u9e3c=\u9d43 +\u9e3d=\u9d3f +\u9e3e=\u9e1e +\u9e3f=\u9d3b +\u9e40=\u9d50 +\u9e41=\u9d53 +\u9e42=\u9e1d +\u9e43=\u9d51 +\u9e44=\u9d60 +\u9e45=\u9d5d +\u9e46=\u9d52 +\u9e47=\u9df3 +\u9e48=\u9d5c +\u9e49=\u9d61 +\u9e4a=\u9d72 +\u9e4b=\u9d93 +\u9e4c=\u9d6a +\u9e4d=\u9d7e +\u9e4e=\u9d6f +\u9e4f=\u9d6c +\u9e50=\u9d6e +\u9e51=\u9d89 +\u9e52=\u9d8a +\u9e53=\u9d77 +\u9e54=\u9deb +\u9e55=\u9d98 +\u9e56=\u9da1 +\u9e57=\u9d9a +\u9e58=\u9dbb +\u9e59=\u9d96 +\u9e5a=\u9dbf +\u9e5b=\u9da5 +\u9e5c=\u9da9 +\u9e5d=\u9dca +\u9e5e=\u9dc2 +\u9e5f=\u9db2 +\u9e60=\u9db9 +\u9e61=\u9dba +\u9e62=\u9dc1 +\u9e63=\u9dbc +\u9e64=\u9db4 +\u9e65=\u9dd6 +\u9e66=\u9e1a +\u9e67=\u9dd3 +\u9e68=\u9dda +\u9e69=\u9def +\u9e6a=\u9de6 +\u9e6b=\u9df2 +\u9e6c=\u9df8 +\u9e6d=\u9dfa +\u9e6f=\u9e07 +\u9e70=\u9df9 +\u9e71=\u9e0c +\u9e72=\u9e0f +\u9e73=\u9e1b +\u9e74=\u9e18 +\u9e7e=\u9e7a +\u9ea6=\u9ea5 +\u9eb8=\u9ea9 +\u9ec4=\u9ec3 +\u9ec9=\u9ecc +\u9ee1=\u9ef6 +\u9ee9=\u9ef7 +\u9eea=\u9ef2 +\u9efe=\u9efd +\u9f0b=\u9eff +\u9f0d=\u9f09 +\u9f17=\u9780 +\u9f39=\u9f34 +\u9f44=\u9f47 +\u9f50=\u9f4a +\u9f51=\u9f4f +\u9f7f=\u9f52 +\u9f80=\u9f54 +\u9f81=\u9f55 +\u9f82=\u9f57 +\u9f83=\u9f5f +\u9f84=\u9f61 +\u9f85=\u9f59 +\u9f86=\u9f60 +\u9f87=\u9f5c +\u9f88=\u9f66 +\u9f89=\u9f6c +\u9f8a=\u9f6a +\u9f8b=\u9f72 +\u9f8c=\u9f77 +\u9f99=\u9f8d +\u9f9a=\u9f94 +\u9f9b=\u9f95 +\u9f9f=\u9f9c +\ud842\udfb6=\u55f0 +\ud845\udc84=\u58c8 +\ud858\ude16=\u4308 +\ud863\udc3e=\u93b7 +\ud863\udc3f=\u91f3 +\ud863\udc40=\ud862\udd5b +\ud863\udc41=\u9220 +\ud863\udc42=\u920b +\ud863\udc43=\u9232 +\ud863\udc44=\u922f +\ud863\udc45=\u9241 +\ud863\udc47=\u92b6 +\ud863\udc48=\u92c9 +\ud863\udc49=\u9344 +\ud863\udc4a=\ud862\uddf1 +\ud863\udc4b=\u9302 +\ud863\udc4c=\u93c6 +\ud863\udc4d=\u93af +\ud863\udc4e=\u936e +\ud863\udc4f=\u939d +\ud863\udc50=\ud862\uded2 +\ud863\udc52=\u93c9 +\ud863\udc53=\u940e +\ud863\udc54=\u940f +\ud863\udc55=\ud862\udf82 +\ud863\ude02=\u958d +\ud863\ude03=\u9590 +\ud864\udffc=\u4a8f +\ud864\udffd=\ud864\udfea +\ud864\udffe=\ud864\udfa2 +\ud864\udfff=\u4a98 +\ud865\udc00=\u4a97 +\ud865\udd95=\ud865\udce3 +\ud865\udd96=\u9843 +\ud865\udd97=\u4af4 +\ud865\ude65=\u98b0 +\ud865\ude66=\ud865\uddc0 +\ud865\ude67=\ud865\udde1 +\ud865\ude68=\ud865\ude39 +\ud865\ude69=\ud865\ude00 +\ud865\ude6a=\u98b7 +\ud865\ude6b=\u98be +\ud865\ude6c=\ud865\ude3a +\ud865\ude6d=\ud865\ude1d +\ud865\ude6e=\u4b18 +\ud865\ude6f=\u4b1d +\ud865\ude70=\ud865\ude48 +\ud866\udc05=\ud865\udfd0 +\ud866\udc06=\ud865\udf26 +\ud866\udc07=\u4b40 +\ud866\udc08=\u4b43 +\ud866\udc0b=\ud865\udf54 +\ud866\udc0c=\u9938 +\ud866\udde6=\ud866\udc7a +\ud866\udde8=\u99ce +\ud866\udde9=\ud866\udd0a +\ud866\uddea=\u4bbe +\ud866\uddeb=\u99da +\ud866\uddec=\ud866\udca1 +\ud866\udded=\u4b7f +\ud866\uddee=\ud866\udcbe +\ud866\uddef=\u9a4b +\ud866\uddf0=\u4b9d +\ud866\uddf1=\ud866\udd49 +\ud866\uddf2=\u99e7 +\ud866\uddf3=\ud866\udcb8 +\ud866\uddf4=\u99e9 +\ud866\uddf5=\ud866\udcb4 +\ud866\uddf6=\ud866\udccf +\ud866\uddfa=\u99f6 +\ud866\uddfb=\ud866\udcf5 +\ud866\uddfc=\ud866\udcfa +\ud866\uddff=\u4ba0 +\ud866\ude00=\u9a14 +\ud866\ude01=\u4b9e +\ud866\ude03=\u9a1d +\ud866\ude04=\u9a2a +\ud866\ude05=\ud866\udd38 +\ud866\ude06=\ud866\udd19 +\ud866\ude08=\u9a1f +\ud866\ude09=\ud866\udd32 +\ud866\ude0a=\u9a1a +\ud866\ude0b=\ud866\udd44 +\ud866\ude0c=\ud866\udd51 +\ud866\ude0d=\ud866\udd47 +\ud866\ude0f=\u4bb3 +\ud866\ude10=\ud866\uddc6 +\ud867\udf79=\u9b65 +\ud867\udf7a=\ud867\udd69 +\ud867\udf7b=\ud867\udd79 +\ud867\udf7c=\u9bf6 +\ud867\udf7d=\ud867\uddb1 +\ud867\udf7e=\u9b9f +\ud867\udf7f=\ud867\uddb0 +\ud867\udf80=\u9b95 +\ud867\udf81=\u9bc4 +\ud867\udf83=\u9bb8 +\ud867\udf84=\ud867\uddf0 +\ud867\udf85=\ud867\ude03 +\ud867\udf86=\ud867\ude26 +\ud867\udf87=\u9bf1 +\ud867\udf88=\u4c59 +\ud867\udf8a=\u4c6c +\ud867\udf8b=\u4c70 +\ud867\udf8c=\u9c47 +\ud867\udf8e=\ud867\udf47 +\ud868\ude42=\u4cb0 +\ud868\ude43=\u9cfc +\ud868\ude44=\ud867\udfea +\ud868\ude45=\ud868\udc26 +\ud868\ude46=\u9d32 +\ud868\ude48=\u9d1c +\ud868\ude49=\ud868\udc48 +\ud868\ude4a=\u9de8 +\ud868\ude4b=\ud868\udc3e +\ud868\ude4c=\ud868\udc56 +\ud868\ude4d=\u9d5a +\ud868\ude4e=\ud868\udc86 +\ud868\ude4f=\ud868\udccf +\ud868\ude50=\ud868\udccd +\ud868\ude51=\u9dd4 +\ud868\ude52=\ud868\udd15 +\ud868\ude54=\ud868\udd06 +\ud868\ude55=\ud868\uddf3 +\ud868\udf88=\u4d2c +\ud868\udf89=\u9eb2 +\ud868\udf8a=\u9ea8 +\ud868\udf8b=\u4d34 +\ud868\udf8c=\u9eb3 +\ud869\ude8f=\ud869\ude00 +\ud869\ude90=\ud869\ude2f +\ue82d=\u68e1 +0\u591a\u53ea=0\u591a\u96bb +0\u5929\u540e=0\u5929\u5f8c +0\u53ea=0\u96bb +0\u4f59=0\u9918 +1\u5929\u540e=1\u5929\u5f8c +1\u53ea=1\u96bb +1\u4f59=1\u9918 +2\u5929\u540e=2\u5929\u5f8c +2\u53ea=2\u96bb +2\u4f59=2\u9918 +3\u5929\u540e=3\u5929\u5f8c +3\u53ea=3\u96bb +3\u4f59=3\u9918 +4\u5929\u540e=4\u5929\u5f8c +4\u53ea=4\u96bb +4\u4f59=4\u9918 +5\u5929\u540e=5\u5929\u5f8c +5\u53ea=5\u96bb +5\u4f59=5\u9918 +6\u5929\u540e=6\u5929\u5f8c +6\u53ea=6\u96bb +6\u4f59=6\u9918 +7\u5929\u540e=7\u5929\u5f8c +7\u53ea=7\u96bb +7\u4f59=7\u9918 +8\u5929\u540e=8\u5929\u5f8c +8\u53ea=8\u96bb +8\u4f59=8\u9918 +9\u5929\u540e=9\u5929\u5f8c +9\u53ea=9\u96bb +9\u4f59=9\u9918 +\u00b7\u8303=\u00b7\u8303 +\u3001\u514b\u5236=\u3001\u524b\u5236 +\u3002\u514b\u5236=\u3002\u524b\u5236 +\u3007\u53ea=\u3007\u96bb +\u3007\u4f59=\u3007\u9918 +\u4e00\u5e72\u4e8c\u51c0=\u4e00\u4e7e\u4e8c\u6de8 +\u4e00\u4f19\u4eba=\u4e00\u4f19\u4eba +\u4e00\u4f19\u5934=\u4e00\u4f19\u982d +\u4e00\u4f19\u98df=\u4e00\u4f19\u98df +\u4e00\u5e76=\u4e00\u4f75 +\u4e00\u4e2a\u51c6=\u4e00\u500b\u6e96 +\u4e00\u524d\u4e00\u540e=\u4e00\u524d\u4e00\u5f8c +\u4e00\u5212=\u4e00\u5283 +\u4e00\u534a\u53ea=\u4e00\u534a\u53ea +\u4e00\u540a\u94b1=\u4e00\u540a\u9322 +\u4e00\u5730\u91cc=\u4e00\u5730\u88e1 +\u4e00\u4f19=\u4e00\u5925 +\u4e00\u5929\u540e=\u4e00\u5929\u5f8c +\u4e00\u5929\u949f=\u4e00\u5929\u9418 +\u4e00\u5e72\u4eba=\u4e00\u5e72\u4eba +\u4e00\u5e72\u5bb6\u4e2d=\u4e00\u5e72\u5bb6\u4e2d +\u4e00\u5e72\u5f1f\u5144=\u4e00\u5e72\u5f1f\u5144 +\u4e00\u5e72\u5f1f\u5b50=\u4e00\u5e72\u5f1f\u5b50 +\u4e00\u5e72\u90e8\u4e0b=\u4e00\u5e72\u90e8\u4e0b +\u4e00\u540a=\u4e00\u5f14 +\u4e00\u522b\u5934=\u4e00\u5f46\u982d +\u4e00\u6597\u6597=\u4e00\u6597\u6597 +\u4e00\u6811\u767e\u83b7=\u4e00\u6a39\u767e\u7a6b +\u4e00\u51c6=\u4e00\u6e96 +\u4e00\u4e89\u4e24\u4e11=\u4e00\u722d\u5169\u919c +\u4e00\u7269\u514b\u4e00\u7269=\u4e00\u7269\u524b\u4e00\u7269 +\u4e00\u76ee\u4e86\u7136=\u4e00\u76ee\u4e86\u7136 +\u4e00\u624e=\u4e00\u7d2e +\u4e00\u51b2=\u4e00\u885d +\u4e00\u9505\u9762=\u4e00\u934b\u9eb5 +\u4e00\u53ea=\u4e00\u96bb +\u4e00\u9762\u98df=\u4e00\u9762\u98df +\u4e00\u4f59=\u4e00\u9918 +\u4e00\u53d1\u5343\u94a7=\u4e00\u9aee\u5343\u921e +\u4e00\u54c4\u800c\u6563=\u4e00\u9b28\u800c\u6563 +\u4e01\u4e01\u5f53\u5f53=\u4e01\u4e01\u7576\u7576 +\u4e01\u4e11=\u4e01\u4e11 +\u4e03\u5212=\u4e03\u5283 +\u4e03\u5929\u540e=\u4e03\u5929\u5f8c +\u4e03\u60c5\u516d\u6b32=\u4e03\u60c5\u516d\u617e +\u4e03\u624e=\u4e03\u7d2e +\u4e03\u53ea=\u4e03\u96bb +\u4e03\u4f59=\u4e03\u9918 +\u4e07\u4fdf=\u4e07\u4fdf +\u4e07\u65d7=\u4e07\u65d7 +\u4e09\u5929\u540e=\u4e09\u5929\u5f8c +\u4e09\u5f81\u4e03\u8f9f=\u4e09\u5fb5\u4e03\u8f9f +\u4e09\u51c6=\u4e09\u6e96 +\u4e09\u624e=\u4e09\u7d2e +\u4e09\u7edf\u5386=\u4e09\u7d71\u66c6 +\u4e09\u7edf\u5386\u53f2=\u4e09\u7d71\u6b77\u53f2 +\u4e09\u590d=\u4e09\u8907 +\u4e09\u53ea=\u4e09\u96bb +\u4e09\u4f59=\u4e09\u9918 +\u4e0a\u540a\u81ea\u6740=\u4e0a\u540a\u81ea\u6bba +\u4e0a\u540a=\u4e0a\u5f14 +\u4e0a\u6881\u5c71=\u4e0a\u6881\u5c71 +\u4e0a\u6881=\u4e0a\u6a11 +\u4e0a\u7b7e\u540d=\u4e0a\u7c3d\u540d +\u4e0a\u7b7e\u5b57=\u4e0a\u7c3d\u5b57 +\u4e0a\u7b7e\u5199=\u4e0a\u7c3d\u5beb +\u4e0a\u7b7e\u6536=\u4e0a\u7c3d\u6536 +\u4e0a\u7b7e=\u4e0a\u7c64 +\u4e0a\u836f=\u4e0a\u85e5 +\u4e0a\u8bfe\u949f=\u4e0a\u8ab2\u9418 +\u4e0a\u9762\u7cca=\u4e0a\u9762\u7cca +\u4e0b\u4ed1\u8def=\u4e0b\u5d19\u8def +\u4e0b\u4e8e=\u4e0b\u65bc +\u4e0b\u6881=\u4e0b\u6a11 +\u4e0b\u6ce8\u89e3=\u4e0b\u6ce8\u89e3 +\u4e0b\u7b7e=\u4e0b\u7c64 +\u4e0b\u836f=\u4e0b\u85e5 +\u4e0b\u8bfe\u949f=\u4e0b\u8ab2\u9418 +\u4e0b\u8868=\u4e0b\u9336 +\u4e0b\u949f=\u4e0b\u9418 +\u4e0d\u5e72\u4e0d\u51c0=\u4e0d\u4e7e\u4e0d\u6de8 +\u4e0d\u5360=\u4e0d\u4f54 +\u4e0d\u514b\u81ea\u5236=\u4e0d\u514b\u81ea\u5236 +\u4e0d\u51c6\u4ed6=\u4e0d\u51c6\u4ed6 +\u4e0d\u51c6\u4f60=\u4e0d\u51c6\u4f60 +\u4e0d\u51c6\u5979=\u4e0d\u51c6\u5979 +\u4e0d\u51c6\u5b83=\u4e0d\u51c6\u5b83 +\u4e0d\u51c6\u6211=\u4e0d\u51c6\u6211 +\u4e0d\u51c6\u6ca1=\u4e0d\u51c6\u6c92 +\u4e0d\u51c6\u7ffb\u5370=\u4e0d\u51c6\u7ffb\u5370 +\u4e0d\u51c6\u8bb8=\u4e0d\u51c6\u8a31 +\u4e0d\u51c6\u8c01=\u4e0d\u51c6\u8ab0 +\u4e0d\u514b\u5236=\u4e0d\u524b\u5236 +\u4e0d\u524d\u4e0d\u540e=\u4e0d\u524d\u4e0d\u5f8c +\u4e0d\u52a0\u81ea\u5236=\u4e0d\u52a0\u81ea\u5236 +\u4e0d\u5360\u51f6\u5409=\u4e0d\u5360\u51f6\u5409 +\u4e0d\u5360\u535c=\u4e0d\u5360\u535c +\u4e0d\u5360\u5409\u51f6=\u4e0d\u5360\u5409\u51f6 +\u4e0d\u5360\u7b97=\u4e0d\u5360\u7b97 +\u4e0d\u597d\u5e72\u6d89=\u4e0d\u597d\u5e72\u6d89 +\u4e0d\u597d\u5e72\u9884=\u4e0d\u597d\u5e72\u9810 +\u4e0d\u597d\u5e72\u9810=\u4e0d\u597d\u5e72\u9810 +\u4e0d\u5acc\u6bcd\u4e11=\u4e0d\u5acc\u6bcd\u919c +\u4e0d\u5bd2\u800c\u6817=\u4e0d\u5bd2\u800c\u6144 +\u4e0d\u5e72\u4e8b=\u4e0d\u5e72\u4e8b +\u4e0d\u5e72\u4ed6=\u4e0d\u5e72\u4ed6 +\u4e0d\u5e72\u4f11=\u4e0d\u5e72\u4f11 +\u4e0d\u5e72\u4f60=\u4e0d\u5e72\u4f60 +\u4e0d\u5e72\u5979=\u4e0d\u5e72\u5979 +\u4e0d\u5e72\u5b83=\u4e0d\u5e72\u5b83 +\u4e0d\u5e72\u6211=\u4e0d\u5e72\u6211 +\u4e0d\u5e72\u64fe=\u4e0d\u5e72\u64fe +\u4e0d\u5e72\u6270=\u4e0d\u5e72\u64fe +\u4e0d\u5e72\u6d89=\u4e0d\u5e72\u6d89 +\u4e0d\u5e72\u7260=\u4e0d\u5e72\u7260 +\u4e0d\u5e72\u72af=\u4e0d\u5e72\u72af +\u4e0d\u5e72\u9884=\u4e0d\u5e72\u9810 +\u4e0d\u5e72\u9810=\u4e0d\u5e72\u9810 +\u4e0d\u5e72=\u4e0d\u5e79 +\u4e0d\u540a=\u4e0d\u5f14 +\u4e0d\u91c7=\u4e0d\u63a1 +\u4e0d\u6597\u80c6=\u4e0d\u6597\u81bd +\u4e0d\u65ad\u53d1=\u4e0d\u65b7\u767c +\u4e0d\u6bcf\u53ea=\u4e0d\u6bcf\u53ea +\u4e0d\u51c6=\u4e0d\u6e96 +\u4e0d\u51c6\u786e=\u4e0d\u6e96\u78ba +\u4e0d\u8c37=\u4e0d\u7a40 +\u4e0d\u836f\u800c\u6108=\u4e0d\u85e5\u800c\u7652 +\u4e0d\u6258=\u4e0d\u8a17 +\u4e0d\u8d1f\u6240\u6258=\u4e0d\u8ca0\u6240\u6258 +\u4e0d\u901a\u540a\u5e86=\u4e0d\u901a\u5f14\u6176 +\u4e0d\u4e11=\u4e0d\u919c +\u4e0d\u91c7\u58f0=\u4e0d\u91c7\u8072 +\u4e0d\u9508\u94a2=\u4e0d\u93fd\u92fc +\u4e0d\u98df\u5e72\u814a=\u4e0d\u98df\u4e7e\u814a +\u4e0d\u6597=\u4e0d\u9b25 +\u4e11\u4e09=\u4e11\u4e09 +\u4e11\u5a46\u5b50=\u4e11\u5a46\u5b50 +\u4e11\u5e74=\u4e11\u5e74 +\u4e11\u65e5=\u4e11\u65e5 +\u4e11\u65e6=\u4e11\u65e6 +\u4e11\u65f6=\u4e11\u6642 +\u4e11\u6708=\u4e11\u6708 +\u4e11\u8868\u529f=\u4e11\u8868\u529f +\u4e11\u89d2=\u4e11\u89d2 +\u4e14\u4e8e=\u4e14\u65bc +\u4e16\u7530\u8c37=\u4e16\u7530\u8c37 +\u4e16\u754c\u676f=\u4e16\u754c\u76c3 +\u4e16\u7eaa\u949f=\u4e16\u7d00\u9418 +\u4e16\u7eaa\u949f\u8868=\u4e16\u7d00\u9418\u9336 +\u4e22\u4e11=\u4e1f\u919c +\u5e76\u4e0d\u51c6=\u4e26\u4e0d\u51c6 +\u5e76\u5b58\u7740=\u4e26\u5b58\u8457 +\u5e76\u66f0\u5165\u6dc0=\u4e26\u66f0\u5165\u6fb1 +\u5e76\u53d1\u52a8=\u4e26\u767c\u52d5 +\u5e76\u53d1\u5c55=\u4e26\u767c\u5c55 +\u5e76\u53d1\u73b0=\u4e26\u767c\u73fe +\u5e76\u53d1\u8868=\u4e26\u767c\u8868 +\u4e2d\u56fd\u56fd\u9645\u4fe1\u6258\u6295\u8d44\u516c\u53f8=\u4e2d\u570b\u570b\u969b\u4fe1\u6258\u6295\u8cc7\u516c\u53f8 +\u4e2d\u56fd\u70df\u8349\u603b\u516c\u53f8=\u4e2d\u570b\u70df\u8349\u7e3d\u516c\u53f8 +\u4e2d\u578b\u949f=\u4e2d\u578b\u9418 +\u4e2d\u578b\u949f\u8868\u9762=\u4e2d\u578b\u9418\u8868\u9762 +\u4e2d\u578b\u949f\u8868=\u4e2d\u578b\u9418\u9336 +\u4e2d\u578b\u949f\u9762=\u4e2d\u578b\u9418\u9762 +\u4e2d\u4ed1=\u4e2d\u5d19 +\u4e2d\u5cb3=\u4e2d\u5dbd +\u4e2d\u4e8e=\u4e2d\u65bc +\u4e2d\u7b7e=\u4e2d\u7c64 +\u4e2d\u7f8e\u53d1\u8868=\u4e2d\u7f8e\u767c\u8868 +\u4e2d\u836f=\u4e2d\u85e5 +\u4e30\u5100=\u4e30\u5100 +\u4e30\u4eea=\u4e30\u5100 +\u4e30\u5357=\u4e30\u5357 +\u4e30\u53f0=\u4e30\u53f0 +\u4e30\u59ff=\u4e30\u59ff +\u4e30\u5bb9=\u4e30\u5bb9 +\u4e30\u5ea6=\u4e30\u5ea6 +\u4e30\u60c5=\u4e30\u60c5 +\u4e30\u6807=\u4e30\u6a19 +\u4e30\u6807\u4e0d\u51e1=\u4e30\u6a19\u4e0d\u51e1 +\u4e30\u6a19\u4e0d\u51e1=\u4e30\u6a19\u4e0d\u51e1 +\u4e30\u795e=\u4e30\u795e +\u4e30\u8338=\u4e30\u8338 +\u4e30\u91c7=\u4e30\u91c7 +\u4e30\u97f5=\u4e30\u97fb +\u4e30\u97fb=\u4e30\u97fb +\u4e38\u836f=\u4e38\u85e5 +\u4e39\u836f=\u4e39\u85e5 +\u4e3b\u4ec6=\u4e3b\u50d5 +\u4e3b\u5e72=\u4e3b\u5e79 +\u4e3b\u949f\u5dee=\u4e3b\u9418\u5dee +\u4e3b\u949f\u66f2\u7ebf=\u4e3b\u9418\u66f2\u7dda +\u4e48\u4e48\u5c0f\u4e11=\u4e48\u9ebc\u5c0f\u4e11 +\u4e4b\u4e00\u53ea=\u4e4b\u4e00\u53ea +\u4e4b\u4e8c\u53ea=\u4e4b\u4e8c\u53ea +\u4e4b\u516b\u4e5d\u53ea=\u4e4b\u516b\u4e5d\u53ea +\u4e4b\u540e=\u4e4b\u5f8c +\u4e4b\u5f81=\u4e4b\u5fb5 +\u4e4b\u6258=\u4e4b\u8a17 +\u4e4b\u949f=\u4e4b\u9418 +\u4e4b\u4f59=\u4e4b\u9918 +\u4e59\u4e11=\u4e59\u4e11 +\u4e5d\u4e16\u4e4b\u4ec7=\u4e5d\u4e16\u4e4b\u8b8e +\u4e5d\u5212=\u4e5d\u5283 +\u4e5d\u5929\u540e=\u4e5d\u5929\u5f8c +\u4e5d\u8c37=\u4e5d\u7a40 +\u4e5d\u624e=\u4e5d\u7d2e +\u4e5d\u53ea=\u4e5d\u96bb +\u4e5d\u4f59=\u4e5d\u9918 +\u4e5d\u9f99\u8868\u884c=\u4e5d\u9f8d\u8868\u884c +\u4e5f\u514b\u5236=\u4e5f\u524b\u5236 +\u4e5f\u6597\u4e86\u80c6=\u4e5f\u6597\u4e86\u81bd +\u5e72\u5e72=\u4e7e\u4e7e +\u5e72\u5e72\u513f\u7684=\u4e7e\u4e7e\u5152\u7684 +\u5e72\u5e72\u51c0\u51c0=\u4e7e\u4e7e\u6de8\u6de8 +\u5e72\u4e95=\u4e7e\u4e95 +\u5e72\u4e2a\u591f=\u4e7e\u500b\u5920 +\u5e72\u513f=\u4e7e\u5152 +\u5e72\u51b0=\u4e7e\u51b0 +\u5e72\u51b7=\u4e7e\u51b7 +\u5e72\u523b\u7248=\u4e7e\u523b\u7248 +\u5e72\u5265\u5265=\u4e7e\u525d\u525d +\u5e72\u5366=\u4e7e\u5366 +\u5e72\u540a\u7740\u4e0b\u5df4=\u4e7e\u540a\u8457\u4e0b\u5df4 +\u5e72\u548c=\u4e7e\u548c +\u5e72\u54b3=\u4e7e\u54b3 +\u5e72\u54bd=\u4e7e\u54bd +\u5e72\u54e5=\u4e7e\u54e5 +\u5e72\u54ed=\u4e7e\u54ed +\u5e72\u5531=\u4e7e\u5531 +\u5e72\u557c=\u4e7e\u557c +\u5e72\u4e54=\u4e7e\u55ac +\u5e72\u5455=\u4e7e\u5614 +\u5e72\u54d5=\u4e7e\u5666 +\u5e72\u568e=\u4e7e\u568e +\u5e72\u56de\u4ed8=\u4e7e\u56de\u4ed8 +\u5e72\u5706\u6d01\u51c0=\u4e7e\u5713\u6f54\u6de8 +\u5e72\u5730=\u4e7e\u5730 +\u5e72\u5764=\u4e7e\u5764 +\u5e72\u575e=\u4e7e\u5862 +\u5e72\u5973=\u4e7e\u5973 +\u5e72\u5974\u624d=\u4e7e\u5974\u624d +\u5e72\u59b9=\u4e7e\u59b9 +\u5e72\u59ca=\u4e7e\u59ca +\u5e72\u5a18=\u4e7e\u5a18 +\u5e72\u5988=\u4e7e\u5abd +\u5e72\u5b50=\u4e7e\u5b50 +\u5e72\u5b63=\u4e7e\u5b63 +\u5e72\u5c38=\u4e7e\u5c4d +\u5e72\u5c4e\u6a5b=\u4e7e\u5c4e\u6a5b +\u5e72\u5df4=\u4e7e\u5df4 +\u5e72\u5f0f=\u4e7e\u5f0f +\u5e72\u5f1f=\u4e7e\u5f1f +\u5e72\u6025=\u4e7e\u6025 +\u5e72\u6027=\u4e7e\u6027 +\u5e72\u6253\u96f7=\u4e7e\u6253\u96f7 +\u5e72\u6298=\u4e7e\u6298 +\u5e72\u6482\u53f0=\u4e7e\u6482\u53f0 +\u5e72\u6487\u4e0b=\u4e7e\u6487\u4e0b +\u5e72\u64e6=\u4e7e\u64e6 +\u5e72\u652f\u524c=\u4e7e\u652f\u524c +\u5e72\u652f\u652f=\u4e7e\u652f\u652f +\u5e72\u6572\u6886\u5b50\u4e0d\u5356\u6cb9=\u4e7e\u6572\u6886\u5b50\u4e0d\u8ce3\u6cb9 +\u5e72\u6599=\u4e7e\u6599 +\u5e72\u65f1=\u4e7e\u65f1 +\u5e72\u6696=\u4e7e\u6696 +\u5e72\u6750=\u4e7e\u6750 +\u5e72\u6751\u6c99=\u4e7e\u6751\u6c99 +\u5e72\u676f=\u4e7e\u676f +\u5e72\u679c=\u4e7e\u679c +\u5e72\u67af=\u4e7e\u67af +\u5e72\u67f4=\u4e7e\u67f4 +\u5e72\u67f4\u70c8\u706b=\u4e7e\u67f4\u70c8\u706b +\u5e72\u6885=\u4e7e\u6885 +\u5e72\u6b7b=\u4e7e\u6b7b +\u5e72\u6c60=\u4e7e\u6c60 +\u5e72\u6ca1=\u4e7e\u6c92 +\u5e72\u6d17=\u4e7e\u6d17 +\u5e72\u6db8=\u4e7e\u6db8 +\u5e72\u51c9=\u4e7e\u6dbc +\u5e72\u51c0=\u4e7e\u6de8 +\u5e72\u6e20=\u4e7e\u6e20 +\u5e72\u6e34=\u4e7e\u6e34 +\u5e72\u6c9f=\u4e7e\u6e9d +\u5e72\u6f06=\u4e7e\u6f06 +\u5e72\u6da9=\u4e7e\u6f80 +\u5e72\u6e7f=\u4e7e\u6fd5 +\u5e72\u71ac=\u4e7e\u71ac +\u5e72\u70ed=\u4e7e\u71b1 +\u5e72\u71b1=\u4e7e\u71b1 +\u5e72\u706f\u76cf=\u4e7e\u71c8\u76de +\u5e72\u71e5=\u4e7e\u71e5 +\u5e72\u7238=\u4e7e\u7238 +\u5e72\u7239=\u4e7e\u7239 +\u5e72\u723d=\u4e7e\u723d +\u5e72\u7247=\u4e7e\u7247 +\u5e72\u751f\u53d7=\u4e7e\u751f\u53d7 +\u5e72\u751f\u5b50=\u4e7e\u751f\u5b50 +\u5e72\u4ea7=\u4e7e\u7522 +\u5e72\u7530=\u4e7e\u7530 +\u5e72\u75a5=\u4e7e\u75a5 +\u5e72\u7626=\u4e7e\u7626 +\u5e72\u762a=\u4e7e\u765f +\u5e72\u7663=\u4e7e\u766c +\u5e72\u763e=\u4e7e\u766e +\u5e72\u767d\u513f=\u4e7e\u767d\u5152 +\u5e72\u7684=\u4e7e\u7684 +\u5e72\u773c=\u4e7e\u773c +\u5e72\u77aa\u773c=\u4e7e\u77aa\u773c +\u5e72\u793c=\u4e7e\u79ae +\u5e72\u7a3f=\u4e7e\u7a3f +\u5e72\u7b11=\u4e7e\u7b11 +\u5e72\u7b49=\u4e7e\u7b49 +\u5e72\u7bfe\u7247=\u4e7e\u7bfe\u7247 +\u5e72\u7c89=\u4e7e\u7c89 +\u5e72\u7cae=\u4e7e\u7ce7 +\u5e72\u7ed3=\u4e7e\u7d50 +\u5e72\u4e1d=\u4e7e\u7d72 +\u5e72\u7eb2=\u4e7e\u7db1 +\u5e72\u7ef7=\u4e7e\u7e43 +\u5e72\u8017=\u4e7e\u8017 +\u5e72\u8089\u7247=\u4e7e\u8089\u7247 +\u5e72\u80a1=\u4e7e\u80a1 +\u5e72\u80a5=\u4e7e\u80a5 +\u5e72\u8106=\u4e7e\u8106 +\u5e72\u82b1=\u4e7e\u82b1 +\u5e72\u520d=\u4e7e\u82bb +\u5e72\u82d4=\u4e7e\u82d4 +\u5e72\u8328\u814a=\u4e7e\u8328\u81d8 +\u5e72\u8336\u94b1=\u4e7e\u8336\u9322 +\u5e72\u8349=\u4e7e\u8349 +\u5e72\u83dc=\u4e7e\u83dc +\u5e72\u843d=\u4e7e\u843d +\u5e72\u7740=\u4e7e\u8457 +\u5e72\u59dc=\u4e7e\u8591 +\u5e72\u85aa=\u4e7e\u85aa +\u5e72\u8654=\u4e7e\u8654 +\u5e72\u53f7=\u4e7e\u865f +\u5e72\u8840\u6d46=\u4e7e\u8840\u6f3f +\u5e72\u8863=\u4e7e\u8863 +\u5e72\u88c2=\u4e7e\u88c2 +\u5e72\u4eb2=\u4e7e\u89aa +\u4e7e\u8c61\u5386=\u4e7e\u8c61\u66c6 +\u4e7e\u8c61\u66c6=\u4e7e\u8c61\u66c6 +\u5e72\u8d1d=\u4e7e\u8c9d +\u5e72\u8d27=\u4e7e\u8ca8 +\u5e72\u8e81=\u4e7e\u8e81 +\u5e72\u903c=\u4e7e\u903c +\u5e72\u916a=\u4e7e\u916a +\u5e72\u9175\u6bcd=\u4e7e\u9175\u6bcd +\u5e72\u918b=\u4e7e\u918b +\u5e72\u91cd=\u4e7e\u91cd +\u5e72\u91cf=\u4e7e\u91cf +\u5e72\u963f\u5976=\u4e7e\u963f\u5976 +\u5e72\u9686=\u4e7e\u9686 +\u5e72\u96f7=\u4e7e\u96f7 +\u5e72\u7535=\u4e7e\u96fb +\u5e72\u970d\u4e71=\u4e7e\u970d\u4e82 +\u5e72\u98a1=\u4e7e\u9859 +\u5e72\u53f0=\u4e7e\u98b1 +\u5e72\u996d=\u4e7e\u98ef +\u5e72\u9986=\u4e7e\u9928 +\u5e72\u7cc7=\u4e7e\u9931 +\u5e72\u998f=\u4e7e\u993e +\u5e72\u9c7c=\u4e7e\u9b5a +\u5e72\u9c9c=\u4e7e\u9bae +\u5e72\u9762=\u4e7e\u9eb5 +\u4e71\u53d1=\u4e82\u9aee +\u4e71\u54c4=\u4e82\u9b28 +\u4e71\u54c4\u4e0d\u8fc7\u6765=\u4e82\u9b28\u4e0d\u904e\u4f86 +\u4e86\u514b\u5236=\u4e86\u524b\u5236 +\u4e8b\u540e=\u4e8b\u5f8c +\u4e8b\u60c5\u5e72\u8106=\u4e8b\u60c5\u5e72\u8106 +\u4e8b\u6709\u6597\u5de7=\u4e8b\u6709\u9b25\u5de7 +\u4e8b\u8ff9=\u4e8b\u8ff9 +\u4e8b\u90fd\u5e72\u8106=\u4e8b\u90fd\u5e72\u8106 +\u4e8c\u4e0d\u68f1\u767b=\u4e8c\u4e0d\u7a1c\u767b +\u4e8c\u5212=\u4e8c\u5283 +\u4e8c\u53ea\u5f97=\u4e8c\u53ea\u5f97 +\u4e8c\u5929\u540e=\u4e8c\u5929\u5f8c +\u4e8c\u4ed1=\u4e8c\u5d19 +\u4e8c\u7f36\u949f\u60d1=\u4e8c\u7f36\u9418\u60d1 +\u4e8c\u8001\u677f=\u4e8c\u8001\u677f +\u4e8c\u864e\u76f8\u6597=\u4e8c\u864e\u76f8\u9b25 +\u4e8c\u91cc\u5934=\u4e8c\u91cc\u982d +\u4e8c\u91cc\u982d=\u4e8c\u91cc\u982d +\u4e8c\u53ea=\u4e8c\u96bb +\u4e8c\u4f59=\u4e8c\u9918 +\u4e8e\u4e8e=\u4e8e\u4e8e +\u4e8e\u53f3\u4efb=\u4e8e\u53f3\u4efb +\u4e8e\u601d=\u4e8e\u601d +\u4e8e\u5f52=\u4e8e\u6b78 +\u4e8e\u7530=\u4e8e\u7530 +\u4e8e\u7f8e\u4eba=\u4e8e\u7f8e\u4eba +\u4e8e\u9617=\u4e8e\u95d0 +\u4e8e\u98de=\u4e8e\u98db +\u4e8e\u4f59\u66f2\u6298=\u4e8e\u9918\u66f2\u6298 +\u4e91\u4e4e=\u4e91\u4e4e +\u4e91\u4e91=\u4e91\u4e91 +\u4e91\u4f55=\u4e91\u4f55 +\u4e91\u4e3a=\u4e91\u70ba +\u4e91\u7136=\u4e91\u7136 +\u4e91\u5c14=\u4e91\u723e +\u4e94\u5212=\u4e94\u5283 +\u4e94\u5929\u540e=\u4e94\u5929\u5f8c +\u4e94\u5cb3=\u4e94\u5dbd +\u4e94\u8c37=\u4e94\u7a40 +\u4e94\u624e=\u4e94\u7d2e +\u4e94\u884c\u751f\u514b=\u4e94\u884c\u751f\u524b +\u4e94\u8c37\u738b\u5317\u8857=\u4e94\u8c37\u738b\u5317\u8857 +\u4e94\u8c37\u738b\u5357\u8857=\u4e94\u8c37\u738b\u5357\u8857 +\u4e94\u53ea=\u4e94\u96bb +\u4e94\u4f59=\u4e94\u9918 +\u4e94\u51fa=\u4e94\u9f63 +\u4e95\u5e72\u6467\u8d25=\u4e95\u69a6\u6467\u6557 +\u4e95\u91cc=\u4e95\u88e1 +\u4e9a\u4e8e=\u4e9e\u65bc +\u4ea4\u6258=\u4ea4\u8a17 +\u4ea4\u6e38=\u4ea4\u904a +\u4ea4\u54c4=\u4ea4\u9b28 +\u4ea6\u4e91=\u4ea6\u4e91 +\u4ea6\u5e84\u4ea6\u8c10=\u4ea6\u838a\u4ea6\u8ae7 +\u4eae\u4e11=\u4eae\u919c +\u4eae\u949f=\u4eae\u9418 +\u4eba\u4e91=\u4eba\u4e91 +\u4eba\u53c2\u52a0=\u4eba\u53c3\u52a0 +\u4eba\u53c2\u5c55=\u4eba\u53c3\u5c55 +\u4eba\u53c2\u6218=\u4eba\u53c3\u6230 +\u4eba\u53c2\u62dc=\u4eba\u53c3\u62dc +\u4eba\u53c2\u653f=\u4eba\u53c3\u653f +\u4eba\u53c2\u7167=\u4eba\u53c3\u7167 +\u4eba\u53c2\u770b=\u4eba\u53c3\u770b +\u4eba\u53c2\u7985=\u4eba\u53c3\u79aa +\u4eba\u53c2\u8003=\u4eba\u53c3\u8003 +\u4eba\u53c2\u4e0e=\u4eba\u53c3\u8207 +\u4eba\u53c2\u89c1=\u4eba\u53c3\u898b +\u4eba\u53c2\u89c2=\u4eba\u53c3\u89c0 +\u4eba\u53c2\u8c0b=\u4eba\u53c3\u8b00 +\u4eba\u53c2\u8bae=\u4eba\u53c3\u8b70 +\u4eba\u53c2\u8d5e=\u4eba\u53c3\u8d0a +\u4eba\u53c2\u900f=\u4eba\u53c3\u900f +\u4eba\u53c2\u9009=\u4eba\u53c3\u9078 +\u4eba\u53c2\u914c=\u4eba\u53c3\u914c +\u4eba\u53c2\u9605=\u4eba\u53c3\u95b1 +\u4eba\u53e3\u5206\u5e03=\u4eba\u53e3\u5206\u5e03 +\u4eba\u540e=\u4eba\u5f8c +\u4eba\u6b32=\u4eba\u617e +\u4eba\u7269\u5fd7=\u4eba\u7269\u8a8c +\u4eba\u53c2=\u4eba\u8518 +\u4ec0\u9526\u9762=\u4ec0\u9326\u9eb5 +\u4ec0\u4e48=\u4ec0\u9ebc +\u4ec7\u4ec7=\u4ec7\u8b8e +\u4eca\u540e=\u4eca\u5f8c +\u4ed6\u514b\u5236=\u4ed6\u524b\u5236 +\u4ed6\u949f=\u4ed6\u9418 +\u4ed8\u6258=\u4ed8\u8a17 +\u4ed9\u540e\u5ea7=\u4ed9\u540e\u5ea7 +\u4ed9\u836f=\u4ed9\u85e5 +\u4ee4\u4eba\u53d1\u6307=\u4ee4\u4eba\u9aee\u6307 +\u4ee5\u540e=\u4ee5\u5f8c +\u4ee5\u81ea\u5236=\u4ee5\u81ea\u5236 +\u4ef0\u836f=\u4ef0\u85e5 +\u4ef6\u949f=\u4ef6\u9418 +\u4efb\u4f55\u8868=\u4efb\u4f55\u9336 +\u4efb\u4f55\u949f=\u4efb\u4f55\u9418 +\u4efb\u4f55\u949f\u8868=\u4efb\u4f55\u9418\u9336 +\u4efb\u6559\u4e8e=\u4efb\u6559\u65bc +\u4efb\u4e8e=\u4efb\u65bc +\u4eff\u5236=\u4eff\u88fd +\u4f01\u5212=\u4f01\u5283 +\u4f0a\u4e8e\u6e56\u5e95=\u4f0a\u4e8e\u6e56\u5e95 +\u4f0a\u5e9c\u9762=\u4f0a\u5e9c\u9eb5 +\u4f0a\u65af\u5170\u6559\u5386=\u4f0a\u65af\u862d\u6559\u66c6 +\u4f0a\u65af\u5170\u6559\u5386\u53f2=\u4f0a\u65af\u862d\u6559\u6b77\u53f2 +\u4f0a\u65af\u5170\u5386=\u4f0a\u65af\u862d\u66c6 +\u4f0a\u65af\u5170\u5386\u53f2=\u4f0a\u65af\u862d\u6b77\u53f2 +\u4f0a\u90c1=\u4f0a\u9b31 +\u4f0f\u51e0=\u4f0f\u51e0 +\u4f10\u7f6a\u540a\u6c11=\u4f10\u7f6a\u5f14\u6c11 +\u4f11\u5f81=\u4f11\u5fb5 +\u4f19\u5934=\u4f19\u982d +\u4f34\u6e38=\u4f34\u904a +\u4f3c\u4e8e=\u4f3c\u65bc +\u4f46\u4e91=\u4f46\u4e91 +\u5e03\u4e8e=\u4f48\u65bc +\u5e03\u9053=\u4f48\u9053 +\u5e03\u96f7\u3001=\u4f48\u96f7\u3001 +\u5e03\u96f7\u3002=\u4f48\u96f7\u3002 +\u5e03\u96f7\u5c01\u9501=\u4f48\u96f7\u5c01\u9396 +\u5e03\u96f7\u7684=\u4f48\u96f7\u7684 +\u5e03\u96f7\u8247=\u4f48\u96f7\u8247 +\u5e03\u96f7\u8230=\u4f48\u96f7\u8266 +\u5e03\u96f7\u901f\u5ea6=\u4f48\u96f7\u901f\u5ea6 +\u5e03\u96f7\uff0c=\u4f48\u96f7\uff0c +\u5e03\u96f7\uff1b=\u4f48\u96f7\uff1b +\u4f4d\u4e8e=\u4f4d\u65bc +\u4f4d\u51c6=\u4f4d\u6e96 +\u4f4e\u6d3c=\u4f4e\u6d3c +\u4f4f\u624e=\u4f4f\u7d2e +\u53600=\u4f540 +\u53601=\u4f541 +\u53602=\u4f542 +\u53603=\u4f543 +\u53604=\u4f544 +\u53605=\u4f545 +\u53606=\u4f546 +\u53607=\u4f547 +\u53608=\u4f548 +\u53609=\u4f549 +\u5360A=\u4f54A +\u5360B=\u4f54B +\u5360C=\u4f54C +\u5360D=\u4f54D +\u5360E=\u4f54E +\u5360F=\u4f54F +\u5360G=\u4f54G +\u5360H=\u4f54H +\u5360I=\u4f54I +\u5360J=\u4f54J +\u5360K=\u4f54K +\u5360L=\u4f54L +\u5360M=\u4f54M +\u5360N=\u4f54N +\u5360O=\u4f54O +\u5360P=\u4f54P +\u5360Q=\u4f54Q +\u5360R=\u4f54R +\u5360S=\u4f54S +\u5360T=\u4f54T +\u5360U=\u4f54U +\u5360V=\u4f54V +\u5360W=\u4f54W +\u5360X=\u4f54X +\u5360Y=\u4f54Y +\u5360Z=\u4f54Z +\u5360a=\u4f54a +\u5360b=\u4f54b +\u5360c=\u4f54c +\u5360d=\u4f54d +\u5360e=\u4f54e +\u5360f=\u4f54f +\u5360g=\u4f54g +\u5360h=\u4f54h +\u5360i=\u4f54i +\u5360j=\u4f54j +\u5360k=\u4f54k +\u5360l=\u4f54l +\u5360m=\u4f54m +\u5360n=\u4f54n +\u5360o=\u4f54o +\u5360p=\u4f54p +\u5360q=\u4f54q +\u5360r=\u4f54r +\u5360s=\u4f54s +\u5360t=\u4f54t +\u5360u=\u4f54u +\u5360v=\u4f54v +\u5360w=\u4f54w +\u5360x=\u4f54x +\u5360y=\u4f54y +\u5360z=\u4f54z +\u5360\u3007=\u4f54\u3007 +\u5360\u4e00=\u4f54\u4e00 +\u5360\u4e03=\u4f54\u4e03 +\u5360\u4e07=\u4f54\u4e07 +\u5360\u4e09=\u4f54\u4e09 +\u5360\u4e0a\u98ce=\u4f54\u4e0a\u98a8 +\u5360\u4e0b=\u4f54\u4e0b +\u5360\u4e0b\u98ce=\u4f54\u4e0b\u98a8 +\u5360\u4e0d\u5360=\u4f54\u4e0d\u4f54 +\u5360\u4e0d\u8db3=\u4f54\u4e0d\u8db3 +\u5360\u4e16\u754c=\u4f54\u4e16\u754c +\u5360\u4e2d=\u4f54\u4e2d +\u5360\u4e3b=\u4f54\u4e3b +\u5360\u4e5d=\u4f54\u4e5d +\u5360\u4e86=\u4f54\u4e86 +\u5360\u4e8c=\u4f54\u4e8c +\u5360\u4e94=\u4f54\u4e94 +\u5360\u4eba\u4fbf\u5b9c=\u4f54\u4eba\u4fbf\u5b9c +\u5360\u4f4d=\u4f54\u4f4d +\u5360\u4f4f=\u4f54\u4f4f +\u5360\u5360=\u4f54\u4f54 +\u5360\u4fbf\u5b9c=\u4f54\u4fbf\u5b9c +\u5360\u4fc4=\u4f54\u4fc4 +\u5360\u4e2a=\u4f54\u500b +\u5360\u4e2a\u4f4d=\u4f54\u500b\u4f4d +\u5360\u505c\u8f66=\u4f54\u505c\u8eca +\u5360\u4ebf=\u4f54\u5104 +\u5360\u4f18=\u4f54\u512a +\u5360\u5148=\u4f54\u5148 +\u5360\u5149=\u4f54\u5149 +\u5360\u5168=\u4f54\u5168 +\u5360\u4e24=\u4f54\u5169 +\u5360\u516b=\u4f54\u516b +\u5360\u516d=\u4f54\u516d +\u5360\u5206=\u4f54\u5206 +\u5360\u5230=\u4f54\u5230 +\u5360\u52a0=\u4f54\u52a0 +\u5360\u52a3=\u4f54\u52a3 +\u5360\u5317=\u4f54\u5317 +\u5360\u5341=\u4f54\u5341 +\u5360\u5343=\u4f54\u5343 +\u5360\u534a=\u4f54\u534a +\u5360\u5357=\u4f54\u5357 +\u5360\u5370=\u4f54\u5370 +\u5360\u53bb=\u4f54\u53bb +\u5360\u53d6=\u4f54\u53d6 +\u5360\u53f0=\u4f54\u53f0 +\u5360\u54fa\u4e73=\u4f54\u54fa\u4e73 +\u5360\u55eb=\u4f54\u56c1 +\u5360\u56db=\u4f54\u56db +\u5360\u56fd\u5185=\u4f54\u570b\u5167 +\u5360\u5728=\u4f54\u5728 +\u5360\u5730=\u4f54\u5730 +\u5360\u573a=\u4f54\u5834 +\u5360\u538b=\u4f54\u58d3 +\u5360\u591a=\u4f54\u591a +\u5360\u5927=\u4f54\u5927 +\u5360\u597d=\u4f54\u597d +\u5360\u5c0f=\u4f54\u5c0f +\u5360\u5c11=\u4f54\u5c11 +\u5360\u5c40\u90e8=\u4f54\u5c40\u90e8 +\u5360\u5c4b=\u4f54\u5c4b +\u5360\u5c71=\u4f54\u5c71 +\u5360\u5e02\u573a=\u4f54\u5e02\u5834 +\u5360\u5e73\u5747=\u4f54\u5e73\u5747 +\u5360\u5e8a=\u4f54\u5e8a +\u5360\u5ea7=\u4f54\u5ea7 +\u5360\u540e=\u4f54\u5f8c +\u5360\u5f97=\u4f54\u5f97 +\u5360\u5fb7=\u4f54\u5fb7 +\u5360\u6389=\u4f54\u6389 +\u5360\u636e=\u4f54\u64da +\u5360\u6574\u4f53=\u4f54\u6574\u9ad4 +\u5360\u65b0=\u4f54\u65b0 +\u5360\u6709=\u4f54\u6709 +\u5360\u6709\u6b32=\u4f54\u6709\u617e +\u5360\u4e1c=\u4f54\u6771 +\u5360\u67e5=\u4f54\u67e5 +\u5360\u6b21=\u4f54\u6b21 +\u5360\u6bd4=\u4f54\u6bd4 +\u5360\u6cd5=\u4f54\u6cd5 +\u5360\u6ee1=\u4f54\u6eff +\u5360\u6fb3=\u4f54\u6fb3 +\u5360\u4e3a=\u4f54\u70ba +\u5360\u7387=\u4f54\u7387 +\u5360\u7528=\u4f54\u7528 +\u5360\u6bd5=\u4f54\u7562 +\u5360\u767e=\u4f54\u767e +\u5360\u5c3d=\u4f54\u76e1 +\u5360\u7a33=\u4f54\u7a69 +\u5360\u7f51=\u4f54\u7db2 +\u5360\u7ebf=\u4f54\u7dda +\u5360\u603b=\u4f54\u7e3d +\u5360\u7f3a=\u4f54\u7f3a +\u5360\u7f8e=\u4f54\u7f8e +\u5360\u8015=\u4f54\u8015 +\u5360\u81f3\u591a=\u4f54\u81f3\u591a +\u5360\u81f3\u5c11=\u4f54\u81f3\u5c11 +\u5360\u82f1=\u4f54\u82f1 +\u5360\u7740=\u4f54\u8457 +\u5360\u8461=\u4f54\u8461 +\u5360\u82cf=\u4f54\u8607 +\u5360\u897f=\u4f54\u897f +\u5360\u8d44\u6e90=\u4f54\u8cc7\u6e90 +\u5360\u8d77=\u4f54\u8d77 +\u5360\u8d85\u8fc7=\u4f54\u8d85\u904e +\u5360\u8fc7=\u4f54\u904e +\u5360\u9053=\u4f54\u9053 +\u5360\u96f6=\u4f54\u96f6 +\u5360\u9886=\u4f54\u9818 +\u5360\u5934=\u4f54\u982d +\u5360\u5934\u7b79=\u4f54\u982d\u7c4c +\u5360\u996d=\u4f54\u98ef +\u5360\u9999=\u4f54\u9999 +\u5360\u9a6c=\u4f54\u99ac +\u5360\u9ad8\u679d\u513f=\u4f54\u9ad8\u679d\u5152 +\u5360\uff10=\u4f54\uff10 +\u5360\uff11=\u4f54\uff11 +\u5360\uff12=\u4f54\uff12 +\u5360\uff13=\u4f54\uff13 +\u5360\uff14=\u4f54\uff14 +\u5360\uff15=\u4f54\uff15 +\u5360\uff16=\u4f54\uff16 +\u5360\uff17=\u4f54\uff17 +\u5360\uff18=\u4f54\uff18 +\u5360\uff19=\u4f54\uff19 +\u5360\uff21=\u4f54\uff21 +\u5360\uff22=\u4f54\uff22 +\u5360\uff23=\u4f54\uff23 +\u5360\uff24=\u4f54\uff24 +\u5360\uff25=\u4f54\uff25 +\u5360\uff26=\u4f54\uff26 +\u5360\uff27=\u4f54\uff27 +\u5360\uff28=\u4f54\uff28 +\u5360\uff29=\u4f54\uff29 +\u5360\uff2a=\u4f54\uff2a +\u5360\uff2b=\u4f54\uff2b +\u5360\uff2c=\u4f54\uff2c +\u5360\uff2d=\u4f54\uff2d +\u5360\uff2e=\u4f54\uff2e +\u5360\uff2f=\u4f54\uff2f +\u5360\uff30=\u4f54\uff30 +\u5360\uff31=\u4f54\uff31 +\u5360\uff32=\u4f54\uff32 +\u5360\uff33=\u4f54\uff33 +\u5360\uff34=\u4f54\uff34 +\u5360\uff35=\u4f54\uff35 +\u5360\uff36=\u4f54\uff36 +\u5360\uff37=\u4f54\uff37 +\u5360\uff38=\u4f54\uff38 +\u5360\uff39=\u4f54\uff39 +\u5360\uff3a=\u4f54\uff3a +\u5360\uff41=\u4f54\uff41 +\u5360\uff42=\u4f54\uff42 +\u5360\uff43=\u4f54\uff43 +\u5360\uff44=\u4f54\uff44 +\u5360\uff45=\u4f54\uff45 +\u5360\uff46=\u4f54\uff46 +\u5360\uff47=\u4f54\uff47 +\u5360\uff48=\u4f54\uff48 +\u5360\uff49=\u4f54\uff49 +\u5360\uff4a=\u4f54\uff4a +\u5360\uff4b=\u4f54\uff4b +\u5360\uff4c=\u4f54\uff4c +\u5360\uff4d=\u4f54\uff4d +\u5360\uff4e=\u4f54\uff4e +\u5360\uff4f=\u4f54\uff4f +\u5360\uff50=\u4f54\uff50 +\u5360\uff51=\u4f54\uff51 +\u5360\uff52=\u4f54\uff52 +\u5360\uff53=\u4f54\uff53 +\u5360\uff54=\u4f54\uff54 +\u5360\uff55=\u4f54\uff55 +\u5360\uff56=\u4f54\uff56 +\u5360\uff57=\u4f54\uff57 +\u5360\uff58=\u4f54\uff58 +\u5360\uff59=\u4f54\uff59 +\u5360\uff5a=\u4f54\uff5a +\u4f59\u5149\u4e2d=\u4f59\u5149\u4e2d +\u4f59\u5149\u751f=\u4f59\u5149\u751f +\u4f5b\u7f57\u68f1\u8428=\u4f5b\u7f85\u7a1c\u85a9 +\u4f5b\u949f=\u4f5b\u9418 +\u4f5c\u5978\u72af\u79d1=\u4f5c\u59e6\u72af\u79d1 +\u4f5c\u51c6=\u4f5c\u6e96 +\u4f5c\u5e84=\u4f5c\u838a +\u4f60\u514b\u5236=\u4f60\u524b\u5236 +\u4f60\u6597\u4e86\u80c6=\u4f60\u6597\u4e86\u81bd +\u4f60\u624d\u5b50\u53d1\u660f=\u4f60\u7e94\u5b50\u767c\u660f +\u4f63\u91d1\u6536\u76ca=\u4f63\u91d1\u6536\u76ca +\u4f63\u91d1\u8d39\u7528=\u4f63\u91d1\u8cbb\u7528 +\u4f73\u80b4=\u4f73\u80b4 +\u5e76\u4e00\u4e0d\u4e8c=\u4f75\u4e00\u4e0d\u4e8c +\u5e76\u5165=\u4f75\u5165 +\u5e76\u517c=\u4f75\u517c +\u5e76\u5230=\u4f75\u5230 +\u5e76\u5408=\u4f75\u5408 +\u5e76\u540d=\u4f75\u540d +\u5e76\u541e\u4e0b=\u4f75\u541e\u4e0b +\u5e76\u62e2=\u4f75\u650f +\u5e76\u6848=\u4f75\u6848 +\u5e76\u6d41=\u4f75\u6d41 +\u5e76\u706b=\u4f75\u706b +\u5e76\u4e3a=\u4f75\u70ba +\u5e76\u4ea7=\u4f75\u7522 +\u5e76\u5f53=\u4f75\u7576 +\u5e76\u53e0=\u4f75\u758a +\u5e76\u53d1=\u4f75\u767c +\u5e76\u79d1=\u4f75\u79d1 +\u5e76\u7f51=\u4f75\u7db2 +\u5e76\u7ebf=\u4f75\u7dda +\u5e76\u80a9\u5b50=\u4f75\u80a9\u5b50 +\u5e76\u8d2d=\u4f75\u8cfc +\u5e76\u9664=\u4f75\u9664 +\u5e76\u9aa8=\u4f75\u9aa8 +\u6765\u4e8e=\u4f86\u65bc +\u6765\u590d=\u4f86\u8907 +\u4f8d\u4ec6=\u4f8d\u50d5 +\u4f9b\u5236=\u4f9b\u88fd +\u4f9d\u4f9d\u4e0d\u820d=\u4f9d\u4f9d\u4e0d\u6368 +\u4f9d\u6258=\u4f9d\u8a17 +\u4fb5\u5360=\u4fb5\u4f54 +\u4fb5\u5e76=\u4fb5\u4f75 +\u4fb5\u5360\u5230=\u4fb5\u5360\u5230 +\u4fb5\u5360\u7f6a=\u4fb5\u5360\u7f6a +\u4fbf\u836f=\u4fbf\u85e5 +\u7cfb\u6570=\u4fc2\u6578 +\u7cfb\u4e3a=\u4fc2\u70ba +\u4fc4\u5360=\u4fc4\u4f54 +\u4fdd\u9669\u67dc=\u4fdd\u96aa\u67dc +\u4fe1\u6258\u8d38\u6613=\u4fe1\u6258\u8cbf\u6613 +\u4fe1\u6258=\u4fe1\u8a17 +\u4fee\u6539\u540e=\u4fee\u6539\u5f8c +\u4fee\u70bc=\u4fee\u934a +\u4fee\u80e1\u5200=\u4fee\u9b0d\u5200 +\u4fef\u51b2=\u4fef\u885d +\u4e2a\u91cc=\u500b\u88e1 +\u4e2a\u949f=\u500b\u9418 +\u4e2a\u949f\u8868=\u500b\u9418\u9336 +\u4eec\u514b\u5236=\u5011\u524b\u5236 +\u4eec\u6597\u4e86\u80c6=\u5011\u6597\u4e86\u81bd +\u5012\u7ef7\u5b69\u513f=\u5012\u7e43\u5b69\u5152 +\u5e78\u514d=\u5016\u514d +\u5e78\u5b58=\u5016\u5b58 +\u5e78\u5e78=\u5016\u5e78 +\u501b\u4e11=\u501b\u919c +\u501f\u542c\u4e8e\u804b=\u501f\u807d\u65bc\u807e +\u5026\u6e38=\u5026\u904a +\u5047\u836f=\u5047\u85e5 +\u5047\u6258=\u5047\u8a17 +\u5047\u53d1=\u5047\u9aee +\u504e\u5e72=\u504e\u4e7e +\u504f\u540e=\u504f\u5f8c +\u505a\u5e84=\u505a\u838a +\u505c\u505c\u5f53\u5f53=\u505c\u505c\u7576\u7576 +\u505c\u5f81=\u505c\u5fb5 +\u505c\u5236=\u505c\u88fd +\u5077\u9e21\u4e0d\u7740=\u5077\u96de\u4e0d\u8457 +\u4f2a\u836f=\u507d\u85e5 +\u5907\u6ce8=\u5099\u8a3b +\u5bb6\u4f19=\u50a2\u4f19 +\u5bb6\u4ff1=\u50a2\u4ff1 +\u5bb6\u5177=\u50a2\u5177 +\u50ac\u5e76=\u50ac\u4f75 +\u4f63\u4e2d\u4f7c\u4f7c=\u50ad\u4e2d\u4f7c\u4f7c +\u4f63\u4eba=\u50ad\u4eba +\u4f63\u4ec6=\u50ad\u50d5 +\u4f63\u5175=\u50ad\u5175 +\u4f63\u5de5=\u50ad\u5de5 +\u4f63\u61d2=\u50ad\u61f6 +\u4f63\u4e66=\u50ad\u66f8 +\u4f63\u91d1=\u50ad\u91d1 +\u50b2\u971c\u6597\u96ea=\u50b2\u971c\u9b25\u96ea +\u4f20\u4f4d\u4e8e\u56db\u592a\u5b50=\u50b3\u4f4d\u4e8e\u56db\u592a\u5b50 +\u4f20\u4e8e=\u50b3\u65bc +\u4f24\u75d5\u7d2f\u7d2f=\u50b7\u75d5\u7e8d\u7e8d +\u50bb\u91cc\u50bb\u6c14=\u50bb\u88e1\u50bb\u6c23 +\u503e\u590d=\u50be\u8907 +\u4ec6\u4eba=\u50d5\u4eba +\u4ec6\u4f7f=\u50d5\u4f7f +\u4ec6\u4ec6=\u50d5\u50d5 +\u4ec6\u50ee=\u50d5\u50ee +\u4ec6\u540f=\u50d5\u540f +\u4ec6\u56fa\u6000\u6069=\u50d5\u56fa\u61f7\u6069 +\u4ec6\u592b=\u50d5\u592b +\u4ec6\u59d1=\u50d5\u59d1 +\u4ec6\u5987=\u50d5\u5a66 +\u4ec6\u5c04=\u50d5\u5c04 +\u4ec6\u5c11=\u50d5\u5c11 +\u4ec6\u5f79=\u50d5\u5f79 +\u4ec6\u4ece=\u50d5\u5f9e +\u4ec6\u618e=\u50d5\u618e +\u4ec6\u6b27=\u50d5\u6b50 +\u4ec6\u7a0b=\u50d5\u7a0b +\u4ec6\u867d\u7f62\u9a7d=\u50d5\u96d6\u7f77\u99d1 +\u4fa5\u5e78=\u50e5\u5016 +\u50ee\u4ec6=\u50ee\u50d5 +\u96c7\u4e3b=\u50f1\u4e3b +\u96c7\u4eba=\u50f1\u4eba +\u96c7\u5230=\u50f1\u5230 +\u96c7\u5458=\u50f1\u54e1 +\u96c7\u5de5=\u50f1\u5de5 +\u96c7\u7528=\u50f1\u7528 +\u96c7\u519c=\u50f1\u8fb2 +\u4eea\u8303=\u5100\u7bc4 +\u4eea\u8868=\u5100\u9336 +\u4ebf\u591a\u53ea=\u5104\u591a\u96bb +\u4ebf\u5929\u540e=\u5104\u5929\u5f8c +\u4ebf\u53ea=\u5104\u96bb +\u4ebf\u4f59=\u5104\u9918 +\u4fed\u4ec6=\u5109\u50d5 +\u4fed\u6734=\u5109\u6a38 +\u4fed\u786e\u4e4b\u6559=\u5109\u786e\u4e4b\u6559 +\u5112\u7565\u6539\u9769\u5386=\u5112\u7565\u6539\u9769\u66c6 +\u5112\u7565\u6539\u9769\u5386\u53f2=\u5112\u7565\u6539\u9769\u6b77\u53f2 +\u5112\u7565\u5386=\u5112\u7565\u66c6 +\u5112\u7565\u5386\u53f2=\u5112\u7565\u6b77\u53f2 +\u5c3d\u5c3d=\u5118\u5118 +\u5c3d\u5148=\u5118\u5148 +\u5c3d\u5176\u6240\u6709=\u5118\u5176\u6240\u6709 +\u5c3d\u529b=\u5118\u529b +\u5c3d\u53ef\u80fd=\u5118\u53ef\u80fd +\u5c3d\u5feb=\u5118\u5feb +\u5c3d\u65e9=\u5118\u65e9 +\u5c3d\u662f=\u5118\u662f +\u5c3d\u7ba1=\u5118\u7ba1 +\u5c3d\u901f=\u5118\u901f +\u4f18\u6e38=\u512a\u904a +\u5140\u672f=\u5140\u672e +\u5143\u51f6=\u5143\u5147 +\u5145\u9965=\u5145\u9951 +\u5146\u4f59=\u5146\u9918 +\u51f6\u5200=\u5147\u5200 +\u51f6\u5668=\u5147\u5668 +\u51f6\u5acc=\u5147\u5acc +\u51f6\u5df4\u5df4=\u5147\u5df4\u5df4 +\u51f6\u5f92=\u5147\u5f92 +\u51f6\u608d=\u5147\u608d +\u51f6\u6076=\u5147\u60e1 +\u51f6\u624b=\u5147\u624b +\u51f6\u6848=\u5147\u6848 +\u51f6\u67aa=\u5147\u69cd +\u51f6\u6a2a=\u5147\u6a6b +\u51f6\u6b98=\u5147\u6b98 +\u51f6\u6b8b=\u5147\u6b98 +\u51f6\u6bba=\u5147\u6bba +\u51f6\u6740=\u5147\u6bba +\u51f6\u72af=\u5147\u72af +\u51f6\u72e0=\u5147\u72e0 +\u51f6\u731b=\u5147\u731b +\u51f6\u7591=\u5147\u7591 +\u51f6\u76f8=\u5147\u76f8 +\u51f6\u9669=\u5147\u96aa +\u5148\u5360=\u5148\u4f54 +\u5148\u540e=\u5148\u5f8c +\u5148\u5fe7\u540e\u4e50=\u5148\u6182\u5f8c\u6a02 +\u5148\u91c7=\u5148\u63a1 +\u5148\u653b\u540e\u5b88=\u5148\u653b\u5f8c\u5b88 +\u5148\u76db\u540e\u8870=\u5148\u76db\u5f8c\u8870 +\u5148\u793c\u540e\u5175=\u5148\u79ae\u5f8c\u5175 +\u5148\u4e49\u540e\u5229=\u5148\u7fa9\u5f8c\u5229 +\u5148\u58f0\u540e\u5b9e=\u5148\u8072\u5f8c\u5be6 +\u5148\u82e6\u540e\u7518=\u5148\u82e6\u5f8c\u7518 +\u5148\u8d62\u540e\u8f93=\u5148\u8d0f\u5f8c\u8f38 +\u5148\u8fdb\u540e\u51fa=\u5148\u9032\u5f8c\u51fa +\u5148\u5f00\u82b1\u540e\u7ed3\u679c=\u5148\u958b\u82b1\u5f8c\u7d50\u679c +\u5149\u524d\u88d5\u540e=\u5149\u524d\u88d5\u5f8c +\u5149\u81f4\u81f4=\u5149\u7dfb\u7dfb +\u514b\u836f=\u514b\u85e5 +\u514b\u590d=\u514b\u8907 +\u515a\u53c2=\u515a\u53c3 +\u515a\u592a\u5c09=\u515a\u592a\u5c09 +\u515a\u6000\u82f1=\u515a\u61f7\u82f1 +\u515a\u8fdb=\u515a\u9032 +\u515a\u9879=\u515a\u9805 +\u5165\u591c\u540e=\u5165\u591c\u5f8c +\u5165\u4f19=\u5165\u5925 +\u5185\u5fc3\u91cc=\u5167\u5fc3\u88e1 +\u5185\u5236=\u5167\u88fd +\u5185\u9762\u5305=\u5167\u9762\u5305 +\u5185\u9762\u5305\u7684=\u5167\u9762\u5305\u7684 +\u5185\u6597=\u5167\u9b25 +\u5185\u54c4=\u5167\u9b28 +\u5168\u5e72=\u5168\u4e7e +\u5168\u9762\u5305\u56f4=\u5168\u9762\u5305\u570d +\u5168\u9762\u5305\u88f9=\u5168\u9762\u5305\u88f9 +\u4e24\u5929\u540e=\u5169\u5929\u5f8c +\u4e24\u5929\u6652\u7f51=\u5169\u5929\u6652\u7db2 +\u4e24\u624e=\u5169\u7d2e +\u4e24\u864e\u5171\u6597=\u5169\u864e\u5171\u9b25 +\u4e24\u53ea=\u5169\u96bb +\u4e24\u4f59=\u5169\u9918 +\u4e24\u9f20\u6597\u7a74=\u5169\u9f20\u9b25\u7a74 +\u516b\u5927\u80e1\u540c=\u516b\u5927\u80e1\u540c +\u516b\u5929\u540e=\u516b\u5929\u5f8c +\u516b\u5b57\u80e1=\u516b\u5b57\u9b0d +\u516b\u624e=\u516b\u7d2e +\u516b\u8721=\u516b\u8721 +\u516b\u53ea=\u516b\u96bb +\u516b\u4f59=\u516b\u9918 +\u516c\u4ed4\u9762=\u516c\u4ed4\u9eb5 +\u516c\u4ec6=\u516c\u50d5 +\u516c\u5143\u540e=\u516c\u5143\u5f8c +\u516c\u5b59\u4e11=\u516c\u5b6b\u4e11 +\u516c\u5e72=\u516c\u5e79 +\u516c\u5386=\u516c\u66c6 +\u516c\u5386\u53f2=\u516c\u6b77\u53f2 +\u516c\u5398=\u516c\u91d0 +\u516c\u4f59=\u516c\u9918 +\u516d\u5212=\u516d\u5283 +\u516d\u5929\u540e=\u516d\u5929\u5f8c +\u516d\u8c37=\u516d\u7a40 +\u516d\u624e=\u516d\u7d2e +\u516d\u51b2=\u516d\u885d +\u516d\u53ea=\u516d\u96bb +\u516d\u4f59=\u516d\u9918 +\u516d\u51fa=\u516d\u9f63 +\u5176\u4e00\u53ea=\u5176\u4e00\u53ea +\u5176\u4e8c\u53ea=\u5176\u4e8c\u53ea +\u5176\u516b\u4e5d\u53ea=\u5176\u516b\u4e5d\u53ea +\u5176\u540e=\u5176\u5f8c +\u5176\u6b21\u8f9f\u5730=\u5176\u6b21\u8f9f\u5730 +\u5176\u4f59=\u5176\u9918 +\u5178\u8303=\u5178\u7bc4 +\u517c\u5e76=\u517c\u5e76 +\u5189\u6709\u4ec6=\u5189\u6709\u50d5 +\u5197\u4f59=\u5197\u9918 +\u51a4\u4ec7=\u51a4\u8b8e +\u51a5\u8499=\u51a5\u6fdb +\u51ac\u5c71\u5e84=\u51ac\u5c71\u5e84 +\u51ac\u6e38=\u51ac\u904a +\u51b6\u6e38=\u51b6\u904a +\u51b6\u70bc=\u51b6\u934a +\u51b7\u5e84\u5b50=\u51b7\u838a\u5b50 +\u51b7\u9762\u76f8=\u51b7\u9762\u76f8 +\u51b7\u9762=\u51b7\u9eb5 +\u51c6\u4e0d\u51c6\u4ed6=\u51c6\u4e0d\u51c6\u4ed6 +\u51c6\u4e0d\u51c6\u4f60=\u51c6\u4e0d\u51c6\u4f60 +\u51c6\u4e0d\u51c6\u5979=\u51c6\u4e0d\u51c6\u5979 +\u51c6\u4e0d\u51c6\u5b83=\u51c6\u4e0d\u51c6\u5b83 +\u51c6\u4e0d\u51c6\u6211=\u51c6\u4e0d\u51c6\u6211 +\u51c6\u4e0d\u51c6\u8bb8=\u51c6\u4e0d\u51c6\u8a31 +\u51c6\u4e0d\u51c6\u8c01=\u51c6\u4e0d\u51c6\u8ab0 +\u51c6\u4fdd\u62a4=\u51c6\u4fdd\u8b77 +\u51c6\u4fdd\u91ca=\u51c6\u4fdd\u91cb +\u51cc\u8499\u521d=\u51cc\u6fdb\u521d +\u51dd\u70bc=\u51dd\u934a +\u51e0\u4e0a=\u51e0\u4e0a +\u51e0\u51e0=\u51e0\u51e0 +\u51e0\u51f3=\u51e0\u51f3 +\u51e0\u5b50=\u51e0\u5b50 +\u51e0\u65c1=\u51e0\u65c1 +\u51e0\u6756=\u51e0\u6756 +\u51e0\u6848=\u51e0\u6848 +\u51e0\u6905=\u51e0\u6905 +\u51e0\u69bb=\u51e0\u69bb +\u51e0\u51c0\u7a97\u660e=\u51e0\u6de8\u7a97\u660e +\u51e0\u7b75=\u51e0\u7b75 +\u51e0\u4e1d=\u51e0\u7d72 +\u51e0\u9762\u4e0a=\u51e0\u9762\u4e0a +\u51f6\u6740\u6848=\u51f6\u6bba\u6848 +\u51f6\u76f8\u6bd5\u9732=\u51f6\u76f8\u7562\u9732 +\u51f9\u6d1e\u91cc=\u51f9\u6d1e\u88e1 +\u51fa\u4e56\u5f04\u4e11=\u51fa\u4e56\u5f04\u919c +\u51fa\u4e56\u9732\u4e11=\u51fa\u4e56\u9732\u919c +\u51fa\u5f81\u6536=\u51fa\u5f81\u6536 +\u51fa\u4e8e=\u51fa\u65bc +\u51fa\u8c0b\u5212\u7b56=\u51fa\u8b00\u5283\u7b56 +\u51fa\u6e38=\u51fa\u904a +\u51fa\u4e11=\u51fa\u919c +\u51fa\u9524=\u51fa\u939a +\u5206\u5e03=\u5206\u4f48 +\u5206\u5e03\u4e8e=\u5206\u4f48\u65bc +\u5206\u5360=\u5206\u4f54 +\u5206\u534a\u949f=\u5206\u534a\u9418 +\u5206\u591a\u949f=\u5206\u591a\u9418 +\u5206\u5b50\u949f=\u5206\u5b50\u9418 +\u5206\u5e03\u533a=\u5206\u5e03\u5340 +\u5206\u5e03\u5716=\u5206\u5e03\u5716 +\u5206\u5e03\u56fe=\u5206\u5e03\u5716 +\u5206\u6563\u4e8e=\u5206\u6563\u65bc +\u5206\u949f=\u5206\u9418 +\u5211\u4f59=\u5211\u9918 +\u5212\u4e00\u6868=\u5212\u4e00\u69f3 +\u5212\u4e86\u4e00\u4f1a=\u5212\u4e86\u4e00\u6703 +\u5212\u6765\u5212\u53bb=\u5212\u4f86\u5212\u53bb +\u5212\u5230\u5cb8=\u5212\u5230\u5cb8 +\u5212\u5230\u6c5f\u5fc3=\u5212\u5230\u6c5f\u5fc3 +\u5212\u5f97\u6765=\u5212\u5f97\u4f86 +\u5212\u7740=\u5212\u8457 +\u5212\u7740\u8d70=\u5212\u8457\u8d70 +\u5212\u9f99\u821f=\u5212\u9f8d\u821f +\u5224\u65ad\u53d1=\u5224\u65b7\u767c +\u522b\u540e=\u5225\u5f8c +\u522b\u65e5\u5357\u9e3f\u624d\u5317\u53bb=\u5225\u65e5\u5357\u9d3b\u7e94\u5317\u53bb +\u522b\u81f4=\u5225\u7dfb +\u522b\u5e84=\u5225\u838a +\u522b\u7740=\u5225\u8457 +\u522b\u8f9f=\u5225\u95e2 +\u5229\u6b32=\u5229\u617e +\u5229\u4e8e=\u5229\u65bc +\u5229\u6b32\u718f\u5fc3=\u5229\u6b32\u718f\u5fc3 +\u5220\u540e\u7559\u4f4d=\u522a\u5f8c\u7559\u4f4d +\u5220\u540e\u7f29\u4f4d=\u522a\u5f8c\u7e2e\u4f4d +\u522e\u6765\u522e\u53bb=\u522e\u4f86\u522e\u53bb +\u522e\u7740=\u522e\u8457 +\u522e\u8d77\u6765=\u522e\u8d77\u4f86 +\u522e\u98ce\u4e0b\u96ea\u5012\u4fbf\u5b9c=\u522e\u98a8\u4e0b\u96ea\u5012\u4fbf\u5b9c +\u522e\u80e1=\u522e\u9b0d +\u5236\u51b7\u673a=\u5236\u51b7\u6a5f +\u5236\u7b7e=\u5236\u7c64 +\u5236\u949f=\u5236\u9418 +\u523a\u7ee3=\u523a\u7e61 +\u523b\u5212=\u523b\u5283 +\u523b\u534a\u949f=\u523b\u534a\u9418 +\u523b\u591a\u949f=\u523b\u591a\u9418 +\u523b\u949f=\u523b\u9418 +\u5243\u53d1=\u5243\u9aee +\u5243\u80e1=\u5243\u9b0d +\u5243\u987b=\u5243\u9b1a +\u524a\u53d1=\u524a\u9aee +\u524a\u9762=\u524a\u9eb5 +\u514b\u5236\u4e0d\u4e86=\u524b\u5236\u4e0d\u4e86 +\u514b\u5236\u4e0d\u4f4f=\u524b\u5236\u4e0d\u4f4f +\u514b\u6263=\u524b\u6263 +\u514b\u65e5=\u524b\u65e5 +\u514b\u661f=\u524b\u661f +\u514b\u671f=\u524b\u671f +\u514b\u6b7b=\u524b\u6b7b +\u514b\u8584=\u524b\u8584 +\u524d\u4ef0\u540e\u5408=\u524d\u4ef0\u5f8c\u5408 +\u524d\u5028\u540e\u606d=\u524d\u5028\u5f8c\u606d +\u524d\u524d\u540e\u540e=\u524d\u524d\u5f8c\u5f8c +\u524d\u547c\u540e\u62e5=\u524d\u547c\u5f8c\u64c1 +\u524d\u540e=\u524d\u5f8c +\u524d\u601d\u540e\u60f3=\u524d\u601d\u5f8c\u60f3 +\u524d\u633d\u540e\u63a8=\u524d\u633d\u5f8c\u63a8 +\u524d\u77ed\u540e\u957f=\u524d\u77ed\u5f8c\u9577 +\u524d\u8a00\u4e0d\u5bf9\u540e\u8bed=\u524d\u8a00\u4e0d\u5c0d\u5f8c\u8a9e +\u524d\u8a00\u4e0d\u7b54\u540e\u8bed=\u524d\u8a00\u4e0d\u7b54\u5f8c\u8a9e +\u524d\u9762\u5e97=\u524d\u9762\u5e97 +\u5254\u5e84\u8d27=\u5254\u838a\u8ca8 +\u521a\u5e72=\u525b\u4e7e +\u521a\u96c7=\u525b\u50f1 +\u521a\u624d\u4e00\u8f7d=\u525b\u7e94\u4e00\u8f09 +\u5265\u5236=\u525d\u88fd +\u5269\u4f59=\u5269\u9918 +\u526a\u5176\u53d1=\u526a\u5176\u9aee +\u526a\u7261\u4e39\u5582\u725b=\u526a\u7261\u4e39\u5582\u725b +\u526a\u5f69=\u526a\u7db5 +\u526a\u53d1=\u526a\u9aee +\u5272\u820d=\u5272\u6368 +\u521b\u83b7=\u5275\u7a6b +\u521b\u5236=\u5275\u88fd +\u94f2\u51fa=\u5277\u51fa +\u94f2\u5208=\u5277\u5208 +\u94f2\u5e73=\u5277\u5e73 +\u94f2\u9664=\u5277\u9664 +\u94f2\u5934=\u5277\u982d +\u5212\u4e00=\u5283\u4e00 +\u5212\u4e0a=\u5283\u4e0a +\u5212\u4e0b=\u5283\u4e0b +\u5212\u4e86=\u5283\u4e86 +\u5212\u51fa=\u5283\u51fa +\u5212\u5206=\u5283\u5206 +\u5212\u5230=\u5283\u5230 +\u5212\u5212=\u5283\u5283 +\u5212\u53bb=\u5283\u53bb +\u5212\u5728=\u5283\u5728 +\u5212\u5730=\u5283\u5730 +\u5212\u5b9a=\u5283\u5b9a +\u5212\u5f97=\u5283\u5f97 +\u5212\u6210=\u5283\u6210 +\u5212\u6389=\u5283\u6389 +\u5212\u62e8=\u5283\u64a5 +\u5212\u65f6\u4ee3=\u5283\u6642\u4ee3 +\u5212\u6b3e=\u5283\u6b3e +\u5212\u5f52=\u5283\u6b78 +\u5212\u6cd5=\u5283\u6cd5 +\u5212\u6e05=\u5283\u6e05 +\u5212\u754c=\u5283\u754c +\u5212\u7834=\u5283\u7834 +\u5212\u7ebf=\u5283\u7dda +\u5212\u8db3=\u5283\u8db3 +\u5212\u8fc7=\u5283\u904e +\u5212\u5f00=\u5283\u958b +\u5267\u836f=\u5287\u85e5 +\u5218\u514b\u5e84=\u5289\u514b\u838a +\u529b\u514b\u5236=\u529b\u524b\u5236 +\u529b\u62fc=\u529b\u62da +\u529b\u62fc\u4f17\u654c=\u529b\u62fc\u773e\u6575 +\u529b\u6c42\u514b\u5236=\u529b\u6c42\u524b\u5236 +\u529b\u4e89\u4e0a\u6e38=\u529b\u722d\u4e0a\u904a +\u529f\u81f4=\u529f\u7dfb +\u52a0\u6c22\u7cbe\u5236=\u52a0\u6c2b\u7cbe\u5236 +\u52a0\u836f=\u52a0\u85e5 +\u52a0\u6ce8=\u52a0\u8a3b +\u52a3\u4e8e=\u52a3\u65bc +\u52a9\u4e8e=\u52a9\u65bc +\u52ab\u540e\u4f59\u751f=\u52ab\u5f8c\u9918\u751f +\u52ab\u4f59=\u52ab\u9918 +\u52c3\u90c1=\u52c3\u9b31 +\u52a8\u8361=\u52d5\u8569 +\u80dc\u4e8e=\u52dd\u65bc +\u52b3\u529b\u58eb\u8868=\u52de\u529b\u58eb\u9336 +\u52e4\u4ec6=\u52e4\u50d5 +\u52e4\u6734=\u52e4\u6a38 +\u52cb\u7ae0=\u52f3\u7ae0 +\u52fa\u836f=\u52fa\u85e5 +\u52fe\u5e72=\u52fe\u5e79 +\u52fe\u5fc3\u6597\u89d2=\u52fe\u5fc3\u9b25\u89d2 +\u52fe\u9b42\u8361\u9b44=\u52fe\u9b42\u8569\u9b44 +\u5305\u51c6=\u5305\u6e96 +\u5305\u8c37=\u5305\u7a40 +\u5305\u624e=\u5305\u7d2e +\u5305\u5e84=\u5305\u838a +\u530f\u7cfb=\u530f\u7e6b +\u5317\u5cb3=\u5317\u5dbd +\u5317\u56de\u7ebf=\u5317\u8ff4\u7dda +\u5317\u56de\u94c1\u8def=\u5317\u8ff4\u9435\u8def +\u5321\u590d=\u5321\u8907 +\u532a\u5e72=\u532a\u5e79 +\u533f\u4e8e=\u533f\u65bc +\u533a\u5212=\u5340\u5283 +\u5341\u5212=\u5341\u5283 +\u5341\u591a\u53ea=\u5341\u591a\u96bb +\u5341\u5929\u540e=\u5341\u5929\u5f8c +\u5341\u624e=\u5341\u7d2e +\u5341\u53ea=\u5341\u96bb +\u5341\u4f59=\u5341\u9918 +\u5341\u51fa=\u5341\u9f63 +\u5343\u53ea\u53ef=\u5343\u53ea\u53ef +\u5343\u53ea\u591f=\u5343\u53ea\u5920 +\u5343\u53ea\u6015=\u5343\u53ea\u6015 +\u5343\u53ea\u80fd=\u5343\u53ea\u80fd +\u5343\u53ea\u8db3\u591f=\u5343\u53ea\u8db3\u5920 +\u5343\u591a\u53ea=\u5343\u591a\u96bb +\u5343\u5929\u540e=\u5343\u5929\u5f8c +\u5343\u624e=\u5343\u7d2e +\u5343\u4e1d\u4e07\u7f15=\u5343\u7d72\u842c\u7e37 +\u5343\u56de\u767e\u6298=\u5343\u8ff4\u767e\u6298 +\u5343\u56de\u767e\u8f6c=\u5343\u8ff4\u767e\u8f49 +\u5343\u94a7\u4e00\u53d1=\u5343\u921e\u4e00\u9aee +\u5343\u53ea=\u5343\u96bb +\u5343\u4f59=\u5343\u9918 +\u5347\u5b98\u53d1\u8d22=\u5347\u5b98\u767c\u8ca1 +\u5348\u540e=\u5348\u5f8c +\u534a\u5236\u54c1=\u534a\u5236\u54c1 +\u534a\u53ea\u53ef=\u534a\u53ea\u53ef +\u534a\u53ea\u591f=\u534a\u53ea\u5920 +\u534a\u4e8e=\u534a\u65bc +\u534a\u53ea=\u534a\u96bb +\u5357\u4eac\u949f=\u5357\u4eac\u9418 +\u5357\u4eac\u949f\u8868=\u5357\u4eac\u9418\u9336 +\u5357\u5bab\u9002=\u5357\u5bae\u9002 +\u5357\u5c4f\u665a\u949f=\u5357\u5c4f\u665a\u9418 +\u5357\u5cb3=\u5357\u5dbd +\u5357\u7b51=\u5357\u7b51 +\u5357\u56de\u7ebf=\u5357\u8ff4\u7dda +\u5357\u56de\u94c1\u8def=\u5357\u8ff4\u9435\u8def +\u5357\u6e38=\u5357\u904a +\u535a\u6c47=\u535a\u5f59 +\u535a\u91c7=\u535a\u63a1 +\u535e\u5e84=\u535e\u838a +\u535e\u5e84\u5b50=\u535e\u838a\u5b50 +\u5360\u4e86\u535c=\u5360\u4e86\u535c +\u5360\u4fbf\u5b9c\u7684\u662f\u5446=\u5360\u4fbf\u5b9c\u7684\u662f\u7343 +\u5360\u535c=\u5360\u535c +\u5360\u591a\u6570=\u5360\u591a\u6578 +\u5360\u6709\u4e94\u4e0d\u9a8c=\u5360\u6709\u4e94\u4e0d\u9a57 +\u5360\u6709\u6743=\u5360\u6709\u6b0a +\u5370\u7d2f\u7ef6\u82e5=\u5370\u7e8d\u7dac\u82e5 +\u5370\u5236=\u5370\u88fd +\u5371\u4e8e=\u5371\u65bc +\u5375\u4e0e\u77f3\u6597=\u5375\u8207\u77f3\u9b25 +\u5377\u987b=\u5377\u9b1a +\u5382\u90e8=\u5382\u90e8 +\u539d\u85aa\u4e8e\u706b=\u539d\u85aa\u65bc\u706b +\u539f\u5b50\u949f=\u539f\u5b50\u9418 +\u539f\u949f=\u539f\u9418 +\u5386\u7269\u4e4b\u610f=\u53a4\u7269\u4e4b\u610f +\u53a5\u540e=\u53a5\u5f8c +\u53c2\u4e0e=\u53c3\u4e0e +\u53c2\u4e0e\u8005=\u53c3\u4e0e\u8005 +\u53c2\u5408=\u53c3\u5408 +\u53c2\u8003\u4ef7\u503c=\u53c3\u8003\u50f9\u503c +\u53c2\u4e0e\u4eba\u5458=\u53c3\u8207\u4eba\u54e1 +\u53c2\u4e0e\u5236=\u53c3\u8207\u5236 +\u53c2\u4e0e\u611f=\u53c3\u8207\u611f +\u53c2\u89c2\u56e2=\u53c3\u89c0\u5718 +\u53c2\u89c2\u56e2\u4f53=\u53c3\u89c0\u5718\u9ad4 +\u53c2\u9605=\u53c3\u95b1 +\u53cd\u6734=\u53cd\u6a38 +\u53cd\u51b2=\u53cd\u885d +\u53cd\u590d\u5236=\u53cd\u8907\u88fd +\u53cd\u590d=\u53cd\u8986 +\u53cd\u8986=\u53cd\u8986 +\u53d6\u820d=\u53d6\u6368 +\u53d7\u6258=\u53d7\u8a17 +\u53e3\u5e72=\u53e3\u4e7e +\u53e3\u5e72\u5192=\u53e3\u5e72\u5192 +\u53e3\u5e72\u653f=\u53e3\u5e72\u653f +\u53e3\u5e72\u6d89=\u53e3\u5e72\u6d89 +\u53e3\u5e72\u72af=\u53e3\u5e72\u72af +\u53e3\u5e72\u9884=\u53e3\u5e72\u9810 +\u53e3\u71e5\u5507\u5e72=\u53e3\u71e5\u5507\u4e7e +\u53e3\u8179\u4e4b\u6b32=\u53e3\u8179\u4e4b\u617e +\u53e3\u91cc=\u53e3\u88e1 +\u53e3\u949f=\u53e3\u9418 +\u53e4\u4e66\u4e91=\u53e4\u66f8\u4e91 +\u53e4\u67ef\u54b8=\u53e4\u67ef\u9e79 +\u53e4\u6734=\u53e4\u6a38 +\u53e4\u8bed\u4e91=\u53e4\u8a9e\u4e91 +\u53e4\u8ff9=\u53e4\u8ff9 +\u53e4\u949f=\u53e4\u9418 +\u53e4\u949f\u8868=\u53e4\u9418\u9336 +\u53e6\u8f9f=\u53e6\u95e2 +\u53e9\u949f=\u53e9\u9418 +\u53ea\u5360=\u53ea\u4f54 +\u53ea\u5360\u535c=\u53ea\u5360\u535c +\u53ea\u5360\u5409=\u53ea\u5360\u5409 +\u53ea\u5360\u795e\u95ee\u535c=\u53ea\u5360\u795e\u554f\u535c +\u53ea\u5360\u7b97=\u53ea\u5360\u7b97 +\u53ea\u91c7=\u53ea\u63a1 +\u53ea\u51b2=\u53ea\u885d +\u53ea\u8eab\u4e0a\u5df2=\u53ea\u8eab\u4e0a\u5df2 +\u53ea\u8eab\u4e0a\u6709=\u53ea\u8eab\u4e0a\u6709 +\u53ea\u8eab\u4e0a\u6ca1=\u53ea\u8eab\u4e0a\u6c92 +\u53ea\u8eab\u4e0a\u65e0=\u53ea\u8eab\u4e0a\u7121 +\u53ea\u8eab\u4e0a\u7684=\u53ea\u8eab\u4e0a\u7684 +\u53ea\u8eab\u4e16=\u53ea\u8eab\u4e16 +\u53ea\u8eab\u4efd=\u53ea\u8eab\u4efd +\u53ea\u8eab\u524d=\u53ea\u8eab\u524d +\u53ea\u8eab\u53d7=\u53ea\u8eab\u53d7 +\u53ea\u8eab\u5b50=\u53ea\u8eab\u5b50 +\u53ea\u8eab\u5f62=\u53ea\u8eab\u5f62 +\u53ea\u8eab\u5f71=\u53ea\u8eab\u5f71 +\u53ea\u8eab\u540e=\u53ea\u8eab\u5f8c +\u53ea\u8eab\u5fc3=\u53ea\u8eab\u5fc3 +\u53ea\u8eab\u65c1=\u53ea\u8eab\u65c1 +\u53ea\u8eab\u6750=\u53ea\u8eab\u6750 +\u53ea\u8eab\u6bb5=\u53ea\u8eab\u6bb5 +\u53ea\u8eab\u4e3a=\u53ea\u8eab\u70ba +\u53ea\u8eab\u8fb9=\u53ea\u8eab\u908a +\u53ea\u8eab\u9996=\u53ea\u8eab\u9996 +\u53ea\u8eab\u4f53=\u53ea\u8eab\u9ad4 +\u53ea\u8eab\u9ad8=\u53ea\u8eab\u9ad8 +\u53ea\u91c7\u58f0=\u53ea\u91c7\u8072 +\u53ee\u53ee\u5f53\u5f53=\u53ee\u53ee\u5679\u5679 +\u53ee\u5f53=\u53ee\u5679 +\u53ef\u4ee5\u514b\u5236=\u53ef\u4ee5\u524b\u5236 +\u53ef\u7d27\u53ef\u677e=\u53ef\u7dca\u53ef\u9b06 +\u53ef\u81ea\u5236=\u53ef\u81ea\u5236 +\u53f0\u5b50\u5973=\u53f0\u5b50\u5973 +\u53f0\u5b50\u5b59=\u53f0\u5b50\u5b6b +\u53f0\u5e03\u666f=\u53f0\u5e03\u666f +\u53f0\u540e=\u53f0\u5f8c +\u53f0\u5386=\u53f0\u66c6 +\u53f0\u5386\u53f2=\u53f0\u6b77\u53f2 +\u53f0\u949f=\u53f0\u9418 +\u53f0\u9762\u524d=\u53f0\u9762\u524d +\u53f1\u54a4903=\u53f1\u54a4903 +\u53f1\u54a4MY903=\u53f1\u54a4MY903 +\u53f1\u54a4My903=\u53f1\u54a4My903 +\u53f1\u54a4\u53f1\u53f1\u54a4=\u53f1\u54a4\u53f1\u53f1\u54a4 +\u53f1\u54a4\u53f1\u54a4\u53f1\u54a4\u54a4=\u53f1\u54a4\u53f1\u54a4\u53f1\u54a4\u54a4 +\u53f1\u54a4\u54a4=\u53f1\u54a4\u54a4 +\u53f1\u54a4\u4e50\u575b=\u53f1\u54a4\u6a02\u58c7 +\u53f1\u54a4\u6a02\u58c7=\u53f1\u54a4\u6a02\u58c7 +\u53f3\u540e=\u53f3\u5f8c +\u53f6 \u606d\u5f18=\u53f6 \u606d\u5f18 +\u53f6\u3000\u606d\u5f18=\u53f6\u3000\u606d\u5f18 +\u53f6\u606d\u5f18=\u53f6\u606d\u5f18 +\u53f6\u97f3=\u53f6\u97f3 +\u53f6\u97f5=\u53f6\u97fb +\u5403\u677f\u5200\u9762=\u5403\u677f\u5200\u9eb5 +\u5403\u7740\u4e0d\u5c3d=\u5403\u8457\u4e0d\u76e1 +\u5403\u59dc=\u5403\u8591 +\u5403\u836f=\u5403\u85e5 +\u5403\u836f\u540e=\u5403\u85e5\u5f8c +\u5403\u91cc\u6252\u5916=\u5403\u88e1\u6252\u5916 +\u5403\u91cc\u722c\u5916=\u5403\u88e1\u722c\u5916 +\u5403\u8fa3\u9762=\u5403\u8fa3\u9eb5 +\u5403\u9519\u836f=\u5403\u932f\u85e5 +\u5404\u8f9f=\u5404\u95e2 +\u5404\u7c7b\u949f=\u5404\u985e\u9418 +\u5408\u4f19\u4eba=\u5408\u4f19\u4eba +\u5408\u5e76=\u5408\u4f75 +\u5408\u4f19=\u5408\u5925 +\u5408\u5e9c\u4e0a=\u5408\u5e9c\u4e0a +\u5408\u91c7=\u5408\u63a1 +\u5408\u5386=\u5408\u66c6 +\u5408\u5386\u53f2=\u5408\u6b77\u53f2 +\u5408\u51c6=\u5408\u6e96 +\u5408\u7740=\u5408\u8457 +\u5408\u8457\u8005=\u5408\u8457\u8005 +\u5409\u51f6\u5e86\u540a=\u5409\u51f6\u6176\u5f14 +\u540a\u5e26\u88e4=\u540a\u5e36\u8932 +\u540a\u6302\u7740=\u540a\u639b\u8457 +\u540a\u6746=\u540a\u6746 +\u540a\u7740=\u540a\u8457 +\u540a\u88e4=\u540a\u8932 +\u540a\u88e4\u5e26=\u540a\u8932\u5e36 +\u540a\u949f=\u540a\u9418 +\u540c\u4f19=\u540c\u5925 +\u540c\u4e8e=\u540c\u65bc +\u540e\u4e30=\u540e\u8c50 +\u540e\u8c50=\u540e\u8c50 +\u540e\u53d1\u5ea7=\u540e\u9aee\u5ea7 +\u5410\u54fa\u6349\u53d1=\u5410\u54fa\u6349\u9aee +\u5410\u54fa\u63e1\u53d1=\u5410\u54fa\u63e1\u9aee +\u5411\u5f80\u6765=\u5411\u5f80\u4f86 +\u5411\u5f80\u5e38=\u5411\u5f80\u5e38 +\u5411\u5f80\u65e5=\u5411\u5f80\u65e5 +\u5411\u5f80\u65f6=\u5411\u5f80\u6642 +\u5411\u540e=\u5411\u5f8c +\u5411\u7740=\u5411\u8457 +\u541e\u5e76=\u541e\u4f75 +\u541f\u6e38=\u541f\u904a +\u542b\u9f7f\u6234\u53d1=\u542b\u9f52\u6234\u9aee +\u5439\u5e72=\u5439\u4e7e +\u5439\u53d1=\u5439\u9aee +\u5439\u80e1=\u5439\u9b0d +\u543e\u4e3a\u4e4b\u8303\u6211\u9a70\u9a71=\u543e\u7232\u4e4b\u7bc4\u6211\u99b3\u9a45 +\u5446\u5446\u50bb\u50bb=\u5446\u5446\u50bb\u50bb +\u5446\u5446\u6323\u6323=\u5446\u5446\u6399\u6399 +\u5446\u5446\u7b28\u7b28=\u5446\u5446\u7b28\u7b28 +\u5446\u81f4\u81f4=\u5446\u7dfb\u7dfb +\u5446\u91cc\u5446\u6c14=\u5446\u88e1\u5446\u6c23 +\u5468\u5386=\u5468\u66c6 +\u5468\u6770\u4f26=\u5468\u6770\u502b +\u5468\u6770\u502b=\u5468\u6770\u502b +\u5468\u5386\u53f2=\u5468\u6b77\u53f2 +\u5468\u5e84\u738b=\u5468\u838a\u738b +\u5468\u6e38=\u5468\u904a +\u547c\u5401=\u547c\u7c72 +\u547d\u4e2d\u6ce8\u5b9a=\u547d\u4e2d\u6ce8\u5b9a +\u548c\u514b\u5236=\u548c\u524b\u5236 +\u548c\u5978=\u548c\u59e6 +\u548e\u5f81=\u548e\u5fb5 +\u5495\u5495\u949f=\u5495\u5495\u9418 +\u54ac\u59dc\u5477\u918b=\u54ac\u8591\u5477\u918b +\u54af\u5f53=\u54af\u5679 +\u54b3\u55fd\u836f=\u54b3\u55fd\u85e5 +\u54c0\u540a=\u54c0\u5f14 +\u54c0\u633d=\u54c0\u8f13 +\u54c1\u6c47=\u54c1\u5f59 +\u54c4\u5802\u5927\u7b11=\u54c4\u5802\u5927\u7b11 +\u5458\u5c71\u5e84=\u54e1\u5c71\u5e84 +\u54ea\u91cc=\u54ea\u88e1 +\u54ed\u810f=\u54ed\u9ad2 +\u5501\u540a=\u5501\u5f14 +\u5457\u8d5e=\u5504\u8b9a +\u5507\u5e72=\u5507\u4e7e +\u552e\u540e=\u552e\u5f8c +\u552f\u4e00\u53ea=\u552f\u4e00\u53ea +\u5531\u6e38=\u5531\u904a +\u553e\u9762\u81ea\u5e72=\u553e\u9762\u81ea\u4e7e +\u553e\u4f59=\u553e\u9918 +\u5546\u5386=\u5546\u66c6 +\u5546\u5386\u53f2=\u5546\u6b77\u53f2 +\u5577\u5f53=\u5577\u5679 +\u5582\u4e86\u4e00\u58f0=\u5582\u4e86\u4e00\u8072 +\u5584\u540e=\u5584\u5f8c +\u5584\u4e8e=\u5584\u65bc +\u559c\u5411\u5f80=\u559c\u5411\u5f80 +\u559c\u6b22\u8868=\u559c\u6b61\u9336 +\u559c\u6b22\u949f=\u559c\u6b61\u9418 +\u559c\u6b22\u949f\u8868=\u559c\u6b61\u9418\u9336 +\u559d\u5e72=\u559d\u4e7e +\u55a7\u54c4=\u55a7\u9b28 +\u4e27\u949f=\u55aa\u9418 +\u4e54\u5cb3=\u55ac\u5dbd +\u5355\u4e8e=\u55ae\u4e8e +\u5355\u5355\u4e8e=\u55ae\u55ae\u65bc +\u5355\u5e72=\u55ae\u5e79 +\u5355\u6253\u72ec\u6597=\u55ae\u6253\u7368\u9b25 +\u5355\u53ea=\u55ae\u96bb +\u55d1\u836f=\u55d1\u85e5 +\u55e3\u540e=\u55e3\u5f8c +\u5600\u55d2\u7684\u8868=\u5600\u55d2\u7684\u9336 +\u5609\u8c37=\u5609\u7a40 +\u5609\u80b4=\u5609\u80b4 +\u5634\u91cc=\u5634\u88cf +\u6076\u5fc3=\u5641\u5fc3 +\u5659\u9f7f\u6234\u53d1=\u5659\u9f52\u6234\u9aee +\u55b7\u6d12=\u5674\u6d12 +\u5f53\u5577=\u5679\u5577 +\u5f53\u5f53=\u5679\u5679 +\u565c\u82cf=\u5695\u56cc +\u5411\u5bfc=\u56ae\u5c0e +\u5411\u5f80=\u56ae\u5f80 +\u5411\u5e94=\u56ae\u61c9 +\u5411\u8fe9=\u56ae\u9087 +\u4e25\u4e8e=\u56b4\u65bc +\u4e25\u4e1d\u5408\u7f1d=\u56b4\u7d72\u5408\u7e2b +\u56bc\u8c37=\u56bc\u7a40 +\u56c9\u56c9\u82cf\u82cf=\u56c9\u56c9\u56cc\u56cc +\u56c9\u82cf=\u56c9\u56cc +\u5631\u6258=\u56d1\u8a17 +\u56db\u51fa\u5f81\u6536=\u56db\u51fa\u5fb5\u6536 +\u56db\u5206\u5386=\u56db\u5206\u66c6 +\u56db\u5206\u5386\u53f2=\u56db\u5206\u6b77\u53f2 +\u56db\u5929\u540e=\u56db\u5929\u5f8c +\u56db\u820d\u4e94\u5165=\u56db\u6368\u4e94\u5165 +\u56db\u624e=\u56db\u7d2e +\u56db\u53ea=\u56db\u96bb +\u56db\u9762\u5305=\u56db\u9762\u5305 +\u56db\u9762\u949f=\u56db\u9762\u9418 +\u56db\u4f59=\u56db\u9918 +\u56db\u51fa=\u56db\u9f63 +\u56de\u91c7=\u56de\u63a1 +\u56de\u65cb\u52a0\u901f=\u56de\u65cb\u52a0\u901f +\u56de\u5386=\u56de\u66c6 +\u56de\u5386\u53f2=\u56de\u6b77\u53f2 +\u56de\u4e1d=\u56de\u7d72 +\u56de\u7740=\u56de\u8457 +\u56de\u8361=\u56de\u8569 +\u56de\u6e38=\u56de\u904a +\u56de\u9633\u8361\u6c14=\u56de\u967d\u8569\u6c23 +\u56e0\u4e8e=\u56e0\u65bc +\u56f0\u5026\u8d77\u6765=\u56f0\u5026\u8d77\u4f86 +\u56f0\u517d\u4e4b\u6597=\u56f0\u7378\u4e4b\u9b25 +\u56f0\u517d\u72b9\u6597=\u56f0\u7378\u7336\u9b25 +\u56f0\u6597=\u56f0\u9b25 +\u56fa\u5f81=\u56fa\u5fb5 +\u56ff\u4e8e=\u56ff\u65bc +\u5708\u5360=\u5708\u4f54 +\u5708\u5b50\u91cc=\u5708\u5b50\u88e1 +\u5708\u6881=\u5708\u6a11 +\u5708\u91cc=\u5708\u88e1 +\u56fd\u4e4b\u6862\u5e72=\u570b\u4e4b\u6968\u69a6 +\u56fd\u5bb6\u65c5\u6e38\u5c40=\u570b\u5bb6\u65c5\u6e38\u5c40 +\u56fd\u4e8e=\u570b\u65bc +\u56fd\u5386=\u570b\u66c6 +\u56fd\u5386\u4ee3=\u570b\u6b77\u4ee3 +\u56fd\u5386\u53f2=\u570b\u6b77\u53f2 +\u56fd\u4ec7=\u570b\u8b8e +\u56ed\u91cc=\u5712\u88e1 +\u56ed\u6e38\u4f1a=\u5712\u904a\u6703 +\u56fe\u91cc=\u5716\u88e1 +\u56fe\u9274=\u5716\u9451 +\u571f\u91cc=\u571f\u88e1 +\u571f\u5236=\u571f\u88fd +\u571f\u9709\u7d20=\u571f\u9709\u7d20 +\u5728\u5236\u54c1=\u5728\u5236\u54c1 +\u5728\u514b\u5236=\u5728\u524b\u5236 +\u5728\u540e=\u5728\u5f8c +\u5728\u4e8e=\u5728\u65bc +\u5730\u5360=\u5730\u4f54 +\u5730\u514b\u5236=\u5730\u524b\u5236 +\u5730\u65b9\u5fd7=\u5730\u65b9\u5fd7 +\u5730\u5fd7=\u5730\u8a8c +\u5730\u4e11\u5fb7\u9f50=\u5730\u919c\u5fb7\u9f4a +\u574f\u4e8e=\u574f\u65bc +\u5750\u5982\u949f=\u5750\u5982\u9418 +\u5750\u5e84=\u5750\u838a +\u5750\u949f=\u5750\u9418 +\u5751\u91cc=\u5751\u88e1 +\u5764\u8303=\u5764\u7bc4 +\u5766\u8361=\u5766\u8569 +\u5766\u8361\u8361=\u5766\u8569\u8569 +\u5771\u90c1=\u5771\u9b31 +\u5782\u4e8e=\u5782\u65bc +\u5782\u8303=\u5782\u7bc4 +\u5782\u53d1=\u5782\u9aee +\u578b\u8303=\u578b\u7bc4 +\u57c3\u53ca\u5386=\u57c3\u53ca\u66c6 +\u57c3\u53ca\u5386\u53f2=\u57c3\u53ca\u6b77\u53f2 +\u57c3\u8363\u51b2=\u57c3\u69ae\u885d +\u57cb\u5934\u5bfb\u8868=\u57cb\u982d\u5c0b\u9336 +\u57cb\u5934\u5bfb\u949f=\u57cb\u982d\u5c0b\u9418 +\u57cb\u5934\u5bfb\u949f\u8868=\u57cb\u982d\u5c0b\u9418\u9336 +\u57ce\u91cc=\u57ce\u88e1 +\u57fa\u5e72=\u57fa\u5e79 +\u57fa\u4e8e=\u57fa\u65bc +\u57fa\u51c6=\u57fa\u6e96 +\u575a\u81f4=\u5805\u7dfb +\u5819\u6dc0=\u5819\u6fb1 +\u6d82\u7740=\u5857\u8457 +\u6d82\u836f=\u5857\u85e5 +\u585e\u8033\u76d7\u949f=\u585e\u8033\u76dc\u9418 +\u585e\u836f=\u585e\u85e5 +\u5893\u5fd7\u94ed=\u5893\u5fd7\u9298 +\u5893\u5fd7=\u5893\u8a8c +\u589e\u8f9f=\u589e\u95e2 +\u58a8\u6c88=\u58a8\u6c88 +\u58a8\u6c88\u672a\u5e72=\u58a8\u700b\u672a\u4e7e +\u5815\u80ce\u836f=\u58ae\u80ce\u85e5 +\u57a6\u590d=\u58be\u8907 +\u57a6\u8f9f=\u58be\u95e2 +\u5784\u65ad\u4ef7\u683c=\u58df\u65b7\u50f9\u683c +\u5784\u65ad\u8d44\u4ea7=\u58df\u65b7\u8cc7\u7522 +\u5784\u65ad\u96c6\u56e2=\u58df\u65b7\u96c6\u5718 +\u58ee\u6e38=\u58ef\u904a +\u58ee\u9762=\u58ef\u9eb5 +\u58f9\u90c1=\u58f9\u9b31 +\u58f6\u91cc=\u58fa\u88e1 +\u58f8\u8303=\u58fc\u7bc4 +\u5bff\u9762=\u58fd\u9eb5 +\u590f\u5929\u91cc=\u590f\u5929\u88e1 +\u590f\u5386=\u590f\u66c6 +\u590f\u5386\u53f2=\u590f\u6b77\u53f2 +\u590f\u6e38=\u590f\u904a +\u5916\u5f3a\u4e2d\u5e72=\u5916\u5f37\u4e2d\u4e7e +\u5916\u5236=\u5916\u88fd +\u591a\u5360=\u591a\u4f54 +\u591a\u5212=\u591a\u5283 +\u591a\u534a\u53ea=\u591a\u534a\u53ea +\u591a\u53ea\u662f=\u591a\u53ea\u662f +\u591a\u53ea\u9700=\u591a\u53ea\u9700 +\u591a\u5929\u540e=\u591a\u5929\u5f8c +\u591a\u4e8e=\u591a\u65bc +\u591a\u51b2=\u591a\u885d +\u591a\u4e11=\u591a\u919c +\u591a\u53ea=\u591a\u96bb +\u591a\u4f59=\u591a\u9918 +\u591a\u4e48=\u591a\u9ebc +\u591c\u5149\u8868=\u591c\u5149\u9336 +\u591c\u91cc=\u591c\u88e1 +\u591c\u6e38=\u591c\u904a +\u591f\u514b\u5236=\u5920\u524b\u5236 +\u68a6\u6709\u4e94\u4e0d\u5360=\u5922\u6709\u4e94\u4e0d\u5360 +\u68a6\u91cc=\u5922\u88e1 +\u68a6\u6e38=\u5922\u904a +\u4f19\u4f34=\u5925\u4f34 +\u4f19\u53cb=\u5925\u53cb +\u4f19\u540c=\u5925\u540c +\u4f19\u4f17=\u5925\u773e +\u4f19\u8ba1=\u5925\u8a08 +\u5927\u4e11=\u5927\u4e11 +\u5927\u4f19\u513f=\u5927\u4f19\u5152 +\u5927\u578b\u949f=\u5927\u578b\u9418 +\u5927\u578b\u949f\u8868\u9762=\u5927\u578b\u9418\u8868\u9762 +\u5927\u578b\u949f\u8868=\u5927\u578b\u9418\u9336 +\u5927\u578b\u949f\u9762=\u5927\u578b\u9418\u9762 +\u5927\u4f19=\u5927\u5925 +\u5927\u5e72=\u5927\u5e79 +\u5927\u6279\u6d8c\u5230=\u5927\u6279\u6e67\u5230 +\u5927\u6298\u513f=\u5927\u647a\u5152 +\u5927\u660e\u5386=\u5927\u660e\u66c6 +\u5927\u660e\u5386\u53f2=\u5927\u660e\u6b77\u53f2 +\u5927\u5386=\u5927\u66c6 +\u5927\u672c\u949f=\u5927\u672c\u9418 +\u5927\u672c\u949f\u6572=\u5927\u672c\u9418\u6572 +\u5927\u5386\u53f2=\u5927\u6b77\u53f2 +\u5927\u5446=\u5927\u7343 +\u5927\u75c5\u521d\u6108=\u5927\u75c5\u521d\u7652 +\u5927\u76ee\u5e72\u8fde=\u5927\u76ee\u4e7e\u9023 +\u5927\u7b28\u949f=\u5927\u7b28\u9418 +\u5927\u7b28\u949f\u6572=\u5927\u7b28\u9418\u6572 +\u5927\u8721=\u5927\u8721 +\u5927\u884d\u5386=\u5927\u884d\u66c6 +\u5927\u884d\u5386\u53f2=\u5927\u884d\u6b77\u53f2 +\u5927\u8a00\u975e\u5938=\u5927\u8a00\u975e\u5938 +\u5927\u8d5e=\u5927\u8b9a +\u5927\u5468\u6298=\u5927\u9031\u647a +\u5927\u91d1\u53d1\u82d4=\u5927\u91d1\u9aee\u82d4 +\u5927\u9524=\u5927\u939a +\u5927\u949f=\u5927\u9418 +\u5927\u53ea=\u5927\u96bb +\u5927\u66f2=\u5927\u9eb4 +\u5929\u5e72\u7269\u71e5=\u5929\u4e7e\u7269\u71e5 +\u5929\u514b\u5730\u51b2=\u5929\u514b\u5730\u885d +\u5929\u540e\u5bab=\u5929\u540e\u5bae +\u5929\u540e\u5e99\u9053=\u5929\u540e\u5edf\u9053 +\u5929\u5730\u5fd7\u72fc=\u5929\u5730\u5fd7\u72fc +\u5929\u5730\u4e3a\u8303=\u5929\u5730\u70ba\u7bc4 +\u5929\u5e72\u5730\u652f=\u5929\u5e72\u5730\u652f +\u5929\u540e=\u5929\u5f8c +\u5929\u6587\u5b66\u949f=\u5929\u6587\u5b78\u9418 +\u5929\u6587\u949f=\u5929\u6587\u9418 +\u5929\u7ffb\u5730\u8986=\u5929\u7ffb\u5730\u8986 +\u5929\u8986\u5730\u8f7d=\u5929\u8986\u5730\u8f09 +\u592a\u4ec6=\u592a\u50d5 +\u592a\u521d\u5386=\u592a\u521d\u66c6 +\u592a\u521d\u5386\u53f2=\u592a\u521d\u6b77\u53f2 +\u592f\u5e72=\u592f\u5e79 +\u5938\u4eba=\u5938\u4eba +\u5938\u514b=\u5938\u514b +\u5938\u5938\u5176\u8c08=\u5938\u5938\u5176\u8ac7 +\u5938\u59e3=\u5938\u59e3 +\u5938\u5bb9=\u5938\u5bb9 +\u5938\u6bd7=\u5938\u6bd7 +\u5938\u7236=\u5938\u7236 +\u5938\u7279=\u5938\u7279 +\u5938\u8131=\u5938\u812b +\u5938\u8bde=\u5938\u8a95 +\u5938\u8bde\u4e0d\u7ecf=\u5938\u8a95\u4e0d\u7d93 +\u5938\u4e3d=\u5938\u9e97 +\u5947\u8ff9=\u5947\u8ff9 +\u5947\u4e11=\u5947\u919c +\u594f\u6298=\u594f\u647a +\u5965\u5360=\u5967\u4f54 +\u593a\u6597=\u596a\u9b25 +\u594b\u6597=\u596e\u9b25 +\u5973\u4e11=\u5973\u4e11 +\u5973\u4f63\u4eba=\u5973\u4f63\u4eba +\u5973\u4f63=\u5973\u50ad +\u5973\u4ec6=\u5973\u50d5 +\u5974\u4ec6=\u5974\u50d5 +\u5978\u6deb\u63b3\u63a0=\u5978\u6deb\u64c4\u63a0 +\u5979\u514b\u5236=\u5979\u524b\u5236 +\u597d\u5e72=\u597d\u4e7e +\u597d\u5bb6\u4f19=\u597d\u50a2\u5925 +\u597d\u52c7\u6597\u72e0=\u597d\u52c7\u9b25\u72e0 +\u597d\u6597\u5927=\u597d\u6597\u5927 +\u597d\u6597\u5ba4=\u597d\u6597\u5ba4 +\u597d\u6597\u7b20=\u597d\u6597\u7b20 +\u597d\u6597\u7bf7=\u597d\u6597\u7bf7 +\u597d\u6597\u80c6=\u597d\u6597\u81bd +\u597d\u6597\u84ec=\u597d\u6597\u84ec +\u597d\u4e8e=\u597d\u65bc +\u597d\u5446=\u597d\u7343 +\u597d\u56f0=\u597d\u774f +\u597d\u7b7e=\u597d\u7c64 +\u597d\u4e11=\u597d\u919c +\u597d\u6597=\u597d\u9b25 +\u5982\u679c\u5e72=\u5982\u679c\u5e79 +\u5982\u9965\u4f3c\u6e34=\u5982\u9951\u4f3c\u6e34 +\u5999\u836f=\u5999\u85e5 +\u59cb\u4e8e=\u59cb\u65bc +\u59d4\u6258=\u59d4\u8a17 +\u59d4\u6258\u4e66=\u59d4\u8a17\u66f8 +\u5978\u592b=\u59e6\u592b +\u5978\u5987=\u59e6\u5a66 +\u5978\u5b84=\u59e6\u5b84 +\u5978\u60c5=\u59e6\u60c5 +\u5978\u6740=\u59e6\u6bba +\u5978\u6c61=\u59e6\u6c59 +\u5978\u6deb=\u59e6\u6deb +\u5978\u733e=\u59e6\u733e +\u5978\u7ec6=\u59e6\u7d30 +\u5978\u90aa=\u59e6\u90aa +\u5a01\u68f1=\u5a01\u7a1c +\u5a5a\u540e=\u5a5a\u5f8c +\u5a62\u4ec6=\u5a62\u50d5 +\u5a32\u6746=\u5aa7\u6746 +\u5ac1\u7978\u4e8e=\u5ac1\u798d\u65bc +\u5acc\u51f6=\u5acc\u5147 +\u5acc\u597d\u9053\u4e11=\u5acc\u597d\u9053\u919c +\u5b09\u6e38=\u5b09\u904a +\u5b16\u5e78=\u5b16\u5016 +\u5b34\u4f59=\u5b34\u9918 +\u5b50\u4e4b\u4e30\u516e=\u5b50\u4e4b\u4e30\u516e +\u5b50\u4e91=\u5b50\u4e91 +\u5b57\u6c47=\u5b57\u5f59 +\u5b57\u91cc\u884c\u95f4=\u5b57\u88e1\u884c\u9593 +\u5b58\u5341\u4e00\u4e8e\u5343\u767e=\u5b58\u5341\u4e00\u65bc\u5343\u767e +\u5b58\u6298=\u5b58\u647a +\u5b58\u4e8e=\u5b58\u65bc +\u5b63\u540e\u8d5b=\u5b63\u5f8c\u8cfd +\u5b64\u5be1\u4e0d\u8c37=\u5b64\u5be1\u4e0d\u7a40 +\u5b87\u5b99\u5fd7=\u5b87\u5b99\u8a8c +\u5b88\u5148\u5f85\u540e=\u5b88\u5148\u5f85\u5f8c +\u5b89\u4e8e=\u5b89\u65bc +\u5b89\u6c88\u94c1\u8def=\u5b89\u700b\u9435\u8def +\u5b89\u7720\u836f=\u5b89\u7720\u85e5 +\u5b89\u80ce\u836f=\u5b89\u80ce\u85e5 +\u5b8c\u5de5\u540e=\u5b8c\u5de5\u5f8c +\u5b8c\u6210\u540e=\u5b8c\u6210\u5f8c +\u5b97\u5468\u949f=\u5b97\u5468\u9418 +\u5b98\u4e0d\u6015\u5927\u53ea\u6015\u7ba1=\u5b98\u4e0d\u6015\u5927\u53ea\u6015\u7ba1 +\u5b98\u5730\u4e3a\u91c7=\u5b98\u5730\u70ba\u5bc0 +\u5b98\u5386=\u5b98\u66c6 +\u5b98\u5386\u53f2=\u5b98\u6b77\u53f2 +\u5b98\u5e84=\u5b98\u838a +\u5b9a\u4e8e=\u5b9a\u65bc +\u5b9a\u51c6=\u5b9a\u6e96 +\u5b9a\u5236=\u5b9a\u88fd +\u5ba3\u6cc4=\u5ba3\u6d29 +\u5ba6\u6e38=\u5ba6\u904a +\u5bab\u91cc=\u5bae\u88e1 +\u5bb0\u76f8\u809a\u91cc\u597d\u6491\u8239=\u5bb0\u76f8\u809a\u88e1\u597d\u6490\u8239 +\u5bb0\u76f8\u809a\u91cc\u80fd\u6491\u8239=\u5bb0\u76f8\u809a\u88e1\u80fd\u6490\u8239 +\u5bb3\u4e8e=\u5bb3\u65bc +\u5bb4\u6e38=\u5bb4\u904a +\u5bb6\u4ec6=\u5bb6\u50d5 +\u5bb6\u5177\u5907=\u5bb6\u5177\u5099 +\u5bb6\u5177\u6709=\u5bb6\u5177\u6709 +\u5bb6\u5177\u6728\u5de5\u79d1=\u5bb6\u5177\u6728\u5de5\u79d1 +\u5bb6\u5177\u884c=\u5bb6\u5177\u884c +\u5bb6\u5177\u4f53=\u5bb6\u5177\u9ad4 +\u5bb6\u5e84=\u5bb6\u838a +\u5bb6\u91cc=\u5bb6\u88e1 +\u5bb6\u4e11=\u5bb6\u919c +\u5bb9\u540e\u8bf4\u660e=\u5bb9\u5f8c\u8aaa\u660e +\u5bb9\u4e8e=\u5bb9\u65bc +\u5bb9\u8303=\u5bb9\u7bc4 +\u5bc4\u6258\u5728=\u5bc4\u6258\u5728 +\u5bc4\u6258=\u5bc4\u8a17 +\u5bc6\u81f4=\u5bc6\u7dfb +\u5bc7\u51c6=\u5bc7\u6e96 +\u5bc7\u4ec7=\u5bc7\u8b8e +\u5bcc\u4f59=\u5bcc\u9918 +\u5bd2\u6817=\u5bd2\u6144 +\u5bd2\u4e8e=\u5bd2\u65bc +\u5bd3\u4e8e=\u5bd3\u65bc +\u5bd3\u7981\u4e8e\u5f81=\u5bd3\u7981\u65bc\u5fb5 +\u5be1\u5360=\u5be1\u4f54 +\u5be1\u6b32=\u5be1\u617e +\u5b9e\u5e72=\u5be6\u5e79 +\u5199\u5b57\u53f0=\u5beb\u5b57\u6aaf +\u5bbd\u5bbd\u677e\u677e=\u5bec\u5bec\u9b06\u9b06 +\u5bbd\u4e8e=\u5bec\u65bc +\u5bbd\u4f59=\u5bec\u9918 +\u5bbd\u677e=\u5bec\u9b06 +\u5bee\u91c7=\u5bee\u5bc0 +\u5b9d\u5c71\u5e84=\u5bf6\u5c71\u5e84 +\u5b9d\u5386=\u5bf6\u66c6 +\u5bf6\u66c6=\u5bf6\u66c6 +\u5b9d\u5386\u53f2=\u5bf6\u6b77\u53f2 +\u5b9d\u5e84=\u5bf6\u838a +\u5b9d\u91cc\u5b9d\u6c14=\u5bf6\u88e1\u5bf6\u6c23 +\u5bf8\u53d1\u5343\u91d1=\u5bf8\u9aee\u5343\u91d1 +\u5bfa\u949f=\u5bfa\u9418 +\u5c01\u9762\u91cc=\u5c01\u9762\u88e1 +\u5c04\u96d5=\u5c04\u9d70 +\u5c06\u5360=\u5c07\u4f54 +\u5c06\u5360\u535c=\u5c07\u5360\u535c +\u4e13\u5411\u5f80=\u5c08\u5411\u5f80 +\u4e13\u6ce8=\u5c08\u8a3b +\u5bf9\u6298=\u5c0d\u647a +\u5bf9\u4e8e=\u5c0d\u65bc +\u5bf9\u51c6=\u5c0d\u6e96 +\u5bf9\u51c6\u8868=\u5c0d\u6e96\u9336 +\u5bf9\u51c6\u949f=\u5c0d\u6e96\u9418 +\u5bf9\u51c6\u949f\u8868=\u5c0d\u6e96\u9418\u9336 +\u5bf9\u534e\u53d1\u52a8=\u5c0d\u83ef\u767c\u52d5 +\u5bf9\u8868\u4e2d=\u5c0d\u8868\u4e2d +\u5bf9\u8868\u626c=\u5c0d\u8868\u63da +\u5bf9\u8868\u660e=\u5c0d\u8868\u660e +\u5bf9\u8868\u6f14=\u5c0d\u8868\u6f14 +\u5bf9\u8868\u73b0=\u5c0d\u8868\u73fe +\u5bf9\u8868\u8fbe=\u5c0d\u8868\u9054 +\u5bf9\u8868=\u5c0d\u9336 +\u5bfc\u6e38=\u5c0e\u904a +\u5c0f\u4e11=\u5c0f\u4e11 +\u5c0f\u4ef7=\u5c0f\u4ef7 +\u5c0f\u4ec6=\u5c0f\u50d5 +\u5c0f\u51e0=\u5c0f\u51e0 +\u5c0f\u578b\u949f=\u5c0f\u578b\u9418 +\u5c0f\u578b\u949f\u8868\u9762=\u5c0f\u578b\u9418\u8868\u9762 +\u5c0f\u578b\u949f\u8868=\u5c0f\u578b\u9418\u9336 +\u5c0f\u578b\u949f\u9762=\u5c0f\u578b\u9418\u9762 +\u5c0f\u4f19\u5b50=\u5c0f\u5925\u5b50 +\u5c0f\u7c73\u9762=\u5c0f\u7c73\u9eb5 +\u5c0f\u53ea=\u5c0f\u96bb +\u5c11\u5360=\u5c11\u4f54 +\u5c11\u91c7=\u5c11\u63a1 +\u5c31\u514b\u5236=\u5c31\u524b\u5236 +\u5c31\u8303=\u5c31\u7bc4 +\u5c31\u91cc=\u5c31\u88e1 +\u5c38\u4f4d\u7d20\u9910=\u5c38\u4f4d\u7d20\u9910 +\u5c38\u5229=\u5c38\u5229 +\u5c38\u5c45\u4f59\u6c14=\u5c38\u5c45\u9918\u6c23 +\u5c38\u795d=\u5c38\u795d +\u5c38\u7984=\u5c38\u797f +\u5c38\u81e3=\u5c38\u81e3 +\u5c38\u8c0f=\u5c38\u8aeb +\u5c38\u9b42\u754c=\u5c38\u9b42\u754c +\u5c38\u9e20=\u5c38\u9ce9 +\u5c3c\u514b\u677e=\u5c3c\u514b\u9b06 +\u5c40\u91cc=\u5c40\u88e1 +\u5c41\u80a1\u5927\u540a\u4e86\u5fc3=\u5c41\u80a1\u5927\u5f14\u4e86\u5fc3 +\u5c4b\u5b50\u91cc=\u5c4b\u5b50\u88e1 +\u5c4b\u6881=\u5c4b\u6a11 +\u5c4b\u91cc=\u5c4b\u88e1 +\u5c51\u4e8e=\u5c51\u65bc +\u5c61\u987e\u5c14\u4ec6=\u5c62\u9867\u723e\u50d5 +\u5c5e\u4e8e=\u5c6c\u65bc +\u5c5e\u6258=\u5c6c\u8a17 +\u5c6f\u624e=\u5c6f\u7d2e +\u5c6f\u91cc=\u5c6f\u88e1 +\u5c71\u5d29\u949f\u5e94=\u5c71\u5d29\u9418\u61c9 +\u5c71\u5cb3=\u5c71\u5dbd +\u5c71\u540e=\u5c71\u5f8c +\u5c71\u6881=\u5c71\u6a11 +\u5c71\u68f1=\u5c71\u7a1c +\u5c71\u7f8a\u80e1=\u5c71\u7f8a\u9b0d +\u5c71\u5e84=\u5c71\u838a +\u5c71\u836f=\u5c71\u85e5 +\u5c71\u91cc=\u5c71\u88e1 +\u5c71\u91cd\u6c34\u590d=\u5c71\u91cd\u6c34\u8907 +\u5cb1\u5cb3=\u5cb1\u5dbd +\u5cf0\u56de=\u5cf0\u8ff4 +\u5cfb\u5cad=\u5cfb\u5cad +\u6606\u5267=\u5d11\u5287 +\u6606\u5c71=\u5d11\u5c71 +\u6606\u4ed1=\u5d11\u5d19 +\u6606\u4ed1\u5c71\u8109=\u5d11\u5d19\u5c71\u8108 +\u6606\u66f2=\u5d11\u66f2 +\u6606\u8154=\u5d11\u8154 +\u6606\u82cf=\u5d11\u8607 +\u6606\u8c03=\u5d11\u8abf +\u5d16\u5e7f=\u5d16\u5e7f +\u4ed1\u80cc=\u5d19\u80cc +\u5d92\u68f1=\u5d92\u7a1c +\u5cb3\u5cb3=\u5dbd\u5dbd +\u5cb3\u9e93=\u5dbd\u9e93 +\u5ddd\u8c37=\u5ddd\u7a40 +\u5de1\u56de\u533b\u7597=\u5de1\u56de\u91ab\u7642 +\u5de1\u56de=\u5de1\u8ff4 +\u5de1\u6e38=\u5de1\u904a +\u5de5\u81f4=\u5de5\u7dfb +\u5de6\u540e=\u5de6\u5f8c +\u5de6\u51b2\u53f3\u7a81=\u5de6\u885d\u53f3\u7a81 +\u5de7\u5987\u505a\u4e0d\u5f97\u65e0\u9762\u998e\u9966=\u5de7\u5a66\u505a\u4e0d\u5f97\u7121\u9eb5\u993a\u98e5 +\u5de7\u5e72=\u5de7\u5e79 +\u5de7\u5386=\u5de7\u66c6 +\u5de7\u5386\u53f2=\u5de7\u6b77\u53f2 +\u5dee\u4e4b\u6beb\u5398=\u5dee\u4e4b\u6beb\u5398 +\u5dee\u4e4b\u6beb\u5398\uff0c\u8c2c\u4ee5\u5343\u91cc=\u5dee\u4e4b\u6beb\u91d0\uff0c\u8b2c\u4ee5\u5343\u91cc +\u5dee\u4e8e=\u5dee\u65bc +\u5df1\u4e11=\u5df1\u4e11 +\u5df2\u5360=\u5df2\u4f54 +\u5df2\u5360\u535c=\u5df2\u5360\u535c +\u5df2\u5360\u7b97=\u5df2\u5360\u7b97 +\u5df4\u5c14\u5e72=\u5df4\u723e\u5e79 +\u5df7\u91cc=\u5df7\u88e1 +\u5e02\u5360=\u5e02\u4f54 +\u5e02\u5360\u7387=\u5e02\u4f54\u7387 +\u5e02\u91cc=\u5e02\u88e1 +\u5e03\u8c37=\u5e03\u7a40 +\u5e03\u8c37\u9e1f\u949f=\u5e03\u7a40\u9ce5\u9418 +\u5e03\u5e84=\u5e03\u838a +\u5e03\u8c37\u9e1f=\u5e03\u8c37\u9ce5 +\u5e0c\u4f2f\u6765\u5386=\u5e0c\u4f2f\u4f86\u66c6 +\u5e0c\u4f2f\u6765\u5386\u53f2=\u5e0c\u4f2f\u4f86\u6b77\u53f2 +\u5e18\u5b50=\u5e18\u5b50 +\u5e18\u5e03=\u5e18\u5e03 +\u5e08\u8303=\u5e2b\u7bc4 +\u5e2d\u5377=\u5e2d\u6372 +\u5e26\u56e2\u53c2\u52a0=\u5e36\u5718\u53c3\u52a0 +\u5e26\u5f81=\u5e36\u5fb5 +\u5e26\u53d1\u4fee\u884c=\u5e36\u9aee\u4fee\u884c +\u5e55\u540e=\u5e55\u5f8c +\u5e2e\u4f63=\u5e6b\u50ad +\u5e72\u7cfb=\u5e72\u4fc2 +\u5e72\u7740\u6025=\u5e72\u8457\u6025 +\u5e73\u5e73\u5f53\u5f53=\u5e73\u5e73\u7576\u7576 +\u5e73\u6cc9\u5e84=\u5e73\u6cc9\u838a +\u5e73\u51c6=\u5e73\u6e96 +\u5e74\u540e=\u5e74\u5f8c +\u5e74\u5386=\u5e74\u66c6 +\u5e74\u5386\u53f2=\u5e74\u6b77\u53f2 +\u5e74\u8c37=\u5e74\u7a40 +\u5e74\u91cc=\u5e74\u88e1 +\u5e76\u529b=\u5e76\u529b +\u5e76\u541e=\u5e76\u541e +\u5e76\u5dde=\u5e76\u5dde +\u5e76\u65e5\u800c\u98df=\u5e76\u65e5\u800c\u98df +\u5e76\u884c=\u5e76\u884c +\u5e76\u8fed=\u5e76\u8fed +\u5e78\u514d\u4e8e\u96be=\u5e78\u514d\u65bc\u96e3 +\u5e78\u4e8e=\u5e78\u65bc +\u5e78\u8fd0\u80e1=\u5e78\u904b\u9b0d +\u5e72\u4e0a=\u5e79\u4e0a +\u5e72\u4e0b\u53bb=\u5e79\u4e0b\u53bb +\u5e72\u4e0d\u4e86=\u5e79\u4e0d\u4e86 +\u5e72\u4e0d\u6210=\u5e79\u4e0d\u6210 +\u5e72\u4e86=\u5e79\u4e86 +\u5e72\u4e8b=\u5e79\u4e8b +\u5e72\u4e9b=\u5e79\u4e9b +\u5e72\u4eba=\u5e79\u4eba +\u5e72\u4ec0\u4e48=\u5e79\u4ec0\u9ebc +\u5e72\u4e2a=\u5e79\u500b +\u5e72\u52b2=\u5e79\u52c1 +\u5e72\u52b2\u51b2\u5929=\u5e79\u52c1\u6c96\u5929 +\u5e72\u540f=\u5e79\u540f +\u5e72\u5458=\u5e79\u54e1 +\u5e72\u5565=\u5e79\u5565 +\u5e72\u5417=\u5e79\u55ce +\u5e72\u561b=\u5e79\u561b +\u5e72\u574f\u4e8b=\u5e79\u58de\u4e8b +\u5e72\u5b8c=\u5e79\u5b8c +\u5e72\u5bb6=\u5e79\u5bb6 +\u5e72\u5c06=\u5e79\u5c07 +\u5e72\u5f97=\u5e79\u5f97 +\u5e72\u6027\u6cb9=\u5e79\u6027\u6cb9 +\u5e72\u624d=\u5e79\u624d +\u5e72\u6389=\u5e79\u6389 +\u5e72\u63a2=\u5e79\u63a2 +\u5e72\u6821=\u5e79\u6821 +\u5e72\u6d3b=\u5e79\u6d3b +\u5e72\u6d41=\u5e79\u6d41 +\u5e72\u6d4e=\u5e79\u6fdf +\u5e72\u8425\u751f=\u5e79\u71df\u751f +\u5e72\u7236\u4e4b\u86ca=\u5e79\u7236\u4e4b\u8831 +\u5e72\u7403\u6e29\u5ea6=\u5e79\u7403\u6eab\u5ea6 +\u5e72\u751a\u4e48=\u5e79\u751a\u9ebc +\u5e72\u7565=\u5e79\u7565 +\u5e72\u5f53=\u5e79\u7576 +\u5e72\u7684\u505c\u5f53=\u5e79\u7684\u505c\u7576 +\u5e72\u7ec6\u80de=\u5e79\u7d30\u80de +\u5e72\u7d30\u80de=\u5e79\u7d30\u80de +\u5e72\u7ebf=\u5e79\u7dda +\u5e72\u7ec3=\u5e79\u7df4 +\u5e72\u7f3a=\u5e79\u7f3a +\u5e72\u7fa4\u5173\u7cfb=\u5e79\u7fa4\u95dc\u4fc2 +\u5e72\u86ca=\u5e79\u8831 +\u5e72\u8b66=\u5e79\u8b66 +\u5e72\u8d77\u6765=\u5e79\u8d77\u4f86 +\u5e72\u8def=\u5e79\u8def +\u5e72\u529e=\u5e79\u8fa6 +\u5e72\u8fd9\u4e00\u884c=\u5e79\u9019\u4e00\u884c +\u5e72\u8fd9\u79cd\u4e8b=\u5e79\u9019\u7a2e\u4e8b +\u5e72\u9053=\u5e79\u9053 +\u5e72\u90e8=\u5e79\u90e8 +\u5e72\u9769\u547d=\u5e79\u9769\u547d +\u5e72\u5934=\u5e79\u982d +\u5e72\u4e48=\u5e79\u9ebc +\u51e0\u5212=\u5e7e\u5283 +\u51e0\u5929\u540e=\u5e7e\u5929\u5f8c +\u51e0\u53ea=\u5e7e\u96bb +\u51e0\u51fa=\u5e7e\u9f63 +\u5e7f\u90e8=\u5e7f\u90e8 +\u5e84\u7a3c\u4eba=\u5e84\u7a3c\u4eba +\u5e84\u7a3c\u9662=\u5e84\u7a3c\u9662 +\u5e97\u91cc=\u5e97\u88e1 +\u5e9c\u5e72\u537f=\u5e9c\u5e72\u537f +\u5e9c\u5e72\u64fe=\u5e9c\u5e72\u64fe +\u5e9c\u5e72\u6270=\u5e9c\u5e72\u64fe +\u5e9c\u5e72\u653f=\u5e9c\u5e72\u653f +\u5e9c\u5e72\u6d89=\u5e9c\u5e72\u6d89 +\u5e9c\u5e72\u72af=\u5e9c\u5e72\u72af +\u5e9c\u5e72\u9810=\u5e9c\u5e72\u9810 +\u5e9c\u5e72\u9884=\u5e9c\u5e72\u9810 +\u5e9c\u5e72=\u5e9c\u5e79 +\u5e9c\u540e=\u5e9c\u5f8c +\u5ea7\u949f=\u5ea7\u9418 +\u5eb7\u5e84\u5927\u9053=\u5eb7\u5e84\u5927\u9053 +\u5eb7\u91c7\u6069=\u5eb7\u63a1\u6069 +\u5eb7\u5e84=\u5eb7\u838a +\u53a8\u4f59=\u5eda\u9918 +\u53ae\u6597=\u5edd\u9b25 +\u5e99\u91cc=\u5edf\u88e1 +\u5e7f\u5f81=\u5ee3\u5fb5 +\u5e7f\u820d=\u5ee3\u6368 +\u5ef6\u540e=\u5ef6\u5f8c +\u5efa\u4e8e=\u5efa\u65bc +\u5f04\u5e72=\u5f04\u4e7e +\u5f04\u4e11=\u5f04\u919c +\u5f04\u810f=\u5f04\u9ad2 +\u5f04\u677e=\u5f04\u9b06 +\u5f04\u9b3c\u540a\u7334=\u5f04\u9b3c\u5f14\u7334 +\u540a\u513f\u90ce\u5f53=\u5f14\u5152\u90ce\u7576 +\u540a\u5377=\u5f14\u5377 +\u540a\u53d6=\u5f14\u53d6 +\u540a\u53e4=\u5f14\u53e4 +\u540a\u53e4\u5bfb\u5e7d=\u5f14\u53e4\u5c0b\u5e7d +\u540a\u5501=\u5f14\u5501 +\u540a\u95ee=\u5f14\u554f +\u540a\u5589=\u5f14\u5589 +\u540a\u4e27=\u5f14\u55aa +\u540a\u4e27\u95ee\u75be=\u5f14\u55aa\u554f\u75be +\u540a\u55ad=\u5f14\u55ad +\u540a\u573a=\u5f14\u5834 +\u540a\u5960=\u5f14\u5960 +\u540a\u5b5d=\u5f14\u5b5d +\u540a\u5ba2=\u5f14\u5ba2 +\u540a\u5bb4=\u5f14\u5bb4 +\u540a\u5e26=\u5f14\u5e36 +\u540a\u5f71=\u5f14\u5f71 +\u540a\u6170=\u5f14\u6170 +\u540a\u6263=\u5f14\u6263 +\u540a\u62f7=\u5f14\u62f7 +\u540a\u62f7\u7ef7\u6252=\u5f14\u62f7\u7e43\u6252 +\u540a\u6302=\u5f14\u639b +\u540a\u6492=\u5f14\u6492 +\u540a\u6587=\u5f14\u6587 +\u540a\u65d7=\u5f14\u65d7 +\u540a\u4e66=\u5f14\u66f8 +\u540a\u6865=\u5f14\u6a4b +\u540a\u6b7b=\u5f14\u6b7b +\u540a\u6b7b\u95ee\u75be=\u5f14\u6b7b\u554f\u75be +\u540a\u6c11=\u5f14\u6c11 +\u540a\u6c11\u4f10\u7f6a=\u5f14\u6c11\u4f10\u7f6a +\u540a\u796d=\u5f14\u796d +\u540a\u7eb8=\u5f14\u7d19 +\u540a\u8005\u5927\u60a6=\u5f14\u8005\u5927\u6085 +\u540a\u8170\u6492\u8de8=\u5f14\u8170\u6492\u8de8 +\u540a\u811a\u513f\u4e8b=\u5f14\u8173\u5152\u4e8b +\u540a\u8180\u5b50=\u5f14\u8180\u5b50 +\u540a\u8bcd=\u5f14\u8a5e +\u540a\u8be1=\u5f14\u8a6d +\u540a\u8be1\u77dc\u5947=\u5f14\u8a6d\u77dc\u5947 +\u540a\u8c0e=\u5f14\u8b0a +\u540a\u8d3a\u8fce\u9001=\u5f14\u8cc0\u8fce\u9001 +\u540a\u5934=\u5f14\u982d +\u540a\u9888=\u5f14\u9838 +\u540a\u9e64=\u5f14\u9db4 +\u5f15\u6597=\u5f15\u9b25 +\u5f18\u5386=\u5f18\u66c6 +\u5f18\u5386\u53f2=\u5f18\u6b77\u53f2 +\u5f31\u4e8e=\u5f31\u65bc +\u5f31\u6c34\u4e09\u5343\u53ea\u53d6\u4e00\u74e2=\u5f31\u6c34\u4e09\u5343\u53ea\u53d6\u4e00\u74e2 +\u5f20\u4e09\u4e30=\u5f35\u4e09\u4e30 +\u5f35\u4e09\u4e30=\u5f35\u4e09\u4e30 +\u5f20\u52cb=\u5f35\u52f3 +\u5f3a\u5360=\u5f37\u4f54 +\u5f3a\u5978=\u5f37\u59e6 +\u5f3a\u5e72=\u5f37\u5e79 +\u5f3a\u4e8e=\u5f37\u65bc +\u522b\u53e3\u6c14=\u5f46\u53e3\u6c23 +\u522b\u5f3a=\u5f46\u5f37 +\u522b\u626d=\u5f46\u626d +\u522b\u62d7=\u5f46\u62d7 +\u522b\u6c14=\u5f46\u6c23 +\u5f39\u5b50\u53f0=\u5f48\u5b50\u6aaf +\u5f39\u73e0\u53f0=\u5f48\u73e0\u6aaf +\u5f39\u836f=\u5f48\u85e5 +\u6c47\u520a=\u5f59\u520a +\u6c47\u62a5=\u5f59\u5831 +\u6c47\u6574=\u5f59\u6574 +\u6c47\u7b97=\u5f59\u7b97 +\u6c47\u7f16=\u5f59\u7de8 +\u6c47\u7e82=\u5f59\u7e82 +\u6c47\u8f91=\u5f59\u8f2f +\u6c47\u96c6=\u5f59\u96c6 +\u5f62\u5355\u5f71\u53ea=\u5f62\u55ae\u5f71\u96bb +\u5f62\u5f71\u76f8\u540a=\u5f62\u5f71\u76f8\u5f14 +\u5f62\u4e8e=\u5f62\u65bc +\u4eff\u4f5b=\u5f77\u5f7f +\u5f79\u4e8e=\u5f79\u65bc +\u5f7c\u6b64\u514b\u5236=\u5f7c\u6b64\u524b\u5236 +\u5f80\u540e=\u5f80\u5f8c +\u5f80\u65e5\u7121\u4ec7=\u5f80\u65e5\u7121\u8b8e +\u5f80\u809a\u91cc\u541e=\u5f80\u809a\u88e1\u541e +\u5f80\u91cc=\u5f80\u88e1 +\u5f80\u590d=\u5f80\u8907 +\u5f88\u5e72=\u5f88\u4e7e +\u5f88\u51f6=\u5f88\u5147 +\u5f88\u4e11=\u5f88\u919c +\u5f8b\u5386\u5fd7=\u5f8b\u66c6\u5fd7 +\u540e\u4e0a=\u5f8c\u4e0a +\u540e\u4e0b=\u5f8c\u4e0b +\u540e\u4e16=\u5f8c\u4e16 +\u540e\u4e3b=\u5f8c\u4e3b +\u540e\u4e8b=\u5f8c\u4e8b +\u540e\u4eba=\u5f8c\u4eba +\u540e\u4ee3=\u5f8c\u4ee3 +\u540e\u4ef0=\u5f8c\u4ef0 +\u540e\u4ef6=\u5f8c\u4ef6 +\u540e\u4efb=\u5f8c\u4efb +\u540e\u4f5c=\u5f8c\u4f5c +\u540e\u6765=\u5f8c\u4f86 +\u540e\u504f=\u5f8c\u504f +\u540e\u5907=\u5f8c\u5099 +\u540e\u4f20=\u5f8c\u50b3 +\u540e\u5206=\u5f8c\u5206 +\u540e\u5230=\u5f8c\u5230 +\u540e\u529b\u4e0d\u7ee7=\u5f8c\u529b\u4e0d\u7e7c +\u540e\u52b2=\u5f8c\u52c1 +\u540e\u52e4=\u5f8c\u52e4 +\u540e\u533a=\u5f8c\u5340 +\u540e\u534a=\u5f8c\u534a +\u540e\u5370=\u5f8c\u5370 +\u540e\u539d\u8def=\u5f8c\u539d\u8def +\u540e\u53bb=\u5f8c\u53bb +\u540e\u53f0=\u5f8c\u53f0 +\u540e\u53f0\u8001\u677f=\u5f8c\u53f0\u8001\u677f +\u540e\u5411=\u5f8c\u5411 +\u540e\u5468=\u5f8c\u5468 +\u540e\u5510=\u5f8c\u5510 +\u540e\u55e3=\u5f8c\u55e3 +\u540e\u56ed=\u5f8c\u5712 +\u540e\u56fe=\u5f8c\u5716 +\u540e\u571f=\u5f8c\u571f +\u540e\u57d4=\u5f8c\u57d4 +\u540e\u5802=\u5f8c\u5802 +\u540e\u5c18=\u5f8c\u5875 +\u540e\u58c1=\u5f8c\u58c1 +\u540e\u5929=\u5f8c\u5929 +\u540e\u592b=\u5f8c\u592b +\u540e\u594f=\u5f8c\u594f +\u540e\u59bb=\u5f8c\u59bb +\u540e\u5a18=\u5f8c\u5a18 +\u540e\u5987=\u5f8c\u5a66 +\u540e\u5b66=\u5f8c\u5b78 +\u540e\u5bab=\u5f8c\u5bae +\u540e\u5c71=\u5f8c\u5c71 +\u540e\u5df7=\u5f8c\u5df7 +\u540e\u5e02=\u5f8c\u5e02 +\u540e\u5e74=\u5f8c\u5e74 +\u540e\u51e0=\u5f8c\u5e7e +\u540e\u5e84=\u5f8c\u5e84 +\u540e\u5e8f=\u5f8c\u5e8f +\u540e\u5ea7=\u5f8c\u5ea7 +\u540e\u5ead=\u5f8c\u5ead +\u540e\u6094=\u5f8c\u6094 +\u540e\u60a3=\u5f8c\u60a3 +\u540e\u623f=\u5f8c\u623f +\u540e\u624b=\u5f8c\u624b +\u540e\u6392=\u5f8c\u6392 +\u540e\u63a0\u89d2=\u5f8c\u63a0\u89d2 +\u540e\u63a5=\u5f8c\u63a5 +\u540e\u63f4=\u5f8c\u63f4 +\u540e\u64a4=\u5f8c\u64a4 +\u540e\u653b=\u5f8c\u653b +\u540e\u653e=\u5f8c\u653e +\u540e\u6548=\u5f8c\u6548 +\u540e\u6587=\u5f8c\u6587 +\u540e\u65b9=\u5f8c\u65b9 +\u540e\u4e8e=\u5f8c\u65bc +\u540e\u65e5=\u5f8c\u65e5 +\u540e\u660c\u8def=\u5f8c\u660c\u8def +\u540e\u664b=\u5f8c\u6649 +\u540e\u664c=\u5f8c\u664c +\u540e\u665a=\u5f8c\u665a +\u540e\u666f=\u5f8c\u666f +\u540e\u4f1a=\u5f8c\u6703 +\u540e\u6709=\u5f8c\u6709 +\u540e\u671b\u955c=\u5f8c\u671b\u93e1 +\u540e\u671f=\u5f8c\u671f +\u540e\u679c=\u5f8c\u679c +\u540e\u6845=\u5f8c\u6845 +\u540e\u6881=\u5f8c\u6881 +\u540e\u6865=\u5f8c\u6a4b +\u540e\u6b65=\u5f8c\u6b65 +\u540e\u6bb5=\u5f8c\u6bb5 +\u540e\u6bbf=\u5f8c\u6bbf +\u540e\u6bcd=\u5f8c\u6bcd +\u540e\u6d3e=\u5f8c\u6d3e +\u540e\u6d6a=\u5f8c\u6d6a +\u540e\u51c9=\u5f8c\u6dbc +\u540e\u6e2f=\u5f8c\u6e2f +\u540e\u6c49=\u5f8c\u6f22 +\u540e\u4e3a=\u5f8c\u70ba +\u540e\u65e0\u6765\u8005=\u5f8c\u7121\u4f86\u8005 +\u540e\u7167\u955c=\u5f8c\u7167\u93e1 +\u540e\u71d5=\u5f8c\u71d5 +\u540e\u7236=\u5f8c\u7236 +\u540e\u73b0\u4ee3=\u5f8c\u73fe\u4ee3 +\u540e\u751f=\u5f8c\u751f +\u540e\u7528=\u5f8c\u7528 +\u540e\u7531=\u5f8c\u7531 +\u540e\u76fe=\u5f8c\u76fe +\u540e\u77e5=\u5f8c\u77e5 +\u540e\u77e5\u540e\u89c9=\u5f8c\u77e5\u5f8c\u89ba +\u540e\u798f=\u5f8c\u798f +\u540e\u79c3=\u5f8c\u79bf +\u540e\u79e6=\u5f8c\u79e6 +\u540e\u7a7a\u7ffb=\u5f8c\u7a7a\u7ffb +\u540e\u7a97=\u5f8c\u7a97 +\u540e\u7ad9=\u5f8c\u7ad9 +\u540e\u7aef=\u5f8c\u7aef +\u540e\u7af9\u56f4=\u5f8c\u7af9\u570d +\u540e\u8282=\u5f8c\u7bc0 +\u540e\u7bc7=\u5f8c\u7bc7 +\u540e\u7f00=\u5f8c\u7db4 +\u540e\u7ee7=\u5f8c\u7e7c +\u540e\u7eed=\u5f8c\u7e8c +\u540e\u7f6e=\u5f8c\u7f6e +\u540e\u8005=\u5f8c\u8005 +\u540e\u80a2=\u5f8c\u80a2 +\u540e\u80cc=\u5f8c\u80cc +\u540e\u8111=\u5f8c\u8166 +\u540e\u811a=\u5f8c\u8173 +\u540e\u817f=\u5f8c\u817f +\u540e\u819b=\u5f8c\u819b +\u540e\u82b1\u56ed=\u5f8c\u82b1\u5712 +\u540e\u83dc\u56ed=\u5f8c\u83dc\u5712 +\u540e\u53f6=\u5f8c\u8449 +\u540e\u884c=\u5f8c\u884c +\u540e\u8857=\u5f8c\u8857 +\u540e\u536b=\u5f8c\u885b +\u540e\u88d4=\u5f8c\u88d4 +\u540e\u8865=\u5f8c\u88dc +\u540e\u4653=\u5f8c\u896c +\u540e\u89c6\u955c=\u5f8c\u8996\u93e1 +\u540e\u8a00=\u5f8c\u8a00 +\u540e\u8ba1=\u5f8c\u8a08 +\u540e\u8bb0=\u5f8c\u8a18 +\u540e\u8bbe=\u5f8c\u8a2d +\u540e\u8bfb=\u5f8c\u8b80 +\u540e\u8d70=\u5f8c\u8d70 +\u540e\u8d77=\u5f8c\u8d77 +\u540e\u8d75=\u5f8c\u8d99 +\u540e\u8db3=\u5f8c\u8db3 +\u540e\u8ddf=\u5f8c\u8ddf +\u540e\u8def=\u5f8c\u8def +\u540e\u8eab=\u5f8c\u8eab +\u540e\u8f66=\u5f8c\u8eca +\u540e\u8f88=\u5f8c\u8f29 +\u540e\u8f6e=\u5f8c\u8f2a +\u540e\u8f6c=\u5f8c\u8f49 +\u540e\u8ff0=\u5f8c\u8ff0 +\u540e\u9000=\u5f8c\u9000 +\u540e\u9001=\u5f8c\u9001 +\u540e\u8fdb=\u5f8c\u9032 +\u540e\u8fc7=\u5f8c\u904e +\u540e\u9057\u75c7=\u5f8c\u907a\u75c7 +\u540e\u8fb9=\u5f8c\u908a +\u540e\u90e8=\u5f8c\u90e8 +\u540e\u955c=\u5f8c\u93e1 +\u540e\u95e8=\u5f8c\u9580 +\u540e\u9632=\u5f8c\u9632 +\u540e\u9662=\u5f8c\u9662 +\u540e\u96c6=\u5f8c\u96c6 +\u540e\u9762=\u5f8c\u9762 +\u540e\u9762\u5e97=\u5f8c\u9762\u5e97 +\u540e\u9879=\u5f8c\u9805 +\u540e\u5934=\u5f8c\u982d +\u540e\u9888=\u5f8c\u9838 +\u540e\u987e=\u5f8c\u9867 +\u540e\u9b4f=\u5f8c\u9b4f +\u540e\u70b9=\u5f8c\u9ede +\u540e\u9f99=\u5f8c\u9f8d +\u5f90\u5e72=\u5f90\u5e79 +\u5f92\u6258\u7a7a\u8a00=\u5f92\u8a17\u7a7a\u8a00 +\u5f97\u514b\u5236=\u5f97\u524b\u5236 +\u4ece\u4e8e=\u5f9e\u65bc +\u4ece\u91cc\u5230\u5916=\u5f9e\u88e1\u5230\u5916 +\u4ece\u91cc\u5411\u5916=\u5f9e\u88e1\u5411\u5916 +\u590d\u59cb=\u5fa9\u59cb +\u590d\u4ec7=\u5fa9\u8b8e +\u5f81\u4eba=\u5fb5\u4eba +\u5f81\u4ee4=\u5fb5\u4ee4 +\u5f81\u5360=\u5fb5\u4f54 +\u5f81\u4fe1=\u5fb5\u4fe1 +\u5f81\u5019=\u5fb5\u5019 +\u5f81\u5146=\u5fb5\u5146 +\u5f81\u5175=\u5fb5\u5175 +\u5f81\u5230=\u5fb5\u5230 +\u5f81\u52df=\u5fb5\u52df +\u5f81\u53cb=\u5fb5\u53cb +\u5f81\u53ec=\u5fb5\u53ec +\u5f81\u540d\u8d23\u5b9e=\u5fb5\u540d\u8cac\u5be6 +\u5f81\u540f=\u5fb5\u540f +\u5f81\u548e=\u5fb5\u548e +\u5f81\u542f=\u5fb5\u555f +\u5f81\u58eb=\u5fb5\u58eb +\u5f81\u5a5a=\u5fb5\u5a5a +\u5f81\u5b9e=\u5fb5\u5be6 +\u5f81\u5eb8=\u5fb5\u5eb8 +\u5f81\u5f15=\u5fb5\u5f15 +\u5f81\u5f97=\u5fb5\u5f97 +\u5f81\u602a=\u5fb5\u602a +\u5f81\u624d=\u5fb5\u624d +\u5f81\u62db=\u5fb5\u62db +\u5f81\u6536=\u5fb5\u6536 +\u5f81\u6548=\u5fb5\u6548 +\u5f81\u6587=\u5fb5\u6587 +\u5f81\u6c42=\u5fb5\u6c42 +\u5f81\u72b6=\u5fb5\u72c0 +\u5f81\u7528=\u5fb5\u7528 +\u5f81\u53d1=\u5fb5\u767c +\u5f81\u7a0e=\u5fb5\u7a05 +\u5f81\u7a3f=\u5fb5\u7a3f +\u5f81\u7b54=\u5fb5\u7b54 +\u5f81\u7ed3=\u5fb5\u7d50 +\u5f81\u5723=\u5fb5\u8056 +\u5f81\u8058=\u5fb5\u8058 +\u5f81\u8bad=\u5fb5\u8a13 +\u5f81\u8be2=\u5fb5\u8a62 +\u5f81\u8c03=\u5fb5\u8abf +\u5f81\u8c61=\u5fb5\u8c61 +\u5f81\u8d2d=\u5fb5\u8cfc +\u5f81\u8ff9=\u5fb5\u8de1 +\u5f81\u8f66=\u5fb5\u8eca +\u5f81\u8f9f=\u5fb5\u8f9f +\u5f81\u9010=\u5fb5\u9010 +\u5f81\u9009=\u5fb5\u9078 +\u5f81\u96c6=\u5fb5\u96c6 +\u5f81\u98ce\u53ec\u96e8=\u5fb5\u98a8\u53ec\u96e8 +\u5f81\u9a8c=\u5fb5\u9a57 +\u5fb7\u5360=\u5fb7\u4f54 +\u5fc3\u613f=\u5fc3\u613f +\u5fc3\u4e8e=\u5fc3\u65bc +\u5fc3\u7406=\u5fc3\u7406 +\u5fc3\u7ec6\u5982\u53d1=\u5fc3\u7d30\u5982\u9aee +\u5fc3\u7cfb=\u5fc3\u7e6b +\u5fc3\u8361=\u5fc3\u8569 +\u5fc3\u836f=\u5fc3\u85e5 +\u5fc3\u91cc=\u5fc3\u88cf +\u5fc3\u91cc\u4e0d\u5b89=\u5fc3\u88e1\u4e0d\u5b89 +\u5fc3\u91cc\u6709\u6570=\u5fc3\u88e1\u6709\u6578 +\u5fc3\u91cc\u8bdd=\u5fc3\u88e1\u8a71 +\u5fc3\u91cc\u5934=\u5fc3\u88e1\u982d +\u5fc3\u957f\u53d1\u77ed=\u5fc3\u9577\u9aee\u77ed +\u5fc3\u4f59=\u5fc3\u9918 +\u5fc5\u987b=\u5fc5\u9808 +\u5fd9\u5e76=\u5fd9\u4f75 +\u5fd9\u91cc=\u5fd9\u88e1 +\u5fd9\u91cc\u5077\u95f2=\u5fd9\u88e1\u5077\u9592 +\u5fe0\u4eba\u4e4b\u6258=\u5fe0\u4eba\u4e4b\u6258 +\u5fe0\u4ec6=\u5fe0\u50d5 +\u5fe0\u4e8e=\u5fe0\u65bc +\u5feb\u5e72=\u5feb\u4e7e +\u5feb\u514b\u5236=\u5feb\u524b\u5236 +\u5feb\u5feb\u5f53\u5f53=\u5feb\u5feb\u7576\u7576 +\u5feb\u51b2=\u5feb\u885d +\u5ffd\u524d\u5ffd\u540e=\u5ffd\u524d\u5ffd\u5f8c +\u600e\u4e48=\u600e\u9ebc +\u600e\u4e48\u7740=\u600e\u9ebc\u8457 +\u6012\u4e8e=\u6012\u65bc +\u6012\u53d1\u51b2\u51a0=\u6012\u9aee\u885d\u51a0 +\u601d\u524d\u601d\u540e=\u601d\u524d\u601d\u5f8c +\u601d\u524d\u60f3\u540e=\u601d\u524d\u60f3\u5f8c +\u601d\u5982\u6cc9\u6d8c=\u601d\u5982\u6cc9\u6e67 +\u6020\u4e8e=\u6020\u65bc +\u6025\u4e8e=\u6025\u65bc +\u6025\u51b2\u800c\u4e0b=\u6025\u885d\u800c\u4e0b +\u6027\u5f81=\u6027\u5fb5 +\u6027\u6b32=\u6027\u617e +\u602a\u91cc\u602a\u6c14=\u602a\u88e1\u602a\u6c23 +\u602b\u90c1=\u602b\u9b31 +\u6042\u6817=\u6042\u6144 +\u6052\u751f\u6307\u6570=\u6052\u751f\u6307\u6578 +\u6052\u751f\u80a1\u4ef7\u6307\u6570=\u6052\u751f\u80a1\u50f9\u6307\u6578 +\u6052\u751f\u94f6\u884c=\u6052\u751f\u9280\u884c +\u6055\u4e4f\u4ef7\u50ac=\u6055\u4e4f\u4ef7\u50ac +\u606f\u4ea4\u7edd\u6e38=\u606f\u4ea4\u7d55\u904a +\u606f\u8c37=\u606f\u7a40 +\u6070\u624d=\u6070\u7e94 +\u608d\u836f=\u608d\u85e5 +\u6092\u90c1=\u6092\u9b31 +\u60a0\u60a0\u8361\u8361=\u60a0\u60a0\u8569\u8569 +\u60a0\u8361=\u60a0\u8569 +\u60a0\u6e38=\u60a0\u904a +\u60a8\u514b\u5236=\u60a8\u524b\u5236 +\u60b2\u7b51=\u60b2\u7b51 +\u60b2\u90c1=\u60b2\u9b31 +\u95f7\u5728\u5fc3\u91cc=\u60b6\u5728\u5fc3\u88e1 +\u95f7\u7740\u5934\u513f\u5e72=\u60b6\u8457\u982d\u5152\u5e79 +\u60b8\u6817=\u60b8\u6144 +\u60c5\u6b32=\u60c5\u617e +\u60c7\u6734=\u60c7\u6a38 +\u6076\u76f4\u4e11\u6b63=\u60e1\u76f4\u919c\u6b63 +\u6076\u6597=\u60e1\u9b25 +\u60f3\u514b\u5236=\u60f3\u524b\u5236 +\u60f4\u6817=\u60f4\u6144 +\u610f\u5360=\u610f\u4f54 +\u610f\u514b\u5236=\u610f\u524b\u5236 +\u610f\u5927\u5229\u9762=\u610f\u5927\u5229\u9eb5 +\u610f\u9762=\u610f\u9eb5 +\u7231\u5728\u5fc3\u91cc=\u611b\u5728\u5fc3\u88e1 +\u7231\u56f0=\u611b\u774f +\u611f\u5192\u836f=\u611f\u5192\u85e5 +\u613f\u6734=\u613f\u6a38 +\u613f\u800c\u606d=\u613f\u800c\u606d +\u6817\u51bd=\u6144\u51bd +\u6817\u6817=\u6144\u6144 +\u614c\u91cc\u614c\u5f20=\u614c\u88e1\u614c\u5f35 +\u5e86\u540a=\u6176\u5f14 +\u5e86\u5386=\u6176\u66c6 +\u5e86\u5386\u53f2=\u6176\u6b77\u53f2 +\u6b32\u4ee4\u667a\u660f=\u617e\u4ee4\u667a\u660f +\u6b32\u58d1\u96be\u586b=\u617e\u58d1\u96e3\u586b +\u6b32\u5ff5=\u617e\u5ff5 +\u6b32\u671b=\u617e\u671b +\u6b32\u6d77=\u617e\u6d77 +\u6b32\u706b=\u617e\u706b +\u6b32\u969c=\u617e\u969c +\u5fe7\u90c1=\u6182\u9b31 +\u51ed\u51e0=\u6191\u51e0 +\u51ed\u540a=\u6191\u5f14 +\u51ed\u6298=\u6191\u647a +\u51ed\u51c6=\u6191\u6e96 +\u51ed\u501f=\u6191\u85c9 +\u51ed\u501f\u7740=\u6191\u85c9\u8457 +\u6073\u6258=\u61c7\u8a17 +\u61c8\u677e=\u61c8\u9b06 +\u5e94\u514b\u5236=\u61c9\u524b\u5236 +\u5e94\u5f81=\u61c9\u5fb5 +\u5e94\u949f=\u61c9\u9418 +\u61d4\u6817=\u61cd\u6144 +\u8499\u61c2=\u61de\u61c2 +\u8499\u8499\u61c2\u61c2=\u61de\u61de\u61c2\u61c2 +\u8499\u76f4=\u61de\u76f4 +\u60e9\u524d\u6bd6\u540e=\u61f2\u524d\u6bd6\u5f8c +\u60e9\u5fff\u7a92\u6b32=\u61f2\u5fff\u7a92\u6b32 +\u6000\u91cc=\u61f7\u88e1 +\u6000\u8868=\u61f7\u9336 +\u6000\u949f=\u61f7\u9418 +\u60ac\u6302=\u61f8\u6302 +\u60ac\u6881=\u61f8\u6a11 +\u60ac\u81c2\u6881=\u61f8\u81c2\u6a11 +\u60ac\u949f=\u61f8\u9418 +\u61ff\u8303=\u61ff\u7bc4 +\u604b\u604b\u4e0d\u820d=\u6200\u6200\u4e0d\u6368 +\u6210\u4e8e=\u6210\u65bc +\u6210\u4e8e\u601d=\u6210\u65bc\u601d +\u6210\u836f=\u6210\u85e5 +\u6211\u514b\u5236=\u6211\u524b\u5236 +\u622c\u8c37=\u6229\u7a40 +\u622a\u53d1=\u622a\u9aee +\u6218\u5929\u6597\u5730=\u6230\u5929\u9b25\u5730 +\u6218\u540e=\u6230\u5f8c +\u6218\u6817=\u6230\u6144 +\u6218\u6597=\u6230\u9b25 +\u620f\u5f69\u5a31\u4eb2=\u6232\u7db5\u5a1b\u89aa +\u6234\u8868=\u6234\u9336 +\u6234\u53d1\u542b\u9f7f=\u6234\u9aee\u542b\u9f52 +\u623f\u91cc=\u623f\u88e1 +\u6240\u4e91=\u6240\u4e91 +\u6240\u4e91\u4e91=\u6240\u4e91\u4e91 +\u6240\u5360=\u6240\u4f54 +\u6240\u5360\u535c=\u6240\u5360\u535c +\u6240\u5360\u661f=\u6240\u5360\u661f +\u6240\u5360\u7b97=\u6240\u5360\u7b97 +\u6240\u6258=\u6240\u8a17 +\u6241\u62df\u8c37\u76d7\u866b=\u6241\u64ec\u7a40\u76dc\u87f2 +\u624b\u585a\u6cbb\u866b=\u624b\u585a\u6cbb\u866b +\u624b\u51a2\u6cbb\u866b=\u624b\u585a\u6cbb\u866b +\u624b\u6298=\u624b\u647a +\u624b\u8868\u6001=\u624b\u8868\u614b +\u624b\u8868\u660e=\u624b\u8868\u660e +\u624b\u8868\u51b3=\u624b\u8868\u6c7a +\u624b\u8868\u6f14=\u624b\u8868\u6f14 +\u624b\u8868\u73b0=\u624b\u8868\u73fe +\u624b\u8868\u793a=\u624b\u8868\u793a +\u624b\u8868\u8fbe=\u624b\u8868\u9054 +\u624b\u8868\u9732=\u624b\u8868\u9732 +\u624b\u8868\u9762=\u624b\u8868\u9762 +\u624b\u91cc=\u624b\u88e1 +\u624b\u8868=\u624b\u9336 +\u624b\u677e=\u624b\u9b06 +\u624d\u514b\u5236=\u624d\u524b\u5236 +\u624d\u5e72\u4f11=\u624d\u5e72\u4f11 +\u624d\u5e72\u6208=\u624d\u5e72\u6208 +\u624d\u5e72\u6270=\u624d\u5e72\u64fe +\u624d\u5e72\u653f=\u624d\u5e72\u653f +\u624d\u5e72\u6d89=\u624d\u5e72\u6d89 +\u624d\u5e72\u9884=\u624d\u5e72\u9810 +\u624d\u5e72=\u624d\u5e79 +\u624e\u597d\u5e95\u5b50=\u624e\u597d\u5e95\u5b50 +\u624e\u597d\u6839=\u624e\u597d\u6839 +\u6251\u4f5c\u6559\u5211=\u6251\u4f5c\u6559\u5211 +\u6251\u6253=\u6251\u6253 +\u6251\u631e=\u6251\u64bb +\u6253\u5e72\u54d5=\u6253\u4e7e\u5666 +\u6253\u5e76=\u6253\u4f75 +\u6253\u51fa\u540a\u5165=\u6253\u51fa\u5f14\u5165 +\u6253\u5361\u949f=\u6253\u5361\u9418 +\u6253\u5428=\u6253\u5428 +\u6253\u5e72=\u6253\u5e79 +\u6253\u62fc=\u6253\u62da +\u6253\u65ad\u53d1=\u6253\u65b7\u767c +\u6253\u8c37=\u6253\u7a40 +\u6253\u7740\u949f=\u6253\u8457\u9418 +\u6253\u8def\u5e84\u677f=\u6253\u8def\u838a\u677f +\u6253\u949f=\u6253\u9418 +\u6253\u6597=\u6253\u9b25 +\u6258\u7ba1\u56fd=\u6258\u7ba1\u570b +\u625b\u5927\u6881=\u625b\u5927\u6a11 +\u625e\u5fa1=\u625e\u79a6 +\u626f\u9762=\u626f\u9eb5 +\u6276\u4f59\u56fd=\u6276\u9918\u570b +\u6279\u51c6\u7684=\u6279\u51c6\u7684 +\u6279\u590d=\u6279\u8907 +\u6279\u6ce8=\u6279\u8a3b +\u6279\u6597=\u6279\u9b25 +\u627f\u5148\u542f\u540e=\u627f\u5148\u555f\u5f8c +\u627f\u524d\u542f\u540e=\u627f\u524d\u555f\u5f8c +\u627f\u5236=\u627f\u88fd +\u6291\u5236\u4f5c\u7528=\u6291\u5236\u4f5c\u7528 +\u6291\u90c1=\u6291\u9b31 +\u6293\u5978=\u6293\u59e6 +\u6293\u836f=\u6293\u85e5 +\u6293\u6597=\u6293\u9b25 +\u6295\u836f=\u6295\u85e5 +\u6297\u764c\u836f=\u6297\u764c\u85e5 +\u6297\u5fa1=\u6297\u79a6 +\u6297\u836f=\u6297\u85e5 +\u6298\u5411\u5f80=\u6298\u5411\u5f80 +\u6298\u5b50\u620f=\u6298\u5b50\u6232 +\u6298\u621f\u6c88\u6cb3=\u6298\u621f\u6c88\u6cb3 +\u6298\u51b2=\u6298\u885d +\u62ab\u699b\u91c7\u5170=\u62ab\u699b\u63a1\u862d +\u62ab\u5934\u6563\u53d1=\u62ab\u982d\u6563\u9aee +\u62ab\u53d1=\u62ab\u9aee +\u62b1\u6734\u800c\u957f\u541f\u516e=\u62b1\u6734\u800c\u9577\u541f\u516e +\u62b1\u7d20\u6000\u6734=\u62b1\u7d20\u61f7\u6a38 +\u62b5\u5fa1=\u62b5\u79a6 +\u62b9\u5e72=\u62b9\u4e7e +\u62bd\u516c\u7b7e=\u62bd\u516c\u7c64 +\u62bd\u7b7e=\u62bd\u7c64 +\u62bf\u53d1=\u62bf\u9aee +\u62c2\u949f\u65e0\u58f0=\u62c2\u9418\u7121\u8072 +\u62c6\u4f19=\u62c6\u5925 +\u62c8\u987b=\u62c8\u9b1a +\u62c9\u514b\u65bd\u5c14\u5fb7\u949f=\u62c9\u514b\u65bd\u723e\u5fb7\u9418 +\u62c9\u6746=\u62c9\u6746 +\u62c9\u7ea4=\u62c9\u7e34 +\u62c9\u9762\u4e0a=\u62c9\u9762\u4e0a +\u62c9\u9762\u5177=\u62c9\u9762\u5177 +\u62c9\u9762\u524d=\u62c9\u9762\u524d +\u62c9\u9762\u5dfe=\u62c9\u9762\u5dfe +\u62c9\u9762\u65e0=\u62c9\u9762\u7121 +\u62c9\u9762\u76ae=\u62c9\u9762\u76ae +\u62c9\u9762\u7f69=\u62c9\u9762\u7f69 +\u62c9\u9762\u8272=\u62c9\u9762\u8272 +\u62c9\u9762\u90e8=\u62c9\u9762\u90e8 +\u62c9\u9762=\u62c9\u9eb5 +\u62d2\u4eba\u4e8e=\u62d2\u4eba\u65bc +\u62d2\u4e8e=\u62d2\u65bc +\u62d3\u6734=\u62d3\u6a38 +\u62d4\u53d1=\u62d4\u9aee +\u62d4\u987b=\u62d4\u9b1a +\u62d7\u522b=\u62d7\u5f46 +\u62d8\u4e8e=\u62d8\u65bc +\u62d9\u4e8e=\u62d9\u65bc +\u62d9\u6734=\u62d9\u6a38 +\u62fc\u5374=\u62da\u537b +\u62fc\u547d=\u62da\u547d +\u62fc\u820d=\u62da\u6368 +\u62fc\u6b7b=\u62da\u6b7b +\u62fc\u751f\u5c3d\u6b7b=\u62da\u751f\u76e1\u6b7b +\u62fc\u7edd=\u62da\u7d55 +\u62fc\u8001\u547d=\u62da\u8001\u547d +\u62fc\u6597=\u62da\u9b25 +\u62dc\u6258=\u62dc\u8a17 +\u62ec\u53d1=\u62ec\u9aee +\u62ed\u5e72=\u62ed\u4e7e +\u62ee\u636e=\u62ee\u636e +\u62fc\u6b7b\u62fc\u6d3b=\u62fc\u6b7b\u62fc\u6d3b +\u62fe\u6c88=\u62fe\u700b +\u62ff\u51c6=\u62ff\u6e96 +\u62ff\u7834\u4ed1=\u62ff\u7834\u5d19 +\u6302\u540d=\u6302\u540d +\u6302\u56fe=\u6302\u5716 +\u6302\u5e05=\u6302\u5e25 +\u6302\u5f69=\u6302\u5f69 +\u6302\u5ff5=\u6302\u5ff5 +\u6302\u53f7=\u6302\u865f +\u6302\u8f66=\u6302\u8eca +\u6302\u9762=\u6302\u9762 +\u6307\u624b\u5212\u811a=\u6307\u624b\u5283\u8173 +\u630c\u6597=\u630c\u9b25 +\u6311\u5927\u6881=\u6311\u5927\u6a11 +\u6311\u6597=\u6311\u9b25 +\u632f\u8361=\u632f\u8569 +\u6346\u624e=\u6346\u7d2e +\u6349\u5978\u5f92=\u6349\u5978\u5f92 +\u6349\u5978\u7ec6=\u6349\u5978\u7d30 +\u6349\u5978\u8d3c=\u6349\u5978\u8cca +\u6349\u5978\u515a=\u6349\u5978\u9ee8 +\u6349\u5978=\u6349\u59e6 +\u6349\u53d1=\u6349\u9aee +\u634d\u5fa1=\u634d\u79a6 +\u634f\u9762\u4eba=\u634f\u9eb5\u4eba +\u820d\u4e0d\u5f97=\u6368\u4e0d\u5f97 +\u820d\u51fa=\u6368\u51fa +\u820d\u53bb=\u6368\u53bb +\u820d\u547d=\u6368\u547d +\u820d\u5815=\u6368\u58ae +\u820d\u5b89\u5c31\u5371=\u6368\u5b89\u5c31\u5371 +\u820d\u5b9e=\u6368\u5be6 +\u820d\u5df1\u4ece\u4eba=\u6368\u5df1\u5f9e\u4eba +\u820d\u5df1\u6551\u4eba=\u6368\u5df1\u6551\u4eba +\u820d\u5df1\u4e3a\u4eba=\u6368\u5df1\u70ba\u4eba +\u820d\u5df1\u4e3a\u516c=\u6368\u5df1\u70ba\u516c +\u820d\u5df1\u4e3a\u56fd=\u6368\u5df1\u70ba\u570b +\u820d\u5f97=\u6368\u5f97 +\u820d\u6211\u5176\u8c01=\u6368\u6211\u5176\u8ab0 +\u820d\u672c\u9010\u672b=\u6368\u672c\u9010\u672b +\u820d\u5f03=\u6368\u68c4 +\u820d\u6b7b\u5fd8\u751f=\u6368\u6b7b\u5fd8\u751f +\u820d\u751f=\u6368\u751f +\u820d\u77ed\u53d6\u957f=\u6368\u77ed\u53d6\u9577 +\u820d\u8eab=\u6368\u8eab +\u820d\u8f66\u4fdd\u5e05=\u6368\u8eca\u4fdd\u5e25 +\u820d\u8fd1\u6c42\u8fdc=\u6368\u8fd1\u6c42\u9060 +\u5377\u4f4f=\u6372\u4f4f +\u5377\u6765=\u6372\u4f86 +\u5377\u513f=\u6372\u5152 +\u5377\u5165=\u6372\u5165 +\u5377\u52a8=\u6372\u52d5 +\u5377\u53bb=\u6372\u53bb +\u5377\u56fe=\u6372\u5716 +\u5377\u571f\u91cd\u6765=\u6372\u571f\u91cd\u4f86 +\u5377\u5c3a=\u6372\u5c3a +\u5377\u5fc3\u83dc=\u6372\u5fc3\u83dc +\u5377\u6210=\u6372\u6210 +\u5377\u66f2=\u6372\u66f2 +\u5377\u6b3e=\u6372\u6b3e +\u5377\u6bdb=\u6372\u6bdb +\u5377\u70df=\u6372\u7159 +\u5377\u7b52=\u6372\u7b52 +\u5377\u5e18=\u6372\u7c3e +\u5377\u7eb8=\u6372\u7d19 +\u5377\u7f29=\u6372\u7e2e +\u5377\u820c=\u6372\u820c +\u5377\u8216\u76d6=\u6372\u8216\u84cb +\u5377\u83f8=\u6372\u83f8 +\u5377\u8896=\u6372\u8896 +\u5377\u8d70=\u6372\u8d70 +\u5377\u8d77=\u6372\u8d77 +\u5377\u8f74=\u6372\u8ef8 +\u5377\u9003=\u6372\u9003 +\u5377\u94fa\u76d6=\u6372\u92ea\u84cb +\u5377\u4e91=\u6372\u96f2 +\u5377\u98ce=\u6372\u98a8 +\u5377\u53d1=\u6372\u9aee +\u6375\u9762=\u6375\u9eb5 +\u6376\u70bc=\u6376\u934a +\u626b\u8361=\u6383\u8569 +\u638c\u67dc=\u638c\u67dc +\u6392\u9aa8\u9762=\u6392\u9aa8\u9eb5 +\u6302\u5e18=\u639b\u5e18 +\u6302\u94a9=\u639b\u920e +\u6302\u949f=\u639b\u9418 +\u91c7\u4e0b=\u63a1\u4e0b +\u91c7\u4f10=\u63a1\u4f10 +\u91c7\u4f4f=\u63a1\u4f4f +\u91c7\u4fe1=\u63a1\u4fe1 +\u91c7\u5149=\u63a1\u5149 +\u91c7\u5230=\u63a1\u5230 +\u91c7\u5236=\u63a1\u5236 +\u91c7\u533a=\u63a1\u5340 +\u91c7\u53bb=\u63a1\u53bb +\u91c7\u53d6=\u63a1\u53d6 +\u91c7\u56de=\u63a1\u56de +\u91c7\u5728=\u63a1\u5728 +\u91c7\u597d=\u63a1\u597d +\u91c7\u5f97=\u63a1\u5f97 +\u91c7\u62fe=\u63a1\u62fe +\u91c7\u6316=\u63a1\u6316 +\u91c7\u6398=\u63a1\u6398 +\u91c7\u6458=\u63a1\u6458 +\u91c7\u646d=\u63a1\u646d +\u91c7\u62e9=\u63a1\u64c7 +\u91c7\u64b7=\u63a1\u64f7 +\u91c7\u6536=\u63a1\u6536 +\u91c7\u6599=\u63a1\u6599 +\u91c7\u6696=\u63a1\u6696 +\u91c7\u6851=\u63a1\u6851 +\u91c7\u6837=\u63a1\u6a23 +\u91c7\u6a35\u4eba=\u63a1\u6a35\u4eba +\u91c7\u6811\u79cd=\u63a1\u6a39\u7a2e +\u91c7\u6c14=\u63a1\u6c23 +\u91c7\u6cb9=\u63a1\u6cb9 +\u91c7\u4e3a=\u63a1\u70ba +\u91c7\u7164=\u63a1\u7164 +\u91c7\u83b7=\u63a1\u7372 +\u91c7\u730e=\u63a1\u7375 +\u91c7\u73e0=\u63a1\u73e0 +\u91c7\u751f\u6298\u5272=\u63a1\u751f\u6298\u5272 +\u91c7\u7528=\u63a1\u7528 +\u91c7\u7684=\u63a1\u7684 +\u91c7\u77f3=\u63a1\u77f3 +\u91c7\u7802\u573a=\u63a1\u7802\u5834 +\u91c7\u77ff=\u63a1\u7926 +\u91c7\u79cd=\u63a1\u7a2e +\u91c7\u7a7a\u533a=\u63a1\u7a7a\u5340 +\u91c7\u7a7a\u91c7\u7a57=\u63a1\u7a7a\u63a1\u7a57 +\u91c7\u7eb3=\u63a1\u7d0d +\u91c7\u7ed9=\u63a1\u7d66 +\u91c7\u82b1=\u63a1\u82b1 +\u91c7\u82b9\u4eba=\u63a1\u82b9\u4eba +\u91c7\u8336=\u63a1\u8336 +\u91c7\u83ca=\u63a1\u83ca +\u91c7\u83b2=\u63a1\u84ee +\u91c7\u8587=\u63a1\u8587 +\u91c7\u85aa=\u63a1\u85aa +\u91c7\u836f=\u63a1\u85e5 +\u91c7\u884c=\u63a1\u884c +\u91c7\u8865=\u63a1\u88dc +\u91c7\u8bbf=\u63a1\u8a2a +\u91c7\u8bc1=\u63a1\u8b49 +\u91c7\u4e70=\u63a1\u8cb7 +\u91c7\u8d2d=\u63a1\u8cfc +\u91c7\u529e=\u63a1\u8fa6 +\u91c7\u8fd0=\u63a1\u904b +\u91c7\u8fc7=\u63a1\u904e +\u91c7\u9009=\u63a1\u9078 +\u91c7\u91d1=\u63a1\u91d1 +\u91c7\u5f55=\u63a1\u9304 +\u91c7\u94c1=\u63a1\u9435 +\u91c7\u96c6=\u63a1\u96c6 +\u91c7\u98ce=\u63a1\u98a8 +\u91c7\u98ce\u95ee\u4fd7=\u63a1\u98a8\u554f\u4fd7 +\u91c7\u98df=\u63a1\u98df +\u91c7\u76d0=\u63a1\u9e7d +\u63a3\u7b7e=\u63a3\u7c64 +\u63a5\u7740\u8bf4=\u63a5\u8457\u8aaa +\u63a8\u60c5\u51c6\u7406=\u63a8\u60c5\u6e96\u7406 +\u63a8\u6258\u4e4b\u8bcd=\u63a8\u6258\u4e4b\u8a5e +\u63a8\u821f\u4e8e\u9646=\u63a8\u821f\u65bc\u9678 +\u63a8\u6258=\u63a8\u8a17 +\u63d0\u5b50\u5e72=\u63d0\u5b50\u4e7e +\u63d0\u5fc3\u540a\u80c6=\u63d0\u5fc3\u5f14\u81bd +\u63d0\u6469\u592a\u540e\u4e66=\u63d0\u6469\u592a\u5f8c\u66f8 +\u63d2\u4e8e=\u63d2\u65bc +\u6362\u7b7e=\u63db\u7c64 +\u6362\u836f=\u63db\u85e5 +\u6362\u53ea=\u63db\u96bb +\u6362\u53d1=\u63db\u9aee +\u63e1\u53d1=\u63e1\u9aee +\u63e9\u5e72=\u63e9\u4e7e +\u63ea\u91c7=\u63ea\u63a1 +\u63ea\u53d1=\u63ea\u9aee +\u63ea\u987b=\u63ea\u9b1a +\u63ed\u4e11=\u63ed\u919c +\u6325\u624b\u8868=\u63ee\u624b\u8868 +\u6325\u6746=\u63ee\u6746 +\u640b\u9762=\u640b\u9eb5 +\u635f\u4e8e=\u640d\u65bc +\u640f\u6597=\u640f\u9b25 +\u6447\u6447\u8361\u8361=\u6416\u6416\u8569\u8569 +\u6447\u8361=\u6416\u8569 +\u6363\u9b3c\u540a\u767d=\u6417\u9b3c\u5f14\u767d +\u6424\u80ae\u62ca\u80cc=\u6424\u80ae\u62ca\u80cc +\u642c\u6597=\u642c\u9b25 +\u642d\u5e72\u94fa=\u642d\u4e7e\u92ea +\u642d\u4f19=\u642d\u5925 +\u62a2\u5360=\u6436\u4f54 +\u643d\u836f=\u643d\u85e5 +\u6467\u575a\u83b7\u4e11=\u6467\u5805\u7372\u919c +\u646d\u91c7=\u646d\u63a1 +\u6478\u68f1=\u6478\u7a1c +\u6478\u949f=\u6478\u9418 +\u6298\u5408=\u647a\u5408 +\u6298\u594f=\u647a\u594f +\u6298\u5b50=\u647a\u5b50 +\u6298\u5c3a=\u647a\u5c3a +\u6298\u6247=\u647a\u6247 +\u6298\u68af=\u647a\u68af +\u6298\u6905=\u647a\u6905 +\u6298\u53e0=\u647a\u758a +\u6298\u75d5=\u647a\u75d5 +\u6298\u7bf7=\u647a\u7bf7 +\u6298\u7eb8=\u647a\u7d19 +\u6298\u88d9=\u647a\u88d9 +\u6487\u540a=\u6487\u5f14 +\u635e\u5e72=\u6488\u4e7e +\u635e\u9762=\u6488\u9eb5 +\u649a\u987b=\u649a\u9b1a +\u649e\u7403\u53f0=\u649e\u7403\u6aaf +\u649e\u949f=\u649e\u9418 +\u649e\u9635\u51b2\u519b=\u649e\u9663\u885d\u8ecd +\u64a4\u5e76=\u64a4\u4f75 +\u64a4\u540e=\u64a4\u5f8c +\u62e8\u8c37=\u64a5\u7a40 +\u64a9\u6597=\u64a9\u9b25 +\u64ad\u4e8e=\u64ad\u65bc +\u6251\u51ac=\u64b2\u9f15 +\u6251\u51ac\u51ac=\u64b2\u9f15\u9f15 +\u64c0\u9762=\u64c0\u9eb5 +\u51fb\u6251=\u64ca\u6251 +\u51fb\u949f=\u64ca\u9418 +\u64cd\u4f5c\u949f=\u64cd\u4f5c\u9418 +\u62c5\u4ed4\u9762=\u64d4\u4ed4\u9eb5 +\u62c5\u62c5\u9762=\u64d4\u64d4\u9eb5 +\u62c5\u7740=\u64d4\u8457 +\u62c5\u8d1f\u7740=\u64d4\u8ca0\u8457 +\u64d8\u5212=\u64d8\u5283 +\u636e\u4e91=\u64da\u4e91 +\u636e\u5e72\u800c\u7aa5\u4e95\u5e95=\u64da\u69a6\u800c\u7aba\u4e95\u5e95 +\u64e2\u53d1=\u64e2\u9aee +\u64e6\u5e72=\u64e6\u4e7e +\u64e6\u5e72\u51c0=\u64e6\u4e7e\u6de8 +\u64e6\u836f=\u64e6\u85e5 +\u62e7\u5e72=\u64f0\u4e7e +\u6446\u949f=\u64fa\u9418 +\u6444\u5236=\u651d\u88fd +\u652f\u5e72=\u652f\u5e79 +\u652f\u6746=\u652f\u6746 +\u6536\u83b7=\u6536\u7a6b +\u6539\u5f81=\u6539\u5fb5 +\u653b\u5360=\u653b\u4f54 +\u653e\u5728\u5fc3\u91cc=\u653e\u5728\u5fc3\u88e1 +\u653e\u8499\u6323=\u653e\u61de\u6399 +\u653e\u8361=\u653e\u8569 +\u653e\u677e=\u653e\u9b06 +\u654f\u4e8e=\u654f\u65bc +\u6551\u836f=\u6551\u85e5 +\u8d25\u4e8e=\u6557\u65bc +\u53d9\u8bf4\u7740=\u6558\u8aaa\u8457 +\u6559\u5b66\u949f=\u6559\u5b78\u9418 +\u6559\u5fc3\u7cfb=\u6559\u5fc3\u7cfb +\u6559\u4e8e=\u6559\u65bc +\u6559\u8303=\u6559\u7bc4 +\u6562\u5e72=\u6562\u5e79 +\u6562\u60c5\u6b32=\u6562\u60c5\u6b32 +\u6562\u6597\u4e86\u80c6=\u6562\u6597\u4e86\u81bd +\u6563\u4f19=\u6563\u5925 +\u6563\u4e8e=\u6563\u65bc +\u6563\u8361=\u6563\u8569 +\u6566\u6734=\u6566\u6a38 +\u656c\u633d=\u656c\u8f13 +\u6572\u6251=\u6572\u6251 +\u6572\u949f=\u6572\u9418 +\u6574\u5e84=\u6574\u838a +\u6574\u53ea=\u6574\u96bb +\u6574\u53d1\u7528\u54c1=\u6574\u9aee\u7528\u54c1 +\u654c\u540e=\u6575\u5f8c +\u654c\u5ffe\u540c\u4ec7=\u6575\u613e\u540c\u8b8e +\u6577\u836f=\u6577\u85e5 +\u6570\u5929\u540e=\u6578\u5929\u5f8c +\u6570\u5b57\u8868=\u6578\u5b57\u9336 +\u6570\u5b57\u949f=\u6578\u5b57\u9418 +\u6570\u5b57\u949f\u8868=\u6578\u5b57\u9418\u9336 +\u6570\u7f6a\u5e76\u7f5a=\u6578\u7f6a\u4f75\u7f70 +\u6570\u4e0e\u864f\u786e=\u6578\u8207\u865c\u786e +\u6587\u4e11=\u6587\u4e11 +\u6587\u6c47\u62a5=\u6587\u532f\u5831 +\u6587\u540e=\u6587\u5f8c +\u6587\u5f81\u660e=\u6587\u5fb5\u660e +\u6587\u601d\u6cc9\u6d8c=\u6587\u601d\u6cc9\u6e67 +\u6587\u91c7\u90c1\u90c1=\u6587\u91c7\u90c1\u90c1 +\u6597\u8f6c\u53c2\u6a2a=\u6597\u8f49\u53c3\u6a6b +\u65ab\u96d5\u4e3a\u6734=\u65ab\u96d5\u70ba\u6a38 +\u65b0\u5386=\u65b0\u66c6 +\u65b0\u5386\u53f2=\u65b0\u6b77\u53f2 +\u65b0\u624e=\u65b0\u7d2e +\u65b0\u5e84=\u65b0\u838a +\u65b0\u5e84\u5e02=\u65b0\u838a\u5e02 +\u65b2\u96d5\u4e3a\u6734=\u65b2\u96d5\u70ba\u6a38 +\u65ad\u540e=\u65b7\u5f8c +\u65ad\u53d1=\u65b7\u9aee +\u65ad\u53d1\u6587\u8eab=\u65b7\u9aee\u6587\u8eab +\u65b9\u4fbf\u9762=\u65b9\u4fbf\u9eb5 +\u65b9\u51e0=\u65b9\u51e0 +\u65b9\u5411\u5f80=\u65b9\u5411\u5f80 +\u65b9\u5fd7=\u65b9\u8a8c +\u65b9\u9762=\u65b9\u9762 +\u4e8e0=\u65bc0 +\u4e8e1=\u65bc1 +\u4e8e2=\u65bc2 +\u4e8e3=\u65bc3 +\u4e8e4=\u65bc4 +\u4e8e5=\u65bc5 +\u4e8e6=\u65bc6 +\u4e8e7=\u65bc7 +\u4e8e8=\u65bc8 +\u4e8e9=\u65bc9 +\u4e8e\u4e00=\u65bc\u4e00 +\u4e8e\u4e00\u5f79=\u65bc\u4e00\u5f79 +\u4e8e\u4e03=\u65bc\u4e03 +\u4e8e\u4e09=\u65bc\u4e09 +\u4e8e\u4e16=\u65bc\u4e16 +\u4e8e\u4e4b=\u65bc\u4e4b +\u4e8e\u4e4e=\u65bc\u4e4e +\u4e8e\u4e5d=\u65bc\u4e5d +\u4e8e\u4e8b=\u65bc\u4e8b +\u4e8e\u4e8c=\u65bc\u4e8c +\u4e8e\u4e94=\u65bc\u4e94 +\u4e8e\u4eba=\u65bc\u4eba +\u4e8e\u4eca=\u65bc\u4eca +\u4e8e\u4ed6=\u65bc\u4ed6 +\u4e8e\u4f0f=\u65bc\u4f0f +\u4e8e\u4f55=\u65bc\u4f55 +\u4e8e\u4f60=\u65bc\u4f60 +\u4e8e\u516b=\u65bc\u516b +\u4e8e\u516d=\u65bc\u516d +\u4e8e\u514b\u5236=\u65bc\u524b\u5236 +\u4e8e\u524d=\u65bc\u524d +\u4e8e\u52a3=\u65bc\u52a3 +\u4e8e\u52e4=\u65bc\u52e4 +\u4e8e\u5341=\u65bc\u5341 +\u4e8e\u534a=\u65bc\u534a +\u4e8e\u547c\u54c0\u54c9=\u65bc\u547c\u54c0\u54c9 +\u4e8e\u56db=\u65bc\u56db +\u4e8e\u56fd=\u65bc\u570b +\u4e8e\u574f=\u65bc\u574f +\u4e8e\u5782=\u65bc\u5782 +\u4e8e\u592b\u7f57=\u65bc\u592b\u7f85 +\u65bc\u592b\u7f57=\u65bc\u592b\u7f85 +\u65bc\u592b\u7f85=\u65bc\u592b\u7f85 +\u4e8e\u5979=\u65bc\u5979 +\u4e8e\u597d=\u65bc\u597d +\u4e8e\u59cb=\u65bc\u59cb +\u65bc\u59d3=\u65bc\u59d3 +\u4e8e\u5b83=\u65bc\u5b83 +\u4e8e\u5bb6=\u65bc\u5bb6 +\u4e8e\u5bc6=\u65bc\u5bc6 +\u4e8e\u5dee=\u65bc\u5dee +\u4e8e\u5df1=\u65bc\u5df1 +\u4e8e\u5e02=\u65bc\u5e02 +\u4e8e\u5e55=\u65bc\u5e55 +\u4e8e\u5f31=\u65bc\u5f31 +\u4e8e\u5f3a=\u65bc\u5f37 +\u4e8e\u5f81=\u65bc\u5f81 +\u4e8e\u540e=\u65bc\u5f8c +\u4e8e\u5fc3=\u65bc\u5fc3 +\u4e8e\u6000=\u65bc\u61f7 +\u4e8e\u6211=\u65bc\u6211 +\u4e8e\u620f=\u65bc\u6232 +\u4e8e\u655d=\u65bc\u655d +\u4e8e\u65af=\u65bc\u65af +\u4e8e\u662f=\u65bc\u662f +\u4e8e\u662f\u4e4e=\u65bc\u662f\u4e4e +\u4e8e\u65f6=\u65bc\u6642 +\u4e8e\u68a8\u534e=\u65bc\u68a8\u83ef +\u65bc\u68a8\u83ef=\u65bc\u68a8\u83ef +\u4e8e\u4e50=\u65bc\u6a02 +\u4e8e\u6b64=\u65bc\u6b64 +\u65bc\u6c0f=\u65bc\u6c0f +\u4e8e\u6c11=\u65bc\u6c11 +\u4e8e\u6c34=\u65bc\u6c34 +\u4e8e\u6cd5=\u65bc\u6cd5 +\u4e8e\u6f5c\u53bf=\u65bc\u6f5b\u7e23 +\u4e8e\u706b=\u65bc\u706b +\u4e8e\u7109=\u65bc\u7109 +\u4e8e\u5899=\u65bc\u7246 +\u4e8e\u7269=\u65bc\u7269 +\u4e8e\u6bd5=\u65bc\u7562 +\u4e8e\u5c3d=\u65bc\u76e1 +\u4e8e\u76f2=\u65bc\u76f2 +\u4e8e\u7942=\u65bc\u7942 +\u4e8e\u7a46=\u65bc\u7a46 +\u4e8e\u7ec8=\u65bc\u7d42 +\u4e8e\u7f8e=\u65bc\u7f8e +\u4e8e\u8272=\u65bc\u8272 +\u4e8e\u83df=\u65bc\u83df +\u4e8e\u84dd=\u65bc\u85cd +\u4e8e\u884c=\u65bc\u884c +\u4e8e\u8877=\u65bc\u8877 +\u4e8e\u8be5=\u65bc\u8a72 +\u4e8e\u519c=\u65bc\u8fb2 +\u4e8e\u9014=\u65bc\u9014 +\u4e8e\u8fc7=\u65bc\u904e +\u4e8e\u9091=\u65bc\u9091 +\u4e8e\u4e11=\u65bc\u919c +\u4e8e\u91ce=\u65bc\u91ce +\u4e8e\u9646=\u65bc\u9678 +\u4e8e\uff10=\u65bc\uff10 +\u4e8e\uff11=\u65bc\uff11 +\u4e8e\uff12=\u65bc\uff12 +\u4e8e\uff13=\u65bc\uff13 +\u4e8e\uff14=\u65bc\uff14 +\u4e8e\uff15=\u65bc\uff15 +\u4e8e\uff16=\u65bc\uff16 +\u4e8e\uff17=\u65bc\uff17 +\u4e8e\uff18=\u65bc\uff18 +\u4e8e\uff19=\u65bc\uff19 +\u65bd\u820d=\u65bd\u6368 +\u65bd\u4e8e=\u65bd\u65bc +\u65bd\u820d\u4e4b\u9053=\u65bd\u820d\u4e4b\u9053 +\u65bd\u836f=\u65bd\u85e5 +\u65c1\u5f81\u535a\u5f15=\u65c1\u5fb5\u535a\u5f15 +\u65c1\u6ce8=\u65c1\u8a3b +\u65c5\u6e38\u4e1a=\u65c5\u6e38\u696d +\u65c5\u6e38=\u65c5\u904a +\u65cb\u5e72\u8f6c\u5764=\u65cb\u4e7e\u8f49\u5764 +\u65cb\u7ed5\u7740=\u65cb\u7e5e\u8457 +\u65cb\u56de=\u65cb\u8ff4 +\u65cf\u91cc=\u65cf\u88e1 +\u65d7\u6746=\u65d7\u6746 +\u65e5\u5360=\u65e5\u4f54 +\u65e5\u540e=\u65e5\u5f8c +\u65e5\u6652=\u65e5\u6652 +\u65e5\u5386=\u65e5\u66c6 +\u65e5\u5386\u53f2=\u65e5\u6b77\u53f2 +\u65e5\u5fd7=\u65e5\u8a8c +\u65f1\u5e72=\u65f1\u4e7e +\u6606\u4ed1\u5c71=\u6606\u5d19\u5c71 +\u5347\u5e73=\u6607\u5e73 +\u5347\u9633=\u6607\u967d +\u660a\u5929\u4e0d\u540a=\u660a\u5929\u4e0d\u5f14 +\u660e\u5f81=\u660e\u5fb5 +\u660e\u76ee\u5f20\u80c6=\u660e\u76ee\u5f35\u80c6 +\u660e\u7a97\u51c0\u51e0=\u660e\u7a97\u6de8\u51e0 +\u660e\u8303=\u660e\u7bc4 +\u660e\u91cc=\u660e\u88e1 +\u6613\u514b\u5236=\u6613\u524b\u5236 +\u6613\u4e8e=\u6613\u65bc +\u661f\u5386=\u661f\u66c6 +\u661f\u671f\u540e=\u661f\u671f\u5f8c +\u661f\u5386\u53f2=\u661f\u6b77\u53f2 +\u661f\u8fb0\u8868=\u661f\u8fb0\u9336 +\u6625\u5047\u91cc=\u6625\u5047\u88e1 +\u6625\u5929\u91cc=\u6625\u5929\u88e1 +\u6625\u836f=\u6625\u85e5 +\u6625\u6e38=\u6625\u904a +\u6625\u9999\u6597\u5b66=\u6625\u9999\u9b25\u5b78 +\u65f6\u949f=\u6642\u9418 +\u6643\u8361=\u6643\u8569 +\u664b\u5347=\u6649\u965e +\u6652\u5e72=\u6652\u4e7e +\u6652\u4f24=\u6652\u50b7 +\u6652\u56fe=\u6652\u5716 +\u6652\u56fe\u7eb8=\u6652\u5716\u7d19 +\u6652\u6210=\u6652\u6210 +\u6652\u6652=\u6652\u6652 +\u6652\u70df=\u6652\u7159 +\u6652\u79cd=\u6652\u7a2e +\u6652\u8863=\u6652\u8863 +\u6652\u9ed1=\u6652\u9ed1 +\u665a\u949f=\u665a\u9418 +\u665e\u53d1=\u665e\u9aee +\u6668\u949f=\u6668\u9418 +\u666e\u51ac\u51ac=\u666e\u9f15\u9f15 +\u666f\u81f4=\u666f\u7dfb +\u667e\u5e72=\u667e\u4e7e +\u6655\u8239\u836f=\u6688\u8239\u85e5 +\u6655\u8f66\u836f=\u6688\u8eca\u85e5 +\u6697\u5730\u91cc=\u6697\u5730\u88e1 +\u6697\u6c9f\u91cc=\u6697\u6e9d\u88e1 +\u6697\u91cc=\u6697\u88e1 +\u6697\u6597=\u6697\u9b25 +\u7545\u6e38=\u66a2\u904a +\u66b4\u655b\u6a2a\u5f81=\u66b4\u6582\u6a6b\u5fb5 +\u66b4\u6652=\u66b4\u6652 +\u5386\u5143=\u66c6\u5143 +\u5386\u547d=\u66c6\u547d +\u5386\u59cb=\u66c6\u59cb +\u5386\u5ba4=\u66c6\u5ba4 +\u5386\u5c3e=\u66c6\u5c3e +\u5386\u6570=\u66c6\u6578 +\u5386\u65e5=\u66c6\u65e5 +\u5386\u4e66=\u66c6\u66f8 +\u5386\u672c=\u66c6\u672c +\u5386\u6cd5=\u66c6\u6cd5 +\u5386\u7eaa=\u66c6\u7d00 +\u5386\u8c61=\u66c6\u8c61 +\u66dd\u6652=\u66dd\u6652 +\u6652\u8c37=\u66ec\u7a40 +\u66f0\u4e91=\u66f0\u4e91 +\u66f4\u4ec6\u96be\u6570=\u66f4\u50d5\u96e3\u6578 +\u66f4\u7b7e=\u66f4\u7c64 +\u66f4\u949f=\u66f4\u9418 +\u4e66\u540e=\u66f8\u5f8c +\u4e66\u5446\u5b50=\u66f8\u7343\u5b50 +\u4e66\u7b7e=\u66f8\u7c64 +\u66fc\u8c37\u4eba=\u66fc\u8c37\u4eba +\u66fe\u6734=\u66fe\u6a38 +\u6700\u591a=\u6700\u591a +\u6700\u540e=\u6700\u5f8c +\u6700\u91cc\u9762=\u6700\u88e1\u9762 +\u4f1a\u5360=\u6703\u4f54 +\u4f1a\u5360\u535c=\u6703\u5360\u535c +\u4f1a\u5e72=\u6703\u5e79 +\u4f1a\u540a=\u6703\u5f14 +\u4f1a\u540e=\u6703\u5f8c +\u4f1a\u91cc=\u6703\u88e1 +\u6708\u540e=\u6708\u5f8c +\u6708\u5386=\u6708\u66c6 +\u6708\u5386\u53f2=\u6708\u6b77\u53f2 +\u6708\u79bb\u4e8e\u6bd5=\u6708\u96e2\u65bc\u7562 +\u6708\u4e3d\u4e8e\u7b95=\u6708\u9e97\u65bc\u7b95 +\u6709\u4e8b\u4e4b\u65e0\u8303=\u6709\u4e8b\u4e4b\u7121\u7bc4 +\u6709\u4ec6=\u6709\u50d5 +\u6709\u591f\u8d5e=\u6709\u5920\u8b9a +\u6709\u5f81\u4f10=\u6709\u5f81\u4f10 +\u6709\u5f81\u6218=\u6709\u5f81\u6230 +\u6709\u5f81\u670d=\u6709\u5f81\u670d +\u6709\u5f81\u8ba8=\u6709\u5f81\u8a0e +\u6709\u5f81=\u6709\u5fb5 +\u6709\u6052\u8857=\u6709\u6052\u8857 +\u6709\u6816\u5ddd=\u6709\u6816\u5ddd +\u6709\u51c6=\u6709\u6e96 +\u6709\u68f1\u6709\u89d2=\u6709\u7a1c\u6709\u89d2 +\u6709\u53ea=\u6709\u96bb +\u6709\u4f59=\u6709\u9918 +\u6709\u53d1\u5934\u9640\u5bfa=\u6709\u9aee\u982d\u9640\u5bfa +\u670d\u4e8e=\u670d\u65bc +\u670d\u836f=\u670d\u85e5 +\u671b\u4e86\u671b=\u671b\u4e86\u671b +\u671b\u7740\u8868=\u671b\u8457\u9336 +\u671b\u7740\u949f=\u671b\u8457\u9418 +\u671b\u7740\u949f\u8868=\u671b\u8457\u9418\u9336 +\u671d\u4e7e\u5915\u60d5=\u671d\u4e7e\u5915\u60d5 +\u671d\u540e=\u671d\u5f8c +\u671d\u949f=\u671d\u9418 +\u6726\u80e7=\u6726\u6727 +\u8499\u80e7=\u6726\u6727 +\u6728\u5076\u620f\u624e=\u6728\u5076\u6232\u7d2e +\u6728\u6746=\u6728\u6746 +\u6728\u6750\u5e72\u998f=\u6728\u6750\u4e7e\u993e +\u6728\u6881=\u6728\u6a11 +\u6728\u5236=\u6728\u88fd +\u6728\u949f=\u6728\u9418 +\u672a\u5e72=\u672a\u4e7e +\u672b\u836f=\u672b\u85e5 +\u672c\u5f81=\u672c\u5fb5 +\u672f\u8d64=\u672e\u8d64 +\u6731\u4ed1\u8857=\u6731\u5d19\u8857 +\u6731\u5e86\u4f59=\u6731\u6176\u9918 +\u6731\u7406\u5b89\u5386=\u6731\u7406\u5b89\u66c6 +\u6731\u7406\u5b89\u5386\u53f2=\u6731\u7406\u5b89\u6b77\u53f2 +\u6746\u5b50=\u6746\u5b50 +\u674e\u9023\u6770=\u674e\u9023\u6770 +\u674e\u8fde\u6770=\u674e\u9023\u6770 +\u6750\u5e72=\u6750\u5e79 +\u6751\u5e84=\u6751\u838a +\u6751\u843d\u53d1=\u6751\u843d\u767c +\u6751\u91cc=\u6751\u88e1 +\u675c\u8001\u5fd7\u9053=\u675c\u8001\u8a8c\u9053 +\u675e\u5b8b\u65e0\u5f81=\u675e\u5b8b\u7121\u5fb5 +\u675f\u53d1=\u675f\u9aee +\u676f\u5e72=\u676f\u4e7e +\u676f\u9762=\u676f\u9eb5 +\u6770\u7279=\u6770\u7279 +\u4e1c\u5468\u949f=\u6771\u5468\u9418 +\u4e1c\u5cb3=\u6771\u5dbd +\u4e1c\u51b2\u897f\u7a81=\u6771\u885d\u897f\u7a81 +\u4e1c\u6e38=\u6771\u904a +\u677e\u5c71\u5e84=\u677e\u5c71\u5e84 +\u677e\u67cf\u540e\u51cb=\u677e\u67cf\u5f8c\u51cb +\u677f\u7740\u8138=\u677f\u8457\u81c9 +\u677f\u8361=\u677f\u8569 +\u6797\u5b8f\u5cb3=\u6797\u5b8f\u5dbd +\u6797\u90c1\u65b9=\u6797\u90c1\u65b9 +\u6797\u949f=\u6797\u9418 +\u679c\u5e72=\u679c\u4e7e +\u679c\u5b50\u5e72=\u679c\u5b50\u4e7e +\u679d\u4e0d\u5f97\u5927\u4e8e\u5e72=\u679d\u4e0d\u5f97\u5927\u65bc\u69a6 +\u679d\u5e72=\u679d\u5e79 +\u67af\u5e72=\u67af\u4e7e +\u67b6\u949f=\u67b6\u9418 +\u67d0\u53ea=\u67d0\u96bb +\u67d3\u6307\u4e8e=\u67d3\u6307\u65bc +\u67d3\u53d1=\u67d3\u9aee +\u67dc\u4e0a=\u67dc\u4e0a +\u67dc\u5b50=\u67dc\u5b50 +\u67dc\u67f3=\u67dc\u67f3 +\u67f1\u6881=\u67f1\u6a11 +\u67f3\u8bd2\u5f81=\u67f3\u8a52\u5fb5 +\u6816\u6816\u7687\u7687=\u6816\u6816\u7687\u7687 +\u6821\u51c6=\u6821\u6e96 +\u6821\u4ec7=\u6821\u8b8e +\u6838\u51c6\u7684=\u6838\u51c6\u7684 +\u683c\u4e8e=\u683c\u65bc +\u683c\u8303=\u683c\u7bc4 +\u683c\u91cc\u5386=\u683c\u91cc\u66c6 +\u683c\u6597=\u683c\u9b25 +\u6842\u5706\u5e72=\u6842\u5713\u4e7e +\u6845\u6746=\u6845\u6746 +\u6848\u53d1\u540e=\u6848\u767c\u5f8c +\u684c\u51e0=\u684c\u51e0 +\u684c\u5386=\u684c\u66c6 +\u684c\u5386\u53f2=\u684c\u6b77\u53f2 +\u6851\u5e72=\u6851\u4e7e +\u6881\u4e0a\u541b\u5b50=\u6881\u4e0a\u541b\u5b50 +\u6761\u5e72=\u689d\u5e79 +\u68a8\u5e72=\u68a8\u4e7e +\u68af\u51b2=\u68af\u885d +\u68b0\u7cfb=\u68b0\u7e6b +\u68b0\u6597=\u68b0\u9b25 +\u5f03\u820d=\u68c4\u6368 +\u68c9\u5236=\u68c9\u88fd +\u68d2\u5b50\u9762=\u68d2\u5b50\u9eb5 +\u67a3\u5e84=\u68d7\u838a +\u680b\u6881=\u68df\u6a11 +\u68eb\u6734=\u68eb\u6a38 +\u690d\u53d1=\u690d\u9aee +\u6930\u67a3\u5e72=\u6930\u68d7\u4e7e +\u695a\u5e84\u95ee\u9f0e=\u695a\u838a\u554f\u9f0e +\u695a\u5e84\u738b=\u695a\u838a\u738b +\u695a\u5e84\u7edd\u7f28=\u695a\u838a\u7d55\u7e93 +\u6862\u5e72=\u6968\u5e79 +\u4e1a\u4f59=\u696d\u9918 +\u69a8\u5e72=\u69a8\u4e7e +\u8363\u767b\u540e\u5ea7=\u69ae\u767b\u540e\u5ea7 +\u6760\u6746=\u69d3\u687f +\u4e50\u5668\u949f=\u6a02\u5668\u9418 +\u6a0a\u4e8e\u671f=\u6a0a\u65bc\u671f +\u6881\u4e0a=\u6a11\u4e0a +\u6881\u67f1=\u6a11\u67f1 +\u6807\u5fd7\u7740=\u6a19\u5fd7\u8457 +\u6807\u6746=\u6a19\u6746 +\u6807\u6807\u81f4\u81f4=\u6a19\u6a19\u81f4\u81f4 +\u6807\u51c6=\u6a19\u6e96 +\u6807\u7b7e=\u6a19\u7c64 +\u6807\u81f4=\u6a19\u7dfb +\u6807\u6ce8=\u6a19\u8a3b +\u6807\u5fd7=\u6a19\u8a8c +\u6a21\u68f1=\u6a21\u7a1c +\u6a21\u8303=\u6a21\u7bc4 +\u6a21\u8303\u68d2\u68d2\u5802=\u6a21\u8303\u68d2\u68d2\u5802 +\u6a21\u5236=\u6a21\u88fd +\u6837\u8303=\u6a23\u7bc4 +\u6a35\u91c7=\u6a35\u63a1 +\u6734\u4fee\u65af=\u6a38\u4fee\u65af +\u6734\u539a=\u6a38\u539a +\u6734\u5b66=\u6a38\u5b78 +\u6734\u5b9e=\u6a38\u5be6 +\u6734\u5ff5\u4ec1=\u6a38\u5ff5\u4ec1 +\u6734\u62d9=\u6a38\u62d9 +\u6734\u6a15=\u6a38\u6a15 +\u6734\u7236=\u6a38\u7236 +\u6734\u76f4=\u6a38\u76f4 +\u6734\u7d20=\u6a38\u7d20 +\u6734\u8bb7=\u6a38\u8a25 +\u6734\u8d28=\u6a38\u8cea +\u6734\u9119=\u6a38\u9119 +\u6734\u91cd=\u6a38\u91cd +\u6734\u91ce=\u6a38\u91ce +\u6734\u949d=\u6a38\u920d +\u6734\u964b=\u6a38\u964b +\u6734\u9a6c=\u6a38\u99ac +\u6734\u9c81=\u6a38\u9b6f +\u6811\u5e72=\u6a39\u69a6 +\u6811\u6881=\u6a39\u6a11 +\u6865\u6881=\u6a4b\u6a11 +\u6a5f\u68b0\u7cfb=\u6a5f\u68b0\u7cfb +\u673a\u68b0\u7cfb=\u6a5f\u68b0\u7cfb +\u673a\u68b0\u8868=\u6a5f\u68b0\u9336 +\u673a\u68b0\u949f=\u6a5f\u68b0\u9418 +\u673a\u68b0\u949f\u8868=\u6a5f\u68b0\u9418\u9336 +\u673a\u7ee3=\u6a5f\u7e61 +\u6a2a\u5f81\u66b4\u655b=\u6a6b\u5fb5\u66b4\u6582 +\u6a2a\u6746=\u6a6b\u6746 +\u6a2a\u6881=\u6a6b\u6a11 +\u6a2a\u51b2=\u6a6b\u885d +\u53f0\u5b50=\u6aaf\u5b50 +\u53f0\u5e03=\u6aaf\u5e03 +\u53f0\u706f=\u6aaf\u71c8 +\u53f0\u7403=\u6aaf\u7403 +\u53f0\u9762=\u6aaf\u9762 +\u67dc\u53f0=\u6ac3\u6aaf +\u6809\u53d1\u5de5=\u6adb\u9aee\u5de5 +\u680f\u6746=\u6b04\u6746 +\u6b32\u6d77\u96be\u586b=\u6b32\u6d77\u96e3\u586b +\u6b3a\u8499=\u6b3a\u77c7 +\u6b47\u540e=\u6b47\u5f8c +\u6b4c\u949f=\u6b4c\u9418 +\u6b27\u6e38=\u6b50\u904a +\u6b62\u54b3\u836f=\u6b62\u54b3\u85e5 +\u6b62\u4e8e=\u6b62\u65bc +\u6b62\u75db\u836f=\u6b62\u75db\u85e5 +\u6b62\u8840\u836f=\u6b62\u8840\u85e5 +\u6b63\u5728\u53f1\u54a4=\u6b63\u5728\u53f1\u54a4 +\u6b63\u5b98\u5e84=\u6b63\u5b98\u5e84 +\u6b63\u540e=\u6b63\u5f8c +\u6b63\u5f53\u7740=\u6b63\u7576\u8457 +\u6b64\u540e=\u6b64\u5f8c +\u6b66\u4e11=\u6b66\u4e11 +\u6b66\u6597=\u6b66\u9b25 +\u5c81\u807f\u4e91\u66ae=\u6b72\u807f\u4e91\u66ae +\u5f52\u5e76=\u6b78\u4f75 +\u5f52\u4e8e=\u6b78\u65bc +\u5f52\u4f59=\u6b78\u9918 +\u6b79\u6597=\u6b79\u9b25 +\u6b7b\u540e=\u6b7b\u5f8c +\u6b7b\u4e8e=\u6b7b\u65bc +\u6b7b\u80e1\u540c=\u6b7b\u80e1\u540c +\u6b7b\u91cc\u6c42\u751f=\u6b7b\u88e1\u6c42\u751f +\u6b7b\u91cc\u9003\u751f=\u6b7b\u88e1\u9003\u751f +\u6b96\u8c37=\u6b96\u7a40 +\u6b8b\u80b4=\u6b98\u80b4 +\u6b8b\u4f59=\u6b98\u9918 +\u50f5\u5c38=\u6bad\u5c4d +\u6bb7\u5e08\u725b\u6597=\u6bb7\u5e2b\u725b\u9b25 +\u6740\u866b\u836f=\u6bba\u87f2\u85e5 +\u58f3\u91cc=\u6bbc\u88e1 +\u6bbf\u540e=\u6bbf\u5f8c +\u6bbf\u949f\u81ea\u9e23=\u6bbf\u9418\u81ea\u9cf4 +\u6bc1\u4e8e=\u6bc0\u65bc +\u6bc1\u949f\u4e3a\u94ce=\u6bc0\u9418\u70ba\u9438 +\u6bb4\u6597=\u6bc6\u9b25 +\u6bcd\u8303=\u6bcd\u7bc4 +\u6bcd\u4e11=\u6bcd\u919c +\u6bcf\u6bcf\u53ea=\u6bcf\u6bcf\u53ea +\u6bcf\u53ea=\u6bcf\u96bb +\u6bd2\u836f=\u6bd2\u85e5 +\u6bd4\u5212=\u6bd4\u5283 +\u6bdb\u574f=\u6bdb\u574f +\u6bdb\u59dc=\u6bdb\u8591 +\u6bdb\u53d1=\u6bdb\u9aee +\u6beb\u5398=\u6beb\u91d0 +\u6beb\u53d1=\u6beb\u9aee +\u6c14\u5728\u5fc3\u91cc=\u6c23\u5728\u5fc3\u88e1 +\u6c14\u51b2\u6597\u725b=\u6c23\u6c96\u6597\u725b +\u6c14\u90c1=\u6c23\u9b31 +\u6c24\u90c1=\u6c24\u9b31 +\u6c34\u6765\u6c64\u91cc\u53bb=\u6c34\u4f86\u6e6f\u88e1\u53bb +\u6c34\u51c6=\u6c34\u6e96 +\u6c34\u91cc=\u6c34\u88e1 +\u6c34\u91cc\u9109=\u6c34\u91cc\u9109 +\u6c34\u91cc\u4e61=\u6c34\u91cc\u9109 +\u6c38\u5386=\u6c38\u66c6 +\u6c38\u5386\u53f2=\u6c38\u6b77\u53f2 +\u6c38\u5fd7\u4e0d\u5fd8=\u6c38\u8a8c\u4e0d\u5fd8 +\u6c42\u77e5\u6b32=\u6c42\u77e5\u617e +\u6c42\u7b7e=\u6c42\u7c64 +\u6c42\u9053\u4e8e\u76f2=\u6c42\u9053\u65bc\u76f2 +\u6c60\u91cc=\u6c60\u88e1 +\u6c61\u8511=\u6c61\u884a +\u6c72\u4e8e=\u6c72\u65bc +\u51b3\u6597=\u6c7a\u9b25 +\u6c88\u6dc0=\u6c88\u6fb1 +\u6c88\u7740=\u6c88\u8457 +\u6c88\u90c1=\u6c88\u9b31 +\u6c89\u6dc0=\u6c89\u6fb1 +\u6c89\u90c1=\u6c89\u9b31 +\u6ca1\u5e72\u6ca1\u51c0=\u6c92\u4e7e\u6c92\u6de8 +\u6ca1\u4e8b\u5e72=\u6c92\u4e8b\u5e79 +\u6ca1\u5e72=\u6c92\u5e79 +\u6ca1\u6298\u81f3=\u6c92\u647a\u81f3 +\u6ca1\u68a2\u5e72=\u6c92\u68a2\u5e79 +\u6ca1\u6837\u8303=\u6c92\u6a23\u7bc4 +\u6ca1\u51c6=\u6c92\u6e96 +\u6ca1\u836f=\u6c92\u85e5 +\u51b2\u51a0\u53d1\u6012=\u6c96\u51a0\u9aee\u6012 +\u6c99\u91cc\u6dd8\u91d1=\u6c99\u88e1\u6dd8\u91d1 +\u6cb3\u5cb3=\u6cb3\u5dbd +\u6cb3\u6d41\u6c47\u96c6=\u6cb3\u6d41\u532f\u96c6 +\u6cb3\u91cc=\u6cb3\u88e1 +\u6cb9\u6597=\u6cb9\u9b25 +\u6cb9\u9762=\u6cb9\u9eb5 +\u6cbb\u6108=\u6cbb\u7652 +\u6cbf\u6eaf=\u6cbf\u6cdd +\u6cd5\u5360=\u6cd5\u4f54 +\u6cd5\u81ea\u5236=\u6cd5\u81ea\u5236 +\u6cdb\u6e38=\u6cdb\u904a +\u6ce1\u5236=\u6ce1\u88fd +\u6ce1\u9762=\u6ce1\u9eb5 +\u6ce2\u68f1\u83dc=\u6ce2\u7a1c\u83dc +\u6ce2\u53d1\u85fb=\u6ce2\u9aee\u85fb +\u6ce5\u4e8e=\u6ce5\u65bc +\u6ce8\u4e91=\u6ce8\u4e91 +\u6cf0\u5c71\u6881\u6728=\u6cf0\u5c71\u6881\u6728 +\u6cf1\u90c1=\u6cf1\u9b31 +\u6cf3\u6c14\u949f=\u6cf3\u6c23\u9418 +\u6d04\u6e38=\u6d04\u904a +\u6d0b\u9762=\u6d0b\u9eb5 +\u6d12\u5bb6=\u6d12\u5bb6 +\u6d12\u626b=\u6d12\u6383 +\u6d12\u6c34=\u6d12\u6c34 +\u6d12\u6d12=\u6d12\u6d12 +\u6d12\u6dc5=\u6d12\u6dc5 +\u6d12\u6da4=\u6d12\u6ecc +\u6d12\u6fef=\u6d12\u6fef +\u6d12\u7136=\u6d12\u7136 +\u6d12\u8131=\u6d12\u812b +\u6d17\u70bc=\u6d17\u934a +\u6d17\u7ec3=\u6d17\u934a +\u6d17\u53d1=\u6d17\u9aee +\u6d1b\u949f\u4e1c\u5e94=\u6d1b\u9418\u6771\u61c9 +\u6cc4\u6b32=\u6d29\u617e +\u6d2a\u8303=\u6d2a\u7bc4 +\u6d2a\u9002=\u6d2a\u9002 +\u6d2a\u949f=\u6d2a\u9418 +\u6c79\u6d8c=\u6d36\u6e67 +\u6d3e\u56e2\u53c2\u52a0=\u6d3e\u5718\u53c3\u52a0 +\u6d41\u5f81=\u6d41\u5fb5 +\u6d41\u4e8e=\u6d41\u65bc +\u6d41\u8361=\u6d41\u8569 +\u6d41\u98ce\u4f59\u4fd7=\u6d41\u98a8\u9918\u4fd7 +\u6d41\u98ce\u4f59\u97f5=\u6d41\u98a8\u9918\u97fb +\u6d69\u6d69\u8361\u8361=\u6d69\u6d69\u8569\u8569 +\u6d69\u8361=\u6d69\u8569 +\u6d6a\u7434\u8868=\u6d6a\u7434\u9336 +\u6d6a\u8361=\u6d6a\u8569 +\u6d6a\u6e38=\u6d6a\u904a +\u6d6e\u5938=\u6d6e\u5938 +\u6d6e\u4e8e=\u6d6e\u65bc +\u6d6e\u6e38\u52a8\u7269=\u6d6e\u6e38\u52d5\u7269 +\u6d6e\u6e38\u690d\u7269=\u6d6e\u6e38\u690d\u7269 +\u6d6e\u6e38\u751f\u7269=\u6d6e\u6e38\u751f\u7269 +\u6d6e\u8361=\u6d6e\u8569 +\u6d6e\u6e38=\u6d6e\u904a +\u6d6e\u677e=\u6d6e\u9b06 +\u6d77\u4e0a\u5e03\u96f7=\u6d77\u4e0a\u4f48\u96f7 +\u6d77\u5e72=\u6d77\u4e7e +\u6d77\u6e7e\u5e03\u96f7=\u6d77\u7063\u4f48\u96f7 +\u6d82\u58ee\u52cb=\u6d82\u58ef\u52f3 +\u6d82\u58ef\u52f3=\u6d82\u58ef\u52f3 +\u6d82\u8b39\u7533=\u6d82\u8b39\u7533 +\u6d82\u8c28\u7533=\u6d82\u8b39\u7533 +\u6d82\u9192\u54f2=\u6d82\u9192\u54f2 +\u6d82\u9e3f\u94a6=\u6d82\u9d3b\u6b3d +\u6d82\u9d3b\u6b3d=\u6d82\u9d3b\u6b3d +\u6d88\u708e\u836f=\u6d88\u708e\u85e5 +\u6d88\u80bf\u836f=\u6d88\u816b\u85e5 +\u6db2\u6676\u8868=\u6db2\u6676\u9336 +\u6db3\u8499=\u6db3\u6fdb +\u6db8\u5e72=\u6db8\u4e7e +\u51c9\u9762=\u6dbc\u9eb5 +\u6dcb\u4f59\u571f=\u6dcb\u9918\u571f +\u6dd1\u8303=\u6dd1\u7bc4 +\u6cea\u5e72=\u6dda\u4e7e +\u6cea\u5982\u6cc9\u6d8c=\u6dda\u5982\u6cc9\u6e67 +\u6de1\u4e8e=\u6de1\u65bc +\u6de1\u8499\u8499=\u6de1\u6fdb\u6fdb +\u6de1\u6731=\u6de1\u7843 +\u51c0\u4f59=\u6de8\u9918 +\u51c0\u53d1=\u6de8\u9aee +\u6deb\u6b32=\u6deb\u617e +\u6deb\u8361=\u6deb\u8569 +\u6dec\u70bc=\u6dec\u934a +\u6df1\u5c71\u4f55\u5904\u949f=\u6df1\u5c71\u4f55\u8655\u9418 +\u6df3\u6734=\u6df3\u6a38 +\u6e0a\u6df3\u5cb3\u5cd9=\u6df5\u6df3\u5dbd\u5cd9 +\u6d45\u6dc0=\u6dfa\u6fb1 +\u6e05\u5fc3\u5be1\u6b32=\u6e05\u5fc3\u5be1\u6b32 +\u6e05\u6c64\u6302\u9762=\u6e05\u6e6f\u639b\u9eb5 +\u51cf\u80a5\u836f=\u6e1b\u80a5\u85e5 +\u6e20\u51b2=\u6e20\u885d +\u6e2f\u5236=\u6e2f\u88fd +\u6e38\u7267\u6c11\u65cf=\u6e38\u7267\u6c11\u65cf +\u6d51\u6734=\u6e3e\u6a38 +\u6d51\u4e2a=\u6e3e\u7b87 +\u51d1\u5408\u7740=\u6e4a\u5408\u8457 +\u6e56\u91cc=\u6e56\u88e1 +\u6e58\u7ee3=\u6e58\u7e61 +\u6e58\u7d2f=\u6e58\u7e8d +\u6e5f\u6f66\u751f\u82f9=\u6e5f\u6f66\u751f\u82f9 +\u6d8c\u4e0a=\u6e67\u4e0a +\u6d8c\u6765=\u6e67\u4f86 +\u6d8c\u5165=\u6e67\u5165 +\u6d8c\u51fa=\u6e67\u51fa +\u6d8c\u5411=\u6e67\u5411 +\u6d8c\u6cc9=\u6e67\u6cc9 +\u6d8c\u73b0=\u6e67\u73fe +\u6d8c\u8d77=\u6e67\u8d77 +\u6d8c\u8fdb=\u6e67\u9032 +\u6e6e\u90c1=\u6e6e\u9b31 +\u6c64\u4e0b\u9762=\u6e6f\u4e0b\u9eb5 +\u6c64\u56e2=\u6e6f\u7cf0 +\u6c64\u836f=\u6e6f\u85e5 +\u6c64\u9762=\u6e6f\u9eb5 +\u6e90\u4e8e=\u6e90\u65bc +\u51c6\u4e0d\u51c6=\u6e96\u4e0d\u6e96 +\u51c6\u4f8b=\u6e96\u4f8b +\u51c6\u4fdd=\u6e96\u4fdd +\u51c6\u5907=\u6e96\u5099 +\u51c6\u513f=\u6e96\u5152 +\u51c6\u5206\u5b50=\u6e96\u5206\u5b50 +\u51c6\u5219=\u6e96\u5247 +\u51c6\u5676\u5c14=\u6e96\u5676\u723e +\u51c6\u5b9a=\u6e96\u5b9a +\u51c6\u5e73\u539f=\u6e96\u5e73\u539f +\u51c6\u5ea6=\u6e96\u5ea6 +\u51c6\u5f0f=\u6e96\u5f0f +\u51c6\u62ff\u7763=\u6e96\u62ff\u7763 +\u51c6\u636e=\u6e96\u64da +\u51c6\u62df=\u6e96\u64ec +\u51c6\u65b0\u5a18=\u6e96\u65b0\u5a18 +\u51c6\u65b0\u90ce=\u6e96\u65b0\u90ce +\u51c6\u661f=\u6e96\u661f +\u51c6\u662f=\u6e96\u662f +\u51c6\u65f6=\u6e96\u6642 +\u51c6\u4f1a=\u6e96\u6703 +\u51c6\u51b3\u8d5b=\u6e96\u6c7a\u8cfd +\u51c6\u7684=\u6e96\u7684 +\u51c6\u786e=\u6e96\u78ba +\u51c6\u7ebf=\u6e96\u7dda +\u51c6\u7ef3=\u6e96\u7e69 +\u51c6\u8bdd=\u6e96\u8a71 +\u51c6\u8c31=\u6e96\u8b5c +\u51c6\u8d27\u5e01=\u6e96\u8ca8\u5e63 +\u51c6\u5934=\u6e96\u982d +\u51c6\u70b9=\u6e96\u9ede +\u6e9f\u8499=\u6e9f\u6fdb +\u6ea2\u4e8e=\u6ea2\u65bc +\u6eb2\u9762=\u6eb2\u9eb5 +\u6eba\u4e8e=\u6eba\u65bc +\u6ec3\u90c1=\u6ec3\u9b31 +\u6ed1\u501f=\u6ed1\u85c9 +\u6c47\u4e30=\u6ed9\u8c50 +\u5364\u5473=\u6ef7\u5473 +\u5364\u6c34=\u6ef7\u6c34 +\u5364\u6c41=\u6ef7\u6c41 +\u5364\u6e56=\u6ef7\u6e56 +\u5364\u8089=\u6ef7\u8089 +\u5364\u83dc=\u6ef7\u83dc +\u5364\u86cb=\u6ef7\u86cb +\u5364\u5236=\u6ef7\u88fd +\u5364\u9e21=\u6ef7\u96de +\u5364\u9762=\u6ef7\u9eb5 +\u6ee1\u62fc\u81ea\u5c3d=\u6eff\u62da\u81ea\u76e1 +\u6ee1\u6ee1\u5f53\u5f53=\u6eff\u6eff\u7576\u7576 +\u6ee1\u5934\u6d0b\u53d1=\u6eff\u982d\u6d0b\u9aee +\u6f02\u8361=\u6f02\u8569 +\u6f15\u633d=\u6f15\u8f13 +\u6ca4\u90c1=\u6f1a\u9b31 +\u6c49\u5f25\u767b\u949f=\u6f22\u5f4c\u767b\u9418 +\u6c49\u5f25\u767b\u949f\u8868\u516c\u53f8=\u6f22\u5f4c\u767b\u9418\u9336\u516c\u53f8 +\u6f2b\u6e38=\u6f2b\u904a +\u6f5c\u610f\u8bc6\u91cc=\u6f5b\u610f\u8b58\u88e1 +\u6f5c\u6c34\u8868=\u6f5b\u6c34\u9336 +\u6f5c\u6c34\u949f=\u6f5b\u6c34\u9418 +\u6f5c\u6c34\u949f\u8868=\u6f5b\u6c34\u9418\u9336 +\u6f6d\u91cc=\u6f6d\u88e1 +\u6f6e\u6d8c=\u6f6e\u6e67 +\u6e83\u4e8e=\u6f70\u65bc +\u6f84\u6fb9\u7cbe\u81f4=\u6f84\u6fb9\u7cbe\u81f4 +\u6f92\u8499=\u6f92\u6fdb +\u6cfd\u6e17\u6f13\u800c\u4e0b\u964d=\u6fa4\u6ef2\u7055\u800c\u4e0b\u964d +\u6dc0\u4e43\u4e0d\u8015\u4e4b\u5730=\u6fb1\u4e43\u4e0d\u8015\u4e4b\u5730 +\u6dc0\u5317\u7247=\u6fb1\u5317\u7247 +\u6dc0\u5c71=\u6fb1\u5c71 +\u6dc0\u6dc0=\u6fb1\u6fb1 +\u6dc0\u79ef=\u6fb1\u7a4d +\u6dc0\u7c89=\u6fb1\u7c89 +\u6dc0\u89e3\u7269=\u6fb1\u89e3\u7269 +\u6dc0\u8c13\u4e4b\u6ed3=\u6fb1\u8b02\u4e4b\u6ed3 +\u6fb9\u53f0=\u6fb9\u81fa +\u6fb9\u8361=\u6fb9\u8569 +\u6fc0\u8361=\u6fc0\u8569 +\u6d53\u53d1=\u6fc3\u9aee +\u8499\u6c5c=\u6fdb\u6c5c +\u8499\u8499\u7ec6\u96e8=\u6fdb\u6fdb\u7d30\u96e8 +\u8499\u96fe=\u6fdb\u9727 +\u8499\u677e\u96e8=\u6fdb\u9b06\u96e8 +\u8499\u9e3f=\u6fdb\u9d3b +\u6cfb\u836f=\u7009\u85e5 +\u6c88\u5409\u7ebf=\u700b\u5409\u7dda +\u6c88\u5c71\u7ebf=\u700b\u5c71\u7dda +\u6c88\u5dde=\u700b\u5dde +\u6c88\u6c34=\u700b\u6c34 +\u6c88\u6cb3=\u700b\u6cb3 +\u6c88\u6d77=\u700b\u6d77 +\u6c88\u6d77\u94c1\u8def=\u700b\u6d77\u9435\u8def +\u6c88\u9633=\u700b\u967d +\u6f47\u6d12=\u701f\u6d12 +\u5f25\u5c71\u904d\u91ce=\u7030\u5c71\u904d\u91ce +\u5f25\u6f2b=\u7030\u6f2b +\u5f25\u6f2b\u7740=\u7030\u6f2b\u8457 +\u5f25\u5f25=\u7030\u7030 +\u704c\u836f=\u704c\u85e5 +\u6f13\u6c5f=\u7055\u6c5f +\u6f13\u6e58=\u7055\u6e58 +\u6f13\u7136=\u7055\u7136 +\u6ee9\u6d82=\u7058\u6d82 +\u706b\u5e76\u975e=\u706b\u4e26\u975e +\u706b\u5e76=\u706b\u4f75 +\u706b\u62fc=\u706b\u62da +\u706b\u6298\u5b50=\u706b\u647a\u5b50 +\u706b\u7bad\u5e03\u96f7=\u706b\u7bad\u4f48\u96f7 +\u706b\u7b7e=\u706b\u7c64 +\u706b\u836f=\u706b\u85e5 +\u7070\u8499=\u7070\u6fdb +\u7070\u8499\u8499=\u7070\u6fdb\u6fdb +\u7086\u9762=\u7086\u9eb5 +\u7092\u9762=\u7092\u9eb5 +\u70ae\u5236=\u70ae\u88fd +\u70b8\u836f=\u70b8\u85e5 +\u70b8\u9171\u9762=\u70b8\u91ac\u9eb5 +\u4e3a\u540e=\u70ba\u5f8c +\u4e3a\u51c6=\u70ba\u6e96 +\u4e3a\u7740=\u70ba\u8457 +\u4e4c\u53d1=\u70cf\u9aee +\u4e4c\u9f99\u9762=\u70cf\u9f8d\u9eb5 +\u70d8\u5e72=\u70d8\u4e7e +\u70d8\u5236=\u70d8\u88fd +\u70e4\u5e72=\u70e4\u4e7e +\u70e4\u6652=\u70e4\u6652 +\u7119\u5e72=\u7119\u4e7e +\u65e0\u540e=\u7121\u5f8c +\u65e0\u5f81\u4e0d\u4fe1=\u7121\u5fb5\u4e0d\u4fe1 +\u65e0\u4e1a\u6e38\u6c11=\u7121\u696d\u6e38\u6c11 +\u65e0\u6881\u697c\u76d6=\u7121\u6a11\u6a13\u84cb +\u65e0\u6cd5\u514b\u5236=\u7121\u6cd5\u524b\u5236 +\u65e0\u836f\u53ef\u6551=\u7121\u85e5\u53ef\u6551 +\u7121\u8a00\u4e0d\u4ec7=\u7121\u8a00\u4e0d\u8b8e +\u65e0\u4f59=\u7121\u9918 +\u7136\u540e=\u7136\u5f8c +\u7136\u8eab\u6b7b\u624d\u6570\u6708\u8033=\u7136\u8eab\u6b7b\u7e94\u6578\u6708\u8033 +\u70bc\u836f=\u7149\u85e5 +\u70bc\u5236=\u7149\u88fd +\u714e\u836f=\u714e\u85e5 +\u714e\u9762=\u714e\u9eb5 +\u70df\u5377=\u7159\u6372 +\u70df\u6597\u4e1d=\u7159\u6597\u7d72 +\u7167\u5360=\u7167\u4f54 +\u7167\u5165\u7b7e=\u7167\u5165\u7c64 +\u7167\u51c6=\u7167\u6e96 +\u7167\u76f8\u5e72\u7247=\u7167\u76f8\u4e7e\u7247 +\u7168\u5e72=\u7168\u4e7e +\u716e\u9762=\u716e\u9eb5 +\u8367\u90c1=\u7192\u9b31 +\u71ac\u836f=\u71ac\u85e5 +\u7096\u836f=\u71c9\u85e5 +\u71ce\u53d1=\u71ce\u9aee +\u70e7\u5e72=\u71d2\u4e7e +\u71d5\u51e0=\u71d5\u51e0 +\u71d5\u5de2\u4e8e\u5e55=\u71d5\u5de2\u65bc\u5e55 +\u71d5\u71d5\u4e8e\u98de=\u71d5\u71d5\u4e8e\u98db +\u71d5\u6e38=\u71d5\u904a +\u70eb\u4e00\u4e2a\u53d1=\u71d9\u4e00\u500b\u9aee +\u70eb\u4e00\u6b21\u53d1=\u71d9\u4e00\u6b21\u9aee +\u70eb\u4e2a\u53d1=\u71d9\u500b\u9aee +\u70eb\u5b8c\u53d1=\u71d9\u5b8c\u9aee +\u70eb\u6b21\u53d1=\u71d9\u6b21\u9aee +\u70eb\u53d1=\u71d9\u9aee +\u70eb\u9762=\u71d9\u9eb5 +\u8425\u5e72=\u71df\u5e79 +\u70ec\u4f59=\u71fc\u9918 +\u4e89\u5148\u6050\u540e=\u722d\u5148\u6050\u5f8c +\u4e89\u5947\u6597\u598d=\u722d\u5947\u9b25\u598d +\u4e89\u5947\u6597\u5f02=\u722d\u5947\u9b25\u7570 +\u4e89\u5947\u6597\u8273=\u722d\u5947\u9b25\u8c54 +\u4e89\u598d\u6597\u5947=\u722d\u598d\u9b25\u5947 +\u4e89\u598d\u6597\u8273=\u722d\u598d\u9b25\u8c54 +\u4e89\u7ea2\u6597\u7d2b=\u722d\u7d05\u9b25\u7d2b +\u4e89\u6597=\u722d\u9b25 +\u7230\u5b9a\u7965\u5386=\u7230\u5b9a\u7965\u53a4 +\u723d\u8361=\u723d\u8569 +\u5c14\u51ac\u5347=\u723e\u51ac\u965e +\u5c14\u540e=\u723e\u5f8c +\u5899\u91cc=\u7246\u88e1 +\u7247\u8a00\u53ea\u8bed=\u7247\u8a00\u96bb\u8a9e +\u7259\u7b7e=\u7259\u7c64 +\u725b\u540e=\u725b\u5f8c +\u725b\u8089\u9762=\u725b\u8089\u9eb5 +\u725b\u53ea=\u725b\u96bb +\u7269\u6b32=\u7269\u617e +\u7279\u5236\u4f4f=\u7279\u5236\u4f4f +\u7279\u5236\u5b9a=\u7279\u5236\u5b9a +\u7279\u5236\u6b62=\u7279\u5236\u6b62 +\u7279\u5236\u8ba2=\u7279\u5236\u8a02 +\u7279\u5f81=\u7279\u5fb5 +\u7279\u6548\u836f=\u7279\u6548\u85e5 +\u7279\u5236=\u7279\u88fd +\u7275\u4e00\u53d1=\u727d\u4e00\u9aee +\u7275\u6302=\u727d\u6302 +\u7275\u7cfb=\u727d\u7e6b +\u8366\u786e=\u7296\u786e +\u72c2\u5360=\u72c2\u4f54 +\u72c2\u5e76\u6f6e=\u72c2\u4f75\u6f6e +\u72c3\u4e8e=\u72c3\u65bc +\u72d0\u501f\u864e\u5a01=\u72d0\u85c9\u864e\u5a01 +\u72d7\u5634\u91cc=\u72d7\u5634\u88e1 +\u731b\u4e8e=\u731b\u65bc +\u731b\u51b2=\u731b\u885d +\u731c\u4e09\u5212\u4e94=\u731c\u4e09\u5212\u4e94 +\u72b9\u5982\u8868=\u7336\u5982\u9336 +\u72b9\u5982\u949f=\u7336\u5982\u9418 +\u72b9\u5982\u949f\u8868=\u7336\u5982\u9418\u9336 +\u5446\u4e32\u4e86\u76ae=\u7343\u4e32\u4e86\u76ae +\u5446\u4e8b=\u7343\u4e8b +\u5446\u4eba=\u7343\u4eba +\u5446\u5b50=\u7343\u5b50 +\u5446\u6027=\u7343\u6027 +\u5446\u60f3=\u7343\u60f3 +\u5446\u61a8\u5446=\u7343\u61a8\u7343 +\u5446\u6839=\u7343\u6839 +\u5446\u6c14=\u7343\u6c23 +\u5446\u6ede=\u7343\u6eef +\u5446\u5446=\u7343\u7343 +\u5446\u75f4=\u7343\u75f4 +\u5446\u78d5=\u7343\u78d5 +\u5446\u7b49=\u7343\u7b49 +\u5446\u8111=\u7343\u8166 +\u5446\u7740=\u7343\u8457 +\u5446\u8bdd=\u7343\u8a71 +\u5446\u5934=\u7343\u982d +\u5956\u676f=\u734e\u76c3 +\u72ec\u5360=\u7368\u4f54 +\u72ec\u5360\u9ccc\u5934=\u7368\u4f54\u9c32\u982d +\u72ec\u8f9f\u8e4a\u5f84=\u7368\u95e2\u8e4a\u5f91 +\u83b7\u532a\u5176\u4e11=\u7372\u532a\u5176\u919c +\u517d\u6b32=\u7378\u617e +\u732e\u4e11=\u737b\u919c +\u7387\u56e2\u53c2\u52a0=\u7387\u5718\u53c3\u52a0 +\u7389\u5386=\u7389\u66c6 +\u7389\u5386\u53f2=\u7389\u6b77\u53f2 +\u738b\u5e84=\u738b\u838a +\u738b\u4f59\u9c7c=\u738b\u9918\u9b5a +\u73cd\u80b4\u5f02\u9994=\u73cd\u80b4\u7570\u994c +\u73ed\u91cc=\u73ed\u88e1 +\u73b0\u4e8e=\u73fe\u65bc +\u7403\u6746=\u7403\u6746 +\u7406\u4e00\u4e2a\u53d1=\u7406\u4e00\u500b\u9aee +\u7406\u4e00\u6b21\u53d1=\u7406\u4e00\u6b21\u9aee +\u7406\u4e2a\u53d1=\u7406\u500b\u9aee +\u7406\u5b8c\u53d1=\u7406\u5b8c\u9aee +\u7406\u6b21\u53d1=\u7406\u6b21\u9aee +\u7406\u53d1=\u7406\u9aee +\u7434\u949f=\u7434\u9418 +\u745e\u5f81=\u745e\u5fb5 +\u7476\u7b7e=\u7464\u7c64 +\u73af\u6e38=\u74b0\u904a +\u74ee\u5b89=\u7515\u5b89 +\u751a\u4e8e=\u751a\u65bc +\u751a\u4e48=\u751a\u9ebc +\u751c\u6c34\u9762=\u751c\u6c34\u9eb5 +\u751c\u9762\u9171=\u751c\u9eb5\u91ac +\u751f\u529b\u9762=\u751f\u529b\u9eb5 +\u751f\u4e8e=\u751f\u65bc +\u751f\u6b96\u6d04\u6e38=\u751f\u6b96\u6d04\u6e38 +\u751f\u7269\u949f=\u751f\u7269\u9418 +\u751f\u53d1\u751f=\u751f\u767c\u751f +\u751f\u59dc=\u751f\u8591 +\u751f\u9508=\u751f\u93fd +\u751f\u53d1=\u751f\u9aee +\u4ea7\u5375\u6d04\u6e38=\u7522\u5375\u6d04\u6e38 +\u4ea7\u540e=\u7522\u5f8c +\u7528\u836f=\u7528\u85e5 +\u7529\u53d1=\u7529\u9aee +\u7530\u8c37=\u7530\u7a40 +\u7530\u5e84=\u7530\u838a +\u7530\u91cc=\u7530\u88e1 +\u7531\u4f59=\u7531\u4f59 +\u7531\u4e8e=\u7531\u65bc +\u7531\u8868\u53ca\u91cc=\u7531\u8868\u53ca\u88e1 +\u7537\u4f63\u4eba=\u7537\u4f63\u4eba +\u7537\u4ec6=\u7537\u50d5 +\u7537\u7528\u8868=\u7537\u7528\u9336 +\u754f\u4e8e=\u754f\u65bc +\u7559\u540e=\u7559\u5f8c +\u7559\u53d1=\u7559\u9aee +\u6bd5\u4e8e=\u7562\u65bc +\u6bd5\u4e1a\u4e8e=\u7562\u696d\u65bc +\u6bd5\u751f\u53d1\u5c55=\u7562\u751f\u767c\u5c55 +\u753b\u7740=\u756b\u8457 +\u5f53\u5bb6\u624d\u77e5\u67f4\u7c73\u4ef7=\u7576\u5bb6\u7e94\u77e5\u67f4\u7c73\u50f9 +\u5f53\u51c6=\u7576\u6e96 +\u5f53\u5f53\u4e01\u4e01=\u7576\u7576\u4e01\u4e01 +\u5f53\u7740=\u7576\u8457 +\u758f\u677e=\u758f\u9b06 +\u7591\u7cfb=\u7591\u4fc2 +\u7591\u51f6=\u7591\u5147 +\u75b2\u4e8e=\u75b2\u65bc +\u75b2\u56f0=\u75b2\u774f +\u75c5\u540e=\u75c5\u5f8c +\u75c5\u540e\u521d\u6108=\u75c5\u5f8c\u521d\u7652 +\u75c5\u5f81=\u75c5\u5fb5 +\u75c5\u6108=\u75c5\u7652 +\u75c5\u4f59=\u75c5\u9918 +\u75c7\u5019\u7fa4=\u75c7\u5019\u7fa4 +\u75ca\u6108=\u75ca\u7652 +\u75d2\u75b9=\u75d2\u75b9 +\u75d2\u75d2=\u75d2\u75d2 +\u75d5\u8ff9=\u75d5\u8ff9 +\u75f4\u5446\u75c7=\u75f4\u5446\u75c7 +\u75f4\u5446=\u75f4\u7343 +\u6108\u5408=\u7652\u5408 +\u75c7\u5019=\u7665\u5019 +\u75c7\u72b6=\u7665\u72c0 +\u75c7\u7ed3=\u7665\u7d50 +\u7678\u4e11=\u7678\u4e11 +\u53d1\u5e72=\u767c\u4e7e +\u53d1\u6c57\u836f=\u767c\u6c57\u85e5 +\u53d1\u5446=\u767c\u7343 +\u53d1\u8499=\u767c\u77c7 +\u53d1\u7b7e=\u767c\u7c64 +\u53d1\u5e84=\u767c\u838a +\u53d1\u7740=\u767c\u8457 +\u53d1\u8868=\u767c\u8868 +\u767c\u8868=\u767c\u8868 +\u53d1\u677e=\u767c\u9b06 +\u53d1\u9762=\u767c\u9eb5 +\u767d\u5e72=\u767d\u4e7e +\u767d\u5154\u64e3\u836f=\u767d\u5154\u64e3\u85e5 +\u767d\u5e72\u513f=\u767d\u5e72\u5152 +\u767d\u672f=\u767d\u672e +\u767d\u6734=\u767d\u6a38 +\u767d\u51c0\u9762\u76ae=\u767d\u6de8\u9762\u76ae +\u767d\u53d1\u5176\u4e8b=\u767d\u767c\u5176\u4e8b +\u767d\u76ae\u677e=\u767d\u76ae\u677e +\u767d\u7c89\u9762=\u767d\u7c89\u9eb5 +\u767d\u91cc\u900f\u7ea2=\u767d\u88e1\u900f\u7d05 +\u767d\u53d1=\u767d\u9aee +\u767d\u80e1=\u767d\u9b0d +\u767d\u9709=\u767d\u9ef4 +\u767e\u53ea\u53ef=\u767e\u53ea\u53ef +\u767e\u53ea\u591f=\u767e\u53ea\u5920 +\u767e\u53ea\u6015=\u767e\u53ea\u6015 +\u767e\u53ea\u8db3\u591f=\u767e\u53ea\u8db3\u5920 +\u767e\u591a\u53ea=\u767e\u591a\u96bb +\u767e\u5929\u540e=\u767e\u5929\u5f8c +\u767e\u62d9\u5343\u4e11=\u767e\u62d9\u5343\u919c +\u767e\u8c37=\u767e\u7a40 +\u767e\u624e=\u767e\u7d2e +\u767e\u82b1\u5386=\u767e\u82b1\u66c6 +\u767e\u82b1\u5386\u53f2=\u767e\u82b1\u6b77\u53f2 +\u767e\u836f\u4e4b\u957f=\u767e\u85e5\u4e4b\u9577 +\u767e\u70bc=\u767e\u934a +\u767e\u53ea=\u767e\u96bb +\u767e\u4f59=\u767e\u9918 +\u7684\u514b\u5236=\u7684\u524b\u5236 +\u7684\u949f=\u7684\u9418 +\u7684\u949f\u8868=\u7684\u9418\u9336 +\u7686\u53ef\u4f5c\u6dc0=\u7686\u53ef\u4f5c\u6fb1 +\u7686\u51c6=\u7686\u6e96 +\u7687\u5929\u540e\u571f=\u7687\u5929\u540e\u571f +\u7687\u5386=\u7687\u66c6 +\u7687\u6781\u5386=\u7687\u6975\u66c6 +\u7687\u6781\u5386\u53f2=\u7687\u6975\u6b77\u53f2 +\u7687\u5386\u53f2=\u7687\u6b77\u53f2 +\u7687\u5e84=\u7687\u838a +\u7693\u53d1=\u7693\u9aee +\u76ae\u5236\u670d=\u76ae\u5236\u670d +\u76ae\u91cc\u9633\u79cb=\u76ae\u88cf\u967d\u79cb +\u76ae\u91cc\u6625\u79cb=\u76ae\u88e1\u6625\u79cb +\u76ae\u5236=\u76ae\u88fd +\u76ae\u677e=\u76ae\u9b06 +\u76b1\u522b=\u76ba\u5f46 +\u76b1\u6298=\u76ba\u647a +\u76c6\u540a=\u76c6\u5f14 +\u76c8\u4f59=\u76c8\u9918 +\u76ca\u4e8e=\u76ca\u65bc +\u76d2\u91cc=\u76d2\u88e1 +\u76db\u8d5e=\u76db\u8b9a +\u76d7\u91c7=\u76dc\u63a1 +\u76d7\u949f=\u76dc\u9418 +\u5c3d\u91cf\u514b\u5236=\u76e1\u91cf\u524b\u5236 +\u76d1\u5236=\u76e3\u88fd +\u76d8\u91cc=\u76e4\u88e1 +\u76d8\u56de=\u76e4\u8ff4 +\u5362\u68f1\u4f3d=\u76e7\u7a1c\u4f3d +\u76f2\u5e72=\u76f2\u5e79 +\u76f4\u63a5\u53c2\u4e0e=\u76f4\u63a5\u53c3\u4e0e +\u76f4\u4e8e=\u76f4\u65bc +\u76f4\u51b2=\u76f4\u885d +\u76f8\u5e76=\u76f8\u4f75 +\u76f8\u514b\u5236=\u76f8\u514b\u5236 +\u76f8\u514b\u670d=\u76f8\u514b\u670d +\u76f8\u514b=\u76f8\u524b +\u76f8\u5e72=\u76f8\u5e72 +\u76f8\u4e8e=\u76f8\u65bc +\u76f8\u51b2=\u76f8\u885d +\u76f8\u6597=\u76f8\u9b25 +\u770b\u51c6=\u770b\u6e96 +\u770b\u7740\u8868=\u770b\u8457\u9336 +\u770b\u7740\u949f=\u770b\u8457\u9418 +\u770b\u7740\u949f\u8868=\u770b\u8457\u9418\u9336 +\u770b\u8868=\u770b\u9336 +\u770b\u949f=\u770b\u9418 +\u771f\u51f6=\u771f\u5147 +\u771f\u4e2a=\u771f\u7b87 +\u773c\u5e18=\u773c\u5e18 +\u773c\u7736\u91cc=\u773c\u7736\u88e1 +\u773c\u836f=\u773c\u85e5 +\u773c\u91cc=\u773c\u88e1 +\u56f0\u4e4f=\u774f\u4e4f +\u56f0\u5026=\u774f\u5026 +\u56f0\u89c9=\u774f\u89ba +\u7761\u7740\u4e86=\u7761\u8457\u4e86 +\u7761\u6e38\u75c5=\u7761\u904a\u75c5 +\u7784\u51c6=\u7784\u6e96 +\u77a0\u4e4e\u540e\u77e3=\u77a0\u4e4e\u5f8c\u77e3 +\u77a7\u7740\u8868=\u77a7\u8457\u9336 +\u77a7\u7740\u949f=\u77a7\u8457\u9418 +\u77a7\u7740\u949f\u8868=\u77a7\u8457\u9418\u9336 +\u4e86\u671b=\u77ad\u671b +\u4e86\u7136=\u77ad\u7136 +\u4e86\u82e5\u6307\u638c=\u77ad\u82e5\u6307\u638c +\u77b3\u8499=\u77b3\u77c7 +\u77bb\u524d\u987e\u540e=\u77bb\u524d\u9867\u5f8c +\u8499\u4e8b=\u77c7\u4e8b +\u8499\u6627\u65e0\u77e5=\u77c7\u6627\u7121\u77e5 +\u8499\u6df7=\u77c7\u6df7 +\u8499\u778d=\u77c7\u778d +\u8499\u772c=\u77c7\u77d3 +\u8499\u8069=\u77c7\u8075 +\u8499\u7740=\u77c7\u8457 +\u8499\u7740\u9505\u513f=\u77c7\u8457\u934b\u5152 +\u8499\u5934\u8f6c=\u77c7\u982d\u8f49 +\u8499\u9a97=\u77c7\u9a19 +\u77a9\u6258=\u77da\u8a17 +\u77dc\u5e84=\u77dc\u838a +\u77ed\u51e0=\u77ed\u51e0 +\u77ed\u4e8e=\u77ed\u65bc +\u77ed\u53d1=\u77ed\u9aee +\u77ee\u51e0=\u77ee\u51e0 +\u77f3\u51e0=\u77f3\u51e0 +\u77f3\u5bb6\u5e84=\u77f3\u5bb6\u838a +\u77f3\u6881=\u77f3\u6a11 +\u77f3\u82f1\u8868=\u77f3\u82f1\u9336 +\u77f3\u82f1\u949f=\u77f3\u82f1\u9418 +\u77f3\u82f1\u949f\u8868=\u77f3\u82f1\u9418\u9336 +\u77f3\u83bc=\u77f3\u84f4 +\u77f3\u949f\u4e73=\u77f3\u9418\u4e73 +\u77fd\u8c37=\u77fd\u8c37 +\u7814\u5236=\u7814\u88fd +\u7830\u5f53=\u7830\u5679 +\u6731\u5507\u7693\u9f7f=\u7843\u5507\u7693\u9f52 +\u6731\u6279=\u7843\u6279 +\u6731\u7802=\u7843\u7802 +\u6731\u7b14=\u7843\u7b46 +\u6731\u7ea2\u8272=\u7843\u7d05\u8272 +\u6731\u8272=\u7843\u8272 +\u6731\u8c15=\u7843\u8aed +\u786c\u5e72=\u786c\u5e79 +\u786e\u7620=\u786e\u7620 +\u7891\u5fd7=\u7891\u8a8c +\u78b0\u949f=\u78b0\u9418 +\u7801\u8868=\u78bc\u9336 +\u78c1\u5236=\u78c1\u88fd +\u78e8\u5236=\u78e8\u88fd +\u78e8\u70bc=\u78e8\u934a +\u78ec\u949f=\u78ec\u9418 +\u7857\u786e=\u78fd\u786e +\u788d\u96be\u7167\u51c6=\u7919\u96e3\u7167\u51c6 +\u783b\u8c37\u673a=\u7931\u7a40\u6a5f +\u793a\u8303=\u793a\u7bc4 +\u793e\u91cc=\u793e\u88e1 +\u795d\u8d5e=\u795d\u8b9a +\u795d\u53d1=\u795d\u9aee +\u795e\u837c\u90c1\u5792=\u795e\u837c\u9b31\u58d8 +\u795e\u6e38=\u795e\u904a +\u795e\u96d5\u50cf=\u795e\u96d5\u50cf +\u795e\u96d5=\u795e\u9d70 +\u7968\u5e84=\u7968\u838a +\u796d\u540a=\u796d\u5f14 +\u796d\u540a\u6587=\u796d\u5f14\u6587 +\u7981\u6b32=\u7981\u617e +\u7981\u6b32\u4e3b\u4e49=\u7981\u6b32\u4e3b\u7fa9 +\u7981\u836f=\u7981\u85e5 +\u7978\u4e8e=\u798d\u65bc +\u5fa1\u4fae=\u79a6\u4fae +\u5fa1\u5bc7=\u79a6\u5bc7 +\u5fa1\u5bd2=\u79a6\u5bd2 +\u5fa1\u654c=\u79a6\u6575 +\u793c\u8d5e=\u79ae\u8b9a +\u79b9\u4f59\u7cae=\u79b9\u9918\u7ce7 +\u79be\u8c37=\u79be\u7a40 +\u79c3\u5983\u4e4b\u53d1=\u79bf\u5983\u4e4b\u9aee +\u79c3\u53d1=\u79bf\u9aee +\u79c0\u53d1=\u79c0\u9aee +\u79c1\u4e0b\u91cc=\u79c1\u4e0b\u88e1 +\u79c1\u6b32=\u79c1\u617e +\u79c1\u6597=\u79c1\u9b25 +\u79cb\u5929\u91cc=\u79cb\u5929\u88e1 +\u79cb\u540e=\u79cb\u5f8c +\u79cb\u88e4=\u79cb\u8932 +\u79cb\u6e38=\u79cb\u904a +\u79cb\u9634\u5165\u4e95\u5e72=\u79cb\u9670\u5165\u4e95\u5e79 +\u79cb\u53d1=\u79cb\u9aee +\u79cd\u5e08\u4e2d=\u79cd\u5e2b\u4e2d +\u79cd\u5e08\u9053=\u79cd\u5e2b\u9053 +\u79cd\u653e=\u79cd\u653e +\u79d1\u8303=\u79d1\u7bc4 +\u79d2\u8868\u660e=\u79d2\u8868\u660e +\u79d2\u8868\u793a=\u79d2\u8868\u793a +\u79d2\u8868=\u79d2\u9336 +\u79d2\u949f=\u79d2\u9418 +\u79fb\u7978\u4e8e=\u79fb\u798d\u65bc +\u7a00\u677e=\u7a00\u9b06 +\u7a0e\u540e=\u7a05\u5f8c +\u7a0e\u540e\u51c0\u5229=\u7a05\u5f8c\u6de8\u5229 +\u7a0e\u6350\u7a3d\u5f81\u5904=\u7a05\u6350\u7a3d\u5f81\u8655 +\u7a0d\u540e=\u7a0d\u5f8c +\u68f1\u53f0=\u7a1c\u53f0 +\u68f1\u5b50=\u7a1c\u5b50 +\u68f1\u5c42=\u7a1c\u5c64 +\u68f1\u67f1=\u7a1c\u67f1 +\u68f1\u767b=\u7a1c\u767b +\u68f1\u68f1=\u7a1c\u7a1c +\u68f1\u7b49\u767b=\u7a1c\u7b49\u767b +\u68f1\u7ebf=\u7a1c\u7dda +\u68f1\u7f1d=\u7a1c\u7e2b +\u68f1\u89d2=\u7a1c\u89d2 +\u68f1\u9525=\u7a1c\u9310 +\u68f1\u955c=\u7a1c\u93e1 +\u68f1\u4f53=\u7a1c\u9ad4 +\u79cd\u8c37=\u7a2e\u7a40 +\u79f0\u8d5e=\u7a31\u8b9a +\u7a3b\u8c37=\u7a3b\u7a40 +\u7a3d\u5f81=\u7a3d\u5fb5 +\u8c37\u4eba=\u7a40\u4eba +\u8c37\u4fdd\u5bb6\u5546=\u7a40\u4fdd\u5bb6\u5546 +\u8c37\u4ed3=\u7a40\u5009 +\u8c37\u572d=\u7a40\u572d +\u8c37\u573a=\u7a40\u5834 +\u8c37\u5b50=\u7a40\u5b50 +\u8c37\u65e5=\u7a40\u65e5 +\u8c37\u65e6=\u7a40\u65e6 +\u8c37\u6881=\u7a40\u6881 +\u8c37\u58f3=\u7a40\u6bbc +\u8c37\u7269=\u7a40\u7269 +\u8c37\u76ae=\u7a40\u76ae +\u8c37\u795e=\u7a40\u795e +\u8c37\u8c37=\u7a40\u7a40 +\u8c37\u7c73=\u7a40\u7c73 +\u8c37\u7c92=\u7a40\u7c92 +\u8c37\u8231=\u7a40\u8259 +\u8c37\u82d7=\u7a40\u82d7 +\u8c37\u8349=\u7a40\u8349 +\u8c37\u8d35\u997f\u519c=\u7a40\u8cb4\u9913\u8fb2 +\u8c37\u8d31\u4f24\u519c=\u7a40\u8ce4\u50b7\u8fb2 +\u8c37\u9053=\u7a40\u9053 +\u8c37\u96e8=\u7a40\u96e8 +\u8c37\u7c7b=\u7a40\u985e +\u8c37\u98ce=\u7a40\u98a8 +\u8c37\u98df=\u7a40\u98df +\u7a46\u7f55\u9ed8\u5fb7\u5386=\u7a46\u7f55\u9ed8\u5fb7\u66c6 +\u7a46\u7f55\u9ed8\u5fb7\u5386\u53f2=\u7a46\u7f55\u9ed8\u5fb7\u6b77\u53f2 +\u79ef\u6781\u53c2\u4e0e=\u7a4d\u6781\u53c3\u4e0e +\u79ef\u6781\u53c2\u52a0=\u7a4d\u6781\u53c3\u52a0 +\u79ef\u6dc0=\u7a4d\u6fb1 +\u79ef\u8c37=\u7a4d\u7a40 +\u79ef\u8c37\u9632\u9965=\u7a4d\u7a40\u9632\u9951 +\u79ef\u90c1=\u7a4d\u9b31 +\u7a33\u5360=\u7a69\u4f54 +\u7a33\u624e=\u7a69\u7d2e +\u7a7a\u4e2d\u5e03\u96f7=\u7a7a\u4e2d\u4f48\u96f7 +\u7a7a\u6295\u5e03\u96f7=\u7a7a\u6295\u4f48\u96f7 +\u7a7a\u8499=\u7a7a\u6fdb +\u7a7a\u8361=\u7a7a\u8569 +\u7a7a\u8361\u8361=\u7a7a\u8569\u8569 +\u7a7a\u8c37\u56de\u97f3=\u7a7a\u8c37\u56de\u97f3 +\u7a7a\u949f=\u7a7a\u9418 +\u7a7a\u4f59=\u7a7a\u9918 +\u7a92\u6b32=\u7a92\u617e +\u7a97\u53f0\u4e0a=\u7a97\u53f0\u4e0a +\u7a97\u5e18=\u7a97\u5e18 +\u7a97\u660e\u51e0\u4eae=\u7a97\u660e\u51e0\u4eae +\u7a97\u660e\u51e0\u51c0=\u7a97\u660e\u51e0\u6de8 +\u7a97\u53f0=\u7a97\u6aaf +\u7a9d\u91cc=\u7aa9\u88e1 +\u7a77\u4e8e=\u7aae\u65bc +\u7a77\u8ffd\u4e0d\u820d=\u7aae\u8ffd\u4e0d\u6368 +\u7a77\u53d1=\u7aae\u9aee +\u7a83\u949f\u63a9\u8033=\u7aca\u9418\u63a9\u8033 +\u7acb\u4e8e=\u7acb\u65bc +\u7acb\u8303=\u7acb\u7bc4 +\u7ad9\u5e72\u5cb8\u513f=\u7ad9\u4e7e\u5cb8\u5152 +\u7ae5\u4ec6=\u7ae5\u50d5 +\u7aef\u5e84=\u7aef\u838a +\u7ade\u6597=\u7af6\u9b25 +\u7af9\u51e0=\u7af9\u51e0 +\u7af9\u6797\u4e4b\u6e38=\u7af9\u6797\u4e4b\u904a +\u7af9\u7b7e=\u7af9\u7c64 +\u7b11\u91cc\u85cf\u5200=\u7b11\u88e1\u85cf\u5200 +\u7b28\u7b28\u5446\u5446=\u7b28\u7b28\u5446\u5446 +\u7b14\u5212=\u7b46\u5283 +\u7b14\u79c3\u58a8\u5e72=\u7b46\u79bf\u58a8\u4e7e +\u7b49\u4e8e=\u7b49\u65bc +\u7b0b\u5e72=\u7b4d\u4e7e +\u7b51\u524d=\u7b51\u524d +\u7b51\u5317=\u7b51\u5317 +\u7b51\u5dde=\u7b51\u5dde +\u7b51\u5f8c=\u7b51\u5f8c +\u7b51\u540e=\u7b51\u5f8c +\u7b51\u6ce2=\u7b51\u6ce2 +\u7b51\u7d2b=\u7b51\u7d2b +\u7b51\u80a5=\u7b51\u80a5 +\u7b51\u897f=\u7b51\u897f +\u7b51\u90a6=\u7b51\u90a6 +\u7b51\u967d=\u7b51\u967d +\u7b51\u9633=\u7b51\u967d +\u7b54\u590d=\u7b54\u8986 +\u7b54\u8986=\u7b54\u8986 +\u7b56\u5212=\u7b56\u5283 +\u7b75\u51e0=\u7b75\u51e0 +\u4e2a\u4e2d\u539f\u56e0=\u7b87\u4e2d\u539f\u56e0 +\u4e2a\u4e2d\u5965\u5999=\u7b87\u4e2d\u5967\u5999 +\u4e2a\u4e2d\u5965\u79d8=\u7b87\u4e2d\u5967\u79d8 +\u4e2a\u4e2d\u597d\u624b=\u7b87\u4e2d\u597d\u624b +\u4e2a\u4e2d\u5f3a\u624b=\u7b87\u4e2d\u5f37\u624b +\u4e2a\u4e2d\u6d88\u606f=\u7b87\u4e2d\u6d88\u606f +\u4e2a\u4e2d\u6ecb\u5473=\u7b87\u4e2d\u6ecb\u5473 +\u4e2a\u4e2d\u7384\u673a=\u7b87\u4e2d\u7384\u6a5f +\u4e2a\u4e2d\u7406\u7531=\u7b87\u4e2d\u7406\u7531 +\u4e2a\u4e2d\u8baf\u606f=\u7b87\u4e2d\u8a0a\u606f +\u4e2a\u4e2d\u8d44\u8baf=\u7b87\u4e2d\u8cc7\u8a0a +\u4e2a\u4e2d\u9ad8\u624b=\u7b87\u4e2d\u9ad8\u624b +\u4e2a\u65e7=\u7b87\u820a +\u7b97\u5728\u91cc\u9762=\u7b97\u5728\u88e1\u9762 +\u7b97\u5386=\u7b97\u66c6 +\u7b97\u5386\u53f2=\u7b97\u6b77\u53f2 +\u7b97\u51c6=\u7b97\u6e96 +\u7b97\u53d1=\u7b97\u9aee +\u7ba1\u4eba\u540a\u811a\u513f\u4e8b=\u7ba1\u4eba\u5f14\u8173\u5152\u4e8b +\u7ba1\u5236\u6cd5=\u7ba1\u5236\u6cd5 +\u7ba1\u5e72=\u7ba1\u5e79 +\u8282\u6b32=\u7bc0\u617e +\u8282\u4f59=\u7bc0\u9918 +\u8303\u4f8b=\u7bc4\u4f8b +\u8303\u56f4=\u7bc4\u570d +\u8303\u5b57=\u7bc4\u5b57 +\u8303\u5f0f=\u7bc4\u5f0f +\u8303\u6027\u5f62\u53d8=\u7bc4\u6027\u5f62\u8b8a +\u8303\u6587=\u7bc4\u6587 +\u8303\u672c=\u7bc4\u672c +\u8303\u7574=\u7bc4\u7587 +\u8303\u91d1=\u7bc4\u91d1 +\u7b80\u5e76=\u7c21\u4f75 +\u7b80\u6734=\u7c21\u6a38 +\u7c38\u8361=\u7c38\u8569 +\u7b7e\u7740=\u7c3d\u8457 +\u7b79\u5212=\u7c4c\u5283 +\u7b7e\u5e50=\u7c64\u5e50 +\u7b7e\u62bc=\u7c64\u62bc +\u7b7e\u6761=\u7c64\u689d +\u7b7e\u8bd7=\u7c64\u8a69 +\u5401\u5929=\u7c72\u5929 +\u5401\u6c42=\u7c72\u6c42 +\u5401\u8bf7=\u7c72\u8acb +\u7c73\u8c37=\u7c73\u7a40 +\u7c89\u62f3\u7ee3\u817f=\u7c89\u62f3\u7e61\u817f +\u7c89\u7b7e\u5b50=\u7c89\u7c64\u5b50 +\u7c97\u5236=\u7c97\u88fd +\u7cbe\u5236\u4f0f=\u7cbe\u5236\u4f0f +\u7cbe\u5236\u4f4f=\u7cbe\u5236\u4f4f +\u7cbe\u5236\u670d=\u7cbe\u5236\u670d +\u7cbe\u5e72=\u7cbe\u5e79 +\u7cbe\u4e8e=\u7cbe\u65bc +\u7cbe\u51c6=\u7cbe\u6e96 +\u7cbe\u81f4=\u7cbe\u7dfb +\u7cbe\u5236=\u7cbe\u88fd +\u7cbe\u70bc=\u7cbe\u934a +\u7cbe\u8f9f=\u7cbe\u95e2 +\u7cbe\u677e=\u7cbe\u9b06 +\u7cca\u91cc\u7cca\u6d82=\u7cca\u88e1\u7cca\u5857 +\u7cd5\u5e72=\u7cd5\u4e7e +\u7caa\u79fd\u8511\u9762=\u7cde\u7a62\u884a\u9762 +\u56e2\u5b50=\u7cf0\u5b50 +\u7cfb\u7740=\u7cfb\u8457 +\u7cfb\u91cc=\u7cfb\u88e1 +\u7eaa\u5143\u540e=\u7d00\u5143\u5f8c +\u7eaa\u5386=\u7d00\u66c6 +\u7eaa\u5386\u53f2=\u7d00\u6b77\u53f2 +\u7ea6\u5360=\u7d04\u4f54 +\u7ea2\u7ef3\u7cfb\u8db3=\u7d05\u7e69\u7e6b\u8db3 +\u7ea2\u949f=\u7d05\u9418 +\u7ea2\u9709\u7d20=\u7d05\u9709\u7d20 +\u7ea2\u53d1=\u7d05\u9aee +\u7ea1\u56de=\u7d06\u8ff4 +\u7ea1\u4f59=\u7d06\u9918 +\u7ea1\u90c1=\u7d06\u9b31 +\u7eb3\u5f81=\u7d0d\u5fb5 +\u7eaf\u6734=\u7d14\u6a38 +\u7eb8\u624e=\u7d19\u7d2e +\u7d20\u6734=\u7d20\u6a38 +\u7d20\u53d1=\u7d20\u9aee +\u7d20\u9762=\u7d20\u9eb5 +\u7d22\u9a6c\u91cc=\u7d22\u99ac\u91cc +\u7d22\u99ac\u91cc=\u7d22\u99ac\u91cc +\u7d22\u9762=\u7d22\u9eb5 +\u7d2b\u59dc=\u7d2b\u8591 +\u624e\u4e0a=\u7d2e\u4e0a +\u624e\u4e0b=\u7d2e\u4e0b +\u624e\u56ee=\u7d2e\u56ee +\u624e\u597d=\u7d2e\u597d +\u624e\u5b9e=\u7d2e\u5be6 +\u624e\u5be8=\u7d2e\u5be8 +\u624e\u5e26\u5b50=\u7d2e\u5e36\u5b50 +\u624e\u6210=\u7d2e\u6210 +\u624e\u6839=\u7d2e\u6839 +\u624e\u8425=\u7d2e\u71df +\u624e\u7d27=\u7d2e\u7dca +\u624e\u811a=\u7d2e\u8173 +\u624e\u88f9=\u7d2e\u88f9 +\u624e\u8bc8=\u7d2e\u8a50 +\u624e\u8d77=\u7d2e\u8d77 +\u624e\u94c1=\u7d2e\u9435 +\u7ec6\u4e0d\u5bb9\u53d1=\u7d30\u4e0d\u5bb9\u9aee +\u7ec6\u5982\u53d1=\u7d30\u5982\u9aee +\u7ec6\u81f4=\u7d30\u7dfb +\u7ec6\u70bc=\u7d30\u934a +\u7ec8\u4e8e=\u7d42\u65bc +\u7ec4\u91cc=\u7d44\u88e1 +\u7ed3\u4f34\u540c\u6e38=\u7d50\u4f34\u540c\u904a +\u7ed3\u4f19=\u7d50\u5925 +\u7ed3\u624e=\u7d50\u7d2e +\u7ed3\u5f69=\u7d50\u7db5 +\u7ed3\u4f59=\u7d50\u9918 +\u7ed3\u53d1=\u7d50\u9aee +\u7edd\u5bf9\u53c2\u7167=\u7d55\u5c0d\u53c3\u7167 +\u7edd\u540e=\u7d55\u5f8c +\u7edd\u4e8e=\u7d55\u65bc +\u7ede\u5e72=\u7d5e\u4e7e +\u7edc\u816e\u80e1=\u7d61\u816e\u9b0d +\u7ed9\u6211\u5e72\u8106=\u7d66\u6211\u5e72\u8106 +\u7ed9\u4e8e=\u7d66\u65bc +\u4e1d\u6765\u7ebf\u53bb=\u7d72\u4f86\u7dda\u53bb +\u4e1d\u5e03=\u7d72\u5e03 +\u4e1d\u6069\u53d1\u6028=\u7d72\u6069\u9aee\u6028 +\u4e1d\u677f=\u7d72\u677f +\u4e1d\u74dc\u5e03=\u7d72\u74dc\u5e03 +\u4e1d\u7ed2\u5e03=\u7d72\u7d68\u5e03 +\u4e1d\u7ebf=\u7d72\u7dda +\u4e1d\u7ec7\u5382=\u7d72\u7e54\u5ee0 +\u4e1d\u866b=\u7d72\u87f2 +\u4e1d\u53d1=\u7d72\u9aee +\u7ed1\u624e=\u7d81\u7d2e +\u7d91\u624e=\u7d91\u7d2e +\u7ecf\u6709\u4e91=\u7d93\u6709\u4e91 +\u7eff\u53d1=\u7da0\u9aee +\u7ef8\u7f0e\u5e84=\u7da2\u7dde\u838a +\u7ef4\u7cfb=\u7dad\u7e6b +\u7efe\u53d1=\u7db0\u9aee +\u7f51\u91cc=\u7db2\u88e1 +\u7f51\u5fd7=\u7db2\u8a8c +\u5f69\u5e26=\u7db5\u5e36 +\u5f69\u6392=\u7db5\u6392 +\u5f69\u697c=\u7db5\u6a13 +\u5f69\u724c\u697c=\u7db5\u724c\u6a13 +\u5f69\u7403=\u7db5\u7403 +\u5f69\u7ef8=\u7db5\u7da2 +\u5f69\u7ebf=\u7db5\u7dda +\u5f69\u8239=\u7db5\u8239 +\u5f69\u8863=\u7db5\u8863 +\u7d27\u81f4=\u7dca\u7dfb +\u7d27\u7ef7=\u7dca\u7e43 +\u7d27\u7ef7\u7ef7=\u7dca\u7e43\u7e43 +\u7d27\u7ef7\u7740=\u7dca\u7e43\u8457 +\u7d27\u8ffd\u4e0d\u820d=\u7dca\u8ffd\u4e0d\u6368 +\u7eea\u4f59=\u7dd2\u9918 +\u7ddd\u51f6=\u7ddd\u5147 +\u7f09\u51f6=\u7ddd\u5147 +\u7f16\u4f59=\u7de8\u4f59 +\u7f16\u5236\u6cd5=\u7de8\u5236\u6cd5 +\u7f16\u91c7=\u7de8\u63a1 +\u7f16\u5236=\u7de8\u88fd +\u7f16\u949f=\u7de8\u9418 +\u7f16\u53d1=\u7de8\u9aee +\u7f13\u5f81=\u7de9\u5fb5 +\u7f13\u51b2=\u7de9\u885d +\u81f4\u5bc6=\u7dfb\u5bc6 +\u8426\u56de=\u7e08\u8ff4 +\u7f1c\u81f4=\u7e1d\u7dfb +\u53bf\u91cc=\u7e23\u88e1 +\u53bf\u5fd7=\u7e23\u8a8c +\u7f1d\u91cc=\u7e2b\u88e1 +\u7f1d\u5236=\u7e2b\u88fd +\u7f29\u6817=\u7e2e\u6144 +\u7eb5\u6b32=\u7e31\u617e +\u7ea4\u592b=\u7e34\u592b +\u7ea4\u624b=\u7e34\u624b +\u603b\u540e=\u7e3d\u5f8c +\u7e41\u590d=\u7e41\u8907 +\u7e41\u949f=\u7e41\u9418 +\u7ef7\u4f4f=\u7e43\u4f4f +\u7ef7\u5b50=\u7e43\u5b50 +\u7ef7\u5e26=\u7e43\u5e36 +\u7ef7\u6252\u540a\u62f7=\u7e43\u6252\u5f14\u62f7 +\u7ef7\u7d27=\u7e43\u7dca +\u7ef7\u8138=\u7e43\u81c9 +\u7ef7\u7740=\u7e43\u8457 +\u7ef7\u7740\u8138=\u7e43\u8457\u81c9 +\u7ef7\u7740\u8138\u513f=\u7e43\u8457\u81c9\u5152 +\u7ef7\u5f00=\u7e43\u958b +\u7a57\u5e0f\u98d8\u4e95\u5e72=\u7e50\u5e43\u98c4\u4e95\u5e79 +\u7ed5\u6881=\u7e5e\u6a11 +\u7ee3\u50cf=\u7e61\u50cf +\u7ee3\u53e3=\u7e61\u53e3 +\u7ee3\u5f97=\u7e61\u5f97 +\u7ee3\u6237=\u7e61\u6236 +\u7ee3\u623f=\u7e61\u623f +\u7ee3\u6bef=\u7e61\u6bef +\u7ee3\u7403=\u7e61\u7403 +\u7ee3\u7684=\u7e61\u7684 +\u7ee3\u82b1=\u7e61\u82b1 +\u7ee3\u8863=\u7e61\u8863 +\u7ee3\u8d77=\u7e61\u8d77 +\u7ee3\u9601=\u7e61\u95a3 +\u7ee3\u978b=\u7e61\u978b +\u7ed8\u5236=\u7e6a\u88fd +\u7cfb\u4e0a=\u7e6b\u4e0a +\u7cfb\u4e16=\u7e6b\u4e16 +\u7cfb\u5230=\u7e6b\u5230 +\u7cfb\u56da=\u7e6b\u56da +\u7cfb\u5fc3=\u7e6b\u5fc3 +\u7cfb\u5ff5=\u7e6b\u5ff5 +\u7cfb\u6000=\u7e6b\u61f7 +\u7cfb\u604b=\u7e6b\u6200 +\u7cfb\u4e8e=\u7e6b\u65bc +\u7cfb\u4e8e\u4e00\u53d1=\u7e6b\u65bc\u4e00\u9aee +\u7cfb\u7ed3=\u7e6b\u7d50 +\u7cfb\u7d27=\u7e6b\u7dca +\u7cfb\u7ef3=\u7e6b\u7e69 +\u7cfb\u7d2f=\u7e6b\u7e8d +\u7cfb\u8f9e=\u7e6b\u8fad +\u7cfb\u98ce\u6355\u5f71=\u7e6b\u98a8\u6355\u5f71 +\u7d2f\u56da=\u7e8d\u56da +\u7d2f\u5806=\u7e8d\u5806 +\u7d2f\u74e6\u7ed3\u7ef3=\u7e8d\u74e6\u7d50\u7e69 +\u7d2f\u7ec1=\u7e8d\u7d32 +\u7d2f\u81e3=\u7e8d\u81e3 +\u7f20\u6597=\u7e8f\u9b25 +\u624d\u5219=\u7e94\u5247 +\u624d\u53ef\u5bb9\u989c\u5341\u4e94\u4f59=\u7e94\u53ef\u5bb9\u984f\u5341\u4e94\u9918 +\u624d\u5f97\u4e24\u5e74=\u7e94\u5f97\u5169\u5e74 +\u624d\u6b64=\u7e94\u6b64 +\u575b\u5b50=\u7f48\u5b50 +\u575b\u575b\u7f50\u7f50=\u7f48\u7f48\u7f50\u7f50 +\u575b\u9a1e=\u7f48\u9a1e +\u7f6e\u4e8e=\u7f6e\u65bc +\u7f6e\u8a00\u6210\u8303=\u7f6e\u8a00\u6210\u7bc4 +\u9a82\u7740=\u7f75\u8457 +\u7f62\u4e8e=\u7f77\u65bc +\u7f81\u7cfb=\u7f88\u7e6b +\u7f8e\u5360=\u7f8e\u4f54 +\u7f8e\u4ed1=\u7f8e\u5d19 +\u7f8e\u4e8e=\u7f8e\u65bc +\u7f8e\u5236=\u7f8e\u88fd +\u7f8e\u4e11=\u7f8e\u919c +\u7f8e\u53d1=\u7f8e\u9aee +\u7fa4\u4e11=\u7fa4\u919c +\u7fa8\u4f59=\u7fa8\u9918 +\u4e49\u5360=\u7fa9\u4f54 +\u4e49\u4ec6=\u7fa9\u50d5 +\u4e49\u5e84=\u7fa9\u838a +\u7fd5\u8f9f=\u7fd5\u95e2 +\u7ff1\u6e38=\u7ff1\u904a +\u7ffb\u6d8c=\u7ffb\u6e67 +\u7ffb\u4e91\u8986\u96e8=\u7ffb\u96f2\u8986\u96e8 +\u7ffb\u677e=\u7ffb\u9b06 +\u8001\u5e72=\u8001\u4e7e +\u8001\u4ec6=\u8001\u50d5 +\u8001\u5e72\u90e8=\u8001\u5e79\u90e8 +\u8001\u8499=\u8001\u61de +\u8001\u4e8e=\u8001\u65bc +\u8001\u7237\u949f=\u8001\u723a\u9418 +\u8001\u5e84=\u8001\u838a +\u8001\u59dc=\u8001\u8591 +\u8001\u677f=\u8001\u95c6 +\u8001\u9762\u76ae=\u8001\u9762\u76ae +\u8003\u540e=\u8003\u5f8c +\u8003\u5f81=\u8003\u5fb5 +\u800c\u514b\u5236=\u800c\u524b\u5236 +\u800c\u540e=\u800c\u5f8c +\u800d\u6597=\u800d\u9b25 +\u8015\u4f63=\u8015\u50ad +\u8015\u83b7=\u8015\u7a6b +\u8033\u540e=\u8033\u5f8c +\u8033\u4f59=\u8033\u9918 +\u803f\u4e8e=\u803f\u65bc +\u804a\u658b\u5fd7\u5f02=\u804a\u9f4b\u5fd7\u7570 +\u8058\u96c7=\u8058\u50f1 +\u8054\u7cfb=\u806f\u7e6b +\u542c\u4e8e=\u807d\u65bc +\u8089\u5e72=\u8089\u4e7e +\u8089\u6b32=\u8089\u617e +\u8089\u4e1d\u9762=\u8089\u7d72\u9eb5 +\u8089\u7fb9\u9762=\u8089\u7fb9\u9eb5 +\u8089\u677e=\u8089\u9b06 +\u809a\u91cc=\u809a\u88cf +\u809d\u90c1=\u809d\u9b31 +\u80a1\u6817=\u80a1\u6144 +\u80a5\u7b51\u65b9\u8a00=\u80a5\u7b51\u65b9\u8a00 +\u80b4\u9994=\u80b4\u994c +\u80c3\u836f=\u80c3\u85e5 +\u80c3\u91cc=\u80c3\u88e1 +\u80cc\u5411\u7740=\u80cc\u5411\u8457 +\u80cc\u5730\u91cc=\u80cc\u5730\u88e1 +\u80cc\u540e=\u80cc\u5f8c +\u80ce\u53d1=\u80ce\u9aee +\u80dc\u80bd=\u80dc\u80bd +\u80dc\u952e=\u80dc\u9375 +\u80e1\u4e91=\u80e1\u4e91 +\u80e1\u6734\u5b89=\u80e1\u6a38\u5b89 +\u80e1\u91cc\u80e1\u6d82=\u80e1\u88e1\u80e1\u5857 +\u80fd\u514b\u5236=\u80fd\u524b\u5236 +\u80fd\u5e72\u4f11=\u80fd\u5e72\u4f11 +\u80fd\u5e72\u6208=\u80fd\u5e72\u6208 +\u80fd\u5e72\u6270=\u80fd\u5e72\u64fe +\u80fd\u5e72\u653f=\u80fd\u5e72\u653f +\u80fd\u5e72\u6d89=\u80fd\u5e72\u6d89 +\u80fd\u5e72\u9884=\u80fd\u5e72\u9810 +\u80fd\u5e72=\u80fd\u5e79 +\u80fd\u81ea\u5236=\u80fd\u81ea\u5236 +\u8109\u51b2=\u8108\u885d +\u810a\u6881\u80cc=\u810a\u6881\u80cc +\u810a\u6881\u9aa8=\u810a\u6881\u9aa8 +\u810a\u6881=\u810a\u6a11 +\u8131\u8c37\u673a=\u812b\u7a40\u6a5f +\u8131\u53d1=\u812b\u9aee +\u814a\u4e4b\u4ee5\u4e3a\u9975=\u814a\u4e4b\u4ee5\u70ba\u990c +\u814a\u5473=\u814a\u5473 +\u814a\u6bd2=\u814a\u6bd2 +\u814a\u7b14=\u814a\u7b46 +\u8150\u5e72=\u8150\u4e7e +\u8150\u4f59=\u8150\u9918 +\u8155\u8868=\u8155\u9336 +\u8111\u5b50\u91cc=\u8166\u5b50\u88e1 +\u8111\u5e72=\u8166\u5e79 +\u8111\u540e=\u8166\u5f8c +\u8170\u91cc=\u8170\u88e1 +\u811a\u6ce8=\u8173\u8a3b +\u811a\u70bc=\u8173\u934a +\u818f\u836f=\u818f\u85e5 +\u80a4\u53d1=\u819a\u9aee +\u80f6\u5377=\u81a0\u6372 +\u81a8\u677e=\u81a8\u9b06 +\u81e3\u4ec6=\u81e3\u50d5 +\u5367\u6e38=\u81e5\u904a +\u81e7\u8c37\u4ea1\u7f8a=\u81e7\u7a40\u4ea1\u7f8a +\u4e34\u6f7c\u6597\u5b9d=\u81e8\u6f7c\u9b25\u5bf6 +\u81ea\u5236\u4e00\u4e0b=\u81ea\u5236\u4e00\u4e0b +\u81ea\u5236\u4e0b\u6765=\u81ea\u5236\u4e0b\u4f86 +\u81ea\u5236\u4e0d=\u81ea\u5236\u4e0d +\u81ea\u5236\u4e4b\u529b=\u81ea\u5236\u4e4b\u529b +\u81ea\u5236\u4e4b\u80fd=\u81ea\u5236\u4e4b\u80fd +\u81ea\u5236\u4ed6=\u81ea\u5236\u4ed6 +\u81ea\u5236\u4f0f=\u81ea\u5236\u4f0f +\u81ea\u5236\u4f60=\u81ea\u5236\u4f60 +\u81ea\u5236\u529b=\u81ea\u5236\u529b +\u81ea\u5236\u5730=\u81ea\u5236\u5730 +\u81ea\u5236\u5979=\u81ea\u5236\u5979 +\u81ea\u5236\u60c5=\u81ea\u5236\u60c5 +\u81ea\u5236\u6211=\u81ea\u5236\u6211 +\u81ea\u5236\u670d=\u81ea\u5236\u670d +\u81ea\u5236\u7684\u80fd=\u81ea\u5236\u7684\u80fd +\u81ea\u5236\u80fd\u529b=\u81ea\u5236\u80fd\u529b +\u81ea\u4e8e=\u81ea\u65bc +\u81ea\u5236=\u81ea\u88fd +\u81ea\u89c9\u81ea\u613f=\u81ea\u89ba\u81ea\u613f +\u81f3\u591a=\u81f3\u591a +\u81f3\u4e8e=\u81f3\u65bc +\u81f4\u4e8e=\u81f4\u65bc +\u81fb\u4e8e=\u81fb\u65bc +\u8202\u8c37=\u8202\u7a40 +\u4e0e\u514b\u5236=\u8207\u524b\u5236 +\u5174\u81f4=\u8208\u7dfb +\u4e3e\u624b\u8868=\u8209\u624b\u8868 +\u4e3e\u624b\u8868\u51b3=\u8209\u624b\u8868\u6c7a +\u65e7\u5e84=\u820a\u5e84 +\u65e7\u5386=\u820a\u66c6 +\u65e7\u5386\u53f2=\u820a\u6b77\u53f2 +\u65e7\u836f=\u820a\u85e5 +\u65e7\u6e38=\u820a\u904a +\u65e7\u8868=\u820a\u9336 +\u65e7\u949f=\u820a\u9418 +\u65e7\u949f\u8868=\u820a\u9418\u9336 +\u820c\u5e72\u5507\u7126=\u820c\u4e7e\u5507\u7126 +\u820c\u540e=\u820c\u5f8c +\u8212\u5377=\u8212\u6372 +\u822a\u6d77\u5386=\u822a\u6d77\u66c6 +\u822a\u6d77\u5386\u53f2=\u822a\u6d77\u6b77\u53f2 +\u8239\u53ea\u5f97=\u8239\u53ea\u5f97 +\u8239\u53ea\u6709=\u8239\u53ea\u6709 +\u8239\u53ea\u80fd=\u8239\u53ea\u80fd +\u8239\u949f=\u8239\u9418 +\u8239\u53ea=\u8239\u96bb +\u8230\u53ea=\u8266\u96bb +\u826f\u836f=\u826f\u85e5 +\u8272\u6b32=\u8272\u617e +\u8278\u6728\u4e30\u4e30=\u8278\u6728\u4e30\u4e30 +\u828d\u836f=\u828d\u85e5 +\u8292\u679c\u5e72=\u8292\u679c\u4e7e +\u82b1\u62f3\u7ee3\u817f=\u82b1\u62f3\u7e61\u817f +\u82b1\u5377=\u82b1\u6372 +\u82b1\u76c6\u91cc=\u82b1\u76c6\u88e1 +\u82b1\u5eb5\u8bcd\u9009=\u82b1\u83f4\u8a5e\u9078 +\u82b1\u836f=\u82b1\u85e5 +\u82b1\u949f=\u82b1\u9418 +\u82b1\u9a6c\u540a\u5634=\u82b1\u99ac\u5f14\u5634 +\u82b1\u54c4=\u82b1\u9b28 +\u82d1\u91cc=\u82d1\u88e1 +\u82e5\u5e72=\u82e5\u5e72 +\u82e6\u5e72=\u82e6\u5e79 +\u82e6\u836f=\u82e6\u85e5 +\u82e6\u91cc=\u82e6\u88cf +\u82e6\u6597=\u82e6\u9b25 +\u82ce\u9ebb=\u82e7\u9ebb +\u82f1\u5360=\u82f1\u4f54 +\u82f9\u8426=\u82f9\u7e08 +\u8302\u90fd\u6dc0=\u8302\u90fd\u6fb1 +\u8303\u6587\u540c=\u8303\u6587\u540c +\u8303\u6587\u6b63\u516c=\u8303\u6587\u6b63\u516c +\u8303\u6587\u703e=\u8303\u6587\u703e +\u8303\u6587\u6f9c=\u8303\u6587\u703e +\u8303\u6587\u7a0b=\u8303\u6587\u7a0b +\u8303\u6587\u82b3=\u8303\u6587\u82b3 +\u8303\u6587\u85e4=\u8303\u6587\u85e4 +\u8303\u6587\u864e=\u8303\u6587\u864e +\u8303\u767b\u5821=\u8303\u767b\u5821 +\u8336\u51e0=\u8336\u51e0 +\u8336\u5e84=\u8336\u838a +\u8336\u4f59=\u8336\u9918 +\u8336\u9762=\u8336\u9eb5 +\u8349\u4e1b\u91cc=\u8349\u53e2\u88e1 +\u8349\u5e7f=\u8349\u5e7f +\u8349\u8350=\u8349\u8350 +\u8349\u836f=\u8349\u85e5 +\u8350\u5c45=\u8350\u5c45 +\u8350\u81fb=\u8350\u81fb +\u8350\u9965=\u8350\u9951 +\u8377\u82b1\u6dc0=\u8377\u82b1\u6fb1 +\u5e84\u4e0a=\u838a\u4e0a +\u5e84\u4e3b=\u838a\u4e3b +\u5e84\u5468=\u838a\u5468 +\u5e84\u5458=\u838a\u54e1 +\u5e84\u4e25=\u838a\u56b4 +\u5e84\u56ed=\u838a\u5712 +\u5e84\u58eb\u987f\u9053=\u838a\u58eb\u9813\u9053 +\u5e84\u5b50=\u838a\u5b50 +\u5e84\u5ba2=\u838a\u5ba2 +\u5e84\u5bb6=\u838a\u5bb6 +\u5e84\u6237=\u838a\u6236 +\u5e84\u623f=\u838a\u623f +\u5e84\u656c=\u838a\u656c +\u5e84\u7530=\u838a\u7530 +\u5e84\u7a3c=\u838a\u7a3c +\u5e84\u8204\u8d8a\u541f=\u838a\u8204\u8d8a\u541f +\u5e84\u91cc=\u838a\u88e1 +\u5e84\u8bed=\u838a\u8a9e +\u5e84\u519c=\u838a\u8fb2 +\u5e84\u91cd=\u838a\u91cd +\u5e84\u9662=\u838a\u9662 +\u5e84\u9a9a=\u838a\u9a37 +\u830e\u5e72=\u8396\u5e79 +\u83bd\u8361=\u83bd\u8569 +\u83cc\u4e1d\u4f53=\u83cc\u7d72\u9ad4 +\u83dc\u5e72=\u83dc\u4e7e +\u83dc\u80b4=\u83dc\u80b4 +\u83e0\u68f1\u83dc=\u83e0\u7a1c\u83dc +\u83e0\u841d\u5e72=\u83e0\u863f\u4e7e +\u534e\u4e25\u949f=\u83ef\u56b4\u9418 +\u534e\u53d1=\u83ef\u9aee +\u4e07\u4e00\u53ea=\u842c\u4e00\u53ea +\u4e07\u591a\u53ea=\u842c\u591a\u96bb +\u4e07\u5929\u540e=\u842c\u5929\u5f8c +\u4e07\u5e74\u5386\u8868=\u842c\u5e74\u66c6\u9336 +\u4e07\u5386=\u842c\u66c6 +\u4e07\u5386\u53f2=\u842c\u6b77\u53f2 +\u4e07\u7b7e\u63d2\u67b6=\u842c\u7c64\u63d2\u67b6 +\u4e07\u624e=\u842c\u7d2e +\u4e07\u8c61=\u842c\u8c61 +\u4e07\u53ea=\u842c\u96bb +\u4e07\u4f59=\u842c\u9918 +\u843d\u540e=\u843d\u5f8c +\u843d\u816e\u80e1=\u843d\u816e\u9b0d +\u843d\u53d1=\u843d\u9aee +\u7740\u513f=\u8457\u5152 +\u7740\u514b\u5236=\u8457\u524b\u5236 +\u7740\u4e66\u7acb\u8bf4=\u8457\u66f8\u7acb\u8aaa +\u7740\u8272\u8f6f\u4f53=\u8457\u8272\u8edf\u9ad4 +\u7740\u91cd\u6307\u51fa=\u8457\u91cd\u6307\u51fa +\u7740\u5f55=\u8457\u9304 +\u7740\u5f55\u89c4\u5219=\u8457\u9304\u898f\u5247 +\u8461\u5360=\u8461\u4f54 +\u8461\u8404\u5e72=\u8461\u8404\u4e7e +\u8463\u6c0f\u5c01\u53d1=\u8463\u6c0f\u5c01\u9aee +\u846b\u82a6\u91cc\u5356\u751a\u4e48\u836f=\u846b\u8606\u88e1\u8ce3\u751a\u9ebc\u85e5 +\u8499\u6c57\u836f=\u8499\u6c57\u85e5 +\u8499\u5e84=\u8499\u838a +\u8499\u96fe\u9732=\u8499\u9727\u9732 +\u849c\u53d1=\u849c\u9aee +\u82cd\u672f=\u84bc\u672e +\u82cd\u53d1=\u84bc\u9aee +\u82cd\u90c1=\u84bc\u9b31 +\u84c4\u53d1=\u84c4\u9aee +\u84c4\u80e1=\u84c4\u9b0d +\u84c4\u987b=\u84c4\u9b1a +\u84ca\u90c1=\u84ca\u9b31 +\u84ec\u84ec\u677e\u677e=\u84ec\u84ec\u9b06\u9b06 +\u84ec\u53d1=\u84ec\u9aee +\u84ec\u677e=\u84ec\u9b06 +\u53c2\u7ee5=\u8518\u7d8f +\u8471\u90c1=\u8525\u9b31 +\u835e\u9ea6\u9762=\u854e\u9ea5\u9eb5 +\u8361\u6765\u8361\u53bb=\u8569\u4f86\u8569\u53bb +\u8361\u5973=\u8569\u5973 +\u8361\u5987=\u8569\u5a66 +\u8361\u5bc7=\u8569\u5bc7 +\u8361\u5e73=\u8569\u5e73 +\u8361\u6c14\u56de\u80a0=\u8569\u6c23\u8ff4\u8178 +\u8361\u6da4=\u8569\u6ecc +\u8361\u6f3e=\u8569\u6f3e +\u8361\u7136=\u8569\u7136 +\u8361\u4ea7=\u8569\u7522 +\u8361\u821f=\u8569\u821f +\u8361\u8239=\u8569\u8239 +\u8361\u8361=\u8569\u8569 +\u8427\u53c2=\u856d\u8518 +\u8584\u5e78=\u8584\u5016 +\u8584\u5e72=\u8584\u5e79 +\u59dc\u662f\u8001\u7684\u8fa3=\u8591\u662f\u8001\u7684\u8fa3 +\u59dc\u672b=\u8591\u672b +\u59dc\u6842=\u8591\u6842 +\u59dc\u6bcd=\u8591\u6bcd +\u59dc\u6c41=\u8591\u6c41 +\u59dc\u6c64=\u8591\u6e6f +\u59dc\u7247=\u8591\u7247 +\u59dc\u7cd6=\u8591\u7cd6 +\u59dc\u4e1d=\u8591\u7d72 +\u59dc\u8001\u8fa3=\u8591\u8001\u8fa3 +\u59dc\u8336=\u8591\u8336 +\u59dc\u84c9=\u8591\u84c9 +\u59dc\u997c=\u8591\u9905 +\u59dc\u9ec4=\u8591\u9ec3 +\u8599\u53d1=\u8599\u9aee +\u859d\u535c=\u859d\u8514 +\u82e7\u60b4=\u85b4\u60b4 +\u82e7\u70ef=\u85b4\u70ef +\u85b4\u70ef=\u85b4\u70ef +\u501f\u4ee5=\u85c9\u4ee5 +\u501f\u52a9=\u85c9\u52a9 +\u501f\u5bc7\u5175=\u85c9\u5bc7\u5175 +\u501f\u624b=\u85c9\u624b +\u501f\u673a=\u85c9\u6a5f +\u501f\u6b64=\u85c9\u6b64 +\u501f\u7531=\u85c9\u7531 +\u501f\u7bb8\u4ee3\u7b79=\u85c9\u7bb8\u4ee3\u7c4c +\u501f\u7740=\u85c9\u8457 +\u501f\u8d44=\u85c9\u8cc7 +\u84dd\u6dc0=\u85cd\u6fb1 +\u85cf\u4e8e=\u85cf\u65bc +\u85cf\u5386=\u85cf\u66c6 +\u85cf\u5386\u53f2=\u85cf\u6b77\u53f2 +\u85cf\u8499\u6b4c\u513f=\u85cf\u77c7\u6b4c\u5152 +\u85e4\u5236=\u85e4\u88fd +\u836f\u4e38=\u85e5\u4e38 +\u836f\u5178=\u85e5\u5178 +\u836f\u5230\u547d\u9664=\u85e5\u5230\u547d\u9664 +\u836f\u5230\u75c5\u9664=\u85e5\u5230\u75c5\u9664 +\u836f\u5242=\u85e5\u5291 +\u836f\u529b=\u85e5\u529b +\u836f\u5305=\u85e5\u5305 +\u836f\u540d=\u85e5\u540d +\u836f\u5473=\u85e5\u5473 +\u836f\u54c1=\u85e5\u54c1 +\u836f\u5546=\u85e5\u5546 +\u836f\u5355=\u85e5\u55ae +\u836f\u5a46=\u85e5\u5a46 +\u836f\u5b66=\u85e5\u5b78 +\u836f\u5bb3=\u85e5\u5bb3 +\u836f\u4e13=\u85e5\u5c08 +\u836f\u5c40=\u85e5\u5c40 +\u836f\u5e08=\u85e5\u5e2b +\u836f\u5e97=\u85e5\u5e97 +\u836f\u5382=\u85e5\u5ee0 +\u836f\u5f15=\u85e5\u5f15 +\u836f\u6027=\u85e5\u6027 +\u836f\u623f=\u85e5\u623f +\u836f\u6548=\u85e5\u6548 +\u836f\u65b9=\u85e5\u65b9 +\u836f\u6750=\u85e5\u6750 +\u836f\u68c9=\u85e5\u68c9 +\u836f\u68c0\u5c40=\u85e5\u6aa2\u5c40 +\u836f\u6c34=\u85e5\u6c34 +\u836f\u6cb9=\u85e5\u6cb9 +\u836f\u6db2=\u85e5\u6db2 +\u836f\u6e23=\u85e5\u6e23 +\u836f\u7247=\u85e5\u7247 +\u836f\u7269=\u85e5\u7269 +\u836f\u738b=\u85e5\u738b +\u836f\u7406=\u85e5\u7406 +\u836f\u74f6=\u85e5\u74f6 +\u836f\u7528=\u85e5\u7528 +\u836f\u7682=\u85e5\u7682 +\u836f\u76d2=\u85e5\u76d2 +\u836f\u77f3=\u85e5\u77f3 +\u836f\u79d1=\u85e5\u79d1 +\u836f\u7bb1=\u85e5\u7bb1 +\u836f\u7b7e=\u85e5\u7c64 +\u836f\u7c89=\u85e5\u7c89 +\u836f\u7cd6=\u85e5\u7cd6 +\u836f\u7ebf=\u85e5\u7dda +\u836f\u7f50=\u85e5\u7f50 +\u836f\u818f=\u85e5\u818f +\u836f\u8216=\u85e5\u8216 +\u836f\u8336=\u85e5\u8336 +\u836f\u8349=\u85e5\u8349 +\u836f\u884c=\u85e5\u884c +\u836f\u8d29=\u85e5\u8ca9 +\u836f\u8d39=\u85e5\u8cbb +\u836f\u9152=\u85e5\u9152 +\u836f\u533b\u5b66\u7cfb=\u85e5\u91ab\u5b78\u7cfb +\u836f\u91cf=\u85e5\u91cf +\u836f\u9488=\u85e5\u91dd +\u836f\u94fa=\u85e5\u92ea +\u836f\u5934=\u85e5\u982d +\u836f\u9975=\u85e5\u990c +\u836f\u9762\u513f=\u85e5\u9eb5\u5152 +\u82cf\u6606=\u8607\u5d11 +\u8574\u542b\u7740=\u860a\u542b\u8457 +\u8574\u6db5\u7740=\u860a\u6db5\u8457 +\u82f9\u679c\u5e72=\u860b\u679c\u4e7e +\u841d\u535c=\u863f\u8514 +\u841d\u535c\u5e72=\u863f\u8514\u4e7e +\u864e\u987b=\u864e\u9b1a +\u864e\u6597=\u864e\u9b25 +\u53f7\u5fd7=\u865f\u8a8c +\u866b\u90e8=\u866b\u90e8 +\u868a\u52a8\u725b\u6597=\u868a\u52d5\u725b\u9b25 +\u86c7\u53d1\u5973\u5996=\u86c7\u9aee\u5973\u5996 +\u86d4\u866b\u836f=\u86d4\u87f2\u85e5 +\u8702\u6d8c=\u8702\u6e67 +\u8702\u51c6=\u8702\u6e96 +\u871c\u91cc\u8c03\u6cb9=\u871c\u88e1\u8abf\u6cb9 +\u8721\u6708=\u8721\u6708 +\u8721\u796d=\u8721\u796d +\u874e\u874e\u87ab\u87ab=\u874e\u874e\u87ab\u87ab +\u874e\u8c2e=\u874e\u8b56 +\u866e\u8768\u76f8\u540a=\u87e3\u8768\u76f8\u5f14 +\u86cf\u5e72=\u87f6\u4e7e +\u8801\u5e72=\u8801\u5e79 +\u86ee\u5e72=\u883b\u5e79 +\u8840\u62fc=\u8840\u62da +\u8840\u4f59=\u8840\u9918 +\u884c\u4e8b\u5386=\u884c\u4e8b\u66c6 +\u884c\u4e8b\u5386\u53f2=\u884c\u4e8b\u6b77\u53f2 +\u884c\u51f6=\u884c\u5147 +\u884c\u51f6\u524d=\u884c\u5147\u524d +\u884c\u51f6\u540e=\u884c\u5147\u5f8c +\u884c\u51f6\u5f8c=\u884c\u5147\u5f8c +\u884c\u4e8e=\u884c\u65bc +\u884c\u767e\u91cc\u8005\u534a\u4e8e\u4e5d\u5341=\u884c\u767e\u91cc\u8005\u534a\u65bc\u4e5d\u5341 +\u80e1\u540c=\u885a\u8855 +\u536b\u661f\u949f=\u885b\u661f\u9418 +\u51b2\u4e0a=\u885d\u4e0a +\u51b2\u4e0b=\u885d\u4e0b +\u51b2\u6765=\u885d\u4f86 +\u51b2\u5012=\u885d\u5012 +\u51b2\u51a0=\u885d\u51a0 +\u51b2\u51fa=\u885d\u51fa +\u51b2\u5230=\u885d\u5230 +\u51b2\u523a=\u885d\u523a +\u51b2\u514b=\u885d\u524b +\u51b2\u529b=\u885d\u529b +\u51b2\u52b2=\u885d\u52c1 +\u51b2\u52a8=\u885d\u52d5 +\u51b2\u53bb=\u885d\u53bb +\u51b2\u53e3=\u885d\u53e3 +\u51b2\u57ae=\u885d\u57ae +\u51b2\u5802=\u885d\u5802 +\u51b2\u575a\u9677\u9635=\u885d\u5805\u9677\u9663 +\u51b2\u538b=\u885d\u58d3 +\u51b2\u5929=\u885d\u5929 +\u51b2\u5dde\u649e\u5e9c=\u885d\u5dde\u649e\u5e9c +\u51b2\u5fc3=\u885d\u5fc3 +\u51b2\u6389=\u885d\u6389 +\u51b2\u649e=\u885d\u649e +\u51b2\u51fb=\u885d\u64ca +\u51b2\u6563=\u885d\u6563 +\u51b2\u6740=\u885d\u6bba +\u51b2\u51b3=\u885d\u6c7a +\u51b2\u6ce2=\u885d\u6ce2 +\u51b2\u6d6a=\u885d\u6d6a +\u51b2\u6fc0=\u885d\u6fc0 +\u51b2\u7136=\u885d\u7136 +\u51b2\u76f9=\u885d\u76f9 +\u51b2\u7834=\u885d\u7834 +\u51b2\u7a0b=\u885d\u7a0b +\u51b2\u7a81=\u885d\u7a81 +\u51b2\u7ebf=\u885d\u7dda +\u51b2\u7740=\u885d\u8457 +\u51b2\u8981=\u885d\u8981 +\u51b2\u8d77=\u885d\u8d77 +\u51b2\u8f66=\u885d\u8eca +\u51b2\u8fdb=\u885d\u9032 +\u51b2\u8fc7=\u885d\u904e +\u51b2\u91cf=\u885d\u91cf +\u51b2\u950b=\u885d\u92d2 +\u51b2\u9677=\u885d\u9677 +\u51b2\u5934\u9635=\u885d\u982d\u9663 +\u51b2\u98ce=\u885d\u98a8 +\u8863\u7ee3\u663c\u884c=\u8863\u7e61\u665d\u884c +\u8868\u5f81=\u8868\u5fb5 +\u8868\u91cc=\u8868\u88e1 +\u8868\u9762=\u8868\u9762 +\u8877\u4e8e=\u8877\u65bc +\u888b\u91cc=\u888b\u88e1 +\u888b\u8868=\u888b\u9336 +\u8896\u91cc=\u8896\u88e1 +\u88ab\u91cc=\u88ab\u88e1 +\u88ab\u590d=\u88ab\u8907 +\u88ab\u8986\u7740=\u88ab\u8986\u8457 +\u88ab\u53d1\u4f6f\u72c2=\u88ab\u9aee\u4f6f\u72c2 +\u88ab\u53d1\u5165\u5c71=\u88ab\u9aee\u5165\u5c71 +\u88ab\u53d1\u5de6\u887d=\u88ab\u9aee\u5de6\u887d +\u88ab\u53d1\u7f28\u51a0=\u88ab\u9aee\u7e93\u51a0 +\u88ab\u53d1\u9633\u72c2=\u88ab\u9aee\u967d\u72c2 +\u88c1\u5e76=\u88c1\u4f75 +\u88c1\u5236=\u88c1\u88fd +\u91cc\u52fe\u5916\u8fde=\u88cf\u52fe\u5916\u9023 +\u91cc\u624b=\u88cf\u624b +\u91cc\u6d77=\u88cf\u6d77 +\u91cc\u9762=\u88cf\u9762 +\u8865\u4e8e=\u88dc\u65bc +\u8865\u836f=\u88dc\u85e5 +\u8865\u8840\u836f=\u88dc\u8840\u85e5 +\u8865\u6ce8=\u88dc\u8a3b +\u88c5\u6298=\u88dd\u647a +\u91cc\u5916=\u88e1\u5916 +\u91cc\u5b50=\u88e1\u5b50 +\u91cc\u5c4b=\u88e1\u5c4b +\u91cc\u5c42=\u88e1\u5c64 +\u91cc\u5e03=\u88e1\u5e03 +\u91cc\u5e26=\u88e1\u5e36 +\u91cc\u5f26=\u88e1\u5f26 +\u91cc\u5e94\u5916\u5408=\u88e1\u61c9\u5916\u5408 +\u91cc\u810a=\u88e1\u810a +\u91cc\u8863=\u88e1\u8863 +\u91cc\u901a\u5916\u56fd=\u88e1\u901a\u5916\u570b +\u91cc\u901a\u5916\u654c=\u88e1\u901a\u5916\u6575 +\u91cc\u8fb9=\u88e1\u908a +\u91cc\u95f4=\u88e1\u9593 +\u91cc\u9762\u513f=\u88e1\u9762\u5152 +\u91cc\u9762\u5305=\u88e1\u9762\u5305 +\u91cc\u5934=\u88e1\u982d +\u5236\u4ef6=\u88fd\u4ef6 +\u5236\u4f5c=\u88fd\u4f5c +\u5236\u505a=\u88fd\u505a +\u5236\u5907=\u88fd\u5099 +\u5236\u51b0=\u88fd\u51b0 +\u5236\u51b7=\u88fd\u51b7 +\u5236\u5242=\u88fd\u5291 +\u5236\u53d6=\u88fd\u53d6 +\u5236\u54c1=\u88fd\u54c1 +\u5236\u56fe=\u88fd\u5716 +\u5236\u5f97=\u88fd\u5f97 +\u5236\u6210=\u88fd\u6210 +\u5236\u6cd5=\u88fd\u6cd5 +\u5236\u6d46=\u88fd\u6f3f +\u5236\u4e3a=\u88fd\u70ba +\u5236\u7247=\u88fd\u7247 +\u5236\u7248=\u88fd\u7248 +\u5236\u7a0b=\u88fd\u7a0b +\u5236\u7cd6=\u88fd\u7cd6 +\u5236\u7eb8=\u88fd\u7d19 +\u5236\u836f=\u88fd\u85e5 +\u5236\u8868=\u88fd\u8868 +\u5236\u9020=\u88fd\u9020 +\u5236\u9769=\u88fd\u9769 +\u5236\u978b=\u88fd\u978b +\u5236\u76d0=\u88fd\u9e7d +\u590d\u4ede\u5e74\u5982=\u8907\u4ede\u5e74\u5982 +\u590d\u4ee5\u767e\u4e07=\u8907\u4ee5\u767e\u842c +\u590d\u4f4d=\u8907\u4f4d +\u590d\u4fe1=\u8907\u4fe1 +\u590d\u5143\u97f3=\u8907\u5143\u97f3 +\u590d\u51fd\u6570=\u8907\u51fd\u6578 +\u590d\u5206\u6570=\u8907\u5206\u6578 +\u590d\u5206\u6790=\u8907\u5206\u6790 +\u590d\u5206\u89e3=\u8907\u5206\u89e3 +\u590d\u5217=\u8907\u5217 +\u590d\u5229=\u8907\u5229 +\u590d\u5370=\u8907\u5370 +\u590d\u53e5=\u8907\u53e5 +\u590d\u5408=\u8907\u5408 +\u590d\u540d=\u8907\u540d +\u590d\u5458=\u8907\u54e1 +\u590d\u58c1=\u8907\u58c1 +\u590d\u58ee=\u8907\u58ef +\u590d\u59d3=\u8907\u59d3 +\u590d\u5b57\u952e=\u8907\u5b57\u9375 +\u590d\u5ba1=\u8907\u5be9 +\u590d\u5199=\u8907\u5beb +\u590d\u5e73\u9762=\u8907\u5e73\u9762 +\u590d\u5f0f=\u8907\u5f0f +\u590d\u590d=\u8907\u5fa9 +\u590d\u6570=\u8907\u6578 +\u590d\u672c=\u8907\u672c +\u590d\u67e5=\u8907\u67e5 +\u590d\u6838=\u8907\u6838 +\u590d\u68c0=\u8907\u6aa2 +\u590d\u6b21=\u8907\u6b21 +\u590d\u6bd4=\u8907\u6bd4 +\u590d\u51b3=\u8907\u6c7a +\u590d\u6d41=\u8907\u6d41 +\u590d\u6d4b=\u8907\u6e2c +\u590d\u4ea9\u73cd=\u8907\u755d\u73cd +\u590d\u53d1=\u8907\u767c +\u590d\u76ee=\u8907\u76ee +\u590d\u773c=\u8907\u773c +\u590d\u79cd=\u8907\u7a2e +\u590d\u7ebf=\u8907\u7dda +\u590d\u4e60=\u8907\u7fd2 +\u590d\u8272=\u8907\u8272 +\u590d\u53f6=\u8907\u8449 +\u590d\u5236=\u8907\u88fd +\u590d\u8bca=\u8907\u8a3a +\u590d\u8bc4=\u8907\u8a55 +\u590d\u8bcd=\u8907\u8a5e +\u590d\u8bd5=\u8907\u8a66 +\u590d\u8bfe=\u8907\u8ab2 +\u590d\u8bae=\u8907\u8b70 +\u590d\u53d8\u51fd\u6570=\u8907\u8b8a\u51fd\u6578 +\u590d\u8d5b=\u8907\u8cfd +\u590d\u8f85\u97f3=\u8907\u8f14\u97f3 +\u590d\u8ff0=\u8907\u8ff0 +\u590d\u9009=\u8907\u9078 +\u590d\u94b1=\u8907\u9322 +\u590d\u9605=\u8907\u95b1 +\u590d\u6742=\u8907\u96dc +\u590d\u7535=\u8907\u96fb +\u590d\u97f3=\u8907\u97f3 +\u590d\u97f5=\u8907\u97fb +\u8912\u8d5e=\u8912\u8b9a +\u886c\u91cc=\u896f\u88e1 +\u897f\u5360=\u897f\u4f54 +\u897f\u5143\u540e=\u897f\u5143\u5f8c +\u897f\u5468\u949f=\u897f\u5468\u9418 +\u897f\u5cb3=\u897f\u5dbd +\u897f\u6652=\u897f\u6652 +\u897f\u5386=\u897f\u66c6 +\u897f\u5386\u53f2=\u897f\u6b77\u53f2 +\u897f\u836f=\u897f\u85e5 +\u897f\u8c37\u7c73=\u897f\u8c37\u7c73 +\u897f\u6e38=\u897f\u904a +\u8981\u5360=\u8981\u4f54 +\u8981\u514b\u5236=\u8981\u524b\u5236 +\u8981\u5360\u535c=\u8981\u5360\u535c +\u8981\u81ea\u5236=\u8981\u81ea\u5236 +\u8981\u51b2=\u8981\u885d +\u8981\u4e48=\u8981\u9ebc +\u8986\u4ea1=\u8986\u4ea1 +\u8986\u547d=\u8986\u547d +\u8986\u5de2\u4e4b\u4e0b\u65e0\u5b8c\u5375=\u8986\u5de2\u4e4b\u4e0b\u7121\u5b8c\u5375 +\u8986\u6c34\u96be\u6536=\u8986\u6c34\u96e3\u6536 +\u8986\u6ca1=\u8986\u6c92 +\u8986\u7740=\u8986\u8457 +\u8986\u76d6=\u8986\u84cb +\u8986\u76d6\u7740=\u8986\u84cb\u8457 +\u8986\u8f99=\u8986\u8f4d +\u8986\u96e8\u7ffb\u4e91=\u8986\u96e8\u7ffb\u96f2 +\u89c1\u4e8e=\u898b\u65bc +\u89c1\u68f1\u89c1\u89d2=\u898b\u7a1c\u898b\u89d2 +\u89c1\u7d20\u62b1\u6734=\u898b\u7d20\u62b1\u6a38 +\u89c1\u949f\u4e0d\u6253=\u898b\u9418\u4e0d\u6253 +\u89c4\u5212=\u898f\u5283 +\u89c4\u8303=\u898f\u7bc4 +\u8996\u5982\u5bc7\u4ec7=\u8996\u5982\u5bc7\u8b8e +\u89c6\u4e8e=\u8996\u65bc +\u89c2\u91c7=\u89c0\u63a1 +\u89d2\u843d\u53d1=\u89d2\u843d\u767c +\u89d2\u843d\u91cc=\u89d2\u843d\u88e1 +\u89da\u68f1=\u89da\u7a1c +\u89e3\u96c7=\u89e3\u50f1 +\u89e3\u75db\u836f=\u89e3\u75db\u85e5 +\u89e3\u836f=\u89e3\u85e5 +\u89e3\u94c3\u4ecd\u987b\u7cfb\u94c3\u4eba=\u89e3\u9234\u4ecd\u9808\u7e6b\u9234\u4eba +\u89e3\u94c3\u8fd8\u987b\u7cfb\u94c3\u4eba=\u89e3\u9234\u9084\u9808\u7e6b\u9234\u4eba +\u89e3\u53d1\u4f6f\u72c2=\u89e3\u9aee\u4f6f\u72c2 +\u89e6\u987b=\u89f8\u9b1a +\u8a00\u4e91=\u8a00\u4e91 +\u8a00\u5927\u800c\u5938=\u8a00\u5927\u800c\u5938 +\u8a00\u8fa9\u800c\u786e=\u8a00\u8faf\u800c\u786e +\u8ba2\u5236=\u8a02\u88fd +\u8ba1\u5212=\u8a08\u5283 +\u6258\u4e86=\u8a17\u4e86 +\u6258\u4e8b=\u8a17\u4e8b +\u6258\u4ea4=\u8a17\u4ea4 +\u6258\u4eba=\u8a17\u4eba +\u6258\u4ed8=\u8a17\u4ed8 +\u6258\u513f\u6240=\u8a17\u5152\u6240 +\u6258\u53e4\u8bbd\u4eca=\u8a17\u53e4\u8af7\u4eca +\u6258\u540d=\u8a17\u540d +\u6258\u547d=\u8a17\u547d +\u6258\u548e=\u8a17\u548e +\u6258\u68a6=\u8a17\u5922 +\u6258\u5927=\u8a17\u5927 +\u6258\u5b64=\u8a17\u5b64 +\u6258\u5e87=\u8a17\u5e87 +\u6258\u6545=\u8a17\u6545 +\u6258\u75be=\u8a17\u75be +\u6258\u75c5=\u8a17\u75c5 +\u6258\u7ba1=\u8a17\u7ba1 +\u6258\u8a00=\u8a17\u8a00 +\u6258\u8bcd=\u8a17\u8a5e +\u6258\u4e70=\u8a17\u8cb7 +\u6258\u5356=\u8a17\u8ce3 +\u6258\u8eab=\u8a17\u8eab +\u6258\u8f9e=\u8a17\u8fad +\u6258\u8fd0=\u8a17\u904b +\u6258\u8fc7=\u8a17\u904e +\u6258\u9644=\u8a17\u9644 +\u8bb8\u613f\u8d77\u7ecf=\u8a31\u613f\u8d77\u7d93 +\u8bc9\u8bf4\u7740=\u8a34\u8aaa\u8457 +\u6ce8\u4e0a=\u8a3b\u4e0a +\u6ce8\u518c=\u8a3b\u518a +\u6ce8\u5931=\u8a3b\u5931 +\u6ce8\u5b9a=\u8a3b\u5b9a +\u6ce8\u660e=\u8a3b\u660e +\u6ce8\u6807=\u8a3b\u6a19 +\u6ce8\u751f\u5a18\u5a18=\u8a3b\u751f\u5a18\u5a18 +\u6ce8\u758f=\u8a3b\u758f +\u6ce8\u811a=\u8a3b\u8173 +\u6ce8\u89e3=\u8a3b\u89e3 +\u6ce8\u8bb0=\u8a3b\u8a18 +\u6ce8\u8bd1=\u8a3b\u8b6f +\u6ce8\u91ca=\u8a3b\u91cb +\u6ce8\u9500=\u8a3b\u92b7 +\u8bc4\u65ad\u53d1=\u8a55\u65b7\u767c +\u8bc4\u6ce8=\u8a55\u8a3b +\u8bcd\u5e72=\u8a5e\u5e79 +\u8bcd\u6c47=\u8a5e\u5f59 +\u8bcd\u4f59=\u8a5e\u9918 +\u8be2\u4e8e=\u8a62\u65bc +\u8be2\u4e8e\u520d\u835b=\u8a62\u65bc\u82bb\u8558 +\u8bd5\u836f=\u8a66\u85e5 +\u8bd5\u5236=\u8a66\u88fd +\u8bd7\u4e91=\u8a69\u4e91 +\u8bd7\u8d5e=\u8a69\u8b9a +\u8bd7\u949f=\u8a69\u9418 +\u8bd7\u4f59=\u8a69\u9918 +\u8bdd\u91cc\u6709\u8bdd=\u8a71\u88e1\u6709\u8a71 +\u8be5\u949f=\u8a72\u9418 +\u8be6\u5f81\u535a\u5f15=\u8a73\u5fb5\u535a\u5f15 +\u8be6\u6ce8=\u8a73\u8a3b +\u8bd4\u8d5e=\u8a84\u8b9a +\u5938\u591a\u6597\u9761=\u8a87\u591a\u9b25\u9761 +\u5938\u80fd\u6597\u667a=\u8a87\u80fd\u9b25\u667a +\u5938\u8d5e=\u8a87\u8b9a +\u5fd7\u54c0=\u8a8c\u54c0 +\u5fd7\u559c=\u8a8c\u559c +\u5fd7\u5e86=\u8a8c\u6176 +\u5fd7\u5f02=\u8a8c\u7570 +\u8ba4\u51c6=\u8a8d\u6e96 +\u8bf1\u5978=\u8a98\u59e6 +\u8bed\u4e91=\u8a9e\u4e91 +\u8bed\u6c47=\u8a9e\u5f59 +\u8bed\u6709\u4e91=\u8a9e\u6709\u4e91 +\u8bda\u5f81=\u8aa0\u5fb5 +\u8bda\u6734=\u8aa0\u6a38 +\u8bec\u8511=\u8aa3\u884a +\u8bf4\u7740=\u8aaa\u8457 +\u8bfe\u540e=\u8ab2\u5f8c +\u8bfe\u5f81=\u8ab2\u5fb5 +\u8bfe\u4f59=\u8ab2\u9918 +\u8c03\u51c6=\u8abf\u6e96 +\u8c03\u5236=\u8abf\u88fd +\u8c03\u8868=\u8abf\u9336 +\u8c03\u949f\u8868=\u8abf\u9418\u9336 +\u8c08\u5f81=\u8ac7\u5fb5 +\u8bf7\u53c2\u9605=\u8acb\u53c3\u95b1 +\u8bf7\u541b\u5165\u74ee=\u8acb\u541b\u5165\u7515 +\u8bf7\u6258=\u8acb\u8a17 +\u54a8\u8be2=\u8aee\u8a62 +\u8bf8\u4f59=\u8af8\u9918 +\u8c0b\u5b9a\u540e\u52a8=\u8b00\u5b9a\u5f8c\u52d5 +\u8c0b\u5e72=\u8b00\u5e79 +\u8c22\u7edd\u53c2\u89c2=\u8b1d\u7d55\u53c3\u89c0 +\u8c2c\u91c7\u865a\u58f0=\u8b2c\u63a1\u865b\u8072 +\u8c2c\u8d5e=\u8b2c\u8b9a +\u8b37\u4e11=\u8b37\u919c +\u8c28\u4e8e\u5fc3=\u8b39\u65bc\u5fc3 +\u8b66\u4e16\u949f=\u8b66\u4e16\u9418 +\u8b66\u62a5\u949f=\u8b66\u5831\u9418 +\u8b66\u793a\u949f=\u8b66\u793a\u9418 +\u8b66\u949f=\u8b66\u9418 +\u8bd1\u6ce8=\u8b6f\u8a3b +\u62a4\u53d1=\u8b77\u9aee +\u8bfb\u540e=\u8b80\u5f8c +\u53d8\u5f81=\u8b8a\u5fb5 +\u53d8\u4e11=\u8b8a\u919c +\u53d8\u810f=\u8b8a\u9ad2 +\u53d8\u9ad2=\u8b8a\u9ad2 +\u4ec7\u554f=\u8b8e\u554f +\u4ec7\u5937=\u8b8e\u5937 +\u4ec7\u6821=\u8b8e\u6821 +\u4ec7\u6b63=\u8b8e\u6b63 +\u4ec7\u9699=\u8b8e\u9699 +\u8d5e\u4e0d\u7edd\u53e3=\u8b9a\u4e0d\u7d55\u53e3 +\u8d5e\u4f69=\u8b9a\u4f69 +\u8d5e\u5457=\u8b9a\u5504 +\u8d5e\u53f9\u4e0d\u5df2=\u8b9a\u5606\u4e0d\u5df2 +\u8d5e\u626c=\u8b9a\u63da +\u8d5e\u4e50=\u8b9a\u6a02 +\u8d5e\u6b4c=\u8b9a\u6b4c +\u8d5e\u53f9=\u8b9a\u6b4e +\u8d5e\u7f8e=\u8b9a\u7f8e +\u8d5e\u7fa8=\u8b9a\u7fa8 +\u8d5e\u8bb8=\u8b9a\u8a31 +\u8d5e\u8bcd=\u8b9a\u8a5e +\u8d5e\u8a89=\u8b9a\u8b7d +\u8d5e\u8d4f=\u8b9a\u8cde +\u8d5e\u8f9e=\u8b9a\u8fad +\u8d5e\u9882=\u8b9a\u980c +\u8c46\u5e72=\u8c46\u4e7e +\u8c46\u8150\u5e72=\u8c46\u8150\u4e7e +\u7ad6\u7740=\u8c4e\u8457 +\u7ad6\u8d77\u810a\u6881=\u8c4e\u8d77\u810a\u6881 +\u4e30\u6ee8=\u8c50\u6ff1 +\u4e30\u6ee8\u4e61=\u8c50\u6ff1\u9109 +\u8c61\u5f81=\u8c61\u5fb5 +\u8c61\u5f81\u7740=\u8c61\u5fb5\u8457 +\u8d1f\u503a\u7d2f\u7d2f=\u8ca0\u50b5\u7e8d\u7e8d +\u8d2a\u6b32=\u8caa\u617e +\u8d35\u4ef7=\u8cb4\u4ef7 +\u8d35\u5e72=\u8cb4\u5e79 +\u8d35\u5f81=\u8cb4\u5fb5 +\u8cb7\u51f6=\u8cb7\u5147 +\u4e70\u51f6=\u8cb7\u5147 +\u4e70\u65ad\u53d1=\u8cb7\u65b7\u767c +\u8d39\u5360=\u8cbb\u4f54 +\u8d3b\u8303=\u8cbd\u7bc4 +\u8d44\u91d1\u5360\u7528=\u8cc7\u91d1\u5360\u7528 +\u8d3e\u540e=\u8cc8\u5f8c +\u8d48\u9965=\u8cd1\u9951 +\u8d4f\u8d5e=\u8cde\u8b9a +\u5356\u65ad\u53d1=\u8ce3\u65b7\u767c +\u5356\u5446=\u8ce3\u7343 +\u8d28\u6734=\u8cea\u6a38 +\u8d4c\u53f0=\u8ced\u6aaf +\u8d4c\u6597=\u8ced\u9b25 +\u8cf8\u4f59=\u8cf8\u9918 +\u8d2d\u5e76=\u8cfc\u4f75 +\u8d2d\u4e70\u6b32=\u8cfc\u8cb7\u617e +\u8d62\u4f59=\u8d0f\u9918 +\u8d64\u7ef3\u7cfb\u8db3=\u8d64\u7e69\u7e6b\u8db3 +\u8d64\u9709\u7d20=\u8d64\u9709\u7d20 +\u8d70\u56de\u8def=\u8d70\u56de\u8def +\u8d70\u540e=\u8d70\u5f8c +\u8d77\u590d=\u8d77\u8907 +\u8d77\u54c4=\u8d77\u9b28 +\u8d85\u7ea7\u676f=\u8d85\u7d1a\u76c3 +\u8d76\u5236=\u8d95\u88fd +\u8d76\u9762\u68cd=\u8d95\u9eb5\u68cd +\u8d75\u5e84=\u8d99\u838a +\u8db1\u5e72=\u8db2\u5e79 +\u8db3\u4e8e=\u8db3\u65bc +\u8dcc\u6251=\u8dcc\u6251 +\u8dcc\u8361=\u8dcc\u8569 +\u8ddf\u524d\u8ddf\u540e=\u8ddf\u524d\u8ddf\u5f8c +\u8def\u7b7e=\u8def\u7c64 +\u8df3\u6881\u5c0f\u4e11=\u8df3\u6a11\u5c0f\u4e11 +\u8df3\u8361=\u8df3\u8569 +\u8df3\u8868=\u8df3\u9336 +\u8e6a\u4e8e=\u8e6a\u65bc +\u8e6d\u68f1\u5b50=\u8e6d\u7a1c\u5b50 +\u8e81\u90c1=\u8e81\u9b31 +\u8eab\u540e=\u8eab\u5f8c +\u8eab\u4e8e=\u8eab\u65bc +\u8eab\u4f53\u53d1\u80a4=\u8eab\u9ad4\u9aee\u819a +\u8eaf\u5e72=\u8ec0\u5e79 +\u8f66\u5e93\u91cc=\u8eca\u5eab\u88e1 +\u8f66\u7ad9\u91cc=\u8eca\u7ad9\u88e1 +\u8f66\u91cc=\u8eca\u88e1 +\u8f68\u8303=\u8ecc\u7bc4 +\u519b\u961f\u514b\u5236=\u8ecd\u968a\u524b\u5236 +\u8f69\u8f9f=\u8ed2\u95e2 +\u8f83\u4e8e=\u8f03\u65bc +\u633d\u66f2=\u8f13\u66f2 +\u633d\u6b4c=\u8f13\u6b4c +\u633d\u806f=\u8f13\u806f +\u633d\u8054=\u8f13\u806f +\u633d\u8a5e=\u8f13\u8a5e +\u633d\u8bcd=\u8f13\u8a5e +\u633d\u8bd7=\u8f13\u8a69 +\u633d\u8a69=\u8f13\u8a69 +\u8f7b\u4e8e=\u8f15\u65bc +\u8f7b\u8f7b\u677e\u677e=\u8f15\u8f15\u9b06\u9b06 +\u8f7b\u677e=\u8f15\u9b06 +\u8f6e\u5978=\u8f2a\u59e6 +\u8f6e\u56de=\u8f2a\u8ff4 +\u8f6c\u5411\u5f80=\u8f49\u5411\u5f80 +\u8f6c\u53f0=\u8f49\u6aaf +\u8f6c\u6258=\u8f49\u8a17 +\u8f6c\u6597\u5343\u91cc=\u8f49\u9b25\u5343\u91cc +\u8f9b\u4e11=\u8f9b\u4e11 +\u8f9f\u8c37=\u8f9f\u7a40 +\u529e\u516c\u53f0=\u8fa6\u516c\u6aaf +\u8f9e\u6c47=\u8fad\u5f59 +\u8fab\u53d1=\u8fae\u9aee +\u8fa9\u6597=\u8faf\u9b25 +\u519c\u5386=\u8fb2\u66c6 +\u519c\u5386\u53f2=\u8fb2\u6b77\u53f2 +\u519c\u6c11\u5386=\u8fb2\u6c11\u66c6 +\u519c\u6c11\u5386\u53f2=\u8fb2\u6c11\u6b77\u53f2 +\u519c\u5e84=\u8fb2\u838a +\u519c\u836f=\u8fb2\u85e5 +\u8fc2\u56de=\u8fc2\u8ff4 +\u8fd1\u65e5\u7121\u4ec7=\u8fd1\u65e5\u7121\u8b8e +\u8fd1\u65e5\u91cc=\u8fd1\u65e5\u88e1 +\u8fd4\u6734=\u8fd4\u6a38 +\u8fe5\u7136\u56de\u5f02=\u8fe5\u7136\u8ff4\u7570 +\u8feb\u4e8e=\u8feb\u65bc +\u56de\u5149\u8fd4\u7167=\u8ff4\u5149\u8fd4\u7167 +\u56de\u5411=\u8ff4\u5411 +\u56de\u5708=\u8ff4\u5708 +\u56de\u5eca=\u8ff4\u5eca +\u56de\u5f62\u5939=\u8ff4\u5f62\u593e +\u56de\u6587=\u8ff4\u6587 +\u56de\u65cb=\u8ff4\u65cb +\u56de\u6d41=\u8ff4\u6d41 +\u56de\u73af=\u8ff4\u74b0 +\u56de\u7eb9\u9488=\u8ff4\u7d0b\u91dd +\u56de\u7ed5=\u8ff4\u7e5e +\u56de\u7fd4=\u8ff4\u7fd4 +\u56de\u80a0=\u8ff4\u8178 +\u56de\u8bf5=\u8ff4\u8aa6 +\u56de\u8def=\u8ff4\u8def +\u56de\u8f6c=\u8ff4\u8f49 +\u56de\u9012\u6027=\u8ff4\u905e\u6027 +\u56de\u907f=\u8ff4\u907f +\u56de\u92ae=\u8ff4\u947e +\u56de\u97f3=\u8ff4\u97f3 +\u56de\u54cd=\u8ff4\u97ff +\u56de\u98ce=\u8ff4\u98a8 +\u8ff7\u5e7b\u836f=\u8ff7\u5e7b\u85e5 +\u8ff7\u4e8e=\u8ff7\u65bc +\u8ff7\u8499=\u8ff7\u6fdb +\u8ff7\u836f=\u8ff7\u85e5 +\u8ff7\u9b42\u836f=\u8ff7\u9b42\u85e5 +\u8ffd\u51f6=\u8ffd\u5147 +\u9000\u4f19=\u9000\u5925 +\u9000\u540e=\u9000\u5f8c +\u9000\u70e7\u836f=\u9000\u71d2\u85e5 +\u9000\u85cf\u4e8e\u5bc6=\u9000\u85cf\u65bc\u5bc6 +\u9006\u949f=\u9006\u9418 +\u9006\u949f\u5411=\u9006\u9418\u5411 +\u900b\u53d1=\u900b\u9aee +\u900d\u9065\u6e38=\u900d\u9059\u904a +\u900f\u8f9f=\u900f\u95e2 +\u8fd9\u4f19\u4eba=\u9019\u5925\u4eba +\u8fd9\u91cc=\u9019\u88cf +\u8fd9\u91cc\u5728=\u9019\u88e1\u5728 +\u8fd9\u91cc\u662f=\u9019\u88e1\u662f +\u8fd9\u91cc\u4f1a=\u9019\u88e1\u6703 +\u8fd9\u91cc\u6709=\u9019\u88e1\u6709 +\u8fd9\u91cc\u80fd=\u9019\u88e1\u80fd +\u8fd9\u949f=\u9019\u9418 +\u8fd9\u53ea=\u9019\u96bb +\u8fd9\u4e48=\u9019\u9ebc +\u8fd9\u4e48\u7740=\u9019\u9ebc\u8457 +\u901a\u5978=\u901a\u59e6 +\u901a\u5fc3\u9762=\u901a\u5fc3\u9eb5 +\u901a\u4e8e=\u901a\u65bc +\u901a\u5386=\u901a\u66c6 +\u901a\u5386\u53f2=\u901a\u6b77\u53f2 +\u901a\u5e84=\u901a\u838a +\u901e\u51f6\u9b25\u72e0=\u901e\u5147\u9b25\u72e0 +\u901e\u51f6\u6597\u72e0=\u901e\u5147\u9b25\u72e0 +\u9020\u949f=\u9020\u9418 +\u9020\u949f\u8868=\u9020\u9418\u9336 +\u9020\u66f2=\u9020\u9eaf +\u8fde\u4e09\u5e76\u56db=\u9023\u4e09\u4f75\u56db +\u8fde\u5360=\u9023\u4f54 +\u8fde\u91c7=\u9023\u63a1 +\u8fde\u7cfb=\u9023\u7e6b +\u8fde\u5e84=\u9023\u838a +\u5468\u6e38\u4e16\u754c=\u9031\u904a\u4e16\u754c +\u8fdb\u5360=\u9032\u4f54 +\u903c\u5e76=\u903c\u4f75 +\u6e38\u4e86=\u904a\u4e86 +\u6e38\u4eba=\u904a\u4eba +\u6e38\u4ed9=\u904a\u4ed9 +\u6e38\u4f34=\u904a\u4f34 +\u6e38\u4fa0=\u904a\u4fe0 +\u6e38\u51b6=\u904a\u51b6 +\u6e38\u5203\u6709\u4f59=\u904a\u5203\u6709\u9918 +\u6e38\u52a8=\u904a\u52d5 +\u6e38\u56ed=\u904a\u5712 +\u6e38\u5b50=\u904a\u5b50 +\u6e38\u5b66=\u904a\u5b78 +\u6e38\u5ba2=\u904a\u5ba2 +\u6e38\u5ba6=\u904a\u5ba6 +\u6e38\u5c71\u73a9\u6c34=\u904a\u5c71\u73a9\u6c34 +\u6e38\u5fc5\u6709\u65b9=\u904a\u5fc5\u6709\u65b9 +\u6e38\u61a9=\u904a\u61a9 +\u6e38\u620f=\u904a\u6232 +\u6e38\u624b\u597d\u95f2=\u904a\u624b\u597d\u9592 +\u6e38\u65b9=\u904a\u65b9 +\u6e38\u661f=\u904a\u661f +\u6e38\u4e50=\u904a\u6a02 +\u6e38\u6807\u5361\u5c3a=\u904a\u6a19\u5361\u5c3a +\u6e38\u5386=\u904a\u6b77 +\u6e38\u6c11=\u904a\u6c11 +\u6e38\u6cb3=\u904a\u6cb3 +\u6e38\u7267=\u904a\u7267 +\u6e38\u730e=\u904a\u7375 +\u6e38\u73a9=\u904a\u73a9 +\u6e38\u8361=\u904a\u76ea +\u6e38\u76ee\u9a8b\u6000=\u904a\u76ee\u9a01\u61f7 +\u6e38\u7a0b=\u904a\u7a0b +\u6e38\u4e1d=\u904a\u7d72 +\u6e38\u5174=\u904a\u8208 +\u6e38\u8239=\u904a\u8239 +\u6e38\u8247=\u904a\u8247 +\u6e38\u8361\u4e0d\u5f52=\u904a\u8569\u4e0d\u6b78 +\u6e38\u827a=\u904a\u85dd +\u6e38\u884c=\u904a\u884c +\u6e38\u8857=\u904a\u8857 +\u6e38\u89c8=\u904a\u89bd +\u6e38\u8bb0=\u904a\u8a18 +\u6e38\u8bf4=\u904a\u8aaa +\u6e38\u8d44=\u904a\u8cc7 +\u6e38\u8d70=\u904a\u8d70 +\u6e38\u8e2a=\u904a\u8e64 +\u6e38\u901b=\u904a\u901b +\u6e38\u9519=\u904a\u932f +\u6e38\u79bb=\u904a\u96e2 +\u6e38\u9a91\u5175=\u904a\u9a0e\u5175 +\u6e38\u9b42=\u904a\u9b42 +\u8fc7\u540e=\u904e\u5f8c +\u8fc7\u4e8e=\u904e\u65bc +\u8fc7\u6746=\u904e\u6746 +\u8fc7\u6c34\u9762=\u904e\u6c34\u9eb5 +\u9053\u8303=\u9053\u7bc4 +\u900a\u4e8e=\u905c\u65bc +\u9012\u56de=\u905e\u8ff4 +\u8fdc\u53bf\u624d\u81f3=\u9060\u7e23\u7e94\u81f3 +\u8fdc\u6e38=\u9060\u904a +\u9068\u6e38=\u9068\u904a +\u906e\u4e11=\u906e\u919c +\u8fc1\u4e8e=\u9077\u65bc +\u9009\u624b\u8868\u660e=\u9078\u624b\u8868\u660e +\u9009\u624b\u8868\u51b3=\u9078\u624b\u8868\u6c7a +\u9009\u624b\u8868\u73b0=\u9078\u624b\u8868\u73fe +\u9009\u624b\u8868\u793a=\u9078\u624b\u8868\u793a +\u9009\u624b\u8868\u8fbe=\u9078\u624b\u8868\u9054 +\u9057\u4f20\u949f=\u907a\u50b3\u9418 +\u9057\u8303=\u907a\u7bc4 +\u9057\u8ff9=\u907a\u8ff9 +\u8fbd\u6c88=\u907c\u700b +\u907f\u5b55\u836f=\u907f\u5b55\u85e5 +\u907f\u6691\u5c71\u5e84=\u907f\u6691\u5c71\u5e84 +\u9080\u5929\u4e4b\u5e78=\u9080\u5929\u4e4b\u5016 +\u8fd8\u5360=\u9084\u4f54 +\u8fd8\u91c7=\u9084\u63a1 +\u8fd8\u51b2=\u9084\u885d +\u908b\u91cc\u908b\u9062=\u908b\u88e1\u908b\u9062 +\u90a3\u53ea\u662f=\u90a3\u53ea\u662f +\u90a3\u53ea\u6709=\u90a3\u53ea\u6709 +\u90a3\u5377=\u90a3\u6372 +\u90a3\u91cc=\u90a3\u88e1 +\u90a3\u53ea=\u90a3\u96bb +\u90a3\u4e48=\u90a3\u9ebc +\u90a3\u4e48\u7740=\u90a3\u9ebc\u8457 +\u90c1\u6734=\u90c1\u6a38 +\u90c1\u90c1\u83f2\u83f2=\u90c1\u90c1\u83f2\u83f2 +\u90ca\u6e38=\u90ca\u904a +\u90d8\u949f=\u90d8\u9418 +\u90e8\u843d\u53d1=\u90e8\u843d\u767c +\u90fd\u4e8e=\u90fd\u65bc +\u4e61\u613f=\u9109\u613f +\u9093\u540e=\u9127\u5f8c +\u912d\u51f1\u4e91=\u912d\u51f1\u4e91 +\u90d1\u51ef\u4e91=\u912d\u51f1\u4e91 +\u90d1\u5e84\u516c=\u912d\u838a\u516c +\u914d\u5236\u9972\u6599=\u914d\u5236\u98fc\u6599 +\u914d\u5408\u7740=\u914d\u5408\u8457 +\u914d\u6c34\u5e72\u7ba1=\u914d\u6c34\u5e79\u7ba1 +\u914d\u836f=\u914d\u85e5 +\u914d\u5236=\u914d\u88fd +\u9152\u5e18=\u9152\u5e18 +\u9152\u540e=\u9152\u5f8c +\u9152\u575b=\u9152\u7f48 +\u9152\u80b4=\u9152\u80b4 +\u9152\u836f=\u9152\u85e5 +\u9152\u91b4\u66f2\u8616=\u9152\u91b4\u9eb4\u6af1 +\u9152\u66f2=\u9152\u9eb4 +\u9165\u677e=\u9165\u9b06 +\u9187\u6734=\u9187\u6a38 +\u9189\u4e8e=\u9189\u65bc +\u918b\u575b=\u918b\u7f48 +\u4e11\u4e2b\u5934=\u919c\u4e2b\u982d +\u4e11\u4e8b=\u919c\u4e8b +\u4e11\u4eba=\u919c\u4eba +\u4e11\u4faa=\u919c\u5115 +\u4e11\u516b\u602a=\u919c\u516b\u602a +\u4e11\u524c\u524c=\u919c\u524c\u524c +\u4e11\u5267=\u919c\u5287 +\u4e11\u5316=\u919c\u5316 +\u4e11\u53f2=\u919c\u53f2 +\u4e11\u540d=\u919c\u540d +\u4e11\u54a4=\u919c\u5412 +\u4e11\u5730=\u919c\u5730 +\u4e11\u5937=\u919c\u5937 +\u4e11\u5973=\u919c\u5973 +\u4e11\u5973\u6548\u98a6=\u919c\u5973\u6548\u9870 +\u4e11\u5974\u513f=\u919c\u5974\u5152 +\u4e11\u5987=\u919c\u5a66 +\u4e11\u5ab3=\u919c\u5ab3 +\u4e11\u5ab3\u5987=\u919c\u5ab3\u5a66 +\u4e11\u5c0f\u9e2d=\u919c\u5c0f\u9d28 +\u4e11\u5df4\u602a=\u919c\u5df4\u602a +\u4e11\u5f92=\u919c\u5f92 +\u4e11\u6076=\u919c\u60e1 +\u4e11\u6001=\u919c\u614b +\u4e11\u6bd9\u4e86=\u919c\u6583\u4e86 +\u4e11\u4e8e=\u919c\u65bc +\u4e11\u672b=\u919c\u672b +\u4e11\u6837=\u919c\u6a23 +\u4e11\u6b7b=\u919c\u6b7b +\u4e11\u6bd4=\u919c\u6bd4 +\u4e11\u6cae=\u919c\u6cae +\u4e11\u7537=\u919c\u7537 +\u4e11\u95fb=\u919c\u805e +\u4e11\u58f0=\u919c\u8072 +\u4e11\u58f0\u8fdc\u64ad=\u919c\u8072\u9060\u64ad +\u4e11\u8138=\u919c\u81c9 +\u4e11\u864f=\u919c\u865c +\u4e11\u884c=\u919c\u884c +\u4e11\u8a00=\u919c\u8a00 +\u4e11\u8bcb=\u919c\u8a46 +\u4e11\u8bdd=\u919c\u8a71 +\u4e11\u8bed=\u919c\u8a9e +\u4e11\u8d3c\u751f=\u919c\u8cca\u751f +\u4e11\u8f9e=\u919c\u8fad +\u4e11\u8fb1=\u919c\u8fb1 +\u4e11\u9006=\u919c\u9006 +\u4e11\u4e11=\u919c\u919c +\u4e11\u964b=\u919c\u964b +\u4e11\u6742=\u919c\u96dc +\u4e11\u5934\u602a\u8138=\u919c\u982d\u602a\u81c9 +\u4e11\u7c7b=\u919c\u985e +\u915d\u917f\u7740=\u919e\u91c0\u8457 +\u533b\u836f=\u91ab\u85e5 +\u917f\u5236=\u91c0\u88fd +\u8845\u949f=\u91c1\u9418 +\u91c7\u77f3\u4e4b\u5f79=\u91c7\u77f3\u4e4b\u5f79 +\u91c7\u77f3\u4e4b\u6218=\u91c7\u77f3\u4e4b\u6230 +\u91c7\u77f3\u4e4b\u6230=\u91c7\u77f3\u4e4b\u6230 +\u91c7\u77f3\u78ef=\u91c7\u77f3\u78ef +\u91c7\u77f3\u77f6=\u91c7\u77f3\u78ef +\u91c9\u836f=\u91c9\u85e5 +\u91cc\u7a0b\u8868=\u91cc\u7a0b\u9336 +\u91cd\u5212=\u91cd\u5283 +\u91cd\u56de=\u91cd\u56de +\u91cd\u6298=\u91cd\u647a +\u91cd\u4e8e=\u91cd\u65bc +\u91cd\u7f57\u9762=\u91cd\u7f85\u9eb5 +\u91cd\u5236=\u91cd\u88fd +\u91cd\u590d=\u91cd\u8907 +\u91cd\u6258=\u91cd\u8a17 +\u91cd\u6e38=\u91cd\u904a +\u91cd\u9524=\u91cd\u939a +\u91ce\u59dc=\u91ce\u8591 +\u91ce\u6e38=\u91ce\u904a +\u5398\u51fa=\u91d0\u51fa +\u5398\u5347=\u91d0\u5347 +\u5398\u5b9a=\u91d0\u5b9a +\u5398\u6b63=\u91d0\u6b63 +\u5398\u6e05=\u91d0\u6e05 +\u5398\u8ba2=\u91d0\u8a02 +\u91d1\u4ec6\u59d1=\u91d1\u50d5\u59d1 +\u91d1\u4ed1\u6eaa=\u91d1\u5d19\u6eaa +\u91d1\u5e03\u9053=\u91d1\u5e03\u9053 +\u91d1\u8303=\u91d1\u7bc4 +\u91d1\u8868\u60c5=\u91d1\u8868\u60c5 +\u91d1\u8868\u6001=\u91d1\u8868\u614b +\u91d1\u8868\u626c=\u91d1\u8868\u63da +\u91d1\u8868\u660e=\u91d1\u8868\u660e +\u91d1\u8868\u6f14=\u91d1\u8868\u6f14 +\u91d1\u8868\u73b0=\u91d1\u8868\u73fe +\u91d1\u8868\u793a=\u91d1\u8868\u793a +\u91d1\u8868\u8fbe=\u91d1\u8868\u9054 +\u91d1\u8868\u9732=\u91d1\u8868\u9732 +\u91d1\u8868\u9762=\u91d1\u8868\u9762 +\u91d1\u88c5\u7389\u91cc=\u91d1\u88dd\u7389\u88e1 +\u91d1\u8868=\u91d1\u9336 +\u91d1\u949f=\u91d1\u9418 +\u91d1\u9a6c\u4ed1\u9053=\u91d1\u99ac\u5d19\u9053 +\u91d1\u53d1=\u91d1\u9aee +\u9489\u9524=\u91d8\u939a +\u94a9\u5fc3\u6597\u89d2=\u920e\u5fc3\u9b25\u89d2 +\u94c3\u54cd\u540e=\u9234\u97ff\u5f8c +\u94f6\u6731=\u9280\u7843 +\u94f6\u53d1=\u9280\u9aee +\u94dc\u8303=\u9285\u7bc4 +\u94dc\u5236=\u9285\u88fd +\u94dc\u949f=\u9285\u9418 +\u94ef\u949f=\u92ab\u9418 +\u94dd\u5236=\u92c1\u88fd +\u94fa\u9526\u5217\u7ee3=\u92ea\u9326\u5217\u7e61 +\u94a2\u4e4b\u70bc\u91d1\u672f\u5e08=\u92fc\u4e4b\u934a\u91d1\u8853\u5e2b +\u94a2\u6881=\u92fc\u6a11 +\u94a2\u5236=\u92fc\u88fd +\u5f55\u7740=\u9304\u8457 +\u5f55\u5236=\u9304\u88fd +\u9524\u70bc=\u9318\u934a +\u94b1\u8c37=\u9322\u7a40 +\u94b1\u8303=\u9322\u7bc4 +\u94b1\u5e84=\u9322\u838a +\u9526\u7ee3\u82b1\u56ed=\u9326\u7d89\u82b1\u5712 +\u9526\u7ee3=\u9326\u7e61 +\u8868\u505c=\u9336\u505c +\u8868\u51a0=\u9336\u51a0 +\u8868\u5e26=\u9336\u5e36 +\u8868\u5e97=\u9336\u5e97 +\u8868\u5382=\u9336\u5ee0 +\u8868\u5feb=\u9336\u5feb +\u8868\u6162=\u9336\u6162 +\u8868\u677f=\u9336\u677f +\u8868\u58f3=\u9336\u6bbc +\u8868\u738b=\u9336\u738b +\u8868\u7684\u5600\u55d2=\u9336\u7684\u5600\u55d2 +\u8868\u7684\u5386\u53f2=\u9336\u7684\u6b77\u53f2 +\u8868\u76d8=\u9336\u76e4 +\u8868\u8499\u5b50=\u9336\u8499\u5b50 +\u8868\u884c=\u9336\u884c +\u8868\u8f6c=\u9336\u8f49 +\u8868\u901f=\u9336\u901f +\u8868\u9488=\u9336\u91dd +\u8868\u94fe=\u9336\u93c8 +\u70bc\u51b6=\u934a\u51b6 +\u70bc\u53e5=\u934a\u53e5 +\u70bc\u5b57=\u934a\u5b57 +\u70bc\u5e08=\u934a\u5e2b +\u70bc\u5ea6=\u934a\u5ea6 +\u70bc\u5f62=\u934a\u5f62 +\u70bc\u6c14=\u934a\u6c23 +\u70bc\u6c5e=\u934a\u6c5e +\u70bc\u77f3=\u934a\u77f3 +\u70bc\u8d2b=\u934a\u8ca7 +\u70bc\u91d1\u672f=\u934a\u91d1\u8853 +\u70bc\u94a2=\u934a\u92fc +\u9505\u5e84=\u934b\u838a +\u953b\u70bc\u51fa=\u935b\u934a\u51fa +\u9532\u800c\u4e0d\u820d=\u9365\u800c\u4e0d\u6368 +\u9570\u4ed3=\u938c\u5009 +\u9524\u513f=\u939a\u5152 +\u9524\u5b50=\u939a\u5b50 +\u9524\u5934=\u939a\u982d +\u9508\u75c5=\u93fd\u75c5 +\u9508\u83cc=\u93fd\u83cc +\u9508\u8680=\u93fd\u8755 +\u949f\u4e0a=\u9418\u4e0a +\u949f\u4e0b=\u9418\u4e0b +\u949f\u4e0d=\u9418\u4e0d +\u949f\u4e0d\u6263\u4e0d\u9e23=\u9418\u4e0d\u6263\u4e0d\u9cf4 +\u949f\u4e0d\u649e\u4e0d\u9e23=\u9418\u4e0d\u649e\u4e0d\u9cf4 +\u949f\u4e0d\u6572\u4e0d\u54cd=\u9418\u4e0d\u6572\u4e0d\u97ff +\u949f\u4e0d\u7a7a\u5219\u54d1=\u9418\u4e0d\u7a7a\u5247\u555e +\u949f\u4e73\u6d1e=\u9418\u4e73\u6d1e +\u949f\u4e73\u77f3=\u9418\u4e73\u77f3 +\u949f\u505c=\u9418\u505c +\u949f\u5320=\u9418\u5320 +\u949f\u53e3=\u9418\u53e3 +\u949f\u5728\u5bfa\u91cc=\u9418\u5728\u5bfa\u88e1 +\u949f\u5854=\u9418\u5854 +\u949f\u58c1=\u9418\u58c1 +\u949f\u592a=\u9418\u592a +\u949f\u597d=\u9418\u597d +\u949f\u5c71=\u9418\u5c71 +\u949f\u5de6\u53f3=\u9418\u5de6\u53f3 +\u949f\u5dee=\u9418\u5dee +\u949f\u5ea7=\u9418\u5ea7 +\u949f\u5f62=\u9418\u5f62 +\u949f\u5f62\u866b=\u9418\u5f62\u87f2 +\u949f\u5f8b=\u9418\u5f8b +\u949f\u5feb=\u9418\u5feb +\u949f\u610f=\u9418\u610f +\u949f\u6162=\u9418\u6162 +\u949f\u6446=\u9418\u64fa +\u949f\u6572=\u9418\u6572 +\u949f\u6709=\u9418\u6709 +\u949f\u697c=\u9418\u6a13 +\u949f\u6a21=\u9418\u6a21 +\u949f\u6ca1=\u9418\u6c92 +\u949f\u6f0f=\u9418\u6f0f +\u949f\u738b=\u9418\u738b +\u949f\u7434=\u9418\u7434 +\u949f\u53d1\u97f3=\u9418\u767c\u97f3 +\u949f\u7684=\u9418\u7684 +\u949f\u76d8=\u9418\u76e4 +\u949f\u76f8=\u9418\u76f8 +\u949f\u78ec=\u9418\u78ec +\u949f\u7ebd=\u9418\u7d10 +\u949f\u7f69=\u9418\u7f69 +\u949f\u58f0=\u9418\u8072 +\u949f\u8170=\u9418\u8170 +\u949f\u884c=\u9418\u884c +\u949f\u8868\u9762=\u9418\u8868\u9762 +\u949f\u88ab=\u9418\u88ab +\u949f\u8c03=\u9418\u8abf +\u949f\u8eab=\u9418\u8eab +\u949f\u901f=\u9418\u901f +\u949f\u8868=\u9418\u9336 +\u949f\u8868\u505c=\u9418\u9336\u505c +\u949f\u8868\u5feb=\u9418\u9336\u5feb +\u949f\u8868\u6162=\u9418\u9336\u6162 +\u949f\u8868\u5386\u53f2=\u9418\u9336\u6b77\u53f2 +\u949f\u8868\u738b=\u9418\u9336\u738b +\u949f\u8868\u7684=\u9418\u9336\u7684 +\u949f\u8868\u7684\u5386\u53f2=\u9418\u9336\u7684\u6b77\u53f2 +\u949f\u8868\u76d8=\u9418\u9336\u76e4 +\u949f\u8868\u884c=\u9418\u9336\u884c +\u949f\u8868\u901f=\u9418\u9336\u901f +\u949f\u5173=\u9418\u95dc +\u949f\u9648\u5217=\u9418\u9673\u5217 +\u949f\u9762=\u9418\u9762 +\u949f\u54cd=\u9418\u97ff +\u949f\u9876=\u9418\u9802 +\u949f\u5934=\u9418\u982d +\u949f\u4f53=\u9418\u9ad4 +\u949f\u9e23=\u9418\u9cf4 +\u949f\u70b9=\u9418\u9ede +\u949f\u9f0e=\u9418\u9f0e +\u949f\u9f13=\u9418\u9f13 +\u94c1\u6746=\u9435\u6746 +\u94c1\u680f\u6746=\u9435\u6b04\u6746 +\u94c1\u9524=\u9435\u939a +\u94c1\u9508=\u9435\u93fd +\u94c1\u949f=\u9435\u9418 +\u94f8\u949f=\u9444\u9418 +\u9274\u4e8e=\u9452\u65bc +\u957f\u51e0=\u9577\u51e0 +\u957f\u4e8e=\u9577\u65bc +\u957f\u5386=\u9577\u66c6 +\u957f\u5386\u53f2=\u9577\u6b77\u53f2 +\u957f\u751f\u836f=\u9577\u751f\u85e5 +\u957f\u80e1=\u9577\u9b0d +\u95e8\u524d\u95e8\u540e=\u9580\u524d\u9580\u5f8c +\u95e8\u5e18=\u9580\u5e18 +\u95e8\u540a\u513f=\u9580\u5f14\u5152 +\u95e8\u91cc=\u9580\u88e1 +\u95eb\u6000\u793c=\u9586\u61f7\u79ae +\u5f00\u540a=\u958b\u5f14 +\u5f00\u5f81=\u958b\u5fb5 +\u5f00\u91c7=\u958b\u63a1 +\u5f00\u53d1=\u958b\u767c +\u5f00\u836f=\u958b\u85e5 +\u5f00\u8f9f=\u958b\u95e2 +\u5f00\u54c4=\u958b\u9b28 +\u95f2\u60c5\u9038\u81f4=\u9592\u60c5\u9038\u7dfb +\u95f2\u8361=\u9592\u8569 +\u95f2\u6e38=\u9592\u904a +\u95f4\u4e0d\u5bb9\u53d1=\u9593\u4e0d\u5bb9\u9aee +\u95f5\u91c7\u5c14=\u9594\u63a1\u723e +\u5408\u5e9c=\u95a4\u5e9c +\u95fa\u8303=\u95a8\u7bc4 +\u9603\u8303=\u95ab\u7bc4 +\u95ef\u8361=\u95d6\u8569 +\u95ef\u70bc=\u95d6\u934a +\u5173\u7cfb=\u95dc\u4fc2 +\u5173\u7cfb\u7740=\u95dc\u4fc2\u8457 +\u5173\u5f13\u4e0e\u6211\u786e=\u95dc\u5f13\u8207\u6211\u786e +\u5173\u4e8e=\u95dc\u65bc +\u8f9f\u4f5b=\u95e2\u4f5b +\u8f9f\u4f5c=\u95e2\u4f5c +\u8f9f\u5212=\u95e2\u5283 +\u8f9f\u571f=\u95e2\u571f +\u8f9f\u5730=\u95e2\u5730 +\u8f9f\u5ba4=\u95e2\u5ba4 +\u8f9f\u5efa=\u95e2\u5efa +\u8f9f\u4e3a=\u95e2\u70ba +\u8f9f\u7530=\u95e2\u7530 +\u8f9f\u7b51=\u95e2\u7bc9 +\u8f9f\u8c23=\u95e2\u8b20 +\u8f9f\u8f9f=\u95e2\u8f9f +\u8f9f\u90aa\u4ee5\u5f8b=\u95e2\u90aa\u4ee5\u5f8b +\u9632\u6652=\u9632\u6652 +\u9632\u5fa1=\u9632\u79a6 +\u9632\u8303=\u9632\u7bc4 +\u9632\u9508=\u9632\u93fd +\u9632\u53f0=\u9632\u98b1 +\u963b\u4e8e=\u963b\u65bc +\u963f\u5446\u74dc=\u963f\u5446\u74dc +\u963f\u65af\u56fe\u91cc\u4e9a\u65af=\u963f\u65af\u5716\u91cc\u4e9e\u65af +\u963f\u5446=\u963f\u7343 +\u9644\u4e8e=\u9644\u65bc +\u9644\u6ce8=\u9644\u8a3b +\u964d\u538b\u836f=\u964d\u58d3\u85e5 +\u5347\u5b98=\u965e\u5b98 +\u9664\u81ed\u836f=\u9664\u81ed\u85e5 +\u966a\u540a=\u966a\u5f14 +\u9634\u5e72=\u9670\u4e7e +\u9634\u5386=\u9670\u66c6 +\u9634\u5386\u53f2=\u9670\u6b77\u53f2 +\u9634\u6c9f\u91cc\u7ffb\u8239=\u9670\u6e9d\u88e1\u7ffb\u8239 +\u9634\u90c1=\u9670\u9b31 +\u9648\u70bc=\u9673\u934a +\u9646\u6e38=\u9678\u904a +\u9633\u6625\u9762=\u967d\u6625\u9eb5 +\u9633\u5386=\u967d\u66c6 +\u9633\u5386\u53f2=\u967d\u6b77\u53f2 +\u9686\u51c6\u8bb8=\u9686\u51c6\u8a31 +\u9686\u51c6=\u9686\u6e96 +\u968f\u540e=\u96a8\u5f8c +\u968f\u4e8e=\u96a8\u65bc +\u9690\u5360=\u96b1\u4f54 +\u9690\u51e0=\u96b1\u51e0 +\u9690\u4e8e=\u96b1\u65bc +\u53ea\u5b57=\u96bb\u5b57 +\u53ea\u5f71=\u96bb\u5f71 +\u53ea\u624b\u906e\u5929=\u96bb\u624b\u906e\u5929 +\u53ea\u773c=\u96bb\u773c +\u53ea\u8a00\u7247\u8bed=\u96bb\u8a00\u7247\u8a9e +\u53ea\u8eab=\u96bb\u8eab +\u96c4\u6597\u6597=\u96c4\u6597\u6597 +\u96c5\u8303=\u96c5\u7bc4 +\u96c5\u81f4=\u96c5\u7dfb +\u96c6\u4e8e=\u96c6\u65bc +\u96c6\u6e38\u6cd5=\u96c6\u904a\u6cd5 +\u96c7\u4f63=\u96c7\u50ad +\u96d5\u6881\u753b\u680b=\u96d5\u6a11\u756b\u68df +\u53cc\u6298\u5c04=\u96d9\u6298\u5c04 +\u53cc\u6298=\u96d9\u647a +\u53cc\u80dc\u7c7b=\u96d9\u80dc\u985e +\u53cc\u96d5=\u96d9\u9d70 +\u6742\u5408\u9762\u513f=\u96dc\u5408\u9eb5\u5152 +\u6742\u5fd7=\u96dc\u8a8c +\u6742\u9762=\u96dc\u9eb5 +\u9e21\u5435\u9e45\u6597=\u96de\u5435\u9d5d\u9b25 +\u9e21\u5978=\u96de\u59e6 +\u9e21\u4e89\u9e45\u6597=\u96de\u722d\u9d5d\u9b25 +\u9e21\u4e1d=\u96de\u7d72 +\u9e21\u4e1d\u9762=\u96de\u7d72\u9eb5 +\u9e21\u817f\u9762=\u96de\u817f\u9eb5 +\u9e21\u86cb\u91cc\u6311\u9aa8\u5934=\u96de\u86cb\u88e1\u6311\u9aa8\u982d +\u9e21\u53ea=\u96de\u96bb +\u79bb\u4e8e=\u96e2\u65bc +\u96be\u820d=\u96e3\u6368 +\u96be\u4e8e=\u96e3\u65bc +\u96e8\u540e=\u96e8\u5f8c +\u96ea\u7a97\u8424\u51e0=\u96ea\u7a97\u87a2\u51e0 +\u96ea\u91cc=\u96ea\u88e1 +\u96ea\u91cc\u7ea2=\u96ea\u91cc\u7d05 +\u4e91\u5357\u767d\u836f=\u96f2\u5357\u767d\u85e5 +\u4e91\u7b08\u4e03\u7b7e=\u96f2\u7b08\u4e03\u7c64 +\u4e91\u6e38=\u96f2\u904a +\u4e91\u987b=\u96f2\u9b1a +\u96f6\u591a\u53ea=\u96f6\u591a\u96bb +\u96f6\u5929\u540e=\u96f6\u5929\u5f8c +\u96f6\u53ea=\u96f6\u96bb +\u96f6\u4f59=\u96f6\u9918 +\u7535\u5b50\u8868=\u96fb\u5b50\u9336 +\u7535\u5b50\u949f=\u96fb\u5b50\u9418 +\u7535\u5b50\u949f\u8868=\u96fb\u5b50\u9418\u9336 +\u7535\u6746=\u96fb\u6746 +\u7535\u7ebf\u6746=\u96fb\u7dda\u6746 +\u7535\u51b2=\u96fb\u885d +\u7535\u8868=\u96fb\u9336 +\u7535\u949f=\u96fb\u9418 +\u9707\u6817=\u9707\u6144 +\u9707\u8361=\u9707\u8569 +\u96fe\u91cc=\u9727\u88e1 +\u9732\u4e11=\u9732\u919c +\u9738\u5360=\u9738\u4f54 +\u9701\u8303=\u973d\u7bc4 +\u7075\u836f=\u9748\u85e5 +\u9752\u5c71\u4e00\u53d1=\u9752\u5c71\u4e00\u9aee +\u9752\u82f9=\u9752\u82f9 +\u9752\u82f9\u679c=\u9752\u860b\u679c +\u9752\u8747\u540a\u5ba2=\u9752\u8805\u5f14\u5ba2 +\u9752\u9709\u7d20=\u9752\u9709\u7d20 +\u9752\u9709=\u9752\u9ef4 +\u975e\u5360\u4e0d\u53ef=\u975e\u4f54\u4e0d\u53ef +\u9760\u540e=\u9760\u5f8c +\u9760\u91cc\u9762=\u9760\u88e1\u9762 +\u9762\u5305\u4f4f=\u9762\u5305\u4f4f +\u9762\u5305\u542b=\u9762\u5305\u542b +\u9762\u5305\u56f4=\u9762\u5305\u570d +\u9762\u5305\u5bb9=\u9762\u5305\u5bb9 +\u9762\u5305\u5e87=\u9762\u5305\u5e87 +\u9762\u5305\u53a2=\u9762\u5305\u5ec2 +\u9762\u5305\u6284=\u9762\u5305\u6284 +\u9762\u5305\u62ec=\u9762\u5305\u62ec +\u9762\u5305\u63fd=\u9762\u5305\u652c +\u9762\u5305\u6db5=\u9762\u5305\u6db5 +\u9762\u5305\u7ba1=\u9762\u5305\u7ba1 +\u9762\u5305\u624e=\u9762\u5305\u7d2e +\u9762\u5305\u7f57=\u9762\u5305\u7f85 +\u9762\u5305\u7740=\u9762\u5305\u8457 +\u9762\u5305\u85cf=\u9762\u5305\u85cf +\u9762\u5305\u88c5=\u9762\u5305\u88dd +\u9762\u5305\u88f9=\u9762\u5305\u88f9 +\u9762\u5305\u8d77=\u9762\u5305\u8d77 +\u9762\u5305\u529e=\u9762\u5305\u8fa6 +\u9762\u5e97\u8216=\u9762\u5e97\u8216 +\u9762\u671d\u7740=\u9762\u671d\u8457 +\u9762\u6761\u76ee=\u9762\u689d\u76ee +\u9762\u689d\u76ee=\u9762\u689d\u76ee +\u9762\u7c89\u788e=\u9762\u7c89\u788e +\u9762\u7c89\u7ea2=\u9762\u7c89\u7d05 +\u9762\u4e34\u7740=\u9762\u81e8\u8457 +\u9762\u98df\u996d=\u9762\u98df\u98ef +\u9762\u98df\u9762=\u9762\u98df\u9eb5 +\u978b\u91cc=\u978b\u88e1 +\u97a3\u5236=\u97a3\u88fd +\u79cb\u5343=\u97a6\u97c6 +\u97ad\u8f9f\u5165\u91cc=\u97ad\u8f9f\u5165\u88e1 +\u97e6\u5e84=\u97cb\u838a +\u97e9\u56fd\u5236=\u97d3\u570b\u88fd +\u97e9\u5236=\u97d3\u88fd +\u97f3\u51c6=\u97f3\u6e96 +\u97f3\u58f0\u5982\u949f=\u97f3\u8072\u5982\u9418 +\u97f6\u5c71\u51b2=\u97f6\u5c71\u885d +\u54cd\u949f=\u97ff\u9418 +\u9801\u9762=\u9801\u9762 +\u9875\u9762=\u9801\u9762 +\u9802\u591a=\u9802\u591a +\u9876\u591a=\u9802\u591a +\u9879\u5e84=\u9805\u838a +\u987a\u4e8e=\u9806\u65bc +\u987a\u949f\u5411=\u9806\u9418\u5411 +\u987b\u6839\u636e=\u9808\u6839\u64da +\u9882\u7cfb=\u980c\u7e6b +\u9882\u8d5e=\u980c\u8b9a +\u9884\u5236=\u9810\u88fd +\u9886\u8896\u6b32=\u9818\u8896\u617e +\u5934\u5dfe\u540a\u5728\u6c34\u91cc=\u982d\u5dfe\u5f14\u5728\u6c34\u88e1 +\u5934\u91cc=\u982d\u88e1 +\u5934\u53d1=\u982d\u9aee +\u988a\u987b=\u9830\u9b1a +\u9898\u7b7e=\u984c\u7c64 +\u989d\u5f81=\u984d\u5fb5 +\u989d\u6211\u7565\u5386=\u984d\u6211\u7565\u66c6 +\u989d\u6211\u7565\u5386\u53f2=\u984d\u6211\u7565\u6b77\u53f2 +\u989c\u8303=\u984f\u7bc4 +\u98a0\u5e72\u5012\u5764=\u985b\u4e7e\u5012\u5764 +\u98a0\u8986=\u985b\u8986 +\u98a0\u98a0\u4ec6\u4ec6=\u985b\u985b\u4ec6\u4ec6 +\u987e\u524d\u4e0d\u987e\u540e=\u9867\u524d\u4e0d\u9867\u5f8c +\u98a4\u6817=\u986b\u6144 +\u663e\u793a\u8868=\u986f\u793a\u9336 +\u663e\u793a\u949f=\u986f\u793a\u9418 +\u663e\u793a\u949f\u8868=\u986f\u793a\u9418\u9336 +\u663e\u7740\u6807\u5fd7=\u986f\u8457\u6a19\u5fd7 +\u98ce\u5e72=\u98a8\u4e7e +\u98ce\u571f\u5fd7=\u98a8\u571f\u8a8c +\u98ce\u5377\u6b8b\u4e91=\u98a8\u6372\u6b98\u96f2 +\u98ce\u7269\u5fd7=\u98a8\u7269\u8a8c +\u98ce\u8303=\u98a8\u7bc4 +\u98ce\u91cc=\u98a8\u88e1 +\u98ce\u8d77\u4e91\u6d8c=\u98a8\u8d77\u96f2\u6e67 +\u53f0\u98ce=\u98b1\u98a8 +\u522e\u4e86=\u98b3\u4e86 +\u522e\u5012=\u98b3\u5012 +\u522e\u53bb=\u98b3\u53bb +\u522e\u5f97=\u98b3\u5f97 +\u522e\u8d70=\u98b3\u8d70 +\u522e\u8d77=\u98b3\u8d77 +\u522e\u96ea=\u98b3\u96ea +\u522e\u98ce=\u98b3\u98a8 +\u98d8\u8361=\u98c4\u8569 +\u98d8\u6e38=\u98c4\u904a +\u98d8\u98d8\u8361\u8361=\u98c4\u98c4\u8569\u8569 +\u98de\u624e=\u98db\u7d2e +\u98de\u520d\u633d\u7c9f=\u98db\u82bb\u8f13\u7c9f +\u98de\u884c\u949f=\u98db\u884c\u9418 +\u98df\u6b32=\u98df\u617e +\u98df\u6b32\u4e0d\u632f=\u98df\u6b32\u4e0d\u632f +\u98df\u91ce\u4e4b\u82f9=\u98df\u91ce\u4e4b\u82f9 +\u98df\u9762=\u98df\u9eb5 +\u996d\u540e=\u98ef\u5f8c +\u996d\u540e\u949f=\u98ef\u5f8c\u9418 +\u996d\u56e2=\u98ef\u7cf0 +\u996d\u5e84=\u98ef\u838a +\u9972\u5582=\u98fc\u9935 +\u997c\u5e72=\u9905\u4e7e +\u9982\u4f59=\u9915\u9918 +\u4f590=\u99180 +\u4f591=\u99181 +\u4f592=\u99182 +\u4f593=\u99183 +\u4f594=\u99184 +\u4f595=\u99185 +\u4f596=\u99186 +\u4f597=\u99187 +\u4f598=\u99188 +\u4f599=\u99189 +\u4f59\u3007=\u9918\u3007 +\u4f59\u4e00=\u9918\u4e00 +\u4f59\u4e03=\u9918\u4e03 +\u4f59\u4e09=\u9918\u4e09 +\u4f59\u4e0b=\u9918\u4e0b +\u4f59\u4e5d=\u9918\u4e5d +\u4f59\u4e8b=\u9918\u4e8b +\u4f59\u4e8c=\u9918\u4e8c +\u4f59\u4e94=\u9918\u4e94 +\u4f59\u4eba=\u9918\u4eba +\u4f59\u4fd7=\u9918\u4fd7 +\u4f59\u500d=\u9918\u500d +\u4f59\u50c7=\u9918\u50c7 +\u4f59\u5149=\u9918\u5149 +\u4f59\u516b=\u9918\u516b +\u4f59\u516d=\u9918\u516d +\u4f59\u5203=\u9918\u5203 +\u4f59\u5207=\u9918\u5207 +\u4f59\u5229=\u9918\u5229 +\u4f59\u5272=\u9918\u5272 +\u4f59\u529b=\u9918\u529b +\u4f59\u52c7=\u9918\u52c7 +\u4f59\u5341=\u9918\u5341 +\u4f59\u5473=\u9918\u5473 +\u4f59\u5598=\u9918\u5598 +\u4f59\u56db=\u9918\u56db +\u4f59\u5730=\u9918\u5730 +\u4f59\u58a8=\u9918\u58a8 +\u4f59\u5916=\u9918\u5916 +\u4f59\u5999=\u9918\u5999 +\u4f59\u59da=\u9918\u59da +\u4f59\u5a01=\u9918\u5a01 +\u4f59\u5b50=\u9918\u5b50 +\u4f59\u5b58=\u9918\u5b58 +\u4f59\u5b7d=\u9918\u5b7d +\u4f59\u5f26=\u9918\u5f26 +\u4f59\u601d=\u9918\u601d +\u4f59\u60b8=\u9918\u60b8 +\u4f59\u5e86=\u9918\u6176 +\u4f59\u6570=\u9918\u6578 +\u4f59\u660e=\u9918\u660e +\u4f59\u6620=\u9918\u6620 +\u4f59\u6687=\u9918\u6687 +\u4f59\u6656=\u9918\u6689 +\u4f59\u676d=\u9918\u676d +\u4f59\u676f=\u9918\u676f +\u4f59\u6843=\u9918\u6843 +\u4f59\u6876=\u9918\u6876 +\u4f59\u4e1a=\u9918\u696d +\u4f59\u6b3e=\u9918\u6b3e +\u4f59\u6b65=\u9918\u6b65 +\u4f59\u6b83=\u9918\u6b83 +\u4f59\u6bd2=\u9918\u6bd2 +\u4f59\u6c14=\u9918\u6c23 +\u4f59\u6ce2=\u9918\u6ce2 +\u4f59\u6ce2\u8361\u6f3e=\u9918\u6ce2\u76ea\u6f3e +\u4f59\u6e29=\u9918\u6eab +\u4f59\u6cfd=\u9918\u6fa4 +\u4f59\u6ca5=\u9918\u701d +\u4f59\u70c8=\u9918\u70c8 +\u4f59\u70ed=\u9918\u71b1 +\u4f59\u70ec=\u9918\u71fc +\u4f59\u73cd=\u9918\u73cd +\u4f59\u751f=\u9918\u751f +\u4f59\u4f17=\u9918\u773e +\u4f59\u7a8d=\u9918\u7ac5 +\u4f59\u7cae=\u9918\u7ce7 +\u4f59\u7eea=\u9918\u7dd2 +\u4f59\u7f3a=\u9918\u7f3a +\u4f59\u7f6a=\u9918\u7f6a +\u4f59\u7fa8=\u9918\u7fa8 +\u4f59\u58f0=\u9918\u8072 +\u4f59\u818f=\u9918\u818f +\u4f59\u5174=\u9918\u8208 +\u4f59\u84c4=\u9918\u84c4 +\u4f59\u836b=\u9918\u852d +\u4f59\u88d5=\u9918\u88d5 +\u4f59\u89d2=\u9918\u89d2 +\u4f59\u8bba=\u9918\u8ad6 +\u4f59\u8d23=\u9918\u8cac +\u4f59\u8cbe=\u9918\u8cbe +\u4f59\u8f89=\u9918\u8f1d +\u4f59\u8f9c=\u9918\u8f9c +\u4f59\u9172=\u9918\u9172 +\u4f59\u95f0=\u9918\u958f +\u4f59\u95f2=\u9918\u9592 +\u4f59\u96f6=\u9918\u96f6 +\u4f59\u9707=\u9918\u9707 +\u4f59\u971e=\u9918\u971e +\u4f59\u97f3=\u9918\u97f3 +\u4f59\u97f3\u7ed5\u6881=\u9918\u97f3\u7e5e\u6881 +\u4f59\u97f5=\u9918\u97fb +\u4f59\u54cd=\u9918\u97ff +\u4f59\u989d=\u9918\u984d +\u4f59\u98ce=\u9918\u98a8 +\u4f59\u98df=\u9918\u98df +\u4f59\u515a=\u9918\u9ee8 +\u4f59\uff10=\u9918\uff10 +\u4f59\uff11=\u9918\uff11 +\u4f59\uff12=\u9918\uff12 +\u4f59\uff13=\u9918\uff13 +\u4f59\uff14=\u9918\uff14 +\u4f59\uff15=\u9918\uff15 +\u4f59\uff16=\u9918\uff16 +\u4f59\uff17=\u9918\uff17 +\u4f59\uff18=\u9918\uff18 +\u4f59\uff19=\u9918\uff19 +\u9984\u9968\u9762=\u991b\u98e9\u9eb5 +\u9986\u540e\u4e00\u8857=\u9928\u5f8c\u4e00\u8857 +\u9986\u540e\u4e8c\u8857=\u9928\u5f8c\u4e8c\u8857 +\u9986\u8c37=\u9928\u7a40 +\u5582\u4e73=\u9935\u4e73 +\u5582\u4e86=\u9935\u4e86 +\u5582\u5976=\u9935\u5976 +\u5582\u7ed9=\u9935\u7d66 +\u5582\u7f8a=\u9935\u7f8a +\u5582\u732a=\u9935\u8c6c +\u5582\u8fc7=\u9935\u904e +\u5582\u9e21=\u9935\u96de +\u5582\u98df=\u9935\u98df +\u5582\u9971=\u9935\u98fd +\u5582\u517b=\u9935\u990a +\u5582\u9a74=\u9935\u9a62 +\u5582\u9c7c=\u9935\u9b5a +\u5582\u9e2d=\u9935\u9d28 +\u5582\u9e45=\u9935\u9d5d +\u9965\u5bd2=\u9951\u5bd2 +\u9965\u6c11=\u9951\u6c11 +\u9965\u6e34=\u9951\u6e34 +\u9965\u6eba=\u9951\u6eba +\u9965\u9971=\u9951\u98fd +\u9965\u9991=\u9951\u9949 +\u9996\u5f53\u5176\u51b2=\u9996\u7576\u5176\u885d +\u9999\u5e72=\u9999\u4e7e +\u9999\u5c71\u5e84=\u9999\u5c71\u5e84 +\u9a6c\u5e72=\u99ac\u4e7e +\u9a6c\u5360\u5c71=\u99ac\u5360\u5c71 +\u99ac\u5360\u5c71=\u99ac\u5360\u5c71 +\u9a6c\u540e=\u99ac\u5f8c +\u9a6c\u6746=\u99ac\u6746 +\u9a6c\u8868=\u99ac\u9336 +\u9a7b\u624e=\u99d0\u7d2e +\u9a80\u8361=\u99d8\u8569 +\u817e\u51b2=\u9a30\u885d +\u60ca\u8d5e=\u9a5a\u8b9a +\u60ca\u949f=\u9a5a\u9418 +\u9aa8\u5b50\u91cc=\u9aa8\u5b50\u88e1 +\u9aa8\u5e72=\u9aa8\u5e79 +\u9aa8\u7070\u575b=\u9aa8\u7070\u7f48 +\u9aa8\u575b=\u9aa8\u7f48 +\u9aa8\u5934\u91cc\u6323\u51fa\u6765\u7684\u94b1\u624d\u505a\u5f97\u8089=\u9aa8\u982d\u88e1\u6399\u51fa\u4f86\u7684\u9322\u7e94\u505a\u5f97\u8089 +\u80ae\u80ae\u810f\u810f=\u9aaf\u9aaf\u9ad2\u9ad2 +\u80ae\u810f=\u9aaf\u9ad2 +\u810f\u4e71=\u9ad2\u4e82 +\u810f\u4e86=\u9ad2\u4e86 +\u810f\u516e\u516e=\u9ad2\u516e\u516e +\u810f\u5b57=\u9ad2\u5b57 +\u810f\u5f97=\u9ad2\u5f97 +\u810f\u5fc3=\u9ad2\u5fc3 +\u810f\u4e1c\u897f=\u9ad2\u6771\u897f +\u810f\u6c34=\u9ad2\u6c34 +\u810f\u7684=\u9ad2\u7684 +\u810f\u8bcd=\u9ad2\u8a5e +\u810f\u8bdd=\u9ad2\u8a71 +\u810f\u94b1=\u9ad2\u9322 +\u810f\u53d1=\u9ad2\u9aee +\u4f53\u8303=\u9ad4\u7bc4 +\u9ad8\u51e0=\u9ad8\u51e0 +\u9ad8\u5e72\u6270=\u9ad8\u5e72\u64fe +\u9ad8\u5e72\u9884=\u9ad8\u5e72\u9810 +\u9ad8\u5e72=\u9ad8\u5e79 +\u9ad8\u5ea6\u81ea\u5236=\u9ad8\u5ea6\u81ea\u5236 +\u9ae1\u53d1=\u9ae1\u9aee +\u9aed\u80e1=\u9aed\u9b0d +\u9aed\u987b=\u9aed\u9b1a +\u53d1\u4e0a\u6307\u51a0=\u9aee\u4e0a\u6307\u51a0 +\u53d1\u4e0a\u51b2\u51a0=\u9aee\u4e0a\u6c96\u51a0 +\u53d1\u4e73=\u9aee\u4e73 +\u53d1\u5149\u53ef\u9274=\u9aee\u5149\u53ef\u9451 +\u53d1\u532a=\u9aee\u532a +\u53d1\u578b=\u9aee\u578b +\u53d1\u5939=\u9aee\u593e +\u53d1\u59bb=\u9aee\u59bb +\u53d1\u59d0=\u9aee\u59d0 +\u53d1\u5c4b=\u9aee\u5c4b +\u53d1\u5df2\u971c\u767d=\u9aee\u5df2\u971c\u767d +\u53d1\u5e26=\u9aee\u5e36 +\u53d1\u5eca=\u9aee\u5eca +\u53d1\u5f0f=\u9aee\u5f0f +\u53d1\u5f15\u5343\u94a7=\u9aee\u5f15\u5343\u921e +\u53d1\u6307=\u9aee\u6307 +\u53d1\u5377=\u9aee\u6372 +\u53d1\u6839=\u9aee\u6839 +\u53d1\u6cb9=\u9aee\u6cb9 +\u53d1\u6f02=\u9aee\u6f02 +\u53d1\u4e3a\u8840\u4e4b\u672c=\u9aee\u70ba\u8840\u4e4b\u672c +\u53d1\u72b6=\u9aee\u72c0 +\u53d1\u7663=\u9aee\u766c +\u53d1\u77ed\u5fc3\u957f=\u9aee\u77ed\u5fc3\u9577 +\u53d1\u7981=\u9aee\u7981 +\u53d1\u7b3a=\u9aee\u7b8b +\u53d1\u7eb1=\u9aee\u7d17 +\u53d1\u7ed3=\u9aee\u7d50 +\u53d1\u4e1d=\u9aee\u7d72 +\u53d1\u7f51=\u9aee\u7db2 +\u53d1\u811a=\u9aee\u8173 +\u53d1\u80a4=\u9aee\u819a +\u53d1\u80f6=\u9aee\u81a0 +\u53d1\u83dc=\u9aee\u83dc +\u53d1\u8721=\u9aee\u881f +\u53d1\u8e0a\u51b2\u51a0=\u9aee\u8e0a\u6c96\u51a0 +\u53d1\u8fab=\u9aee\u8fae +\u53d1\u9488=\u9aee\u91dd +\u53d1\u9497=\u9aee\u91f5 +\u53d1\u957f=\u9aee\u9577 +\u53d1\u9645=\u9aee\u969b +\u53d1\u96d5=\u9aee\u96d5 +\u53d1\u971c=\u9aee\u971c +\u53d1\u9970=\u9aee\u98fe +\u53d1\u9afb=\u9aee\u9afb +\u53d1\u9b13=\u9aee\u9b22 +\u9aef\u80e1=\u9aef\u9b0d +\u9afc\u677e=\u9afc\u9b06 +\u9b05\u677e=\u9b05\u9b06 +\u677e\u4e00\u53e3\u6c14=\u9b06\u4e00\u53e3\u6c23 +\u677e\u4e86=\u9b06\u4e86 +\u677e\u4e9b=\u9b06\u4e9b +\u677e\u5143\u97f3=\u9b06\u5143\u97f3 +\u677e\u52b2=\u9b06\u52c1 +\u677e\u52a8=\u9b06\u52d5 +\u677e\u53e3=\u9b06\u53e3 +\u677e\u5589=\u9b06\u5589 +\u677e\u571f=\u9b06\u571f +\u677e\u5bbd=\u9b06\u5bec +\u677e\u5f1b=\u9b06\u5f1b +\u677e\u5feb=\u9b06\u5feb +\u677e\u61c8=\u9b06\u61c8 +\u677e\u624b=\u9b06\u624b +\u677e\u6389=\u9b06\u6389 +\u677e\u6563=\u9b06\u6563 +\u677e\u67d4=\u9b06\u67d4 +\u677e\u6c14=\u9b06\u6c23 +\u677e\u6d6e=\u9b06\u6d6e +\u677e\u7ed1=\u9b06\u7d81 +\u677e\u7d27=\u9b06\u7dca +\u677e\u7f13=\u9b06\u7de9 +\u677e\u8106=\u9b06\u8106 +\u677e\u8131=\u9b06\u812b +\u677e\u86cb=\u9b06\u86cb +\u677e\u8d77=\u9b06\u8d77 +\u677e\u8f6f=\u9b06\u8edf +\u677e\u901a=\u9b06\u901a +\u677e\u5f00=\u9b06\u958b +\u677e\u997c=\u9b06\u9905 +\u677e\u677e=\u9b06\u9b06 +\u9b08\u53d1=\u9b08\u9aee +\u80e1\u5b50=\u9b0d\u5b50 +\u80e1\u68a2=\u9b0d\u68a2 +\u80e1\u6e23=\u9b0d\u6e23 +\u80e1\u9aed=\u9b0d\u9aed +\u80e1\u9aef=\u9b0d\u9aef +\u80e1\u987b=\u9b0d\u9b1a +\u9b12\u53d1=\u9b12\u9aee +\u987b\u6839=\u9b1a\u6839 +\u987b\u6bdb=\u9b1a\u6bdb +\u987b\u751f=\u9b1a\u751f +\u987b\u7709=\u9b1a\u7709 +\u987b\u53d1=\u9b1a\u9aee +\u987b\u80e1=\u9b1a\u9b0d +\u987b\u987b=\u9b1a\u9b1a +\u987b\u9ca8=\u9b1a\u9bca +\u987b\u9cb8=\u9b1a\u9be8 +\u9b13\u53d1=\u9b22\u9aee +\u6597\u4e0a=\u9b25\u4e0a +\u6597\u4e0d\u8fc7=\u9b25\u4e0d\u904e +\u6597\u4e86=\u9b25\u4e86 +\u6597\u6765\u6597\u53bb=\u9b25\u4f86\u9b25\u53bb +\u6597\u5012=\u9b25\u5012 +\u6597\u5206\u5b50=\u9b25\u5206\u5b50 +\u6597\u529b=\u9b25\u529b +\u6597\u52b2=\u9b25\u52c1 +\u6597\u80dc=\u9b25\u52dd +\u6597\u53e3=\u9b25\u53e3 +\u6597\u5408=\u9b25\u5408 +\u6597\u5634=\u9b25\u5634 +\u6597\u58eb=\u9b25\u58eb +\u6597\u5bcc=\u9b25\u5bcc +\u6597\u5de7=\u9b25\u5de7 +\u6597\u5e4c\u5b50=\u9b25\u5e4c\u5b50 +\u6597\u5f04=\u9b25\u5f04 +\u6597\u5f15=\u9b25\u5f15 +\u6597\u522b\u6c14=\u9b25\u5f46\u6c23 +\u6597\u5f69=\u9b25\u5f69 +\u6597\u5fc3\u773c=\u9b25\u5fc3\u773c +\u6597\u5fd7=\u9b25\u5fd7 +\u6597\u95f7=\u9b25\u60b6 +\u6597\u6210=\u9b25\u6210 +\u6597\u6253=\u9b25\u6253 +\u6597\u6279\u6539=\u9b25\u6279\u6539 +\u6597\u6280=\u9b25\u6280 +\u6597\u6587=\u9b25\u6587 +\u6597\u667a=\u9b25\u667a +\u6597\u66b4=\u9b25\u66b4 +\u6597\u6b66=\u9b25\u6b66 +\u6597\u6bb4=\u9b25\u6bc6 +\u6597\u6c14=\u9b25\u6c23 +\u6597\u6cd5=\u9b25\u6cd5 +\u6597\u4e89=\u9b25\u722d +\u6597\u4e89\u6597\u5408=\u9b25\u722d\u9b25\u5408 +\u6597\u724c=\u9b25\u724c +\u6597\u7259\u62cc\u9f7f=\u9b25\u7259\u62cc\u9f52 +\u6597\u7259\u6597\u9f7f=\u9b25\u7259\u9b25\u9f52 +\u6597\u725b=\u9b25\u725b +\u6597\u7280\u53f0=\u9b25\u7280\u81fa +\u6597\u72ac=\u9b25\u72ac +\u6597\u72e0=\u9b25\u72e0 +\u6597\u53e0=\u9b25\u758a +\u6597\u767e\u8349=\u9b25\u767e\u8349 +\u6597\u773c=\u9b25\u773c +\u6597\u79c1\u6279\u4fee=\u9b25\u79c1\u6279\u4fee +\u6597\u800c\u94f8\u5175=\u9b25\u800c\u9444\u5175 +\u6597\u800c\u94f8\u9525=\u9b25\u800c\u9444\u9310 +\u6597\u811a=\u9b25\u8173 +\u6597\u8230=\u9b25\u8266 +\u6597\u8336=\u9b25\u8336 +\u6597\u8349=\u9b25\u8349 +\u6597\u53f6\u513f=\u9b25\u8449\u5152 +\u6597\u53f6\u5b50=\u9b25\u8449\u5b50 +\u6597\u7740=\u9b25\u8457 +\u6597\u87cb\u87c0=\u9b25\u87cb\u87c0 +\u6597\u8bdd=\u9b25\u8a71 +\u6597\u8273=\u9b25\u8c54 +\u6597\u8d77=\u9b25\u8d77 +\u6597\u8da3=\u9b25\u8da3 +\u6597\u95f2\u6c14=\u9b25\u9591\u6c23 +\u6597\u9e21=\u9b25\u96de +\u6597\u96ea\u7ea2=\u9b25\u96ea\u7d05 +\u6597\u5934=\u9b25\u982d +\u6597\u98ce=\u9b25\u98a8 +\u6597\u9964=\u9b25\u98e3 +\u6597\u6597=\u9b25\u9b25 +\u6597\u54c4=\u9b25\u9b28 +\u6597\u9c7c=\u9b25\u9b5a +\u6597\u9e2d=\u9b25\u9d28 +\u6597\u9e4c\u9e51=\u9b25\u9d6a\u9d89 +\u6597\u4e3d=\u9b25\u9e97 +\u95f9\u7740\u73a9\u513f=\u9b27\u8457\u73a9\u5152 +\u95f9\u8868=\u9b27\u9336 +\u95f9\u949f=\u9b27\u9418 +\u54c4\u52a8=\u9b28\u52d5 +\u54c4\u5802=\u9b28\u5802 +\u54c4\u7b11=\u9b28\u7b11 +\u90c1\u4f0a=\u9b31\u4f0a +\u90c1\u52c3=\u9b31\u52c3 +\u90c1\u5352=\u9b31\u5352 +\u90c1\u5819\u4e0d\u5076=\u9b31\u5819\u4e0d\u5076 +\u90c1\u585e=\u9b31\u585e +\u90c1\u5792=\u9b31\u58d8 +\u90c1\u5f8b=\u9b31\u5f8b +\u90c1\u6092=\u9b31\u6092 +\u90c1\u95f7=\u9b31\u60b6 +\u90c1\u6124=\u9b31\u61a4 +\u90c1\u6291=\u9b31\u6291 +\u90c1\u6339=\u9b31\u6339 +\u90c1\u6c14=\u9b31\u6c23 +\u90c1\u6c5f=\u9b31\u6c5f +\u90c1\u6c89\u6c89=\u9b31\u6c89\u6c89 +\u90c1\u6cf1=\u9b31\u6cf1 +\u90c1\u706b=\u9b31\u706b +\u90c1\u70ed=\u9b31\u71b1 +\u90c1\u71e0=\u9b31\u71e0 +\u90c1\u75c7=\u9b31\u75c7 +\u90c1\u79ef=\u9b31\u7a4d +\u90c1\u7ea1=\u9b31\u7d06 +\u90c1\u7ed3=\u9b31\u7d50 +\u90c1\u84b8=\u9b31\u84b8 +\u90c1\u84ca=\u9b31\u84ca +\u90c1\u8840=\u9b31\u8840 +\u90c1\u9091=\u9b31\u9091 +\u90c1\u90c1=\u9b31\u90c1 +\u90c1\u91d1=\u9b31\u91d1 +\u90c1\u95ed=\u9b31\u9589 +\u90c1\u9676=\u9b31\u9676 +\u90c1\u90c1\u4e0d\u5e73=\u9b31\u9b31\u4e0d\u5e73 +\u90c1\u90c1\u4e0d\u4e50=\u9b31\u9b31\u4e0d\u6a02 +\u90c1\u90c1\u5be1\u6b22=\u9b31\u9b31\u5be1\u6b61 +\u90c1\u90c1\u800c\u7ec8=\u9b31\u9b31\u800c\u7d42 +\u90c1\u90c1\u8471\u8471=\u9b31\u9b31\u8525\u8525 +\u90c1\u9ed1=\u9b31\u9ed1 +\u9b3c\u8c37\u5b50=\u9b3c\u8c37\u5b50 +\u9b42\u7275\u68a6\u7cfb=\u9b42\u727d\u5922\u7e6b +\u9b4f\u5f81=\u9b4f\u5fb5 +\u9b54\u8868=\u9b54\u9336 +\u9c7c\u5e72=\u9b5a\u4e7e +\u9c7c\u677e=\u9b5a\u9b06 +\u9cb8\u987b=\u9be8\u9b1a +\u9c87\u9c7c=\u9bf0\u9b5a +\u9e20\u5360\u9e4a\u5de2=\u9ce9\u4f54\u9d72\u5de2 +\u51e4\u51f0\u4e8e\u98de=\u9cf3\u51f0\u4e8e\u98db +\u51e4\u68a8\u5e72=\u9cf3\u68a8\u4e7e +\u9e23\u949f=\u9cf4\u9418 +\u9e3f\u6848\u76f8\u5e84=\u9d3b\u6848\u76f8\u838a +\u9e3f\u8303=\u9d3b\u7bc4 +\u9e3f\u7bc7\u5de8\u5236=\u9d3b\u7bc7\u5de8\u88fd +\u9e45\u51c6=\u9d5d\u6e96 +\u9e44\u53d1=\u9d60\u9aee +\u96d5\u5fc3\u96c1\u722a=\u9d70\u5fc3\u96c1\u722a +\u96d5\u608d=\u9d70\u608d +\u96d5\u7fce=\u9d70\u7fce +\u96d5\u9e57=\u9d70\u9d9a +\u9e64\u540a=\u9db4\u5f14 +\u9e64\u53d1=\u9db4\u9aee +\u9e70\u96d5=\u9e70\u9d70 +\u54b8\u5473=\u9e79\u5473 +\u54b8\u5634\u6de1\u820c=\u9e79\u5634\u6de1\u820c +\u54b8\u571f=\u9e79\u571f +\u54b8\u5ea6=\u9e79\u5ea6 +\u54b8\u5f97=\u9e79\u5f97 +\u54b8\u6279=\u9e79\u6279 +\u54b8\u6c34=\u9e79\u6c34 +\u54b8\u6d3e=\u9e79\u6d3e +\u54b8\u6d77=\u9e79\u6d77 +\u54b8\u6de1=\u9e79\u6de1 +\u54b8\u6e56=\u9e79\u6e56 +\u54b8\u6c64=\u9e79\u6e6f +\u54b8\u6f5f=\u9e79\u6f5f +\u54b8\u7684=\u9e79\u7684 +\u54b8\u7ca5=\u9e79\u7ca5 +\u54b8\u8089=\u9e79\u8089 +\u54b8\u83dc=\u9e79\u83dc +\u54b8\u83dc\u5e72=\u9e79\u83dc\u4e7e +\u54b8\u86cb=\u9e79\u86cb +\u54b8\u732a\u8089=\u9e79\u8c6c\u8089 +\u54b8\u7c7b=\u9e79\u985e +\u54b8\u98df=\u9e79\u98df +\u54b8\u9c7c=\u9e79\u9b5a +\u54b8\u9e2d\u86cb=\u9e79\u9d28\u86cb +\u54b8\u5364=\u9e79\u9e75 +\u54b8\u54b8=\u9e79\u9e79 +\u76d0\u6253\u600e\u4e48\u54b8=\u9e7d\u6253\u600e\u9ebc\u9e79 +\u76d0\u5364=\u9e7d\u6ef7 +\u76d0\u4f59=\u9e7d\u9918 +\u4e3d\u4e8e=\u9e97\u65bc +\u66f2\u5c18=\u9eb4\u5875 +\u66f2\u8616=\u9eb4\u6af1 +\u66f2\u751f=\u9eb4\u751f +\u66f2\u79c0\u624d=\u9eb4\u79c0\u624d +\u66f2\u83cc=\u9eb4\u83cc +\u66f2\u8f66=\u9eb4\u8eca +\u66f2\u9053\u58eb=\u9eb4\u9053\u58eb +\u66f2\u94b1=\u9eb4\u9322 +\u66f2\u9662=\u9eb4\u9662 +\u66f2\u9709=\u9eb4\u9ef4 +\u9762\u4eba\u513f=\u9eb5\u4eba\u5152 +\u9762\u4ef7=\u9eb5\u50f9 +\u9762\u5305=\u9eb5\u5305 +\u9762\u574a=\u9eb5\u574a +\u9762\u576f\u513f=\u9eb5\u576f\u5152 +\u9762\u5851=\u9eb5\u5851 +\u9762\u5e97=\u9eb5\u5e97 +\u9762\u5382=\u9eb5\u5ee0 +\u9762\u644a=\u9eb5\u6524 +\u9762\u6756=\u9eb5\u6756 +\u9762\u6761=\u9eb5\u689d +\u9762\u6c64=\u9eb5\u6e6f +\u9762\u6d46=\u9eb5\u6f3f +\u9762\u7070=\u9eb5\u7070 +\u9762\u7599\u7629=\u9eb5\u7599\u7629 +\u9762\u76ae=\u9eb5\u76ae +\u9762\u7801\u513f=\u9eb5\u78bc\u5152 +\u9762\u7b4b=\u9eb5\u7b4b +\u9762\u7c89=\u9eb5\u7c89 +\u9762\u7cca=\u9eb5\u7cca +\u9762\u56e2=\u9eb5\u7cf0 +\u9762\u7ebf=\u9eb5\u7dda +\u9762\u7f38=\u9eb5\u7f38 +\u9762\u8336=\u9eb5\u8336 +\u9762\u98df=\u9eb5\u98df +\u9762\u997a=\u9eb5\u9903 +\u9762\u997c=\u9eb5\u9905 +\u9762\u9986=\u9eb5\u9928 +\u9ebb\u836f=\u9ebb\u85e5 +\u9ebb\u9189\u836f=\u9ebb\u9189\u85e5 +\u9ebb\u9171\u9762=\u9ebb\u91ac\u9eb5 +\u9ec4\u5e72\u9ed1\u7626=\u9ec3\u4e7e\u9ed1\u7626 +\u9ec4\u5386=\u9ec3\u66c6 +\u9ec4\u66f2\u9709=\u9ec3\u66f2\u9709 +\u9ec4\u5386\u53f2=\u9ec3\u6b77\u53f2 +\u9ec4\u91d1\u8868=\u9ec3\u91d1\u8868 +\u9ec3\u923a\u7b51=\u9ec3\u923a\u7b51 +\u9ec4\u94b0\u7b51=\u9ec3\u923a\u7b51 +\u9ec4\u949f=\u9ec3\u9418 +\u9ec4\u53d1=\u9ec3\u9aee +\u9ec4\u66f2\u6bd2\u7d20=\u9ec3\u9eb4\u6bd2\u7d20 +\u9ed1\u5974\u5401\u5929\u5f55=\u9ed1\u5974\u7c72\u5929\u9304 +\u9ed1\u53d1=\u9ed1\u9aee +\u70b9\u534a\u949f=\u9ede\u534a\u9418 +\u70b9\u591a\u949f=\u9ede\u591a\u9418 +\u70b9\u949f=\u9ede\u9418 +\u9709\u6bd2=\u9ef4\u6bd2 +\u9709\u7d20=\u9ef4\u7d20 +\u9709\u83cc=\u9ef4\u83cc +\u9709\u9ed1=\u9ef4\u9ed1 +\u9709\u9ee7=\u9ef4\u9ee7 +\u9f13\u91cc=\u9f13\u88e1 +\u51ac\u51ac\u9f13=\u9f15\u9f15\u9f13 +\u9f20\u836f=\u9f20\u85e5 +\u9f20\u66f2\u8349=\u9f20\u9eb4\u8349 +\u9f3b\u6881\u513f=\u9f3b\u6881\u5152 +\u9f3b\u6881=\u9f3b\u6a11 +\u9f3b\u51c6=\u9f3b\u6e96 +\u9f50\u738b\u820d\u725b=\u9f4a\u738b\u6368\u725b +\u9f50\u5e84=\u9f4a\u838a +\u9f7f\u5371\u53d1\u79c0=\u9f52\u5371\u9aee\u79c0 +\u9f7f\u843d\u53d1\u767d=\u9f52\u843d\u9aee\u767d +\u9f7f\u53d1=\u9f52\u9aee +\u51fa\u513f=\u9f63\u5152 +\u51fa\u5267=\u9f63\u5287 +\u51fa\u52a8\u753b=\u9f63\u52d5\u756b +\u51fa\u5361\u901a=\u9f63\u5361\u901a +\u51fa\u5b50=\u9f63\u5b50 +\u51fa\u620f=\u9f63\u6232 +\u51fa\u8282\u76ee=\u9f63\u7bc0\u76ee +\u51fa\u7535\u5f71=\u9f63\u96fb\u5f71 +\u51fa\u7535\u89c6=\u9f63\u96fb\u8996 +\u9f99\u5377=\u9f8d\u6372 +\u9f99\u773c\u5e72=\u9f8d\u773c\u4e7e +\u9f99\u987b=\u9f8d\u9b1a +\u9f99\u6597\u864e\u4f24=\u9f8d\u9b25\u864e\u50b7 +\u9f9f\u5c71\u5e84=\u9f9c\u5c71\u5e84 +\uff01\u514b\u5236=\uff01\u524b\u5236 +\uff0c\u514b\u5236=\uff0c\u524b\u5236 +\uff10\u591a\u53ea=\uff10\u591a\u96bb +\uff10\u5929\u540e=\uff10\u5929\u5f8c +\uff10\u53ea=\uff10\u96bb +\uff10\u4f59=\uff10\u9918 +\uff11\u5929\u540e=\uff11\u5929\u5f8c +\uff11\u53ea=\uff11\u96bb +\uff11\u4f59=\uff11\u9918 +\uff12\u5929\u540e=\uff12\u5929\u5f8c +\uff12\u53ea=\uff12\u96bb +\uff12\u4f59=\uff12\u9918 +\uff13\u5929\u540e=\uff13\u5929\u5f8c +\uff13\u53ea=\uff13\u96bb +\uff13\u4f59=\uff13\u9918 +\uff14\u5929\u540e=\uff14\u5929\u5f8c +\uff14\u53ea=\uff14\u96bb +\uff14\u4f59=\uff14\u9918 +\uff15\u5929\u540e=\uff15\u5929\u5f8c +\uff15\u53ea=\uff15\u96bb +\uff15\u4f59=\uff15\u9918 +\uff16\u5929\u540e=\uff16\u5929\u5f8c +\uff16\u53ea=\uff16\u96bb +\uff16\u4f59=\uff16\u9918 +\uff17\u5929\u540e=\uff17\u5929\u5f8c +\uff17\u53ea=\uff17\u96bb +\uff17\u4f59=\uff17\u9918 +\uff18\u5929\u540e=\uff18\u5929\u5f8c +\uff18\u53ea=\uff18\u96bb +\uff18\u4f59=\uff18\u9918 +\uff19\u5929\u540e=\uff19\u5929\u5f8c +\uff19\u53ea=\uff19\u96bb +\uff19\u4f59=\uff19\u9918 +\uff1a\u514b\u5236=\uff1a\u524b\u5236 +\uff1b\u514b\u5236=\uff1b\u524b\u5236 +\uff1f\u514b\u5236=\uff1f\u524b\u5236 diff --git a/htool-picture/pom.xml b/htool-picture/pom.xml index 6e5f456..ec8e081 100644 --- a/htool-picture/pom.xml +++ b/htool-picture/pom.xml @@ -9,13 +9,11 @@ htool-picture 图片处理 - - - - cn.javaex - htool-core - compile - - - + + + cn.javaex + htool-core + ${project.parent.version} + + \ No newline at end of file diff --git a/htool-servlet/pom.xml b/htool-servlet/pom.xml index 83e8723..a9a345b 100644 --- a/htool-servlet/pom.xml +++ b/htool-servlet/pom.xml @@ -10,14 +10,12 @@ 服务端模块 - javax.servlet javax.servlet-api 4.0.1 provided - org.springframework spring-webmvc @@ -25,7 +23,6 @@ provided - eu.bitwalker UserAgentUtils -- Gitee From 2310a1648e6d43e53e5a8026af75da6602e9bd9d Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Sun, 4 Dec 2022 14:38:48 +0800 Subject: [PATCH 20/44] 20221204 --- .../cn/javaex/htool/core/Base64Utils.java | 20 +- .../cn/javaex/htool/core/file/FileUtils.java | 20 +- .../core/file/{IOStream.java => IOUtils.java} | 4 +- .../htool/core/reflection/ClassUtils.java | 444 ++++++++++++++++++ .../cn/javaex/htool/core/string/ZHUtils.java | 10 +- .../htool/core/string/zh/ZHConverter.java | 8 +- .../cn/javaex/htool/picture/PictureUtils.java | 2 +- 7 files changed, 478 insertions(+), 30 deletions(-) rename htool-core/src/main/java/cn/javaex/htool/core/file/{IOStream.java => IOUtils.java} (89%) create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/reflection/ClassUtils.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java b/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java index 8cf1105..1b51d2a 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java @@ -19,22 +19,30 @@ public class Base64Utils { return Base64.getEncoder().encodeToString(string.getBytes()); } + /** + * 解密 + * @param string + * @return + */ + public static String decode(String string) { + return new String(Base64.getDecoder().decode(string)); + } + /** * byte[] 转 String * @param bytes * @return String */ - public static String encode(byte[] bytes) { - return Base64.getEncoder().encodeToString(bytes); + public static String encodeByte(byte[] bytes) { + return Base64.getEncoder().encodeToString(bytes); } /** - * 解密 + * String 转 byte[] * @param string * @return */ - public static String decode(String string) { - return new String(Base64.getDecoder().decode(string)); + public static byte[] decodeByte(String string) { + return Base64.getDecoder().decode(string); } - } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java index 60bb98c..e4b3f33 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java @@ -28,7 +28,7 @@ import org.springframework.web.context.request.ServletRequestAttributes; * @author 陈霓清 * @Date 2022年12月1日 */ -public class FileUtils extends IOStream { +public class FileUtils { /** 默认缓冲区大小 */ private static final int BUFFER_SIZE = 2048; @@ -80,8 +80,8 @@ public class FileUtils extends IOStream { } catch (Exception e) { e.printStackTrace(); } finally { - closeQuietly(out); - closeQuietly(in); + IOUtils.closeQuietly(out); + IOUtils.closeQuietly(in); } } @@ -146,8 +146,8 @@ public class FileUtils extends IOStream { } catch (Exception e) { e.printStackTrace(); } finally { - closeQuietly(bos); - closeQuietly(bis); + IOUtils.closeQuietly(bos); + IOUtils.closeQuietly(bis); } } @@ -348,10 +348,10 @@ public class FileUtils extends IOStream { } catch (Exception e) { throw new Exception(e); } finally { - closeQuietly(zos); - closeQuietly(fos); - closeQuietly(bis); - closeQuietly(fis); + IOUtils.closeQuietly(zos); + IOUtils.closeQuietly(fos); + IOUtils.closeQuietly(bis); + IOUtils.closeQuietly(fis); } } @@ -409,7 +409,7 @@ public class FileUtils extends IOStream { } catch (Exception e) { throw new Exception(e); } finally { - closeQuietly(zipFile); + IOUtils.closeQuietly(zipFile); } } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/file/IOStream.java b/htool-core/src/main/java/cn/javaex/htool/core/file/IOUtils.java similarity index 89% rename from htool-core/src/main/java/cn/javaex/htool/core/file/IOStream.java rename to htool-core/src/main/java/cn/javaex/htool/core/file/IOUtils.java index a3fb4d8..3743e1a 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/file/IOStream.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/file/IOUtils.java @@ -8,10 +8,10 @@ import java.io.Closeable; * @author 陈霓清 * @Date 2022年12月1日 */ -public class IOStream { +public class IOUtils { /** - * 关不资源 + * 关闭资源 * @param closeable */ public static void closeQuietly(final Closeable closeable) { diff --git a/htool-core/src/main/java/cn/javaex/htool/core/reflection/ClassUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/reflection/ClassUtils.java new file mode 100644 index 0000000..3abaaeb --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/reflection/ClassUtils.java @@ -0,0 +1,444 @@ +package cn.javaex.htool.core.reflection; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +/** + * java 反射工具的封装,用来java反射相关的内容 + * + * @author 陈霓清 + * @Date 2022年12月4日 + */ +public class ClassUtils { + + /** + * 校验指定类有无自定义的父类 + * 验证是否是Object的直接子类 + * @param clazz + * @return + */ + public static boolean hasCustomSuperClass(Class clazz) { + Class superClass = clazz.getSuperclass(); + String superClassName = superClass.getName(); + + if (!"java.lang.Object".equalsIgnoreCase(superClassName)) { + return true; + } + + return false; + } + + /** + * 根据字段名fieldName获得该字段的get方法,当为布尔类型时获得该字段的is方法,支持获取自定义父类中的字段的get方法 + * name --> getName() [为布尔类型时获得isName()方法] + * @param clazz : 该字段所在的类 + * @param fieldName : 字段名 + * @return Method : get或者is方法 + */ + public static Method getGetMethodByField(Class clazz, String fieldName) { + Method method = null; + String getMethodName = null; + + try { + Field field = clazz.getDeclaredField(fieldName); + Class type = field.getType(); + getMethodName = getGetMethodNameByFieldName(fieldName, type.getTypeName()); + } catch (NoSuchFieldException | SecurityException e1) { + // 字段属于父类 + while (hasCustomSuperClass(clazz)) { + clazz = clazz.getSuperclass(); + try { + Field field = clazz.getDeclaredField(fieldName); + Class type = field.getType(); + + getMethodName = getGetMethodNameByFieldName(fieldName, type.getTypeName()); + + break; + } catch (Exception e) { + + } + } + } + + try { + method = clazz.getDeclaredMethod(getMethodName); + } catch (Exception e) { + method = getSuperClassMethod(clazz, getMethodName); + } + + return method; + } + + /** + * 根据字段Field获得该字段的set方法 + * name --> setName() + * @param clazz : 该字段所在的类 + * @param field : 字段 + * @return Method : set方法 + */ + public static Method getSetMethodByField(Class clazz, Field field) { + String setMethodName = getSetMethodNameByFieldName(field.getName()); + Method method = null; + + try { + method = clazz.getDeclaredMethod(setMethodName, field.getType()); + } catch (Exception e) { + method = getSuperClassMethod(clazz, setMethodName, field.getType()); + } + + return method; + } + + /** + * 根据字段名fieldName获得该字段的set方法 + * name --> setName() + * @param clazz : 该字段所在的类 + * @param fieldName : 字段名 + * @return Method : set方法 + */ + public static Method getSetMethodByField(Class clazz, String fieldName) { + Field field = getDeclaredField(clazz, fieldName); + return getSetMethodByField(clazz, field); + } + + /** + * 获取class类和其所有自定义父类的所有属性 + * @param clazz + * @param isFindParent 是否查找父类中的属性 + * @return + */ + public static Field[] getDeclaredFields(Class clazz, boolean isFindParent) { + List list = new ArrayList(); + Field[] fileds = clazz.getDeclaredFields(); + + if (fileds.length > 0) { + list.addAll(Arrays.asList(fileds)); + } + + if (isFindParent) { + while (hasCustomSuperClass(clazz)) { + clazz = clazz.getSuperclass(); + Field[] aFields = clazz.getDeclaredFields(); + if (aFields.length > 0) { + list.addAll(Arrays.asList(aFields)); + } + } + } + + return list.toArray(new Field[]{}); + } + + /** + * 在class类和其所有自定义父类中查找指定属性fieldName + * @param clazz + * @return + */ + public static Field getDeclaredField(Class clazz, String fieldName) { + try { + return clazz.getDeclaredField(fieldName); + } catch (Exception e) { + while (hasCustomSuperClass(clazz)) { + clazz = clazz.getSuperclass(); + try { + return clazz.getDeclaredField(fieldName); + } catch (Exception e1) { + + } + } + } + + return null; + } + + /** + * 根据基本类型type获得该基本类型的包装类,没有包装类的返回自身 + * int --> java.lang.Integer + * @param type : 基本类型 + * @return Class : 包装类 + */ + public static Class getWrapperClass(Class type) { + try { + String className = type.getName(); + + if (className.indexOf(".") == -1) { + if ("int".equals(className)) { + className = "java.lang.Integer"; + } else { + className = "java.lang." + (className.charAt(0) + "").toUpperCase() + className.substring(1); + } + + return Class.forName(className); + } + + return type; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 转换对象value类型值到基本类型type的值 + * valueOf("23", int.class)-->将字符串"23"转换为int值: 23; + * valueOf("abc", int.class)-->将字符串"abc"转换为int值: 转换异常,返回0; + * valueOf("true", boolean.class)-->将字符串"true"转换为布尔值: true + * @param value : 待转换的对象 + * @param type : 转换后的基本类型 + * @return Object : 转换后的值 + */ + public static Object valueOf(Object value, Class type) { + Object obj = value; + try { + Class clazz = getWrapperClass(type); + // 当该字段类型非字符串类型时,调用该字段的包装类的valueOf方法自动转换value值; + // 若type为String,则取得valueOf方法会抛出找不到方法异常,直接返回value值 + Method valueOfMethod = clazz.getDeclaredMethod("valueOf", type); + try { + obj = valueOfMethod.invoke(null, value); + } catch (Exception e) { + try { + valueOfMethod = clazz.getDeclaredMethod("valueOf", String.class); + obj = valueOfMethod.invoke(null, value); + } catch (Exception ex) { + obj = 0; + } + } + } catch (Exception e) { + // 当type为字符串类型或Object对象类型时会抛出异常 + e.printStackTrace(); + } + + return obj; + } + + /** + * 反射成员方法 + * @param clazz + * @param methodName : set方法名,例如:setXXX() + * @param parameterTypes + * @return + */ + public static Method getInvisibleMethod(Class clazz, String methodName, Class...parameterTypes) { + try { + Method method = clazz.getDeclaredMethod(methodName, parameterTypes); + method.setAccessible(true); + return method; + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 从包中读取类的集合 + * @param packageName 包的名称 + * @param isFindChildPackage 是否读取子包 + * @return + */ + public static List getClassNames(String packageName, boolean isFindChildPackage) { + List fileNames = null; + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + String packagePath = packageName.replace(".", "/"); + URL url = loader.getResource(packagePath); + if (url != null) { + String type = url.getProtocol(); + if (type.equals("file")) { + fileNames = getClassNameByFile(url.getPath(), null, isFindChildPackage); + } else if (type.equals("jar")) { + fileNames = getClassNameByJar(url.getPath(), isFindChildPackage); + } + } else { + fileNames = getClassNameByJars(((URLClassLoader) loader).getURLs(), packagePath, isFindChildPackage); + } + + return fileNames; + } + + //==================私有方法==================// + /** + * 根据字段名获得该字段的get方法名 或 is方法名 + * name --> getName 或者 isName + * @param fieldName : 字段名 + * @return String : 方法名 + */ + private static String getGetMethodNameByFieldName(String fieldName, String typeName) { + if ("boolean".equals(typeName)) { + if (fieldName.startsWith("is")) { + return fieldName; + } + + return "is" + formatField(fieldName); + } + + return "get" + formatField(fieldName); + } + + /** + * 根据字段名获得该字段的set方法名 + * name --> setName + * @param fieldName : 字段名 + * @return String : 方法名 + */ + private static String getSetMethodNameByFieldName(String fieldName) { + return "set" + formatField(fieldName); + } + + /** + * 格式化字段 + * @param fieldName + * @return + */ + private static String formatField(String fieldName) { + if (fieldName != null) { + char first = fieldName.charAt(0); + // 对象属性第一个字母若是字母,则需将第一个字母大写,否则不做处理,返回fieldName + if (first >= 'A' && first <= 'z') { + return fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1, fieldName.length()); + } + } + + return fieldName; + } + + /** + * 获取class类的所有自定义的父类的方法methodName(逐级查找,直到找到指定的方法然后返回) + * @param clazz + * @param methodName + * @param parameterTypes + * @return + */ + private static Method getSuperClassMethod(Class clazz, String methodName, Class...parameterTypes) { + while (hasCustomSuperClass(clazz)) { + clazz = clazz.getSuperclass(); + try { + Method method = clazz.getDeclaredMethod(methodName, parameterTypes); + if (!method.isAccessible()) { + method.setAccessible(true); + } + + return method; + } catch (Exception e) { + + } + } + + return null; + } + + /** + * 从项目文件获取某包下所有类 + * @param filePath 文件路径 + * @param className 类名集合 + * @param childPackage 是否遍历子包 + * @return 类的完整名称 + */ + private static List getClassNameByFile(String filePath, List className, boolean childPackage) { + List myClassName = new ArrayList(); + File file = new File(filePath); + File[] childFiles = file.listFiles(); + + for (File childFile : childFiles) { + if (childFile.isDirectory()) { + if (childPackage) { + myClassName.addAll(getClassNameByFile(childFile.getPath(), myClassName, childPackage)); + } + } else { + String childFilePath = childFile.getPath(); + if (childFilePath.endsWith(".class")) { + childFilePath = childFilePath.substring(childFilePath.indexOf("\\classes") + 9, childFilePath.lastIndexOf(".")); + childFilePath = childFilePath.replace("\\", "."); + myClassName.add(childFilePath); + } + } + } + + return myClassName; + } + + /** + * 从所有jar中搜索该包,并获取该包下所有类 + * @param urls URL集合 + * @param packagePath 包路径 + * @param childPackage 是否遍历子包 + * @return 类的完整名称 + */ + private static List getClassNameByJars(URL[] urls, String packagePath, boolean childPackage) { + List myClassName = new ArrayList(); + + if (urls != null) { + for (int i = 0;i < urls.length;i++) { + URL url = urls[i]; + String urlPath = url.getPath(); + // 不必搜索classes文件夹 + if (urlPath.endsWith("classes/")) { + continue; + } + + String jarPath = urlPath + "!/" + packagePath; + myClassName.addAll(getClassNameByJar(jarPath, childPackage)); + } + } + + return myClassName; + } + + /** + * 从jar获取某包下所有类 + * @param jarPath jar文件路径 + * @param childPackage 是否遍历子包 + * @return 类的完整名称 + */ + @SuppressWarnings("resource") + private static List getClassNameByJar(String jarPath, boolean childPackage) { + List myClassName = new ArrayList(); + String[] jarInfo = jarPath.split("!"); + String jarFilePath = jarInfo[0].substring(jarInfo[0].indexOf("/")); + String packagePath = jarInfo[1].substring(1); + + try { + JarFile jarFile = new JarFile(jarFilePath); + Enumeration entrys = jarFile.entries(); + while (entrys.hasMoreElements()) { + JarEntry jarEntry = entrys.nextElement(); + String entryName = jarEntry.getName(); + if (entryName.endsWith(".class")) { + if (childPackage) { + if (entryName.startsWith(packagePath)) { + entryName = entryName.replace("/", ".").substring(0, entryName.lastIndexOf(".")); + myClassName.add(entryName); + } + } else { + int index = entryName.lastIndexOf("/"); + String myPackagePath; + if (index != -1) { + myPackagePath = entryName.substring(0, index); + } else { + myPackagePath = entryName; + } + + if (myPackagePath.equals(packagePath)) { + entryName = entryName.replace("/", ".").substring(0, entryName.lastIndexOf(".")); + myClassName.add(entryName); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return myClassName; + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java index 917cd3c..58df3ab 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java @@ -17,7 +17,7 @@ public class ZHUtils { * @return */ public static String toTraditionalChar(String text) { - ZHConverter converter = ZHConverter.getInstance(ZHConverter.TRADITIONAL); + ZHConverter converter = ZHConverter.getInstance(ZHConverter.TC); return converter.convert(text); } @@ -27,13 +27,13 @@ public class ZHUtils { * @return */ public static String toSimpleChar(String text) { - ZHConverter converter = ZHConverter.getInstance(ZHConverter.SIMPLIFIED); + ZHConverter converter = ZHConverter.getInstance(ZHConverter.SC); return converter.convert(text); } /** - * 汉字转拼音首字母 + * 简体汉字转拼音首字母 * @param text * @return */ @@ -42,8 +42,4 @@ public class ZHUtils { return converter.toPinyin(text); } - public static void main(String[] args) { - System.out.println(ZHUtils.toPinyin("刘西瓜")); - } - } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/zh/ZHConverter.java b/htool-core/src/main/java/cn/javaex/htool/core/string/zh/ZHConverter.java index e534b42..0c54832 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/string/zh/ZHConverter.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/zh/ZHConverter.java @@ -21,9 +21,9 @@ import java.util.Set; public class ZHConverter { /** 繁体 */ - public static final int TRADITIONAL = 0; + public static final int TC = 0; /** 简体 */ - public static final int SIMPLIFIED = 1; + public static final int SC = 1; private static final int NUM_OF_CONVERTERS = 2; @@ -34,8 +34,8 @@ public class ZHConverter { private Set conflictingSets = new HashSet(); static { - PROPERTY_FILES[TRADITIONAL] = "zh2Hant.properties"; - PROPERTY_FILES[SIMPLIFIED] = "zh2Hans.properties"; + PROPERTY_FILES[TC] = "zh2Hant.properties"; + PROPERTY_FILES[SC] = "zh2Hans.properties"; } /** diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index 00fdc66..43be9a3 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -243,7 +243,7 @@ public class PictureUtils { ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageIO.write(srcBuffer,"jpg",os); byte[] bytes = os.toByteArray(); - return Base64Utils.encode(bytes); + return Base64Utils.encodeByte(bytes); } catch (IOException e) { System.err.printf("转换base64错误"); } -- Gitee From bba6bbe1139b64e802b7b6cbded37abafd1c02d5 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Sun, 4 Dec 2022 21:30:43 +0800 Subject: [PATCH 21/44] 20221204 --- .../cn/javaex/htool/core/number/NumUtils.java | 212 ++++++++++++++++++ .../htool/core/string/HStringUtils.java | 182 +++++++++++++++ htool-crypto/pom.xml | 15 +- .../htool/crypto/digest/DigestUtils.java | 112 +++++++++ .../crypto/{Md5Utils.java => digest/Hex.java} | 43 +--- .../java/cn/javaex/htool/crypto/rsa/RSA.java | 66 ++++++ .../cn/javaex/htool/crypto/rsa/RSAUtils.java | 90 ++++++++ .../htool/date/constant/DatePattern.java | 1 - 8 files changed, 675 insertions(+), 46 deletions(-) create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/number/NumUtils.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/string/HStringUtils.java create mode 100644 htool-crypto/src/main/java/cn/javaex/htool/crypto/digest/DigestUtils.java rename htool-crypto/src/main/java/cn/javaex/htool/crypto/{Md5Utils.java => digest/Hex.java} (32%) create mode 100644 htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java create mode 100644 htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/number/NumUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/number/NumUtils.java new file mode 100644 index 0000000..a7f1811 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/number/NumUtils.java @@ -0,0 +1,212 @@ +package cn.javaex.htool.core.number; + +import java.math.BigDecimal; +import java.text.DecimalFormat; + +/** + * 数字计算和转换工具类 + * + * @author 陈霓清 + * @Date 2022年12月4日 + */ +public class NumUtils { + + private static final int DEF_DIV_SCALE = 10; // 默认除法运算精度 + + private static final String CHINESE_LOWER_NUM_UNIT = "千百十亿千百十万千百十"; + private static final String CHINESE_LOWER_NUM_CHAR = "零一二三四五六七八九"; + private static final String CHINESE_LOWER_NUM_10 = "一十"; + + private static final String CHINESE_UPPER_NUM_UNIT = "仟佰拾亿仟佰拾万仟佰拾"; + private static final String CHINESE_UPPER_NUM_CHAR = "零壹贰叁肆伍陆柒捌玖"; + private static final String CHINESE_UPPER_NUM_10 = "壹拾"; + + //==========以BigDecimal类为基础的精确浮点数运算==========// + /** + * 提供精确的加法运算 + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的减法运算 + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static double sub(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.subtract(b2).doubleValue(); + } + + /** + * 提供精确的乘法运算 + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到小数点以后10位,以后的数字四舍五入 + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static double div(double v1, double v2) { + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入 + * @param v1 被除数 + * @param v2 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public static double div(double v1, double v2, int scale) { + if (scale<0) { + throw new IllegalArgumentException("小数位数必须是正整数或零"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + if (b1.compareTo(BigDecimal.ZERO)==0) { + return BigDecimal.ZERO.doubleValue(); + } + return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + /** + * 提供精确的小数位四舍五入处理 + * @param v 需要四舍五入的数字 + * @param scale 小数点后保留几位 + * @return 四舍五入后的结果 + */ + public static double round(double v, int scale) { + if (scale<0) { + throw new IllegalArgumentException("小数位数必须是正整数或零"); + } + BigDecimal b = new BigDecimal(Double.toString(v)); + BigDecimal one = new BigDecimal("1"); + return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + //==========以BigDecimal类为基础的精确浮点数运算==========// + + //==========数字转换==========// + /** + * 数字转中文小写数字 + * @param num + * @return + */ + public static String toChineseLowerNumeral(String num) { + return toChineseNumeral(String.valueOf(num), CHINESE_LOWER_NUM_UNIT, CHINESE_LOWER_NUM_CHAR, CHINESE_LOWER_NUM_10); + } + + /** + * 数字转中文大写数字 + * @param num + * @return + */ + public static String toChineseUpperNumeral(String num) { + return toChineseNumeral(String.valueOf(num), CHINESE_UPPER_NUM_UNIT, CHINESE_UPPER_NUM_CHAR, CHINESE_UPPER_NUM_10); + } + + /** + * 将数字转为带逗号的字符串 + * @param num + * @return 例如:9,876,543,210.50 + */ + public static String toWrittenAmount(double num) { + DecimalFormat df = new DecimalFormat("#,###.00"); + return df.format(num); + } + + /** + * 将数字转为带逗号的字符串 + * @param num + * @return 例如:987,654,321 + */ + public static String toWrittenAmount(long num) { + DecimalFormat df = new DecimalFormat("#,###"); + return df.format(num); + } + + /** + * 数字转中文数字 + * @param num + * @param sUnit + * @param sNumChar + * @param num10 + * @return + */ + private static String toChineseNumeral(String num, String sUnit, String sNumChar, String num10) { + int pos = num.indexOf('.'); + String sBeforeDot = ""; + String sAfterDot = ""; + + if (pos == -1) { + sBeforeDot = num; + } else { + sBeforeDot = num.substring(0, pos); + sAfterDot = num.substring(pos + 1); + } + + String sRet = ""; + char c = '\000'; + for (int i = 0; i < sBeforeDot.length(); i++) { + c = sBeforeDot.charAt(i); + if (c == '0') { + if (i < sBeforeDot.length() - 1) { + String sTmp = sUnit.substring(sUnit.length() - sBeforeDot.length() + i + 1, + sUnit.length() - sBeforeDot.length() + i + 2); + if ((sTmp.equals("亿")) || (sTmp.equals("万"))) { + if (sRet.substring(sRet.length() - 1).equals("零")) { + sRet = sRet.substring(0, sRet.length() - 1); + } + if (((sRet.substring(sRet.length() - 1).equals("亿")) + || (sRet.substring(sRet.length() - 1).equals("万"))) && (sTmp.equals("万"))) { + continue; + } + sRet = sRet + sTmp; + } else if (!sRet.substring(sRet.length() - 1).equals("零")) { + sRet = sRet + "零"; + } + } + } else { + sRet = sRet + sNumChar.substring(c - '0', c - '0' + 1); + if (i < sBeforeDot.length() - 1) { + sRet = sRet + sUnit.substring(sUnit.length() - sBeforeDot.length() + i + 1, + sUnit.length() - sBeforeDot.length() + i + 2); + } + } + } + if ((sRet.length() > 2) && (sRet.substring(0, 2).equals(num10))) { + sRet = sRet.substring(1); + } + if (sRet.substring(sRet.length() - 1).equals("零")) { + sRet = sRet.substring(0, sRet.length() - 1); + } + if (sAfterDot.length() > 0) { + sRet = sRet + "点"; + for (int i = 0; i < sAfterDot.length(); i++) { + c = sAfterDot.charAt(i); + sRet = sRet + sNumChar.substring(c - '0', c - '0' + 1); + } + } + + return sRet; + } + //==========数字转换==========// + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/HStringUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/HStringUtils.java new file mode 100644 index 0000000..654f052 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/HStringUtils.java @@ -0,0 +1,182 @@ +package cn.javaex.htool.core.string; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 字符串工具类 + * + * @author 陈霓清 + * @Date 2022年12月4日 + */ +public class HStringUtils { + + private static final char SEPARATOR = '_'; + + /** + * 首字母转小写 + * @param text + * @return + */ + public static String initLower(String text) { + if (isNotEmpty(text)) { + text = text.substring(0, 1).toLowerCase() + text.substring(1); + } + + return text; + } + + /** + * 首字母转大写 + * @param text + * @return + */ + public static String initUpper(String text) { + if (isNotEmpty(text)) { + text = text.substring(0, 1).toUpperCase() + text.substring(1); + } + + return text; + } + + /** + * 所有字母转小写,单词之间用下划线分隔 + * @param text + * @return + */ + public static String toUnderlineName(String text) { + if (isEmpty(text)) { + return text; + } + + StringBuilder sb = new StringBuilder(); + boolean upperCase = false; + for (int i=0; i=0) && Character.isUpperCase(c)) { + if (!upperCase || !nextUpperCase) { + if (i>0) { + sb.append(SEPARATOR); + } + } + upperCase = true; + } else { + upperCase = false; + } + + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 所有字母转小写,除第一个单词以外,后续的单词首字母转大写 + * @param text + * @return + */ + public static String toCamelCase(String text) { + if (isEmpty(text)) { + return text; + } + + text = text.toLowerCase(); + + StringBuffer sb = new StringBuffer(text.length()); + boolean upperCase = false; + for (int i=0; iChecks if a CharSequence is empty ("") or null.

+ * + *
+     * StringUtils.isEmpty(null)      = true
+     * StringUtils.isEmpty("")        = true
+     * StringUtils.isEmpty(" ")       = false
+     * StringUtils.isEmpty("bob")     = false
+     * StringUtils.isEmpty("  bob  ") = false
+     * 
+ * + *

NOTE: This method changed in Lang version 2.0. + * It no longer trims the CharSequence. + * That functionality is available in isBlank().

+ * + * @param cs the CharSequence to check, may be null + * @return {@code true} if the CharSequence is empty or null + * @since 3.0 Changed signature from isEmpty(String) to isEmpty(CharSequence) + */ + public static boolean isEmpty(final CharSequence cs) { + return cs == null || cs.length() == 0; + } + + /** + *

Checks if a CharSequence is not empty ("") and not null.

+ * + *
+     * StringUtils.isNotEmpty(null)      = false
+     * StringUtils.isNotEmpty("")        = false
+     * StringUtils.isNotEmpty(" ")       = true
+     * StringUtils.isNotEmpty("bob")     = true
+     * StringUtils.isNotEmpty("  bob  ") = true
+     * 
+ * + * @param cs the CharSequence to check, may be null + * @return {@code true} if the CharSequence is not empty and not null + * @since 3.0 Changed signature from isNotEmpty(String) to isNotEmpty(CharSequence) + */ + public static boolean isNotEmpty(final CharSequence cs) { + return !isEmpty(cs); + } + +} diff --git a/htool-crypto/pom.xml b/htool-crypto/pom.xml index 850e77d..04e6b97 100644 --- a/htool-crypto/pom.xml +++ b/htool-crypto/pom.xml @@ -9,12 +9,11 @@ htool-crypto 加密解密模块 - - - - org.bouncycastle - bcpkix-jdk15to18 - 1.72 - - + + + cn.javaex + htool-core + ${project.parent.version} + + \ No newline at end of file diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/digest/DigestUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/digest/DigestUtils.java new file mode 100644 index 0000000..f3b5d01 --- /dev/null +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/digest/DigestUtils.java @@ -0,0 +1,112 @@ +package cn.javaex.htool.crypto.digest; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * 摘要算法加密工具类 + * + * @author 陈霓清 + * @Date 2022年12月4日 + */ +public class DigestUtils extends Hex { + + private static final String MD5 = "md5"; + private static final String SHA1 = "SHA-1"; + private static final String SHA256 = "SHA-256"; + private static final String SHA384 = "SHA-384"; + private static final String SHA512 = "SHA-512"; + + /** + * 将传入的字符串进行MD5加密,并返回加密后的字符串 + * @param str + * @return + */ + public static String md5(String str) { + try { + byte[] md5 = digest(str.getBytes("utf-8"), MD5); + return toHexString(md5); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + return ""; + } + + /** + * 将传入的字符串进行sha1加密,并返回加密后的字符串 + * @param str + * @return + */ + public static String sha1(String str) { + try { + byte[] sha = digest(str.getBytes("utf-8"), SHA1); + return toHexString(sha); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + return ""; + } + + /** + * 将传入的字符串进行sha256加密,并返回加密后的字符串 + * @param str + * @return + */ + public static String sha256(String str) { + try { + byte[] sha = digest(str.getBytes("utf-8"), SHA256); + return toHexString(sha); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + return ""; + } + + /** + * 将传入的字符串进行sha384加密,并返回加密后的字符串 + * @param str + * @return + */ + public static String sha384(String str) { + try { + byte[] sha = digest(str.getBytes("utf-8"), SHA384); + return toHexString(sha); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + return ""; + } + + /** + * 将传入的字符串进行sha512加密,并返回加密后的字符串 + * @param str + * @return + */ + public static String sha512(String str) { + try { + byte[] sha = digest(str.getBytes("utf-8"), SHA512); + return toHexString(sha); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + return ""; + } + + private static byte[] digest(byte[] data, String algorithm) { + try { + MessageDigest md = MessageDigest.getInstance(algorithm); + md.update(data); + return md.digest(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return new byte[] {}; + } + +} diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/Md5Utils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/digest/Hex.java similarity index 32% rename from htool-crypto/src/main/java/cn/javaex/htool/crypto/Md5Utils.java rename to htool-crypto/src/main/java/cn/javaex/htool/crypto/digest/Hex.java index a296cd5..cc2b0de 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/Md5Utils.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/digest/Hex.java @@ -1,48 +1,17 @@ -package cn.javaex.htool.crypto; +package cn.javaex.htool.crypto.digest; -import java.io.UnsupportedEncodingException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.Arrays; -/** - * MD5加密 - * - * @author 陈霓清 - * @Date 2022年11月25日 - */ -public class Md5Utils { +public class Hex { /** - * 将传入的字符串进行MD5加密,并返回加密后的字符串 - * @param str + * byte[] 转 字符串 + * @param bytes * @return */ - public static String md5(String str) { - try { - byte[] md5 = md5(str.getBytes("utf-8")); - return toHexString(md5); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - return ""; - } - - private static byte[] md5(byte[] data) { - try { - MessageDigest md = MessageDigest.getInstance("md5"); - md.update(data); - return md.digest(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - return new byte[] {}; - } - - private static String toHexString(byte[] md5) { + public static String toHexString(byte[] bytes) { StringBuilder buf = new StringBuilder(); - for (byte b : md5) { + for (byte b : bytes) { buf.append(leftPad(Integer.toHexString(b & 0xff), '0', 2)); } return buf.toString(); diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java new file mode 100644 index 0000000..8b082ff --- /dev/null +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java @@ -0,0 +1,66 @@ +package cn.javaex.htool.crypto.rsa; + +import java.security.Key; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; + +import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.string.HStringUtils; + +/** + * RSA + * + * @author 陈霓清 + * @Date 2022年12月4日 + */ +public class RSA { + /** key算法 */ + public static final String KEY_ALGORTHM = "RSA"; + + /** 公钥 */ + private String publicKey; + /** 私钥 */ + private String privateKey; + + /** + * 构造方法,生成新的私钥公钥对 + */ + public RSA() { + KeyPairGenerator keyPairGenerator; + try { + keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORTHM); + keyPairGenerator.initialize(1024); + + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + //公钥 + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + //私钥 + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); + + this.publicKey = HStringUtils.formatNoSTRN(Base64Utils.encodeByte(((Key) publicKey).getEncoded())); + this.privateKey = HStringUtils.formatNoSTRN(Base64Utils.encodeByte(((Key) privateKey).getEncoded())); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getPrivateKey() { + return privateKey; + } + + public void setPrivateKey(String privateKey) { + this.privateKey = privateKey; + } + +} diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java new file mode 100644 index 0000000..a172a24 --- /dev/null +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java @@ -0,0 +1,90 @@ +package cn.javaex.htool.crypto.rsa; + +import java.security.Key; +import java.security.KeyFactory; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.ArrayList; +import java.util.List; + +import javax.crypto.Cipher; + +import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.string.HStringUtils; + +/** + * RSA非对称加密 + * + * @author 陈霓清 + * @Date 2022年12月4日 + */ +public class RSAUtils extends RSA { + + /** + * 用私钥加密 + * @param content 加密数据 + * @param privateKey 私钥 + * @return + * @throws Exception + */ + public static String encryptByPrivateKey(String content, String privateKey) throws Exception { + List array = new ArrayList(); + int length = 29; + while (length < content.length()) { + array.add(content.substring(0, length)); + content = content.substring(length,content.length()); + } + array.add(content); + String returnstr = ""; + for (String sub : array) { + byte[] data = sub.getBytes("UTF-8"); + //解密密钥 + byte[] keyBytes = Base64Utils.decodeByte(privateKey); + //取私钥 + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); + Key key = keyFactory.generatePrivate(pkcs8EncodedKeySpec); + //对数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, key); + + byte[] returndate = cipher.doFinal(data); + returnstr = returnstr + HStringUtils.formatNoSTRN(Base64Utils.encodeByte(returndate)) + ","; + } + if (returnstr.endsWith(",")) { + returnstr =returnstr.substring(0, returnstr.lastIndexOf(",")); + } + + return returnstr; + } + + /** + * 用公钥解密 + * @param content 加密数据 + * @param publicKey 公钥 + * @return + * @throws Exception + */ + public static String decryptByPublicKey(String content, String publicKey) throws Exception { + //对私钥解密 + String[] array = content.split(","); + String returnstr = ""; + + for (String sub : array) { + byte[] data = Base64Utils.decodeByte(sub); + byte[] keyBytes = Base64Utils.decodeByte(publicKey); + X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); + Key key = keyFactory.generatePublic(x509EncodedKeySpec); + //对数据解密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, key); + byte[] rtndate = cipher.doFinal(data); + String temp_str = new String(rtndate,"UTF-8"); + returnstr =returnstr+temp_str; + } + + return returnstr; + } + +} diff --git a/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java b/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java index 95ce644..2e32080 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java +++ b/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java @@ -6,7 +6,6 @@ package cn.javaex.htool.date.constant; * @author 陈霓清 * @Date 2022年11月24日 */ -@SuppressWarnings("ALL") public class DatePattern { /** * 2022-11-24 -- Gitee From 9678124e2bd04eb51f64150809cf1fc270ee3408 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Sun, 4 Dec 2022 23:50:00 +0800 Subject: [PATCH 22/44] 20221204 --- .../htool/core/string/HStringUtils.java | 182 ----- .../javaex/htool/core/string/StringUtils.java | 644 ++++++++++++++++++ .../java/cn/javaex/htool/crypto/rsa/RSA.java | 6 +- .../cn/javaex/htool/crypto/rsa/RSAUtils.java | 4 +- 4 files changed, 649 insertions(+), 187 deletions(-) delete mode 100644 htool-core/src/main/java/cn/javaex/htool/core/string/HStringUtils.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/HStringUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/HStringUtils.java deleted file mode 100644 index 654f052..0000000 --- a/htool-core/src/main/java/cn/javaex/htool/core/string/HStringUtils.java +++ /dev/null @@ -1,182 +0,0 @@ -package cn.javaex.htool.core.string; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * 字符串工具类 - * - * @author 陈霓清 - * @Date 2022年12月4日 - */ -public class HStringUtils { - - private static final char SEPARATOR = '_'; - - /** - * 首字母转小写 - * @param text - * @return - */ - public static String initLower(String text) { - if (isNotEmpty(text)) { - text = text.substring(0, 1).toLowerCase() + text.substring(1); - } - - return text; - } - - /** - * 首字母转大写 - * @param text - * @return - */ - public static String initUpper(String text) { - if (isNotEmpty(text)) { - text = text.substring(0, 1).toUpperCase() + text.substring(1); - } - - return text; - } - - /** - * 所有字母转小写,单词之间用下划线分隔 - * @param text - * @return - */ - public static String toUnderlineName(String text) { - if (isEmpty(text)) { - return text; - } - - StringBuilder sb = new StringBuilder(); - boolean upperCase = false; - for (int i=0; i=0) && Character.isUpperCase(c)) { - if (!upperCase || !nextUpperCase) { - if (i>0) { - sb.append(SEPARATOR); - } - } - upperCase = true; - } else { - upperCase = false; - } - - sb.append(Character.toLowerCase(c)); - } - - return sb.toString(); - } - - /** - * 所有字母转小写,除第一个单词以外,后续的单词首字母转大写 - * @param text - * @return - */ - public static String toCamelCase(String text) { - if (isEmpty(text)) { - return text; - } - - text = text.toLowerCase(); - - StringBuffer sb = new StringBuffer(text.length()); - boolean upperCase = false; - for (int i=0; iChecks if a CharSequence is empty ("") or null.

- * - *
-     * StringUtils.isEmpty(null)      = true
-     * StringUtils.isEmpty("")        = true
-     * StringUtils.isEmpty(" ")       = false
-     * StringUtils.isEmpty("bob")     = false
-     * StringUtils.isEmpty("  bob  ") = false
-     * 
- * - *

NOTE: This method changed in Lang version 2.0. - * It no longer trims the CharSequence. - * That functionality is available in isBlank().

- * - * @param cs the CharSequence to check, may be null - * @return {@code true} if the CharSequence is empty or null - * @since 3.0 Changed signature from isEmpty(String) to isEmpty(CharSequence) - */ - public static boolean isEmpty(final CharSequence cs) { - return cs == null || cs.length() == 0; - } - - /** - *

Checks if a CharSequence is not empty ("") and not null.

- * - *
-     * StringUtils.isNotEmpty(null)      = false
-     * StringUtils.isNotEmpty("")        = false
-     * StringUtils.isNotEmpty(" ")       = true
-     * StringUtils.isNotEmpty("bob")     = true
-     * StringUtils.isNotEmpty("  bob  ") = true
-     * 
- * - * @param cs the CharSequence to check, may be null - * @return {@code true} if the CharSequence is not empty and not null - * @since 3.0 Changed signature from isNotEmpty(String) to isNotEmpty(CharSequence) - */ - public static boolean isNotEmpty(final CharSequence cs) { - return !isEmpty(cs); - } - -} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java new file mode 100644 index 0000000..29bb908 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java @@ -0,0 +1,644 @@ +package cn.javaex.htool.core.string; + +import java.util.Collection; +import java.util.Iterator; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 字符串工具类 + * + * @author 陈霓清 + * @Date 2022年12月4日 + */ +public class StringUtils { + + private static final String EMPTY = ""; + private static final char SEPARATOR = '_'; + + + // Empty checks + //----------------------------------------------------------------------- + /** + *

Checks if a String is empty ("") or null.

+ * + *
+     * StringUtils.isEmpty(null)      = true
+     * StringUtils.isEmpty("")        = true
+     * StringUtils.isEmpty(" ")       = false
+     * StringUtils.isEmpty("bob")     = false
+     * StringUtils.isEmpty("  bob  ") = false
+     * 
+ * + *

NOTE: This method changed in Lang version 2.0. + * It no longer trims the String. + * That functionality is available in isBlank().

+ * + * @param str the String to check, may be null + * @return true if the String is empty or null + */ + public static boolean isEmpty(String str) { + return str == null || str.length() == 0; + } + + /** + *

Checks if a String is not empty ("") and not null.

+ * + *
+     * StringUtils.isNotEmpty(null)      = false
+     * StringUtils.isNotEmpty("")        = false
+     * StringUtils.isNotEmpty(" ")       = true
+     * StringUtils.isNotEmpty("bob")     = true
+     * StringUtils.isNotEmpty("  bob  ") = true
+     * 
+ * + * @param str the String to check, may be null + * @return true if the String is not empty and not null + */ + public static boolean isNotEmpty(String str) { + return !StringUtils.isEmpty(str); + } + + /** + *

Checks if a String is whitespace, empty ("") or null.

+ * + *
+     * StringUtils.isBlank(null)      = true
+     * StringUtils.isBlank("")        = true
+     * StringUtils.isBlank(" ")       = true
+     * StringUtils.isBlank("bob")     = false
+     * StringUtils.isBlank("  bob  ") = false
+     * 
+ * + * @param str the String to check, may be null + * @return true if the String is null, empty or whitespace + * @since 2.0 + */ + public static boolean isBlank(String str) { + int strLen; + if (str == null || (strLen = str.length()) == 0) { + return true; + } + for (int i = 0; i < strLen; i++) { + if ((Character.isWhitespace(str.charAt(i)) == false)) { + return false; + } + } + return true; + } + + /** + *

Checks if a String is not empty (""), not null and not whitespace only.

+ * + *
+     * StringUtils.isNotBlank(null)      = false
+     * StringUtils.isNotBlank("")        = false
+     * StringUtils.isNotBlank(" ")       = false
+     * StringUtils.isNotBlank("bob")     = true
+     * StringUtils.isNotBlank("  bob  ") = true
+     * 
+ * + * @param str the String to check, may be null + * @return true if the String is + * not empty and not null and not whitespace + * @since 2.0 + */ + public static boolean isNotBlank(String str) { + return !StringUtils.isBlank(str); + } + + // Trim + //----------------------------------------------------------------------- + /** + *

Removes control characters (char <= 32) from both + * ends of this String, handling null by returning + * null.

+ * + *

The String is trimmed using {@link String#trim()}. + * Trim removes start and end characters <= 32. + * To strip whitespace use {@link #strip(String)}.

+ * + *

To trim your choice of characters, use the + * {@link #strip(String, String)} methods.

+ * + *
+     * StringUtils.trim(null)          = null
+     * StringUtils.trim("")            = ""
+     * StringUtils.trim("     ")       = ""
+     * StringUtils.trim("abc")         = "abc"
+     * StringUtils.trim("    abc    ") = "abc"
+     * 
+ * + * @param str the String to be trimmed, may be null + * @return the trimmed string, null if null String input + */ + public static String trim(String str) { + return str == null ? null : str.trim(); + } + + /** + *

Removes control characters (char <= 32) from both + * ends of this String returning null if the String is + * empty ("") after the trim or if it is null. + * + *

The String is trimmed using {@link String#trim()}. + * Trim removes start and end characters <= 32. + * To strip whitespace use {@link #stripToNull(String)}.

+ * + *
+     * StringUtils.trimToNull(null)          = null
+     * StringUtils.trimToNull("")            = null
+     * StringUtils.trimToNull("     ")       = null
+     * StringUtils.trimToNull("abc")         = "abc"
+     * StringUtils.trimToNull("    abc    ") = "abc"
+     * 
+ * + * @param str the String to be trimmed, may be null + * @return the trimmed String, + * null if only chars <= 32, empty or null String input + * @since 2.0 + */ + public static String trimToNull(String str) { + String ts = trim(str); + return isEmpty(ts) ? null : ts; + } + + /** + *

Removes control characters (char <= 32) from both + * ends of this String returning an empty String ("") if the String + * is empty ("") after the trim or if it is null. + * + *

The String is trimmed using {@link String#trim()}. + * Trim removes start and end characters <= 32. + * To strip whitespace use {@link #stripToEmpty(String)}.

+ * + *
+     * StringUtils.trimToEmpty(null)          = ""
+     * StringUtils.trimToEmpty("")            = ""
+     * StringUtils.trimToEmpty("     ")       = ""
+     * StringUtils.trimToEmpty("abc")         = "abc"
+     * StringUtils.trimToEmpty("    abc    ") = "abc"
+     * 
+ * + * @param str the String to be trimmed, may be null + * @return the trimmed String, or an empty String if null input + * @since 2.0 + */ + public static String trimToEmpty(String str) { + return str == null ? EMPTY : str.trim(); + } + + // Overlay + //----------------------------------------------------------------------- + /** + *

Overlays part of a String with another String.

+ * + *

A null string input returns null. + * A negative index is treated as zero. + * An index greater than the string length is treated as the string length. + * The start index is always the smaller of the two indices.

+ * + *
+     * StringUtils.overlay(null, *, *, *)            = null
+     * StringUtils.overlay("", "abc", 0, 0)          = "abc"
+     * StringUtils.overlay("abcdef", null, 2, 4)     = "abef"
+     * StringUtils.overlay("abcdef", "", 2, 4)       = "abef"
+     * StringUtils.overlay("abcdef", "", 4, 2)       = "abef"
+     * StringUtils.overlay("abcdef", "zzzz", 2, 4)   = "abzzzzef"
+     * StringUtils.overlay("abcdef", "zzzz", 4, 2)   = "abzzzzef"
+     * StringUtils.overlay("abcdef", "zzzz", -1, 4)  = "zzzzef"
+     * StringUtils.overlay("abcdef", "zzzz", 2, 8)   = "abzzzz"
+     * StringUtils.overlay("abcdef", "zzzz", -2, -3) = "zzzzabcdef"
+     * StringUtils.overlay("abcdef", "zzzz", 8, 10)  = "abcdefzzzz"
+     * 
+ * + * @param str the String to do overlaying in, may be null + * @param overlay the String to overlay, may be null + * @param start the position to start overlaying at + * @param end the position to stop overlaying before + * @return overlayed String, null if null String input + * @since 2.0 + */ + public static String overlay(String str, String overlay, int start, int end) { + if (str == null) { + return null; + } + if (overlay == null) { + overlay = EMPTY; + } + int len = str.length(); + if (start < 0) { + start = 0; + } + if (start > len) { + start = len; + } + if (end < 0) { + end = 0; + } + if (end > len) { + end = len; + } + if (start > end) { + int temp = start; + start = end; + end = temp; + } + return new StringBuffer(len + start - end + overlay.length() + 1) + .append(str.substring(0, start)) + .append(overlay) + .append(str.substring(end)) + .toString(); + } + + // Equals + //----------------------------------------------------------------------- + /** + *

Compares two Strings, returning true if they are equal.

+ * + *

nulls are handled without exceptions. Two null + * references are considered to be equal. The comparison is case sensitive.

+ * + *
+     * StringUtils.equals(null, null)   = true
+     * StringUtils.equals(null, "abc")  = false
+     * StringUtils.equals("abc", null)  = false
+     * StringUtils.equals("abc", "abc") = true
+     * StringUtils.equals("abc", "ABC") = false
+     * 
+ * + * @see java.lang.String#equals(Object) + * @param str1 the first String, may be null + * @param str2 the second String, may be null + * @return true if the Strings are equal, case sensitive, or + * both null + */ + public static boolean equals(String str1, String str2) { + return str1 == null ? str2 == null : str1.equals(str2); + } + + /** + *

Compares two Strings, returning true if they are equal ignoring + * the case.

+ * + *

nulls are handled without exceptions. Two null + * references are considered equal. Comparison is case insensitive.

+ * + *
+     * StringUtils.equalsIgnoreCase(null, null)   = true
+     * StringUtils.equalsIgnoreCase(null, "abc")  = false
+     * StringUtils.equalsIgnoreCase("abc", null)  = false
+     * StringUtils.equalsIgnoreCase("abc", "abc") = true
+     * StringUtils.equalsIgnoreCase("abc", "ABC") = true
+     * 
+ * + * @see java.lang.String#equalsIgnoreCase(String) + * @param str1 the first String, may be null + * @param str2 the second String, may be null + * @return true if the Strings are equal, case insensitive, or + * both null + */ + public static boolean equalsIgnoreCase(String str1, String str2) { + return str1 == null ? str2 == null : str1.equalsIgnoreCase(str2); + } + + + // Joining + //----------------------------------------------------------------------- + + /** + *

Joins the elements of the provided array into a single String + * containing the provided list of elements.

+ * + *

No delimiter is added before or after the list. + * A null separator is the same as an empty String (""). + * Null objects or empty strings within the array are represented by + * empty strings.

+ * + *
+     * StringUtils.join(null, *)                = null
+     * StringUtils.join([], *)                  = ""
+     * StringUtils.join([null], *)              = ""
+     * StringUtils.join(["a", "b", "c"], "--")  = "a--b--c"
+     * StringUtils.join(["a", "b", "c"], null)  = "abc"
+     * StringUtils.join(["a", "b", "c"], "")    = "abc"
+     * StringUtils.join([null, "", "a"], ',')   = ",,a"
+     * 
+ * + * @param array the array of values to join together, may be null + * @param separator the separator character to use, null treated as "" + * @return the joined String, null if null array input + */ + public static String join(Object[] array, String separator) { + if (array == null) { + return null; + } + return join(array, separator, 0, array.length); + } + + /** + *

Joins the elements of the provided Collection into + * a single String containing the provided elements.

+ * + *

No delimiter is added before or after the list. + * A null separator is the same as an empty String ("").

+ * + *

See the examples here: {@link #join(Object[],String)}.

+ * + * @param collection the Collection of values to join together, may be null + * @param separator the separator character to use, null treated as "" + * @return the joined String, null if null iterator input + * @since 2.3 + */ + public static String join(Collection collection, String separator) { + if (collection == null) { + return null; + } + return join(collection.iterator(), separator); + } + + /** + *

Joins the elements of the provided array into a single String + * containing the provided list of elements.

+ * + *

No delimiter is added before or after the list. + * A null separator is the same as an empty String (""). + * Null objects or empty strings within the array are represented by + * empty strings.

+ * + *
+     * StringUtils.join(null, *)                = null
+     * StringUtils.join([], *)                  = ""
+     * StringUtils.join([null], *)              = ""
+     * StringUtils.join(["a", "b", "c"], "--")  = "a--b--c"
+     * StringUtils.join(["a", "b", "c"], null)  = "abc"
+     * StringUtils.join(["a", "b", "c"], "")    = "abc"
+     * StringUtils.join([null, "", "a"], ',')   = ",,a"
+     * 
+ * + * @param array the array of values to join together, may be null + * @param separator the separator character to use, null treated as "" + * @param startIndex the first index to start joining from. It is + * an error to pass in an end index past the end of the array + * @param endIndex the index to stop joining from (exclusive). It is + * an error to pass in an end index past the end of the array + * @return the joined String, null if null array input + */ + private static String join(Object[] array, String separator, int startIndex, int endIndex) { + if (array == null) { + return null; + } + if (separator == null) { + separator = EMPTY; + } + + // endIndex - startIndex > 0: Len = NofStrings *(len(firstString) + len(separator)) + // (Assuming that all Strings are roughly equally long) + int bufSize = (endIndex - startIndex); + if (bufSize <= 0) { + return EMPTY; + } + + bufSize *= ((array[startIndex] == null ? 16 : array[startIndex].toString().length()) + + separator.length()); + + StringBuffer buf = new StringBuffer(bufSize); + + for (int i = startIndex; i < endIndex; i++) { + if (i > startIndex) { + buf.append(separator); + } + if (array[i] != null) { + buf.append(array[i]); + } + } + return buf.toString(); + } + + /** + *

Joins the elements of the provided Iterator into + * a single String containing the provided elements.

+ * + *

No delimiter is added before or after the list. + * A null separator is the same as an empty String ("").

+ * + *

See the examples here: {@link #join(Object[],String)}.

+ * + * @param iterator the Iterator of values to join together, may be null + * @param separator the separator character to use, null treated as "" + * @return the joined String, null if null iterator input + */ + private static String join(Iterator iterator, String separator) { + // handle null, zero and one elements before building a buffer + if (iterator == null) { + return null; + } + if (!iterator.hasNext()) { + return EMPTY; + } + Object first = iterator.next(); + if (!iterator.hasNext()) { + return first == null ? "" : first.toString(); + } + + // two or more elements + StringBuffer buf = new StringBuffer(256); // Java default is 16, probably too small + if (first != null) { + buf.append(first); + } + + while (iterator.hasNext()) { + if (separator != null) { + buf.append(separator); + } + Object obj = iterator.next(); + if (obj != null) { + buf.append(obj); + } + } + return buf.toString(); + } + + /** + * 首字母转小写 + * + *
+     * StringUtils.uncapitalize(null)  = null
+     * StringUtils.uncapitalize("")    = ""
+     * StringUtils.uncapitalize("Cat") = "cat"
+     * StringUtils.uncapitalize("CAT") = "cAT"
+     * 
+ */ + public static String uncapitalize(String str) { + int strLen; + if (str == null || (strLen = str.length()) == 0) { + return str; + } + return new StringBuffer(strLen) + .append(Character.toLowerCase(str.charAt(0))) + .append(str.substring(1)) + .toString(); + } + + /** + * 首字母转大写 + * + *
+     * StringUtils.capitalize(null)  = null
+     * StringUtils.capitalize("")    = ""
+     * StringUtils.capitalize("cat") = "Cat"
+     * StringUtils.capitalize("cAt") = "CAt"
+     * 
+ */ + public static String capitalize(String str) { + int strLen; + if (str == null || (strLen = str.length()) == 0) { + return str; + } + return new StringBuffer(strLen) + .append(Character.toTitleCase(str.charAt(0))) + .append(str.substring(1)) + .toString(); + } + + /** + * 所有字母转小写,单词之间用下划线分隔 + * + *
+     * StringUtils.toUnderlineName(myTest)  = my_test
+     * 
+ * + * @param text + * @return + */ + public static String toUnderlineName(String text) { + if (isEmpty(text)) { + return text; + } + + StringBuilder sb = new StringBuilder(); + boolean upperCase = false; + for (int i=0; i=0) && Character.isUpperCase(c)) { + if (!upperCase || !nextUpperCase) { + if (i>0) { + sb.append(SEPARATOR); + } + } + upperCase = true; + } else { + upperCase = false; + } + + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 所有字母转小写,除第一个单词以外,后续的单词首字母转大写 + * + *
+     * StringUtils.toCamelCase(my_test)  = myTest
+     * 
+ * + * @param text + * @return + */ + public static String toCamelCase(String text) { + if (isEmpty(text)) { + return text; + } + + text = text.toLowerCase(); + + StringBuffer sb = new StringBuffer(text.length()); + boolean upperCase = false; + for (int i=0; i + * StringUtils.toCapitalizeCamelCase(my_test) = MyTest + * + * + * @param text + * @return + */ + public static String toCapitalizeCamelCase(String text) { + if (isEmpty(text)) { + return text; + } + + text = toCamelCase(text); + return capitalize(text); + } + + /** + * 移除字符串中的所有空格、 换行等 + * + * @param content + * @return + */ + public static String formatNoSTRN(String content) { + if (content != null) { + Pattern p = Pattern.compile("\\s*|\t|\r|\n"); + Matcher m = p.matcher(content); + return m.replaceAll(""); + } + + return ""; + } + + /** + * 中间为* + * @param str 指定的字符串 + * @param start 显示开头几位 + * @param end 显示结尾几位 + * @return + */ + public static String hideMiddle(String str, int start, int end) { + if (isBlank(str)) { + return str; + } + + int showNum = start + end; + + if (str.length() > showNum) { + int count = str.length() - showNum; + StringBuffer sb = new StringBuffer(); + for (int i=1; i Date: Sun, 4 Dec 2022 23:53:32 +0800 Subject: [PATCH 23/44] 20221204 --- .../src/main/java/cn/javaex/htool/core/string/StringUtils.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java index 29bb908..80db368 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java @@ -16,7 +16,6 @@ public class StringUtils { private static final String EMPTY = ""; private static final char SEPARATOR = '_'; - // Empty checks //----------------------------------------------------------------------- /** @@ -302,7 +301,6 @@ public class StringUtils { return str1 == null ? str2 == null : str1.equalsIgnoreCase(str2); } - // Joining //----------------------------------------------------------------------- -- Gitee From d6d8099c3ea82254ee09df90037039dafe6d1f48 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Mon, 5 Dec 2022 02:45:52 +0800 Subject: [PATCH 24/44] 20221205 --- .../htool/core/reflection/ClassUtils.java | 18 ++--- .../javaex/htool/core/string/StringUtils.java | 29 +++---- .../cn/javaex/htool/crypto/rsa/RSAUtils.java | 4 +- .../cn/javaex/htool/crypto/sign/Sign.java | 68 ++++++++++++++++ .../javaex/htool/crypto/sign/SignUtils.java | 79 +++++++++++++++++++ 5 files changed, 169 insertions(+), 29 deletions(-) create mode 100644 htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java create mode 100644 htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/reflection/ClassUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/reflection/ClassUtils.java index 3abaaeb..d95dd74 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/reflection/ClassUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/reflection/ClassUtils.java @@ -246,7 +246,7 @@ public class ClassUtils { * @param isFindChildPackage 是否读取子包 * @return */ - public static List getClassNames(String packageName, boolean isFindChildPackage) { + public static List listClassNames(String packageName, boolean isFindChildPackage) { List fileNames = null; ClassLoader loader = Thread.currentThread().getContextClassLoader(); String packagePath = packageName.replace(".", "/"); @@ -254,12 +254,12 @@ public class ClassUtils { if (url != null) { String type = url.getProtocol(); if (type.equals("file")) { - fileNames = getClassNameByFile(url.getPath(), null, isFindChildPackage); + fileNames = listClassNamesByFile(url.getPath(), null, isFindChildPackage); } else if (type.equals("jar")) { - fileNames = getClassNameByJar(url.getPath(), isFindChildPackage); + fileNames = listClassNamesByJar(url.getPath(), isFindChildPackage); } } else { - fileNames = getClassNameByJars(((URLClassLoader) loader).getURLs(), packagePath, isFindChildPackage); + fileNames = listClassNamesByJars(((URLClassLoader) loader).getURLs(), packagePath, isFindChildPackage); } return fileNames; @@ -343,7 +343,7 @@ public class ClassUtils { * @param childPackage 是否遍历子包 * @return 类的完整名称 */ - private static List getClassNameByFile(String filePath, List className, boolean childPackage) { + private static List listClassNamesByFile(String filePath, List className, boolean childPackage) { List myClassName = new ArrayList(); File file = new File(filePath); File[] childFiles = file.listFiles(); @@ -351,7 +351,7 @@ public class ClassUtils { for (File childFile : childFiles) { if (childFile.isDirectory()) { if (childPackage) { - myClassName.addAll(getClassNameByFile(childFile.getPath(), myClassName, childPackage)); + myClassName.addAll(listClassNamesByFile(childFile.getPath(), myClassName, childPackage)); } } else { String childFilePath = childFile.getPath(); @@ -373,7 +373,7 @@ public class ClassUtils { * @param childPackage 是否遍历子包 * @return 类的完整名称 */ - private static List getClassNameByJars(URL[] urls, String packagePath, boolean childPackage) { + private static List listClassNamesByJars(URL[] urls, String packagePath, boolean childPackage) { List myClassName = new ArrayList(); if (urls != null) { @@ -386,7 +386,7 @@ public class ClassUtils { } String jarPath = urlPath + "!/" + packagePath; - myClassName.addAll(getClassNameByJar(jarPath, childPackage)); + myClassName.addAll(listClassNamesByJar(jarPath, childPackage)); } } @@ -400,7 +400,7 @@ public class ClassUtils { * @return 类的完整名称 */ @SuppressWarnings("resource") - private static List getClassNameByJar(String jarPath, boolean childPackage) { + private static List listClassNamesByJar(String jarPath, boolean childPackage) { List myClassName = new ArrayList(); String[] jarInfo = jarPath.split("!"); String jarFilePath = jarInfo[0].substring(jarInfo[0].indexOf("/")); diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java index 80db368..f967862 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java @@ -55,7 +55,7 @@ public class StringUtils { * @return true if the String is not empty and not null */ public static boolean isNotEmpty(String str) { - return !StringUtils.isEmpty(str); + return !isEmpty(str); } /** @@ -103,7 +103,7 @@ public class StringUtils { * @since 2.0 */ public static boolean isNotBlank(String str) { - return !StringUtils.isBlank(str); + return !isBlank(str); } // Trim @@ -189,14 +189,9 @@ public class StringUtils { // Overlay //----------------------------------------------------------------------- - /** - *

Overlays part of a String with another String.

- * - *

A null string input returns null. - * A negative index is treated as zero. - * An index greater than the string length is treated as the string length. - * The start index is always the smaller of the two indices.

- * + /** + * 用另一个字符串覆盖字符串的一部分 + * *
      * StringUtils.overlay(null, *, *, *)            = null
      * StringUtils.overlay("", "abc", 0, 0)          = "abc"
@@ -210,13 +205,12 @@ public class StringUtils {
      * StringUtils.overlay("abcdef", "zzzz", -2, -3) = "zzzzabcdef"
      * StringUtils.overlay("abcdef", "zzzz", 8, 10)  = "abcdefzzzz"
      * 
- * - * @param str the String to do overlaying in, may be null - * @param overlay the String to overlay, may be null - * @param start the position to start overlaying at - * @param end the position to stop overlaying before - * @return overlayed String, null if null String input - * @since 2.0 + * + * @param str + * @param overlay + * @param start 开始重叠的位置,包含 + * @param end 结束之前停止重叠的位置,不包含 + * @return */ public static String overlay(String str, String overlay, int start, int end) { if (str == null) { @@ -303,7 +297,6 @@ public class StringUtils { // Joining //----------------------------------------------------------------------- - /** *

Joins the elements of the provided array into a single String * containing the provided list of elements.

diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java index d090115..13f7638 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java @@ -76,11 +76,11 @@ public class RSAUtils extends RSA { X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); Key key = keyFactory.generatePublic(x509EncodedKeySpec); - //对数据解密 + // 对数据解密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, key); byte[] rtndate = cipher.doFinal(data); - String temp_str = new String(rtndate,"UTF-8"); + String temp_str = new String(rtndate, "UTF-8"); returnstr =returnstr+temp_str; } diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java new file mode 100644 index 0000000..355c855 --- /dev/null +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java @@ -0,0 +1,68 @@ +package cn.javaex.htool.crypto.sign; + +import java.security.Key; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; + +import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.string.StringUtils; + +/** + * RSA + * + * @author 陈霓清 + * @Date 2022年12月4日 + */ +public class Sign { + /** key算法 */ + public static final String KEY_ALGORTHM = "RSA"; + /** 签名算法 */ + public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; + + /** 公钥 */ + private String publicKey; + /** 私钥 */ + private String privateKey; + + /** + * 构造方法,生成新的私钥公钥对 + */ + public Sign() { + KeyPairGenerator keyPairGenerator; + try { + keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORTHM); + keyPairGenerator.initialize(1024); + + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + //公钥 + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + //私钥 + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); + + this.publicKey = StringUtils.formatNoSTRN(Base64Utils.encodeByte(((Key) publicKey).getEncoded())); + this.privateKey = StringUtils.formatNoSTRN(Base64Utils.encodeByte(((Key) privateKey).getEncoded())); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + } + + public String getPublicKey() { + return publicKey; + } + + public void setPublicKey(String publicKey) { + this.publicKey = publicKey; + } + + public String getPrivateKey() { + return privateKey; + } + + public void setPrivateKey(String privateKey) { + this.privateKey = privateKey; + } + +} diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java new file mode 100644 index 0000000..eec1003 --- /dev/null +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java @@ -0,0 +1,79 @@ +package cn.javaex.htool.crypto.sign; + +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.Signature; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.string.StringUtils; + +/** + * RSA非对称加密 + * + * @author 陈霓清 + * @Date 2022年12月4日 + */ +public class SignUtils extends Sign { + + /** + * 用私钥对信息生成数字签名 + * @param data //加密数据 + * @param privateKey //私钥 + * @return + * @throws Exception + */ + public static String sign(String content, String privateKey) throws Exception { + byte[] data =content.getBytes("UTF-8"); + // 解密私钥 + byte[] keyBytes = Base64Utils.decodeByte(privateKey); + // 构造PKCS8EncodedKeySpec对象 + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes); + // 指定加密算法 + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); + // 取私钥匙对象 + PrivateKey key = keyFactory.generatePrivate(pkcs8EncodedKeySpec); + + // 用私钥对信息生成数字签名 + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initSign(key); + signature.update(data); + + return StringUtils.formatNoSTRN(Base64Utils.encodeByte(signature.sign())); + } + + /** + * 校验数字签名 + * @param data 加密数据 + * @param publicKey 公钥 + * @param sign 数字签名 + * @return + */ + public static boolean verify(String content, String publicKey, String sign) { + try { + byte[] data = content.getBytes("UTF-8"); + // 解密公钥 + byte[] keyBytes = Base64Utils.decodeByte(publicKey); + // 构造X509EncodedKeySpec对象 + X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes); + // 指定加密算法 + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); + // 取公钥匙对象 + PublicKey key = keyFactory.generatePublic(x509EncodedKeySpec); + + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initVerify(key); + signature.update(data); + + // 验证签名是否正常 + return signature.verify(Base64Utils.decodeByte(sign)); + } catch (Exception e) { + + } + + return false; + } + +} -- Gitee From f91865d0397fe1313e9bd25f24864c147c5bf269 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Mon, 5 Dec 2022 21:29:02 +0800 Subject: [PATCH 25/44] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=B9=E7=A7=B0?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crypto/symmetric_encryption/AESUtils.java | 116 ++++++++++++++++++ .../crypto/symmetric_encryption/DESUtils.java | 105 ++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java create mode 100644 htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java new file mode 100644 index 0000000..9789abc --- /dev/null +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java @@ -0,0 +1,116 @@ +package cn.javaex.htool.crypto.symmetric_encryption; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import cn.javaex.htool.core.Base64Utils; + +/** + * AES对称加密 + * + * @author 陈霓清 + * @Date 2022年12月5日 + */ +public class AESUtils { + + /** 密钥key */ + public static final String KEY = "oVPSRgw8o1IWmkZn"; + /** 向量iv */ + public static final String IV = "KLyWDN7IivzcIgRW"; + + public static void main(String[] args) throws Exception { + String content = "test 中文"; + // 加密 + String encryptstr = encrypt(content, "KLyWDN78o1IWmkZn", "1234567812345678"); + System.out.println(encryptstr); + // 解密 + String decryptstr = decrypt(encryptstr, "KLyWDN78o1IWmkZn", "1234567812345678"); + System.out.println(decryptstr); + } + + /** + * 加密(使用系统默认key和iv) + * @param content + * @return + * @throws Exception + */ + public static String encrypt(String content) throws Exception { + byte[] raw = KEY.getBytes("utf-8"); + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + // "算法/模式/补码方式" + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + // 使用CBC模式,需要一个向量iv,可增加加密算法的强度 + IvParameterSpec ips = new IvParameterSpec(IV.getBytes()); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ips); + byte[] encrypted = cipher.doFinal(content.getBytes()); + return Base64Utils.encodeByte(encrypted); + } + + /** + * 加密 + * @param content + * @param key 密钥key + * @param iv 向量iv + * @return + * @throws Exception + */ + public static String encrypt(String content, String key, String iv) throws Exception { + if (content == null) { + return null; + } + byte[] raw = key.getBytes("utf-8"); + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + // "算法/模式/补码方式" + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + // 使用CBC模式,需要一个向量iv,可增加加密算法的强度 + IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ips); + byte[] encrypted = cipher.doFinal(content.getBytes()); + return Base64Utils.encodeByte(encrypted); + } + + /** + * 解密(使用系统默认key和iv) + * @param content + * @return + * @throws Exception + */ + public static String decrypt(String content) throws Exception { + try { + byte[] raw = KEY.getBytes("utf-8"); + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + IvParameterSpec ips = new IvParameterSpec(IV.getBytes()); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, ips); + byte[] encrypted1 = Base64Utils.decodeByte(content); + byte[] original = cipher.doFinal(encrypted1); + return new String(original); + } catch (Exception ex) { + return null; + } + } + + /** + * 解密 + * @param content + * @param key + * @param iv + * @return + * @throws Exception + */ + public static String decrypt(String content, String key, String iv) throws Exception { + try { + byte[] raw = key.getBytes("utf-8"); + SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + IvParameterSpec ips = new IvParameterSpec(iv.getBytes()); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, ips); + byte[] encrypted = Base64Utils.decodeByte(content); + byte[] original = cipher.doFinal(encrypted); + return new String(original); + } catch (Exception ex) { + return null; + } + } +} diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java new file mode 100644 index 0000000..f273b68 --- /dev/null +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java @@ -0,0 +1,105 @@ +package cn.javaex.htool.crypto.symmetric_encryption; + +import java.io.UnsupportedEncodingException; +import java.security.Key; + +import javax.crypto.Cipher; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.DESKeySpec; +import javax.crypto.spec.IvParameterSpec; + +import cn.javaex.htool.core.Base64Utils; + +/** + * DES对称加密 + * + * @author 陈霓清 + * @Date 2022年12月5日 + */ +public class DESUtils { + + /** 偏移变量,固定占8位字节 */ + private final static String IV_PARAMETER = "12345678"; + /** 密钥算法 */ + private static final String ALGORITHM = "DES"; + /** 加密/解密算法-工作模式-填充模式 */ + private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding"; + /** 默认编码 */ + private static final String CHARSET = "utf-8"; + + public static void main(String[] args) throws UnsupportedEncodingException { + String data = "test 中文"; + // 加密 + String encrypt = encrypt(data, "12345678"); + System.out.println(encrypt); + // 解密 + String decrypt = decrypt(encrypt, "12345678"); + System.out.println(decrypt); + } + + /** + * 加密 + * + * @param data 待加密字符串 + * @param password 加密密码,长度不能够小于8位 + * @return 加密后内容 + */ + public static String encrypt(String data, String password) { + if (password == null || password.length() < 8) { + throw new RuntimeException("加密失败,key不能小于8位"); + } + if (data == null) + return null; + try { + Key secretKey = generateKey(password); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); + byte[] bytes = cipher.doFinal(data.getBytes(CHARSET)); + + return Base64Utils.encodeByte(bytes); + } catch (Exception e) { + e.printStackTrace(); + return data; + } + } + + /** + * 解密 + * + * @param data 待解密字符串 + * @param password 解密密码,长度不能够小于8位 + * @return 解密后内容 + */ + public static String decrypt(String data, String password) { + if (password == null || password.length() < 8) { + throw new RuntimeException("加密失败,key不能小于8位"); + } + if (data == null) + return null; + try { + Key secretKey = generateKey(password); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET)); + cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); + return new String(cipher.doFinal(Base64Utils.decodeByte(data)), CHARSET); + } catch (Exception e) { + e.printStackTrace(); + return data; + } + } + + /** + * 生成key + * + * @param password + * @return + * @throws Exception + */ + private static Key generateKey(String password) throws Exception { + DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET)); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM); + return keyFactory.generateSecret(dks); + } + +} -- Gitee From 09bb954b86f1c0167f7344a6ad170fe46f232a3b Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Mon, 5 Dec 2022 21:30:02 +0800 Subject: [PATCH 26/44] =?UTF-8?q?=E5=AF=B9=E7=A7=B0=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../htool/crypto/symmetric_encryption/AESUtils.java | 10 ---------- .../htool/crypto/symmetric_encryption/DESUtils.java | 11 ----------- 2 files changed, 21 deletions(-) diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java index 9789abc..0a2efa1 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java @@ -19,16 +19,6 @@ public class AESUtils { /** 向量iv */ public static final String IV = "KLyWDN7IivzcIgRW"; - public static void main(String[] args) throws Exception { - String content = "test 中文"; - // 加密 - String encryptstr = encrypt(content, "KLyWDN78o1IWmkZn", "1234567812345678"); - System.out.println(encryptstr); - // 解密 - String decryptstr = decrypt(encryptstr, "KLyWDN78o1IWmkZn", "1234567812345678"); - System.out.println(decryptstr); - } - /** * 加密(使用系统默认key和iv) * @param content diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java index f273b68..57da38d 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java @@ -1,6 +1,5 @@ package cn.javaex.htool.crypto.symmetric_encryption; -import java.io.UnsupportedEncodingException; import java.security.Key; import javax.crypto.Cipher; @@ -26,16 +25,6 @@ public class DESUtils { private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding"; /** 默认编码 */ private static final String CHARSET = "utf-8"; - - public static void main(String[] args) throws UnsupportedEncodingException { - String data = "test 中文"; - // 加密 - String encrypt = encrypt(data, "12345678"); - System.out.println(encrypt); - // 解密 - String decrypt = decrypt(encrypt, "12345678"); - System.out.println(decrypt); - } /** * 加密 -- Gitee From 3bce95649b0b8a5f773b87771227afd94f10b8dc Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Tue, 6 Dec 2022 00:44:40 +0800 Subject: [PATCH 27/44] =?UTF-8?q?servlet=E6=A8=A1=E5=9D=97=E5=B9=B6?= =?UTF-8?q?=E5=85=A5http=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htool-all/pom.xml | 4 +- .../cn/javaex/htool/core/Base64Utils.java | 125 ++++++++++++++++-- .../core/collection/CollectionUtils.java | 19 +++ .../htool/core/{file => io}/FileUtils.java | 2 +- .../htool/core/{file => io}/IOUtils.java | 2 +- .../htool/core/{file => io}/PathUtils.java | 2 +- .../cn/javaex/htool/core/io/ZipUtils.java | 11 ++ {htool-servlet => htool-http}/pom.xml | 6 +- .../java/cn/javaex/htool/http/HtmlUtils.java | 5 + .../java/cn/javaex/htool/http/HttpUtils.java | 5 + .../htool/http}/servlet/AgentUtils.java | 2 +- .../htool/http}/servlet/CookieUtils.java | 2 +- .../htool/http}/servlet/SessionUtils.java | 2 +- pom.xml | 6 +- 14 files changed, 170 insertions(+), 23 deletions(-) create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java rename htool-core/src/main/java/cn/javaex/htool/core/{file => io}/FileUtils.java (99%) rename htool-core/src/main/java/cn/javaex/htool/core/{file => io}/IOUtils.java (91%) rename htool-core/src/main/java/cn/javaex/htool/core/{file => io}/PathUtils.java (98%) create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java rename {htool-servlet => htool-http}/pom.xml (88%) create mode 100644 htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java create mode 100644 htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java rename {htool-servlet/src/main/java/cn/javaex/htool => htool-http/src/main/java/cn/javaex/htool/http}/servlet/AgentUtils.java (99%) rename {htool-servlet/src/main/java/cn/javaex/htool => htool-http/src/main/java/cn/javaex/htool/http}/servlet/CookieUtils.java (98%) rename {htool-servlet/src/main/java/cn/javaex/htool => htool-http/src/main/java/cn/javaex/htool/http}/servlet/SessionUtils.java (97%) diff --git a/htool-all/pom.xml b/htool-all/pom.xml index 1f73eb7..de8900e 100644 --- a/htool-all/pom.xml +++ b/htool-all/pom.xml @@ -32,10 +32,10 @@ cn.javaex - htool-servlet + htool-http ${project.parent.version} - + cn.javaex htool-picture ${project.parent.version} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java b/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java index 1b51d2a..fb9bbc7 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java @@ -10,22 +10,45 @@ import java.util.Base64; */ public class Base64Utils { + /** 字母表 */ + private static char[] ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray(); + + private static byte[] CODES = new byte[256]; + + static { + for (int i = 0; i < 256; i++) { + CODES[i] = -1; + } + for (int i = 'A'; i <= 'Z'; i++) { + CODES[i] = (byte) (i - 'A'); + } + + for (int i = 'a'; i <= 'z'; i++) { + CODES[i] = (byte) (26 + i - 'a'); + } + for (int i = '0'; i <= '9'; i++) { + CODES[i] = (byte) (52 + i - '0'); + } + CODES['+'] = 62; + CODES['/'] = 63; + } + /** * 加密 - * @param string + * @param str * @return */ - public static String encode(String string) { - return Base64.getEncoder().encodeToString(string.getBytes()); + public static String encode(String str) { + return Base64.getEncoder().encodeToString(str.getBytes()); } /** * 解密 - * @param string + * @param str * @return */ - public static String decode(String string) { - return new String(Base64.getDecoder().decode(string)); + public static String decode(String str) { + return new String(Base64.getDecoder().decode(str)); } /** @@ -39,10 +62,94 @@ public class Base64Utils { /** * String 转 byte[] - * @param string + * @param str + * @return + */ + public static byte[] decodeByte(String str) { + return Base64.getDecoder().decode(str); + } + + /** + * byte[] 转 char[] + * @param data + * @return + */ + public static char[] encodeChar(byte[] data) { + char[] out = new char[((data.length + 2) / 3) * 4]; + for (int i = 0, index = 0; i < data.length; i += 3, index += 4) { + boolean quad = false; + boolean trip = false; + + int val = (0xFF & (int) data[i]); + val <<= 8; + if ((i + 1) < data.length) { + val |= (0xFF & (int) data[i + 1]); + trip = true; + } + val <<= 8; + if ((i + 2) < data.length) { + val |= (0xFF & (int) data[i + 2]); + quad = true; + } + out[index + 3] = ALPHABET[(quad ? (val & 0x3F) : 64)]; + val >>= 6; + out[index + 2] = ALPHABET[(trip ? (val & 0x3F) : 64)]; + val >>= 6; + out[index + 1] = ALPHABET[val & 0x3F]; + val >>= 6; + out[index + 0] = ALPHABET[val & 0x3F]; + } + return out; + } + + /** + * char[] 转 byte[] + * @param data * @return */ - public static byte[] decodeByte(String string) { - return Base64.getDecoder().decode(string); + public static byte[] decodeChar(char[] data) { + int tempLen = data.length; + for (int ix = 0; ix < data.length; ix++) { + if ((data[ix] > 255) || CODES[data[ix]] < 0) { + --tempLen; // ignore non-valid chars and padding + } + } + + int len = (tempLen / 4) * 3; + if ((tempLen % 4) == 3) { + len += 2; + } + if ((tempLen % 4) == 2) { + len += 1; + + } + byte[] out = new byte[len]; + + int shift = 0; // # of excess bits stored in accum + int accum = 0; // excess bits + int index = 0; + + for (int ix = 0; ix < data.length; ix++) { + int value = (data[ix] > 255) ? -1 : CODES[data[ix]]; + + if (value >= 0) { // skip over non-code + accum <<= 6; // bits shift up by 6 each time thru + shift += 6; // loop, with new bits being put in + accum |= value; // at the bottom. + if (shift >= 8) { // whenever there are 8 or more shifted in, + shift -= 8; // write them out (from the top, leaving any + out[index++] = // excess at the bottom for next iteration. + (byte) ((accum >> shift) & 0xff); + } + } + } + + if (index != out.length) { + throw new Error("Miscalculated data length (wrote " + index + + " instead of " + out.length + ")"); + } + + return out; } + } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java new file mode 100644 index 0000000..4a54a9b --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java @@ -0,0 +1,19 @@ +package cn.javaex.htool.core.collection; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 集合操作工具类 + * + * @author 陈霓清 + * @Date 2022年12月5日 + */ +public class CollectionUtils { + + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java similarity index 99% rename from htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java rename to htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java index e4b3f33..4a11b27 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/file/FileUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.core.file; +package cn.javaex.htool.core.io; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; diff --git a/htool-core/src/main/java/cn/javaex/htool/core/file/IOUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java similarity index 91% rename from htool-core/src/main/java/cn/javaex/htool/core/file/IOUtils.java rename to htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java index 3743e1a..f61d511 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/file/IOUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.core.file; +package cn.javaex.htool.core.io; import java.io.Closeable; diff --git a/htool-core/src/main/java/cn/javaex/htool/core/file/PathUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/PathUtils.java similarity index 98% rename from htool-core/src/main/java/cn/javaex/htool/core/file/PathUtils.java rename to htool-core/src/main/java/cn/javaex/htool/core/io/PathUtils.java index 5945f02..f605cb8 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/file/PathUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/PathUtils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.core.file; +package cn.javaex.htool.core.io; import java.io.File; import java.io.InputStream; diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java new file mode 100644 index 0000000..6711ef6 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java @@ -0,0 +1,11 @@ +package cn.javaex.htool.core.io; + +/** + * 文件压缩/解压缩工具类 + * + * @author 陈霓清 + * @Date 2022年12月5日 + */ +public class ZipUtils { + +} diff --git a/htool-servlet/pom.xml b/htool-http/pom.xml similarity index 88% rename from htool-servlet/pom.xml rename to htool-http/pom.xml index a9a345b..c15a68b 100644 --- a/htool-servlet/pom.xml +++ b/htool-http/pom.xml @@ -5,9 +5,9 @@ htool 1.0.0 - htool-servlet - htool-servlet - 服务端模块 + htool-http + htool-http + http模块 diff --git a/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java new file mode 100644 index 0000000..c4a3df7 --- /dev/null +++ b/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java @@ -0,0 +1,5 @@ +package cn.javaex.htool.http; + +public class HtmlUtils { + +} diff --git a/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java new file mode 100644 index 0000000..bccc26b --- /dev/null +++ b/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java @@ -0,0 +1,5 @@ +package cn.javaex.htool.http; + +public class HttpUtils { + +} diff --git a/htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java similarity index 99% rename from htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java rename to htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java index e36b5ac..520d430 100644 --- a/htool-servlet/src/main/java/cn/javaex/htool/servlet/AgentUtils.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.servlet; +package cn.javaex.htool.http.servlet; import eu.bitwalker.useragentutils.Browser; import eu.bitwalker.useragentutils.OperatingSystem; diff --git a/htool-servlet/src/main/java/cn/javaex/htool/servlet/CookieUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java similarity index 98% rename from htool-servlet/src/main/java/cn/javaex/htool/servlet/CookieUtils.java rename to htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java index 72f14b7..2341e43 100644 --- a/htool-servlet/src/main/java/cn/javaex/htool/servlet/CookieUtils.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.servlet; +package cn.javaex.htool.http.servlet; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; diff --git a/htool-servlet/src/main/java/cn/javaex/htool/servlet/SessionUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java similarity index 97% rename from htool-servlet/src/main/java/cn/javaex/htool/servlet/SessionUtils.java rename to htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java index cbe5c94..694fd47 100644 --- a/htool-servlet/src/main/java/cn/javaex/htool/servlet/SessionUtils.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.servlet; +package cn.javaex.htool.http.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; diff --git a/pom.xml b/pom.xml index ed44337..ec58daf 100644 --- a/pom.xml +++ b/pom.xml @@ -7,11 +7,11 @@ htool-all - htool-core htool-cache - htool-date + htool-core htool-crypto - htool-servlet + htool-date + htool-http htool-picture -- Gitee From 9aba99b68f193f8c0957a9d9b214b4495591f0d2 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Wed, 7 Dec 2022 23:06:02 +0800 Subject: [PATCH 28/44] =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/core/io/Charsets.java | 39 ++ .../cn/javaex/htool/core/io/FileHandler.java | 220 ++++++++ .../cn/javaex/htool/core/io/FileUtils.java | 500 +++++++++++++++--- .../java/cn/javaex/htool/core/io/IOUtils.java | 347 +++++++++++- .../cn/javaex/htool/core/io/ZipUtils.java | 11 - .../core/io/output/StringBuilderWriter.java | 138 +++++ 6 files changed, 1148 insertions(+), 107 deletions(-) create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/Charsets.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/FileHandler.java delete mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/Charsets.java b/htool-core/src/main/java/cn/javaex/htool/core/io/Charsets.java new file mode 100644 index 0000000..a1787fe --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/Charsets.java @@ -0,0 +1,39 @@ +package cn.javaex.htool.core.io; + +import java.nio.charset.Charset; + +import cn.javaex.htool.core.string.StringUtils; + +/** + * 字符集工具类 + * + * @author 陈霓清 + * @Date 2022年12月7日 + */ +public class Charsets { + + /** + * 字符集转换 + * + * @param charsetName + * @return + */ + public static Charset toCharset(String charsetName) { + if (StringUtils.isNotEmpty(charsetName)) { + Charset.forName(charsetName); + } + + return Charset.defaultCharset(); + } + + /** + * 返回给定的Charset或默认的Charset + * + * @param charset + * @return + */ + public static Charset toCharset(final Charset charset) { + return charset == null ? Charset.defaultCharset() : charset; + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileHandler.java new file mode 100644 index 0000000..21cbf6b --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileHandler.java @@ -0,0 +1,220 @@ +package cn.javaex.htool.core.io; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; + +/** + * 文件处理工具类 + * + * @author 陈霓清 + * @Date 2022年12月7日 + */ +public class FileHandler { + + /** + * 判断指定的文件是否是符号链接而不是实际文件 + * + * @param file the file to test. + * @return true if the file is a symbolic link + * @see Files#isSymbolicLink(Path) + */ + public static boolean isSymlink(File file) { + return file != null && Files.isSymbolicLink(file.toPath()); + } + + /** + * 要求给定的文件存在并且是一个目录 + * @param directory 待校验的目录对象 + * @param name 异常消息中使用的参数名称 + * @return + */ + public static File requireDirectoryExists(File directory, String name) { + requireExists(directory); + requireDirectory(directory); + return directory; + } + + /** + * 如果给定的文件存在,则必须是一个目录 + * @param directory + * @return + */ + public static File requireDirectoryIfExists(File directory) { + Objects.requireNonNull(directory); + if (directory.exists()) { + requireDirectory(directory); + } + return directory; + } + + /** + * 要求文件必须存在 + * @param file + * @return + */ + public static File requireExists(File file) { + Objects.requireNonNull(file); + if (!file.exists()) { + throw new IllegalArgumentException( + "File system element for parameter does not exist: '" + file + "'"); + } + return file; + } + + /** + * 校验文件是否是一个目录,不是则报错 + * @param directory + * @param name + * @return + */ + public static File requireDirectory(File directory) { + Objects.requireNonNull(directory); + if (!directory.isDirectory()) { + throw new IllegalArgumentException("Parameter is not a directory: '" + directory + "'"); + } + return directory; + } + + /** + * 校验文件复制操作需要参数属性 + * + * @param source 源文件 + * @param destination 目标文件 + * @throws FileNotFoundException + */ + public static void requireFileCopy(File source, File destination) throws FileNotFoundException { + requireExists(source); + Objects.requireNonNull(destination); + } + + /** + * 校验是否是一个文件,不是则报错 + * @param file + * @return + */ + public static File requireFile(File file) { + Objects.requireNonNull(file); + if (!file.isFile()) { + throw new IllegalArgumentException("Parameter is not a file: " + file); + } + return file; + } + + /** + * 校验2个文件是否是同一个文件路径,如果是,则报错 + * @param file1 第1个比较文件 + * @param file2 第2个比较文件 + * @throws IOException + */ + public static void requireCanonicalPathsNotEquals(File file1, File file2) throws IOException { + String canonicalPath = file1.getCanonicalPath(); + if (canonicalPath.equals(file2.getCanonicalPath())) { + throw new IllegalArgumentException(String + .format("File canonical paths are equal: '%s' (file1='%s', file2='%s')", canonicalPath, file1, file2)); + } + } + + /** + * 为File对象创建父级目录 + * @param file + * @return + * @throws IOException + */ + public static File createParentDirectories(File file) throws IOException { + return mkdirs(getParentFile(file)); + } + + /** + * 获取给定文件的父级文件 + * 给定的文件可能是null,文件的父级也可能是null + * @param file + * @return + */ + private static File getParentFile(File file) { + return file == null ? null : file.getParentFile(); + } + + /** + * 创建文件夹 + * @param directory + * @return + * @throws IOException + */ + public static File mkdirs(File directory) throws IOException { + if ((directory != null) && (!directory.mkdirs() && !directory.isDirectory())) { + throw new IOException("Cannot create directory '" + directory + "'."); + } + return directory; + } + + /** + * 要求给定的文件必须存在,且是一个文件,而不是目录 + * @param file + * @return + */ + public static File requireFileIfExists(File file) { + Objects.requireNonNull(file); + return file.exists() ? requireFile(file) : file; + } + + /** + * 要求文件必须是可写的 + * @param file + */ + public static void requireCanWrite(File file) { + Objects.requireNonNull(file); + if (!file.canWrite()) { + throw new IllegalArgumentException("File parameter is not writable: '" + file + "'"); + } + } + + /** + * 要求2个文件的长度相等 + * @param srcFile 源文件 + * @param destFile 目标文件 + * @param srcLen 源文件长度 + * @param dstLen 目标文件长度 + * @throws IOException + */ + public static void requireEqualSizes(File srcFile, File destFile, long srcLen, long dstLen) + throws IOException { + if (srcLen != dstLen) { + throw new IOException("Failed to copy full contents from '" + srcFile + "' to '" + destFile + + "' Expected length: " + srcLen + " Actual: " + dstLen); + } + } + + /** + * 判断文件大小处于限制内 + * + * @param file 文件 + * @param limitSize 限制大小 + * @param fileUnit 限制的单位(B,K,M,G) + * @return + */ + public static boolean checkFileSize(File file, int limitSize, String fileUnit) { + double fileSizeCom = 0; + switch (fileUnit.toUpperCase()) { + case "B": + fileSizeCom = (double) file.length(); + break; + case "K": + fileSizeCom = (double) file.length() / 1024; + break; + case "M": + fileSizeCom = (double) file.length() / (1024*1024); + break; + case "G": + fileSizeCom = (double) file.length() / (1024*1024*1024); + break; + default: + break; + } + + return limitSize >= fileSizeCom; + } +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java index 4a11b27..84db12b 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java @@ -10,6 +10,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; @@ -32,9 +35,405 @@ public class FileUtils { /** 默认缓冲区大小 */ private static final int BUFFER_SIZE = 2048; + /** + * 递归删除文件或目录(目录本身也删除) + * @param path 目录或文件的绝对路径 + * @return boolean + * @throws IOException + */ + public static void deleteFileOrDirectory(String path) throws IOException { + File file = new File(path); + deleteFileOrDirectory(file); + } + + /** + * 递归删除文件或目录(目录本身也删除) + * @param file File文件对象 + * @return boolean + * @throws IOException + */ + public static void deleteFileOrDirectory(File file) throws IOException { + // 1. 校验参数 + FileHandler.requireExists(file); + if (!file.exists()) { + return; + } + + // 2. 清理目录而不删除它 + if (!FileHandler.isSymlink(file)) { + cleanDirectory(file); + } + + // 3. 删除目录或文件本身 + file.delete(); + } + + /** + * 删除目录下的内容而不删除目录本身 + * @param path 目录的绝对路径 + * @throws IOException + */ + public static void cleanDirectory(String path) throws IOException { + File file = new File(path); + cleanDirectory(file); + } + + /** + * 删除目录下的内容而不删除目录本身 + * @param directory File文件对象 + * @throws IOException + */ + public static void cleanDirectory(File directory) throws IOException { + FileHandler.requireExists(directory); + if (!directory.exists()) { + return; + } + + if (directory.isDirectory()) { + File[] files = listFiles(directory); + for (File file : files) { + deleteFileOrDirectory(file); + } + } + } + + /** + * 列出指定目录下的文件 + * @param path 目录的绝对路径 + * @return + * @throws IOException + */ + public static File[] listFiles(String path) throws IOException { + File directory = new File(path); + return listFiles(directory); + } + + /** + * 列出指定目录下的文件 + * @param directory File文件对象 + * @return + * @throws IOException + */ + public static File[] listFiles(File directory) throws IOException { + FileHandler.requireDirectoryExists(directory, "directory"); + File[] files = directory.listFiles(); + if (files == null) { + throw new IOException("Unknown I/O error listing contents of directory: " + directory); + } + return files; + } + + /** + * 复制一个文件到一个新位置 + * 如果目标文件不存在,则创建保存目标文件。如果目标文件存在,则覆盖 + * + * @param srcPath 要复制的源文件的绝对路径 + * @param destPath 要复制的目标文件的绝对路径 + * @throws IOException + */ + public static void copyFile(String srcPath, String destPath) throws IOException { + File srcFile = new File(srcPath); + File destFile = new File(destPath); + + copyFile(srcFile, destFile); + } + + /** + * 复制一个文件到一个新位置 + * 如果目标文件不存在,则创建保存目标文件。如果目标文件存在,则覆盖 + * + * @param srcFile 要复制的源文件,不能为null + * @param destFile 要复制的目标文件,不能为null + * @throws IOException + */ + public static void copyFile(File srcFile, File destFile) throws IOException { + // 1. 校验文件合法性 + // 1.1 校验文件复制操作需要的参数属性 + FileHandler.requireFileCopy(srcFile, destFile); + // 1.2 校验复制源是不是一个文件 + FileHandler.requireFile(srcFile); + // 1.3 校验2个文件是否是同一个文件,如果是,则报错 + FileHandler.requireCanonicalPathsNotEquals(srcFile, destFile); + // 1.4 为目标文件创建父级目录,如果父级目录不存在的话 + FileHandler.createParentDirectories(destFile); + // 1.5 目标文件对应的File对象不能为null,且该File对象代表的必须是一个文件 + FileHandler.requireFileIfExists(destFile); + // 1.6 目标文件如果本身存在,代表覆盖操作,则目标文件必须是可写的 + if (destFile.exists()) { + FileHandler.requireCanWrite(destFile); + } + + // 2. 复制文件(目标文件存在,则覆盖) + Files.copy(srcFile.toPath(), destFile.toPath(), StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING); + + // 3. 校验复制的完整性 + FileHandler.requireEqualSizes(srcFile, destFile, srcFile.length(), destFile.length()); + } + + /** + * 复制目录(不复制源目录本身) + * 将指定的目录及其所有子目录和文件复制到指定的目标 + * 目标是目录的新位置和名称 + * 如果目标目录不存在,将创建该目录 + * 如果目标目录确实存在,则此方法将源与目标合并,源文件会覆盖目标文件 + * @param srcPath + * @param destPath + * @throws IOException + */ + public static void copyDirectory(String srcPath, String destPath) throws IOException { + File srcDir = new File(srcPath); + File destDir = new File(destPath); + + copyDirectory(srcDir, destDir); + } + + /** + * 复制目录(不复制源目录本身) + * 将指定的目录及其所有子目录和文件复制到指定的目标 + * 目标是目录的新位置和名称 + * 如果目标目录不存在,将创建该目录 + * 如果目标目录确实存在,则此方法将源与目标合并,源文件会覆盖目标文件 + * @param srcDir + * @param destDir + * @throws IOException + */ + public static void copyDirectory(File srcDir, File destDir) throws IOException { + // 1. 校验文件合法性 + // 1.1 校验文件复制操作需要的参数属性 + FileHandler.requireFileCopy(srcDir, destDir); + // 1.2 校验复制源是否是一个目录 + FileHandler.requireDirectory(srcDir); + // 1.3 校验2个File对象是否是同一个文件路径,如果是,则报错 + FileHandler.requireCanonicalPathsNotEquals(srcDir, destDir); + + // 2. 源目录中的目录分类 + List exclusionList = null; + String srcDirCanonicalPath = srcDir.getCanonicalPath(); + String destDirCanonicalPath = destDir.getCanonicalPath(); + if (destDirCanonicalPath.startsWith(srcDirCanonicalPath)) { + File[] srcFiles = listFiles(srcDir); + if (srcFiles.length > 0) { + exclusionList = new ArrayList<>(srcFiles.length); + for (File srcFile : srcFiles) { + File copiedFile = new File(destDir, srcFile.getName()); + exclusionList.add(copiedFile.getCanonicalPath()); + } + } + } + + // 3. 复制目录 + doCopyDirectory(srcDir, destDir, exclusionList); + } + + /** + * 复制目录的具体实现 + * @param srcDir + * @param destDir + * @param exclusionList + * @throws IOException + */ + private static void doCopyDirectory(File srcDir, File destDir, List exclusionList) throws IOException { + // 1. 创建目标目录 + FileHandler.mkdirs(destDir); + FileHandler.requireCanWrite(destDir); + + // 2. 递归遍历目录,复制文件 + File[] srcFiles = listFiles(srcDir); + for (File srcFile : srcFiles) { + File dstFile = new File(destDir, srcFile.getName()); + if (exclusionList == null || !exclusionList.contains(srcFile.getCanonicalPath())) { + if (srcFile.isDirectory()) { + doCopyDirectory(srcFile, dstFile, exclusionList); + } else { + copyFile(srcFile, dstFile); + } + } + } + } + + /** + * 复制目录(复制源目录本身) + * 将指定的目录及其所有子目录和文件复制到指定的目标 + * 目标是目录的新位置和名称 + * 如果目标目录不存在,将创建该目录 + * 如果目标目录确实存在,则此方法将源与目标合并,源文件会覆盖目标文件 + * @param srcPath + * @param destPath + * @throws IOException + */ + public static void copyDirectoryToDirectory(String srcPath, String destPath) throws IOException { + File srcDir = new File(srcPath); + File destDir = new File(destPath); + + copyDirectoryToDirectory(srcDir, destDir); + } + + /** + * 复制目录(复制源目录本身) + * 将指定的目录及其所有子目录和文件复制到指定的目标 + * 目标是目录的新位置和名称 + * 如果目标目录不存在,将创建该目录 + * 如果目标目录确实存在,则此方法将源与目标合并,源文件会覆盖目标文件 + * @param sourceDir + * @param destinationDir + * @throws IOException + */ + public static void copyDirectoryToDirectory(File srcDir, File destDir) throws IOException { + // 1. File校验 + FileHandler.requireDirectory(srcDir); + FileHandler.requireDirectoryIfExists(destDir); + + // 2. 复制目录 + copyDirectory(srcDir, new File(destDir, srcDir.getName())); + } + + /** + * 移动文件 + * @param srcPath + * @param destPath + * @throws IOException + */ + public static void moveFile(String srcPath, String destPath) throws IOException { + copyFile(srcPath, destPath); + deleteFileOrDirectory(srcPath); + } + + /** + * 移动目录(不移动源目录本身) + * 将指定的目录及其所有子目录和文件复制到指定的目标 + * @param srcPath + * @param destPath + * @throws IOException + */ + public static void moveDirectory(String srcPath, String destPath) throws IOException { + copyDirectory(srcPath, destPath); + deleteFileOrDirectory(srcPath); + } + + /** + * 移动目录(移动源目录本身) + * 将指定的目录及其所有子目录和文件复制到指定的目标 + * @param srcPath + * @param destPath + * @throws IOException + */ + public static void moveDirectoryToDirectory(String srcPath, String destPath) throws IOException { + copyDirectoryToDirectory(srcPath, destPath); + deleteFileOrDirectory(srcPath); + } + + /** + * 强制创建文件夹,如果该文件夹父级目录不存在,会自动创建父级目录 + * @param directoryPath + * @throws IOException + */ + public static void forceMkdir(String directoryPath) throws IOException { + forceMkdir(new File(directoryPath)); + } + + /** + * 强制创建文件夹,如果该文件夹父级目录不存在,会自动创建父级目录 + * @param directory + * @throws IOException + */ + public static void forceMkdir(File directory) throws IOException { + FileHandler.mkdirs(directory); + } + + /** + * 向文件中写入内容 + * 如果该文件不存在,则自动创建 + * @param filePath 文件的绝对路径 + * @param data 写入的数据 + * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null + * @param isAppend 是否追加写入(true),或者覆盖写入(false) + * @throws IOException + */ + public static void write(String filePath, String data, String charsetName, boolean isAppend) + throws IOException { + write(new File(filePath), data, charsetName, isAppend); + } + + /** + * 向文件中写入内容 + * 如果该文件不存在,则自动创建 + * @param file File对象 + * @param data 写入的数据 + * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null + * @param isAppend 是否追加写入(true),或者覆盖写入(false) + * @throws IOException + */ + public static void write(File file, String data, String charsetName, boolean isAppend) + throws IOException { + try (OutputStream out = IOUtils.openOutputStream(file, isAppend)) { + IOUtils.write(data, out, Charsets.toCharset(charsetName)); + } + } + + /** + * 将文件内容读取为字符串 + * @param filePath + * @return + * @throws IOException + */ + public static String readFile(String filePath) throws IOException { + return readFile(new File(filePath), null); + } + + /** + * 将文件内容读取为字符串 + * @param file + * @return + * @throws IOException + */ + public static String readFile(File file) throws IOException { + return readFile(file, null); + } + + /** + * 将文件内容读取为字符串 + * @param filePath + * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null + * @return + * @throws IOException + */ + public static String readFile(String filePath, String charsetName) throws IOException { + return readFile(new File(filePath), charsetName); + } + + /** + * 将文件内容读取为字符串 + * @param file + * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null + * @return + * @throws IOException + */ + public static String readFile(File file, String charsetName) throws IOException { + // 校验文件大小是否在2G内 + boolean checkFileSize = FileHandler.checkFileSize(file, 2, "G"); + if (checkFileSize) { + byte[] bytes = Files.readAllBytes(Paths.get(file.getPath())); + return new String(bytes, Charsets.toCharset(charsetName)); + } else { + try (InputStream inputStream = IOUtils.openInputStream(file)) { + return IOUtils.toString(inputStream, Charsets.toCharset(charsetName)); + } + } + } + + + + + + + + + + + /** * 下载resources文件夹下的文件(不重命名) - * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx + * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx */ public static void downloadFileFromResource(String filePath) { downloadFileFromResource(filePath, null); @@ -42,7 +441,7 @@ public class FileUtils { /** * 下载resources文件夹下的文件 - * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx + * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx * @param newFileName 重命名文件名称(带后缀) */ public static void downloadFileFromResource(String filePath, String newFileName) { @@ -56,8 +455,8 @@ public class FileUtils { /** * 下载文件 - * @param in InputStream流 - * @param newFileName 重命名文件名称(带后缀) + * @param in InputStream流 + * @param newFileName 重命名文件名称(带后缀) */ public static void downloadFile(InputStream in, String newFileName) { HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); @@ -88,8 +487,8 @@ public class FileUtils { /** * 文件下载(不重命名) * @param filePath 文件的路径(带具体的文件名) - * 如果是相对路径,则认为是项目的同级目录 - * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 + * 如果是相对路径,则认为是项目的同级目录 + * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 */ public static void downloadFile(String filePath) { downloadFile(filePath, null); @@ -97,9 +496,9 @@ public class FileUtils { /** * 文件下载 - * @param filePath 文件的路径(带具体的文件名) - * 如果是相对路径,则认为是项目的同级目录 - * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 + * @param filePath 文件的路径(带具体的文件名) + * 如果是相对路径,则认为是项目的同级目录 + * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 * @param newFileName 重命名文件名称(带后缀) */ public static void downloadFile(String filePath, String newFileName) { @@ -151,71 +550,6 @@ public class FileUtils { } } - /** - * 删除文件或目录(目录本身也删除) - * @param path 目录或文件的全路径 - * @return boolean - */ - public static boolean deleteFile(String path) { - File file = new File(path); - return deleteFile(file); - } - - /** - * 删除文件或目录 - * @param file File文件对象 - * @return boolean - */ - public static boolean deleteFile(File file) { - if (!file.exists()) { - return false; - } - - if (file.isDirectory()) { - File[] fileArr = file.listFiles(); - for (File f : fileArr) { - deleteFile(f); - } - } - - return file.delete(); - } - - /** - * 删除文件或目录 - * @param path 目录或文件的全路径 - * @param flag 是否删除目录本身 - * @return boolean - */ - public static boolean deleteFile(String path, boolean flag) { - File file = new File(path); - return deleteFile(file, flag); - } - - /** - * 删除文件或目录(是否删除目录本身) - * @param file File文件对象 - * @return boolean - */ - private static boolean deleteFile(File file, boolean flag) { - if (!file.exists()) { - return false; - } - - if (file.isDirectory()) { - File[] fileArr = file.listFiles(); - for (File f : fileArr) { - deleteFile(f); - } - } - - if (flag) { - return file.delete(); - } - - return true; - } - /** * 获取文件源中的所有文件 * @param sourcePath @@ -256,8 +590,8 @@ public class FileUtils { /** * 创建一个zip压缩文件,并存放到新的路径中 - * @param sourcePath 源目录或文件的全路径,例如:D:\\Temp 或 D:\\Temp\\1.docx - * @param zipPath 压缩后的文件全路径,例如:D:\\Temp\\xx.zip + * @param sourcePath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx + * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip * @throws Exception */ public static void zip(String sourcePath, String zipPath) throws Exception { @@ -266,9 +600,9 @@ public class FileUtils { /** * 创建一个zip压缩文件,并存放到新的路径中 - * @param sourcePath 源目录或文件的全路径,例如:D:\\Temp 或 D:\\Temp\\1.docx - * @param zipPath 压缩后的文件全路径,例如:D:\\Temp\\xx.zip - * @param isKeepFolder 是否将目录名称也一起压缩 + * @param sourcePath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx + * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip + * @param isKeepFolder 是否将目录名称也一起压缩 * @throws Exception */ public static void zip(String sourcePath, String zipPath, boolean isKeepFolder) throws Exception { @@ -287,7 +621,7 @@ public class FileUtils { File zipFile = new File(zipPath); if (zipFile.exists()) { - deleteFile(zipFile); // 如果压缩包已存在,则先删除 + deleteFileOrDirectory(zipFile); // 如果压缩包已存在,则先删除 } // 判断是否是一个具体的文件 @@ -317,7 +651,7 @@ public class FileUtils { // 将每个文件放入zip流中 for (File file : fileList) { - String name = getRealName(sourcePath, file); // 获取文件相对路径,保持文件原有结构 + String name = getRealName(sourcePath, file); // 获取文件相对路径,保持文件原有结构 ZipEntry zipEntry = null; if (isKeepFolder) { zipEntry = new ZipEntry(new File(sourcePath).getName() + File.separator + name); @@ -357,8 +691,8 @@ public class FileUtils { /** * zip解压 - * @param zipPath zip文件的全路径,例如:D:\\Temp\\xx.zip - * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Tempxx + * @param zipPath zip文件的绝对路径,例如:D:\\Temp\\xx.zip + * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Tempxx * @throws Exception */ public static void unZip(String zipPath, String destDirPath) throws Exception { diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java index f61d511..814c557 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java @@ -1,29 +1,350 @@ package cn.javaex.htool.core.io; import java.io.Closeable; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.Reader; +import java.io.Writer; +import java.nio.charset.Charset; +import java.util.Objects; + +import cn.javaex.htool.core.io.output.StringBuilderWriter; /** - * IO流 + * IO流工具类 * * @author 陈霓清 - * @Date 2022年12月1日 + * @Date 2022年12月6日 */ public class IOUtils { - + /** - * 关闭资源 - * @param closeable + * CR char. + * + * @since 2.9.0 */ - public static void closeQuietly(final Closeable closeable) { - if (closeable == null) { - return; - } + public static final int CR = '\r'; + + /** + * The default buffer size ({@value}) to use in copy methods. + */ + public static final int DEFAULT_BUFFER_SIZE = 8192; + + /** + * The system directory separator character. + */ + public static final char DIR_SEPARATOR = File.separatorChar; + + /** + * The Unix directory separator character. + */ + public static final char DIR_SEPARATOR_UNIX = '/'; + + /** + * The Windows directory separator character. + */ + public static final char DIR_SEPARATOR_WINDOWS = '\\'; + /** + * A singleton empty byte array. + * + * @since 2.9.0 + */ + public static final byte[] EMPTY_BYTE_ARRAY = {}; + + /** + * Represents the end-of-file (or stream). + * + * @since 2.5 (made public) + */ + public static final int EOF = -1; + + /** + * LF char. + * + * @since 2.9.0 + */ + public static final int LF = '\n'; + + /** + * Internal byte array buffer. + */ + private static final ThreadLocal SKIP_BYTE_BUFFER = ThreadLocal.withInitial(IOUtils::byteArray); + + /** + * Internal byte array buffer. + */ + private static final ThreadLocal SKIP_CHAR_BUFFER = ThreadLocal.withInitial(IOUtils::charArray); + + /** + * Returns a new byte array of size {@link #DEFAULT_BUFFER_SIZE}. + * + * @return a new byte array of size {@link #DEFAULT_BUFFER_SIZE}. + * @since 2.9.0 + */ + public static byte[] byteArray() { + return byteArray(DEFAULT_BUFFER_SIZE); + } + + /** + * Returns a new char array of size {@link #DEFAULT_BUFFER_SIZE}. + * + * @return a new char array of size {@link #DEFAULT_BUFFER_SIZE}. + * @since 2.9.0 + */ + private static char[] charArray() { + return charArray(DEFAULT_BUFFER_SIZE); + } + + /** + * Returns a new char array of the given size. + * + * TODO Consider guarding or warning against large allocations... + * + * @param size array size. + * @return a new char array of the given size. + * @since 2.9.0 + */ + private static char[] charArray(int size) { + return new char[size]; + } + + // 关闭流 + // ----------------------------------------------------------------------- + /** + * 关闭一个IO流、socket、或者selector且不抛出异常 + */ + public static void closeQuietly(Closeable closeable) { try { - closeable.close(); - } catch (Exception e) { - e.printStackTrace(); + if (closeable != null) { + closeable.close(); + } + } catch (IOException ioe) { + // ignore } } - + + // copy + // ----------------------------------------------------------------------- + /** + * 将InputStream中的内容复制到Writer中 + * + * @param input InputStream + * @param writer Writer + * @param charset 字符集 + * @throws IOException if an I/O error occurs + */ + public static void copy(InputStream input, Writer writer, Charset charset) + throws IOException { + InputStreamReader reader = new InputStreamReader(input, charset); + copy(reader, writer); + } + + /** + * 将Reader中的内容复制到Writer中 + *

+ * 此方法在内部缓冲输入,因此不需要使用BufferedReader + *

+ * 大型流(超过2GB)将返回字符复制值 + *

+ * + * @param reader Reader + * @param writer Writer + * @return the number of characters copied, or -1 if > Integer.MAX_VALUE + * @throws IOException if an I/O error occurs + */ + public static int copy(Reader reader, Writer writer) throws IOException { + long count = copyLarge(reader, writer); + if (count > Integer.MAX_VALUE) { + return -1; + } + return (int) count; + } + + /** + * Copies bytes from a large (over 2GB) {@code InputStream} to an + * {@code OutputStream}. + *

+ * This method buffers the input internally, so there is no need to use a + * {@code BufferedInputStream}. + *

+ *

+ * The buffer size is given by {@link #DEFAULT_BUFFER_SIZE}. + *

+ * + * @param inputStream the {@code InputStream} to read. + * @param outputStream the {@code OutputStream} to write. + * @return the number of bytes copied. + * @throws NullPointerException if the InputStream is {@code null}. + * @throws NullPointerException if the OutputStream is {@code null}. + * @throws IOException if an I/O error occurs. + * @since 1.3 + */ + public static long copyLarge(InputStream inputStream, OutputStream outputStream) throws IOException { + return copy(inputStream, outputStream, DEFAULT_BUFFER_SIZE); + } + + /** + * Copies chars from a large (over 2GB) {@code Reader} to a {@code Writer}. + *

+ * This method buffers the input internally, so there is no need to use a + * {@code BufferedReader}. + *

+ * The buffer size is given by {@link #DEFAULT_BUFFER_SIZE}. + * + * @param reader the {@code Reader} to source. + * @param writer the {@code Writer} to target. + * @return the number of characters copied + * @throws NullPointerException if the input or output is null + * @throws IOException if an I/O error occurs + * @since 1.3 + */ + public static long copyLarge(Reader reader, Writer writer) throws IOException { + return copyLarge(reader, writer, getCharArray()); + } + + /** + * Copies chars from a large (over 2GB) {@code Reader} to a {@code Writer}. + *

+ * This method uses the provided buffer, so there is no need to use a + * {@code BufferedReader}. + *

+ * + * @param reader the {@code Reader} to source. + * @param writer the {@code Writer} to target. + * @param buffer the buffer to be used for the copy + * @return the number of characters copied + * @throws NullPointerException if the input or output is null + * @throws IOException if an I/O error occurs + * @since 2.2 + */ + public static long copyLarge(Reader reader, Writer writer, char[] buffer) throws IOException { + long count = 0; + int n; + while (-1 != (n = reader.read(buffer))) { + writer.write(buffer, 0, n); + count += n; + } + return count; + } + + public static long copy(InputStream inputStream, OutputStream outputStream, int bufferSize) + throws IOException { + return copyLarge(inputStream, outputStream, IOUtils.byteArray(bufferSize)); + } + + /** + * 将InputStream(字节超过2GB)中的内容复制到OutputStream中 + *

+ * + * @param inputStream InputStream + * @param outputStream OutputStream + * @param 缓冲区用于复制的缓冲区 + * @return the number of bytes copied. + * + * @throws IOException if an I/O error occurs. + */ + public static long copyLarge(InputStream inputStream, OutputStream outputStream, byte[] buffer) + throws IOException { + Objects.requireNonNull(inputStream, "inputStream cannot be empty"); + Objects.requireNonNull(outputStream, "outputStream cannot be empty"); + long count = 0; + int n; + while (EOF != (n = inputStream.read(buffer))) { + outputStream.write(buffer, 0, n); + count += n; + } + return count; + } + + // toString + // ----------------------------------------------------------------------- + public static String toString(InputStream input) throws IOException { + return toString(input, Charset.defaultCharset()); + } + + public static String toString(InputStream input, Charset charset) throws IOException { + try (StringBuilderWriter sw = new StringBuilderWriter()) { + copy(input, sw, charset); + return sw.toString(); + } + } + + /** + * Gets the thread local char array. + * + * @return the thread local char array. + */ + static char[] getCharArray() { + return SKIP_CHAR_BUFFER.get(); + } + + /** + * Returns a new byte array of the given size. + * + * TODO Consider guarding or warning against large allocations... + * + * @param size array size. + * @return a new byte array of the given size. + * @since 2.9.0 + */ + public static byte[] byteArray(int size) { + return new byte[size]; + } + + /** + * Writes chars from a {@code String} to bytes on an {@code OutputStream} using + * the specified character encoding. + *

+ * This method uses {@link String#getBytes(String)}. + * + * @param data the {@code String} to write, null ignored + * @param output the {@code OutputStream} to write to + * @param charset the charset to use, null means platform default + * @throws NullPointerException if output is null + * @throws IOException if an I/O error occurs + * @since 2.3 + */ + public static void write(String data, OutputStream output, Charset charset) throws IOException { + if (data != null) { + output.write(data.getBytes(Charsets.toCharset(charset))); + } + } + + /** + * 打开指定文件的FileOutputStream,并检查如果父级目录不存在,则创建父级目录 + * + * @param file + * @param append + * @return + * @throws IOException + */ + public static FileOutputStream openOutputStream(File file, boolean append) throws IOException { + Objects.requireNonNull(file); + if (file.exists()) { + FileHandler.requireFile(file); + FileHandler.requireCanWrite(file); + } else { + FileHandler.createParentDirectories(file); + } + return new FileOutputStream(file, append); + } + + /** + * 打开指定文件的FileInputStream + * + * @param file + * @return + * @throws IOException + */ + public static FileInputStream openInputStream(File file) throws IOException { + Objects.requireNonNull(file); + return new FileInputStream(file); + } + } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java deleted file mode 100644 index 6711ef6..0000000 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.javaex.htool.core.io; - -/** - * 文件压缩/解压缩工具类 - * - * @author 陈霓清 - * @Date 2022年12月5日 - */ -public class ZipUtils { - -} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java b/htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java new file mode 100644 index 0000000..be10f6b --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java @@ -0,0 +1,138 @@ +package cn.javaex.htool.core.io.output; + +import java.io.IOException; +import java.io.Serializable; +import java.io.Writer; + +public class StringBuilderWriter extends Writer implements Serializable { + private static final long serialVersionUID = 1L; + private final StringBuilder builder; + + /** + * Constructs a new {@link StringBuilder} instance with default capacity. + */ + public StringBuilderWriter() { + this.builder = new StringBuilder(); + } + + /** + * Constructs a new {@link StringBuilder} instance with the specified capacity. + * + * @param capacity The initial capacity of the underlying {@link StringBuilder} + */ + public StringBuilderWriter(final int capacity) { + this.builder = new StringBuilder(capacity); + } + + /** + * Constructs a new instance with the specified {@link StringBuilder}. + * + *

If {@code builder} is null a new instance with default capacity will be created.

+ * + * @param builder The String builder. May be null. + */ + public StringBuilderWriter(final StringBuilder builder) { + this.builder = builder != null ? builder : new StringBuilder(); + } + + /** + * Appends a single character to this Writer. + * + * @param value The character to append + * @return This writer instance + */ + @Override + public Writer append(final char value) { + builder.append(value); + return this; + } + + /** + * Appends a character sequence to this Writer. + * + * @param value The character to append + * @return This writer instance + */ + @Override + public Writer append(final CharSequence value) { + builder.append(value); + return this; + } + + /** + * Appends a portion of a character sequence to the {@link StringBuilder}. + * + * @param value The character to append + * @param start The index of the first character + * @param end The index of the last character + 1 + * @return This writer instance + */ + @Override + public Writer append(final CharSequence value, final int start, final int end) { + builder.append(value, start, end); + return this; + } + + /** + * Closing this writer has no effect. + */ + @Override + public void close() { + // no-op + } + + /** + * Flushing this writer has no effect. + */ + @Override + public void flush() { + // no-op + } + + + /** + * Writes a String to the {@link StringBuilder}. + * + * @param value The value to write + */ + @Override + public void write(final String value) { + if (value != null) { + builder.append(value); + } + } + + /** + * Writes a portion of a character array to the {@link StringBuilder}. + * + * @param value The value to write + * @param offset The index of the first character + * @param length The number of characters to write + */ + @Override + public void write(final char[] value, final int offset, final int length) { + if (value != null) { + builder.append(value, offset, length); + } + } + + /** + * Returns the underlying builder. + * + * @return The underlying builder + */ + public StringBuilder getBuilder() { + return builder; + } + + /** + * Returns {@link StringBuilder#toString()}. + * + * @return The contents of the String builder. + */ + @Override + public String toString() { + return builder.toString(); + } + +} -- Gitee From ea2bb07df2096c719387af84f5a6eec3434c5696 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Fri, 9 Dec 2022 12:16:00 +0800 Subject: [PATCH 29/44] =?UTF-8?q?=E6=A0=B8=E5=BF=83=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/javaex/htool/core/IdUtils.java | 2 +- .../cn/javaex/htool/core/io/FileUtils.java | 670 ++++++++++-------- .../java/cn/javaex/htool/core/io/IOUtils.java | 1 + .../core/io/{ => handler}/FileHandler.java | 23 +- .../htool/core/io/handler/FileHelper.java | 85 +++ .../core/io/handler/FilenameHandler.java | 64 ++ .../javaex/htool/core/io/model/TreeFile.java | 23 + .../javaex/htool/core/string/StringUtils.java | 30 +- .../cn/javaex/htool/picture/PictureUtils.java | 2 +- 9 files changed, 606 insertions(+), 294 deletions(-) rename htool-core/src/main/java/cn/javaex/htool/core/io/{ => handler}/FileHandler.java (90%) create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/handler/FilenameHandler.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/model/TreeFile.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java index 0e110ee..89e9f14 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java @@ -36,7 +36,7 @@ public class IdUtils { * * @return */ - public static String getUuid() { + public static String getUUID() { return UUID.randomUUID().toString().replace("-", ""); } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java index 84db12b..e902031 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java @@ -4,7 +4,6 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -25,13 +24,19 @@ import javax.servlet.http.HttpServletResponse; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import cn.javaex.htool.core.io.handler.FileHandler; +import cn.javaex.htool.core.io.handler.FileHelper; +import cn.javaex.htool.core.io.handler.FilenameHandler; +import cn.javaex.htool.core.io.model.TreeFile; +import cn.javaex.htool.core.string.StringUtils; + /** * 文件操作工具类 * * @author 陈霓清 * @Date 2022年12月1日 */ -public class FileUtils { +public class FileUtils extends FileHelper { /** 默认缓冲区大小 */ private static final int BUFFER_SIZE = 2048; @@ -99,7 +104,7 @@ public class FileUtils { /** * 列出指定目录下的文件 - * @param path 目录的绝对路径 + * @param path 目录的绝对路径 * @return * @throws IOException */ @@ -115,7 +120,7 @@ public class FileUtils { * @throws IOException */ public static File[] listFiles(File directory) throws IOException { - FileHandler.requireDirectoryExists(directory, "directory"); + FileHandler.requireDirectoryExists(directory); File[] files = directory.listFiles(); if (files == null) { throw new IOException("Unknown I/O error listing contents of directory: " + directory); @@ -123,6 +128,77 @@ public class FileUtils { return files; } + /** + * 递归列出指定目录下的所有文件(不列出文件夹) + * @param path 目录的绝对路径 + * @return + * @throws IOException + */ + public static List listDeepFiles(String path) throws IOException { + File directory = new File(path); + return listDeepFiles(directory); + } + + /** + * 递归列出指定目录下的所有文件(不列出文件夹) + * @param directory + * @return + * @throws IOException + */ + public static List listDeepFiles(File directory) throws IOException { + List fileList = new ArrayList(); + + File[] files = listFiles(directory); + for (File file : files) { + if (file.isFile()) { + fileList.add(file); + } else { + // 递归,获取路径中子路径中的所有文件 + fileList.addAll(listDeepFiles(file)); + } + } + + return fileList; + } + + /** + * 递归列出指定目录下的所有文件(列出文件夹) + * @param path 目录的绝对路径 + * @return + * @throws IOException + */ + public static List listDeepFilesAndDirectorys(String path) throws IOException { + File directory = new File(path); + return listDeepFilesAndDirectorys(directory); + } + + /** + * 递归列出指定目录下的所有文件(列出文件夹) + * @param directory + * @return + * @throws IOException + */ + public static List listDeepFilesAndDirectorys(File directory) throws IOException { + List fileList = new ArrayList<>(); + + File[] files = listFiles(directory); + for (File file : files) { + TreeFile treeFile = new TreeFile(); + treeFile.setFile(file); + + + if (file.isDirectory()) { + // 递归,获取路径中子路径中的所有文件 + List listDeepFilesAndDirectorys = listDeepFilesAndDirectorys(file); + treeFile.setChildren(listDeepFilesAndDirectorys); + } + + fileList.add(treeFile); + } + + return fileList; + } + /** * 复制一个文件到一个新位置 * 如果目标文件不存在,则创建保存目标文件。如果目标文件存在,则覆盖 @@ -322,290 +398,132 @@ public class FileUtils { deleteFileOrDirectory(srcPath); } - /** - * 强制创建文件夹,如果该文件夹父级目录不存在,会自动创建父级目录 - * @param directoryPath - * @throws IOException - */ - public static void forceMkdir(String directoryPath) throws IOException { - forceMkdir(new File(directoryPath)); - } - - /** - * 强制创建文件夹,如果该文件夹父级目录不存在,会自动创建父级目录 - * @param directory - * @throws IOException - */ - public static void forceMkdir(File directory) throws IOException { - FileHandler.mkdirs(directory); - } - - /** - * 向文件中写入内容 - * 如果该文件不存在,则自动创建 - * @param filePath 文件的绝对路径 - * @param data 写入的数据 - * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null - * @param isAppend 是否追加写入(true),或者覆盖写入(false) - * @throws IOException - */ - public static void write(String filePath, String data, String charsetName, boolean isAppend) - throws IOException { - write(new File(filePath), data, charsetName, isAppend); - } - - /** - * 向文件中写入内容 - * 如果该文件不存在,则自动创建 - * @param file File对象 - * @param data 写入的数据 - * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null - * @param isAppend 是否追加写入(true),或者覆盖写入(false) - * @throws IOException - */ - public static void write(File file, String data, String charsetName, boolean isAppend) - throws IOException { - try (OutputStream out = IOUtils.openOutputStream(file, isAppend)) { - IOUtils.write(data, out, Charsets.toCharset(charsetName)); - } - } - - /** - * 将文件内容读取为字符串 - * @param filePath - * @return - * @throws IOException - */ - public static String readFile(String filePath) throws IOException { - return readFile(new File(filePath), null); - } - - /** - * 将文件内容读取为字符串 - * @param file - * @return - * @throws IOException - */ - public static String readFile(File file) throws IOException { - return readFile(file, null); - } - - /** - * 将文件内容读取为字符串 - * @param filePath - * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null - * @return - * @throws IOException - */ - public static String readFile(String filePath, String charsetName) throws IOException { - return readFile(new File(filePath), charsetName); - } - - /** - * 将文件内容读取为字符串 - * @param file - * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null - * @return - * @throws IOException - */ - public static String readFile(File file, String charsetName) throws IOException { - // 校验文件大小是否在2G内 - boolean checkFileSize = FileHandler.checkFileSize(file, 2, "G"); - if (checkFileSize) { - byte[] bytes = Files.readAllBytes(Paths.get(file.getPath())); - return new String(bytes, Charsets.toCharset(charsetName)); - } else { - try (InputStream inputStream = IOUtils.openInputStream(file)) { - return IOUtils.toString(inputStream, Charsets.toCharset(charsetName)); - } - } - } - - - - - - - - - - + /** + * 强制创建文件夹,如果该文件夹父级目录不存在,会自动创建父级目录 + * @param directoryPath + * @throws IOException + */ + public static void forceMkdir(String directoryPath) throws IOException { + forceMkdir(new File(directoryPath)); + } /** - * 下载resources文件夹下的文件(不重命名) - * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx + * 强制创建文件夹,如果该文件夹父级目录不存在,会自动创建父级目录 + * @param directory + * @throws IOException */ - public static void downloadFileFromResource(String filePath) { - downloadFileFromResource(filePath, null); + public static void forceMkdir(File directory) throws IOException { + FileHandler.mkdirs(directory); } /** - * 下载resources文件夹下的文件 - * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx - * @param newFileName 重命名文件名称(带后缀) + * 向文件中写入内容 + * 如果该文件不存在,则自动创建 + * @param filePath 文件的绝对路径 + * @param data 写入的数据 + * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null + * @param isAppend 是否追加写入(true),或者覆盖写入(false) + * @throws IOException */ - public static void downloadFileFromResource(String filePath, String newFileName) { - if (newFileName==null || newFileName.length()==0) { - newFileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length()); - } - - InputStream in = PathUtils.getInputStreamFromResource(filePath); - downloadFile(in, newFileName); + public static void write(String filePath, String data, String charsetName, boolean isAppend) + throws IOException { + write(new File(filePath), data, charsetName, isAppend); } /** - * 下载文件 - * @param in InputStream流 - * @param newFileName 重命名文件名称(带后缀) + * 向文件中写入内容 + * 如果该文件不存在,则自动创建 + * @param file File对象 + * @param data 写入的数据 + * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null + * @param isAppend 是否追加写入(true),或者覆盖写入(false) + * @throws IOException */ - public static void downloadFile(InputStream in, String newFileName) { - HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); - - OutputStream out = null; - - try { - response.setContentType("application/octet-stream"); - newFileName = java.net.URLEncoder.encode(newFileName, "UTF-8"); - response.setHeader("Content-disposition", "attachment; filename=" + newFileName); - out = response.getOutputStream(); - - int b = 0; - byte[] buffer = new byte[BUFFER_SIZE]; - while ((b = in.read(buffer)) != -1) { - out.write(buffer, 0, b); - } - - out.flush(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - IOUtils.closeQuietly(out); - IOUtils.closeQuietly(in); + public static void write(File file, String data, String charsetName, boolean isAppend) + throws IOException { + try (OutputStream out = IOUtils.openOutputStream(file, isAppend)) { + IOUtils.write(data, out, Charsets.toCharset(charsetName)); } } /** - * 文件下载(不重命名) - * @param filePath 文件的路径(带具体的文件名) - * 如果是相对路径,则认为是项目的同级目录 - * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 + * 将文件内容读取为字符串 + * @param filePath + * @return + * @throws IOException */ - public static void downloadFile(String filePath) { - downloadFile(filePath, null); + public static String readFile(String filePath) throws IOException { + return readFile(new File(filePath), null); } /** - * 文件下载 - * @param filePath 文件的路径(带具体的文件名) - * 如果是相对路径,则认为是项目的同级目录 - * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 - * @param newFileName 重命名文件名称(带后缀) + * 将文件内容读取为字符串 + * @param file + * @return + * @throws IOException */ - public static void downloadFile(String filePath, String newFileName) { - HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); - - // 传入的路径是否是绝对路径 - boolean isAbsolutePath = PathUtils.isAbsolutePath(filePath); - // 存储文件的物理路径 - String fileAbsolutePath = ""; - if (isAbsolutePath) { - fileAbsolutePath = filePath; - } else { - String projectPath = PathUtils.getProjectPath(); - fileAbsolutePath = projectPath + File.separator + filePath; - } - - File file = new File(fileAbsolutePath); - if (newFileName==null || newFileName.length()==0) { - newFileName = file.getName(); - } - - BufferedInputStream bis = null; - BufferedOutputStream bos = null; - - try { - response.setContentType("application/octet-stream"); - response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(newFileName, "UTF-8")); - response.setHeader("Content-Length", String.valueOf(file.length())); - - bis = new BufferedInputStream(new FileInputStream(file)); - bos = new BufferedOutputStream(response.getOutputStream()); - byte[] buff = new byte[BUFFER_SIZE]; - while (true) { - int bytesRead; - - if (-1 == (bytesRead=bis.read(buff, 0, buff.length))) { - break; - } - - bos.write(buff, 0, bytesRead); - } - - bos.flush(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - IOUtils.closeQuietly(bos); - IOUtils.closeQuietly(bis); - } + public static String readFile(File file) throws IOException { + return readFile(file, null); } /** - * 获取文件源中的所有文件 - * @param sourcePath + * 将文件内容读取为字符串 + * @param filePath + * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null * @return - * @throws FileNotFoundException + * @throws IOException */ - private static List getSourceAllFiles(String sourcePath) throws FileNotFoundException { - List fileList = new ArrayList(); - - File sourceFile = new File(sourcePath); - // 判断文件或目录是否存在 - if (!sourceFile.exists()) { - throw new FileNotFoundException("待压缩的文件或目录不存在:" + sourcePath); - } - - File[] fileArr = sourceFile.listFiles(); - for (File file : fileArr) { - if (file.isFile()) { - fileList.add(file); - } else { - // 递归,获取路径中子路径中的所有文件 - fileList.addAll(getSourceAllFiles(file.getPath())); - } - } - - return fileList; + public static String readFile(String filePath, String charsetName) throws IOException { + return readFile(new File(filePath), charsetName); } /** - * 得到文件在文件夹中的相对路径,保持原有结构 - * @param sourcePath + * 将文件内容读取为字符串 * @param file + * @param charsetName 字符集名称(例如:UTF-8),如果使用系统默认字符集的话,就填写null * @return + * @throws IOException */ - private static String getRealName(String sourcePath, File file) { - return file.getAbsolutePath().replace(sourcePath + File.separator, "").replace(sourcePath, ""); + public static String readFile(File file, String charsetName) throws IOException { + // 校验文件大小是否在2G内 + boolean checkFileSize = FileHandler.checkFileSize(file, 2, "G"); + if (checkFileSize) { + byte[] bytes = Files.readAllBytes(Paths.get(file.getPath())); + return new String(bytes, Charsets.toCharset(charsetName)); + } else { + try (InputStream inputStream = IOUtils.openInputStream(file)) { + return IOUtils.toString(inputStream, Charsets.toCharset(charsetName)); + } + } } - + /** * 创建一个zip压缩文件,并存放到新的路径中 - * @param sourcePath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx - * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip - * @throws Exception + * @param srcPath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx + * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip + * @throws IOException */ - public static void zip(String sourcePath, String zipPath) throws Exception { - zip(sourcePath, zipPath, true); + public static void zip(String srcPath, String zipPath) throws IOException { + zip(srcPath, zipPath, true); } /** * 创建一个zip压缩文件,并存放到新的路径中 - * @param sourcePath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx - * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip - * @param isKeepFolder 是否将目录名称也一起压缩 - * @throws Exception + * @param srcPath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx + * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip + * @param isKeepFolder 是否将目录名称也一起压缩 + * @throws IOException */ - public static void zip(String sourcePath, String zipPath, boolean isKeepFolder) throws Exception { + public static void zip(String srcPath, String zipPath, boolean isKeepFolder) throws IOException { + File srcFile = new File(srcPath); + FileHandler.requireExists(srcFile); + + File zipFile = new File(zipPath); + // 如果压缩包已存在,则先删除 + if (zipFile.exists()) { + deleteFileOrDirectory(zipFile); + } + byte[] buffer = new byte[1024*10]; FileInputStream fis = null; BufferedInputStream bis = null; @@ -613,27 +531,16 @@ public class FileUtils { ZipOutputStream zos = null; try { - File sourceFile = new File(sourcePath); - // 判断文件或目录是否存在 - if (!sourceFile.exists()) { - throw new FileNotFoundException("待压缩的文件或目录不存在:" + sourcePath); - } - - File zipFile = new File(zipPath); - if (zipFile.exists()) { - deleteFileOrDirectory(zipFile); // 如果压缩包已存在,则先删除 - } - // 判断是否是一个具体的文件 - if (sourceFile.isFile()) { + if (srcFile.isFile()) { fos = new FileOutputStream(zipFile); zos = new ZipOutputStream(new BufferedOutputStream(fos)); - // 创建zip实体,并添加进压缩包 - ZipEntry zipEntry = new ZipEntry(sourceFile.getName()); + // 创建zip实体,并添加进压缩包 + ZipEntry zipEntry = new ZipEntry(srcFile.getName()); zos.putNextEntry(zipEntry); - fis = new FileInputStream(sourceFile); + fis = new FileInputStream(srcFile); bis = new BufferedInputStream(fis, 1024*10); int read = 0; while ((read=bis.read(buffer, 0, 1024*10)) != -1) { @@ -642,19 +549,19 @@ public class FileUtils { zos.flush(); } // 目录 - else if (sourceFile.isDirectory()) { + else if (srcFile.isDirectory()) { // 获取文件源中的所有文件 - List fileList = getSourceAllFiles(sourcePath); + List fileList = listDeepFiles(srcFile); fos = new FileOutputStream(zipFile); zos = new ZipOutputStream(new BufferedOutputStream(fos)); // 将每个文件放入zip流中 for (File file : fileList) { - String name = getRealName(sourcePath, file); // 获取文件相对路径,保持文件原有结构 + String name = FileHandler.getRealName(srcPath, file); // 获取文件相对路径,保持文件原有结构 ZipEntry zipEntry = null; if (isKeepFolder) { - zipEntry = new ZipEntry(new File(sourcePath).getName() + File.separator + name); + zipEntry = new ZipEntry(new File(srcPath).getName() + File.separator + name); } else { zipEntry = new ZipEntry(name); } @@ -675,12 +582,8 @@ public class FileUtils { } zos.close(); } - } catch (FileNotFoundException e) { - throw new FileNotFoundException("待压缩的文件或目录不存在:" + sourcePath); } catch (IOException e) { throw new IOException(e); - } catch (Exception e) { - throw new Exception(e); } finally { IOUtils.closeQuietly(zos); IOUtils.closeQuietly(fos); @@ -691,20 +594,18 @@ public class FileUtils { /** * zip解压 - * @param zipPath zip文件的绝对路径,例如:D:\\Temp\\xx.zip - * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Tempxx - * @throws Exception + * @param zipPath zip文件的绝对路径,例如:D:\\Temp\\xx.zip + * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Temp + * @throws IOException */ - public static void unZip(String zipPath, String destDirPath) throws Exception { + public static void unZip(String zipPath, String destDirPath) throws IOException { + File file = new File(zipPath); + FileHandler.requireFile(file); + byte[] buffer = new byte[1024*10]; ZipFile zipFile = null; try { - File file = new File(zipPath); - if (!file.exists()) { - throw new FileNotFoundException("待解压的文件不存在:" + zipPath); - } - zipFile = new ZipFile(zipPath); Enumeration entries = zipFile.entries(); while (entries.hasMoreElements()) { @@ -736,15 +637,216 @@ public class FileUtils { in.close(); } } - } catch (FileNotFoundException e) { - throw new FileNotFoundException("待解压的文件不存在:" + zipPath); } catch (IOException e) { throw new IOException(e); - } catch (Exception e) { - throw new Exception(e); } finally { IOUtils.closeQuietly(zipFile); } } + /** + * 下载resources文件夹下的文件(不重命名) + * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx + */ + public static void downloadFileFromResource(String filePath) { + downloadFileFromResource(filePath, null); + } + + /** + * 下载resources文件夹下的文件 + * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx + * @param newFileName 重命名文件名称(带后缀) + */ + public static void downloadFileFromResource(String filePath, String newFileName) { + if (newFileName==null || newFileName.length()==0) { + newFileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length()); + } + + InputStream in = PathUtils.getInputStreamFromResource(filePath); + downloadFile(in, newFileName); + } + + /** + * 下载文件(InputStream流) + * @param in InputStream流 + * @param newFileName 重命名文件名称(带后缀) + */ + public static void downloadFile(InputStream in, String newFileName) { + HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); + + OutputStream out = null; + + try { + response.setContentType("application/octet-stream"); + newFileName = java.net.URLEncoder.encode(newFileName, "UTF-8"); + response.setHeader("Content-disposition", "attachment; filename=" + newFileName); + out = response.getOutputStream(); + + int b = 0; + byte[] buffer = new byte[BUFFER_SIZE]; + while ((b = in.read(buffer)) != -1) { + out.write(buffer, 0, b); + } + + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + IOUtils.closeQuietly(out); + IOUtils.closeQuietly(in); + } + } + + /** + * 下载文件(不重命名) + * @param filePath 文件的路径(带具体的文件名) + * 如果是相对路径,则认为是项目的同级目录 + * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 + */ + public static void downloadFile(String filePath) { + downloadFile(filePath, null); + } + + /** + * 下载文件(重命名) + * @param filePath 文件的路径(带具体的文件名) + * 如果是相对路径,则认为是项目的同级目录 + * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 + * @param newFileName 重命名文件名称(带后缀) + */ + public static void downloadFile(String filePath, String newFileName) { + HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); + + // 传入的路径是否是绝对路径 + boolean isAbsolutePath = PathUtils.isAbsolutePath(filePath); + // 存储文件的物理路径 + String fileAbsolutePath = ""; + if (isAbsolutePath) { + fileAbsolutePath = filePath; + } else { + String projectPath = PathUtils.getProjectPath(); + fileAbsolutePath = projectPath + File.separator + filePath; + } + + File file = new File(fileAbsolutePath); + if (newFileName==null || newFileName.length()==0) { + newFileName = file.getName(); + } + + BufferedInputStream bis = null; + BufferedOutputStream bos = null; + + try { + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(newFileName, "UTF-8")); + response.setHeader("Content-Length", String.valueOf(file.length())); + + bis = new BufferedInputStream(new FileInputStream(file)); + bos = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[BUFFER_SIZE]; + while (true) { + int bytesRead; + + if (-1 == (bytesRead=bis.read(buff, 0, buff.length))) { + break; + } + + bos.write(buff, 0, bytesRead); + } + + bos.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + IOUtils.closeQuietly(bos); + IOUtils.closeQuietly(bis); + } + } + + /** + * 获取文件的后缀 + *
+	 * foo.txt	  --> "txt"
+	 * a/b/c.jpg	--> "jpg"
+	 * a/b.txt/c	--> ""
+	 * a/b/c		--> ""
+	 * 
+ * @param fileName + * @return + */ + public static String getExtension(String fileName) { + if (StringUtils.isEmpty(fileName)) { + return fileName; + } + + // 如果是Linux下的特殊文件后缀,则直接返回 + for (String specialExtension : SPECIAL_EXTENSION) { + if (fileName.endsWith(EXTENSION_SEPARATOR_STR + specialExtension)) { + return specialExtension; + } + } + + final int index = FilenameHandler.indexOfExtension(fileName); + if (index == NOT_FOUND) { + return EMPTY_STRING; + } + return fileName.substring(index + 1); + } + + /** + * 获取文件的名称,不包括文件后缀和文件路径 + *
+	 * a/b/c.txt --> c
+	 * a.txt	 --> a
+	 * a/b/c	 --> c
+	 * a/b/c/	--> ""
+	 * 
+ * @param fileName + * @return + */ + public static String getBaseName(String fileName) { + fileName = FilenameHandler.getName(fileName); + String extension = getExtension(fileName); + + return fileName.replace(EXTENSION_SEPARATOR_STR + extension, ""); + } + + /** + * 返回文件全名(返回最后一个正斜杠或反斜杠之后的文本) + *
+	 * a/b/c.txt --> c.txt
+	 * a.txt	 --> a.txt
+	 * a/b/c	 --> c
+	 * a/b/c/	--> ""
+	 * 
+ * @param fileName + * @return + */ + public static String getName(String fileName) { + if (StringUtils.isEmpty(fileName)) { + return fileName; + } + + final int index = FilenameHandler.indexOfLastSeparator(fileName); + return fileName.substring(index + 1); + } + + /** + * 获取文件路径,不包括文件名 + *

+ *

+	 * C:\a\b\c.txt --> C:\a\b\
+	 * a.txt		--> ""
+	 * a/b/c		--> a/b/
+	 * 
+ *

+ * @param fileName + * @return + */ + public static String getFullPath(String fileName) { + String name = getName(fileName); + int indexOf = fileName.indexOf(name); + return fileName.substring(0, indexOf); + } + } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java index 814c557..904e3bc 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java @@ -13,6 +13,7 @@ import java.io.Writer; import java.nio.charset.Charset; import java.util.Objects; +import cn.javaex.htool.core.io.handler.FileHandler; import cn.javaex.htool.core.io.output.StringBuilderWriter; /** diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHandler.java similarity index 90% rename from htool-core/src/main/java/cn/javaex/htool/core/io/FileHandler.java rename to htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHandler.java index 21cbf6b..56abd2a 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileHandler.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHandler.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.core.io; +package cn.javaex.htool.core.io.handler; import java.io.File; import java.io.FileNotFoundException; @@ -29,10 +29,9 @@ public class FileHandler { /** * 要求给定的文件存在并且是一个目录 * @param directory 待校验的目录对象 - * @param name 异常消息中使用的参数名称 * @return */ - public static File requireDirectoryExists(File directory, String name) { + public static File requireDirectoryExists(File directory) { requireExists(directory); requireDirectory(directory); return directory; @@ -52,7 +51,7 @@ public class FileHandler { } /** - * 要求文件必须存在 + * 要求文件或目录必须存在 * @param file * @return */ @@ -92,7 +91,7 @@ public class FileHandler { } /** - * 校验是否是一个文件,不是则报错 + * 要求file必须存在,且是一个文件,而不是目录 * @param file * @return */ @@ -152,7 +151,7 @@ public class FileHandler { } /** - * 要求给定的文件必须存在,且是一个文件,而不是目录 + * 要求给定的文件如果存在,就必须是一个文件,而不是目录 * @param file * @return */ @@ -215,6 +214,16 @@ public class FileHandler { break; } - return limitSize >= fileSizeCom; + return limitSize > fileSizeCom; } + + /** + * 得到文件在文件夹中的相对路径,保持原有结构 + * @param srcPath + * @param file + * @return + */ + public static String getRealName(String srcPath, File file) { + return file.getAbsolutePath().replace(srcPath + File.separator, "").replace(srcPath, ""); + } } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java new file mode 100644 index 0000000..cc0c4ab --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java @@ -0,0 +1,85 @@ +package cn.javaex.htool.core.io.handler; + +import java.io.File; +import java.util.regex.Pattern; + +/** + * 文件帮助类 + * + * @author 陈霓清 + * @Date 2022年12月8日 + */ +public class FileHelper { + /** + * 文件扩展分隔符(字符) + */ + public static final char EXTENSION_SEPARATOR = '.'; + + /** + * 文件扩展分隔符(字符串) + */ + public static final String EXTENSION_SEPARATOR_STR = "."; + + /** + * Unix分隔符 + */ + protected static final char UNIX_SEPARATOR = '/'; + + /** + * Windows分隔符 + */ + protected static final char WINDOWS_SEPARATOR = '\\'; + + /** + * 系统分隔符 + */ + protected static final char SYSTEM_SEPARATOR = File.separatorChar; + + /** + * 与系统分隔符相反的分隔符 + */ + protected static final char OTHER_SEPARATOR; + + /** + * 空数组 + */ + protected static final String[] EMPTY_STRING_ARRAY = {}; + + /** + * 空字符串 + */ + protected static final String EMPTY_STRING = ""; + + /** + * 未找到 + */ + protected static final int NOT_FOUND = -1; + + /** + * 特殊的文件扩展名 + */ + protected static final String[] SPECIAL_EXTENSION = {"tar.gz", "tar.bz2", "tar.Z", "tar.xz"}; + + /** + * Windows下文件名中被禁止的字符 + */ + protected static final Pattern INVALID_FILENAME_WINDOWS = Pattern.compile("[\\\\/:*?\"<>|\r\n]"); + + static { + if (isWindowsSystem()) { + OTHER_SEPARATOR = UNIX_SEPARATOR; + } else { + OTHER_SEPARATOR = WINDOWS_SEPARATOR; + } + } + + /** + * 是否是windows系统 + * + * @return + */ + protected static boolean isWindowsSystem() { + return SYSTEM_SEPARATOR == WINDOWS_SEPARATOR; + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FilenameHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FilenameHandler.java new file mode 100644 index 0000000..9c8d99f --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FilenameHandler.java @@ -0,0 +1,64 @@ +package cn.javaex.htool.core.io.handler; + +import cn.javaex.htool.core.string.StringUtils; + +/** + * 文件名处理 + * + * @author 陈霓清 + * @Date 2022年12月8日 + */ +public class FilenameHandler extends FileHelper { + + /** + * 返回文件后缀的索引 + * + * @param fileName + * @return + */ + public static int indexOfExtension(String fileName) { + if (fileName == null) { + return -1; + } + + // 正常的文件后缀索引 + final int extensionPos = fileName.lastIndexOf(EXTENSION_SEPARATOR); + // 非正常的文件后缀索引 + // 例如 https://webimg.javaex.cn/FiPZlaXnGeqvJYV1CtH3yGbBVH_i + // 例如 D:\\test\\1 + final int lastSeparator = indexOfLastSeparator(fileName); + + return lastSeparator > extensionPos ? NOT_FOUND : extensionPos; + } + + /** + * 获取系统分隔符的索引 + * + * @param fileName + * @return + */ + public static int indexOfLastSeparator(String fileName) { + if (fileName == null) { + return NOT_FOUND; + } + final int lastUnixPos = fileName.lastIndexOf(UNIX_SEPARATOR); + final int lastWindowsPos = fileName.lastIndexOf(WINDOWS_SEPARATOR); + return Math.max(lastUnixPos, lastWindowsPos); + } + + /** + * 获取完整的文件名称,去除文件路径 a/b/c.txt -> c.txt + * + * @param fileName + * @return + */ + public static String getName(String fileName) { + if (StringUtils.isEmpty(fileName)) { + return fileName; + } + + int index = FilenameHandler.indexOfLastSeparator(fileName); + return fileName.substring(index + 1); + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/model/TreeFile.java b/htool-core/src/main/java/cn/javaex/htool/core/io/model/TreeFile.java new file mode 100644 index 0000000..85e4696 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/model/TreeFile.java @@ -0,0 +1,23 @@ +package cn.javaex.htool.core.io.model; + +import java.io.File; +import java.util.List; + +public class TreeFile { + private File file; + private List children; + + public File getFile() { + return file; + } + public void setFile(File file) { + this.file = file; + } + public List getChildren() { + return children; + } + public void setChildren(List children) { + this.children = children; + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java index f967862..023d158 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java @@ -606,7 +606,7 @@ public class StringUtils { } /** - * 中间为* + * 中间的字符替换为* * @param str 指定的字符串 * @param start 显示开头几位 * @param end 显示结尾几位 @@ -632,4 +632,32 @@ public class StringUtils { return str; } + /** + * 删除字符串中的第一个字符 + * + * @param str + * @return + */ + public static String removeFirstChar(String str) { + if (str==null || str.length()==0) { + return str; + } + + return str.substring(1); + } + + /** + * 删除字符串中的最后一个字符 + * + * @param str + * @return + */ + public static String removeLastChar(String str) { + if (str==null || str.length()==0) { + return str; + } + + return str.substring(0, str.length() - 1); + } + } diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index 43be9a3..eee852f 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -115,7 +115,7 @@ public class PictureUtils { ImageWriteParam imageWriteParam = writer.getDefaultWriteParam(); ColorModel colorModel = srcBuffer.getColorModel(); try { - String uuid = IdUtils.getUuid(); + String uuid = IdUtils.getUUID(); File tempFile = File.createTempFile("quality_" + uuid, ".jpg"); FileOutputStream fileOutputStream = new FileOutputStream(tempFile); ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(fileOutputStream); -- Gitee From 70ebc249d5ab4c8904f0badd2d1a078197936432 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Mon, 2 Jan 2023 19:29:05 +0800 Subject: [PATCH 30/44] 20230102 --- htool-http/pom.xml | 13 -------- .../javaex/htool/http/servlet/AgentUtils.java | 27 ++++++--------- .../htool/http/servlet/CookieUtils.java | 33 +++++++------------ .../htool/http/servlet/SessionUtils.java | 23 ++++++------- 4 files changed, 32 insertions(+), 64 deletions(-) diff --git a/htool-http/pom.xml b/htool-http/pom.xml index c15a68b..e2e53f6 100644 --- a/htool-http/pom.xml +++ b/htool-http/pom.xml @@ -10,19 +10,6 @@ http模块 - - javax.servlet - javax.servlet-api - 4.0.1 - provided - - - org.springframework - spring-webmvc - 5.3.18 - provided - - eu.bitwalker UserAgentUtils diff --git a/htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java index 520d430..1dd6a26 100644 --- a/htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java @@ -1,12 +1,10 @@ package cn.javaex.htool.http.servlet; +import javax.servlet.http.HttpServletRequest; + import eu.bitwalker.useragentutils.Browser; import eu.bitwalker.useragentutils.OperatingSystem; import eu.bitwalker.useragentutils.UserAgent; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; /** * 获取终端信息 @@ -28,12 +26,10 @@ public class AgentUtils { /** * 获取访问者的ip地址 - * + * @param request * @return */ - public static String getIp() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - + public static String getIp(HttpServletRequest request) { if (request == null) { return UNKNOWN; } @@ -75,11 +71,10 @@ public class AgentUtils { /** * 判断访问来路是否是移动端 - * + * @param request * @return */ - public static boolean isMoblie() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + public static boolean isMoblie(HttpServletRequest request) { String userAgent = request.getHeader("user-agent"); if (userAgent.indexOf(ANDROID) != -1 || userAgent.indexOf(IPHONE) != -1 || userAgent.indexOf(IPAD) != -1) { @@ -91,11 +86,10 @@ public class AgentUtils { /** * 获取访问者浏览器 - * + * @param request * @return */ - public static String getBrowser() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + public static String getBrowser(HttpServletRequest request) { String userAgent = request.getHeader("user-agent"); if (userAgent.contains(MICROSOFT_EDGE)) { @@ -108,11 +102,10 @@ public class AgentUtils { /** * 获取访问者操作系统 - * + * @param request * @return */ - public static String getOperatingSystem() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + public static String getOperatingSystem(HttpServletRequest request) { String userAgent = request.getHeader("user-agent"); OperatingSystem operatingSystem = UserAgent.parseUserAgentString(userAgent).getOperatingSystem(); diff --git a/htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java index 2341e43..a435b9d 100644 --- a/htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java @@ -9,9 +9,6 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - /** * Cookie工具类 * @@ -22,13 +19,12 @@ public class CookieUtils { /** * 设置Cookie + * @param response * @param name * @param value * @param expiry : 过期失效时间,单位:秒 */ - public static void setCookie(String name, String value, int expiry) { - HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); - + public static void setCookie(HttpServletResponse response, String name, String value, int expiry) { Cookie addCookie = new Cookie(name, value); addCookie.setMaxAge(expiry); addCookie.setPath("/"); @@ -37,14 +33,13 @@ public class CookieUtils { /** * 设置Cookie + * @param response * @param name * @param value * @param expiry : 过期失效时间,单位:秒 * @param domain : 域名,例如 javaex.cn */ - public static void setCookie(String name, String value, int expiry, String domain) { - HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); - + public static void setCookie(HttpServletResponse response, String name, String value, int expiry, String domain) { Cookie addCookie = new Cookie(name, value); addCookie.setMaxAge(expiry); addCookie.setPath("/"); @@ -54,12 +49,11 @@ public class CookieUtils { /** * 获取指定名称的cookie + * @param request * @param name * @return */ - public static String getCookie(String name) { - HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); - + public static String getCookie(HttpServletRequest request, String name) { Cookie[] cookieArr = request.getCookies(); if (cookieArr!=null && cookieArr.length>0) { for (int i=0; i getCookieList() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - + public static List getCookieList(HttpServletRequest request) { List cookieList = new ArrayList<>(); Cookie[] cookies = request.getCookies(); if (cookies==null || cookies.length==0) { @@ -99,11 +92,10 @@ public class CookieUtils { /** * 删除Cookie + * @param response * @param name */ - public static void deleteCookie(String name) { - HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); - + public static void deleteCookie(HttpServletResponse response, String name) { Cookie deleteCookie = new Cookie(name, ""); deleteCookie.setPath("/"); deleteCookie.setMaxAge(0); @@ -112,12 +104,11 @@ public class CookieUtils { /** * 删除Cookie + * @param response * @param name * @param domain : 域名,例如 javaex.cn */ - public static void deleteCookie(String name, String domain) { - HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); - + public static void deleteCookie(HttpServletResponse response, String name, String domain) { Cookie deleteCookie = new Cookie(name, ""); deleteCookie.setPath("/"); deleteCookie.setMaxAge(0); diff --git a/htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java index 694fd47..764a4cf 100644 --- a/htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java @@ -3,9 +3,6 @@ package cn.javaex.htool.http.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - /** * Session工具类 * @@ -16,30 +13,29 @@ public class SessionUtils { /** * 设置session + * @param request * @param name * @param value */ - public static void setSession(String name, Object value) { - HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); - + public static void setSession(HttpServletRequest request, String name, Object value) { request.getSession().setAttribute(name, value); } /** * 删除session + * @param request * @param name */ - public static void deleteSession(String name) { - HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); - + public static void deleteSession(HttpServletRequest request, String name) { request.getSession().removeAttribute(name); } /** * 获取sessionId + * @param request + * @return */ - public static String getSessionId() { - HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); + public static String getSessionId(HttpServletRequest request) { HttpSession session = request.getSession(); return session.getId(); @@ -47,12 +43,13 @@ public class SessionUtils { /** * 获取session + * @param + * @param request * @param name * @return */ @SuppressWarnings("unchecked") - public static T getSession(String name) { - HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); + public static T getSession(HttpServletRequest request, String name) { HttpSession session = request.getSession(); return (T) session.getAttribute(name); -- Gitee From e83526185785bc594441cd0b3be769b66a3ac1d7 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Mon, 2 Jan 2023 19:29:54 +0800 Subject: [PATCH 31/44] 20230102 --- htool-http/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/htool-http/pom.xml b/htool-http/pom.xml index e2e53f6..bac0e02 100644 --- a/htool-http/pom.xml +++ b/htool-http/pom.xml @@ -10,6 +10,13 @@ http模块 + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + eu.bitwalker UserAgentUtils -- Gitee From 0ca576e0a2c9ffd791f2f10ce42dca3d0d2bf4c2 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Mon, 2 Jan 2023 19:56:12 +0800 Subject: [PATCH 32/44] 20230102 --- htool-core/pom.xml | 6 ---- .../cn/javaex/htool/core/io/FileUtils.java | 31 ++++++++----------- .../PathHandler.java} | 20 +++++------- .../cn/javaex/htool/core/string/ZHUtils.java | 4 +-- 4 files changed, 23 insertions(+), 38 deletions(-) rename htool-core/src/main/java/cn/javaex/htool/core/io/{PathUtils.java => handler/PathHandler.java} (76%) diff --git a/htool-core/pom.xml b/htool-core/pom.xml index 9bbe29a..020b947 100644 --- a/htool-core/pom.xml +++ b/htool-core/pom.xml @@ -14,11 +14,5 @@ 4.0.1 provided - - org.springframework - spring-webmvc - 5.3.18 - provided - \ No newline at end of file diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java index e902031..aa6d6e7 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java @@ -19,14 +19,13 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - import cn.javaex.htool.core.io.handler.FileHandler; import cn.javaex.htool.core.io.handler.FileHelper; import cn.javaex.htool.core.io.handler.FilenameHandler; +import cn.javaex.htool.core.io.handler.PathHandler; import cn.javaex.htool.core.io.model.TreeFile; import cn.javaex.htool.core.string.StringUtils; @@ -648,8 +647,8 @@ public class FileUtils extends FileHelper { * 下载resources文件夹下的文件(不重命名) * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx */ - public static void downloadFileFromResource(String filePath) { - downloadFileFromResource(filePath, null); + public static void downloadFileFromResource(HttpServletResponse response, String filePath) { + downloadFileFromResource(response, filePath, null); } /** @@ -657,13 +656,13 @@ public class FileUtils extends FileHelper { * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx * @param newFileName 重命名文件名称(带后缀) */ - public static void downloadFileFromResource(String filePath, String newFileName) { + public static void downloadFileFromResource(HttpServletResponse response, String filePath, String newFileName) { if (newFileName==null || newFileName.length()==0) { newFileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length()); } - InputStream in = PathUtils.getInputStreamFromResource(filePath); - downloadFile(in, newFileName); + InputStream in = PathHandler.getInputStreamFromResource(filePath); + downloadFile(response, in, newFileName); } /** @@ -671,9 +670,7 @@ public class FileUtils extends FileHelper { * @param in InputStream流 * @param newFileName 重命名文件名称(带后缀) */ - public static void downloadFile(InputStream in, String newFileName) { - HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); - + public static void downloadFile(HttpServletResponse response, InputStream in, String newFileName) { OutputStream out = null; try { @@ -703,8 +700,8 @@ public class FileUtils extends FileHelper { * 如果是相对路径,则认为是项目的同级目录 * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 */ - public static void downloadFile(String filePath) { - downloadFile(filePath, null); + public static void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath) { + downloadFile(request, response, filePath, null); } /** @@ -714,17 +711,15 @@ public class FileUtils extends FileHelper { * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 * @param newFileName 重命名文件名称(带后缀) */ - public static void downloadFile(String filePath, String newFileName) { - HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); - + public static void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath, String newFileName) { // 传入的路径是否是绝对路径 - boolean isAbsolutePath = PathUtils.isAbsolutePath(filePath); + boolean isAbsolutePath = PathHandler.isAbsolutePath(filePath); // 存储文件的物理路径 String fileAbsolutePath = ""; if (isAbsolutePath) { fileAbsolutePath = filePath; } else { - String projectPath = PathUtils.getProjectPath(); + String projectPath = PathHandler.getProjectPath(request); fileAbsolutePath = projectPath + File.separator + filePath; } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/PathUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java similarity index 76% rename from htool-core/src/main/java/cn/javaex/htool/core/io/PathUtils.java rename to htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java index f605cb8..5a4f69c 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/PathUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java @@ -1,20 +1,17 @@ -package cn.javaex.htool.core.io; +package cn.javaex.htool.core.io.handler; import java.io.File; import java.io.InputStream; import javax.servlet.http.HttpServletRequest; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - /*** * 路径工具类 * * @author 陈霓清 * @Date 2022年12月1日 */ -public class PathUtils { +public class PathHandler { /** * 路径转换 @@ -37,10 +34,11 @@ public class PathUtils { /** * 获取项目所在磁盘的文件夹路径,并设置临时目录 + * @param request * @return */ - public static String getFolderPath() { - String projectPath = getProjectPath(); + public static String getFolderPath(HttpServletRequest request) { + String projectPath = getProjectPath(request); String folderPath = projectPath + File.separator + "temp_download"; File file = new File(folderPath); file.mkdirs(); @@ -52,9 +50,8 @@ public class PathUtils { * 获取项目所在磁盘的文件夹路径 * @return */ - public static String getProjectPath() { + public static String getProjectPath(HttpServletRequest request) { try { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); // 获取地址内容,原路径(项目名) String realPath = request.getSession().getServletContext().getRealPath("/"); // tomcat webapps下部署 @@ -72,11 +69,10 @@ public class PathUtils { /** * 获取服务路径 + * @param request * @return */ - public static String getServerPath() { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - + public static String getServerPath(HttpServletRequest request) { String domain = request.getScheme() + "://" + request.getServerName(); int port = request.getServerPort(); diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java index 58df3ab..2cdd60c 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java @@ -16,7 +16,7 @@ public class ZHUtils { * @param text * @return */ - public static String toTraditionalChar(String text) { + public static String toTC(String text) { ZHConverter converter = ZHConverter.getInstance(ZHConverter.TC); return converter.convert(text); } @@ -26,7 +26,7 @@ public class ZHUtils { * @param text * @return */ - public static String toSimpleChar(String text) { + public static String toSC(String text) { ZHConverter converter = ZHConverter.getInstance(ZHConverter.SC); return converter.convert(text); } -- Gitee From 59253340aa771009eb843fdea93b05ab3a391a8c Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Mon, 2 Jan 2023 21:19:21 +0800 Subject: [PATCH 33/44] 20130102 --- .../cn/javaex/htool/core/io/FileUtils.java | 49 +-- .../java/cn/javaex/htool/core/io/IOUtils.java | 289 ------------------ .../htool/core/io/handler/PathHandler.java | 23 +- .../core/io/output/StringBuilderWriter.java | 138 --------- 4 files changed, 31 insertions(+), 468 deletions(-) delete mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java index aa6d6e7..4c41148 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java @@ -2,6 +2,7 @@ package cn.javaex.htool.core.io; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -9,6 +10,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; +import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; @@ -37,7 +39,7 @@ import cn.javaex.htool.core.string.StringUtils; */ public class FileUtils extends FileHelper { /** 默认缓冲区大小 */ - private static final int BUFFER_SIZE = 2048; + private static final int BUFFER_SIZE = 1024; /** * 递归删除文件或目录(目录本身也删除) @@ -185,7 +187,6 @@ public class FileUtils extends FileHelper { TreeFile treeFile = new TreeFile(); treeFile.setFile(file); - if (file.isDirectory()) { // 递归,获取路径中子路径中的所有文件 List listDeepFilesAndDirectorys = listDeepFilesAndDirectorys(file); @@ -440,8 +441,10 @@ public class FileUtils extends FileHelper { */ public static void write(File file, String data, String charsetName, boolean isAppend) throws IOException { - try (OutputStream out = IOUtils.openOutputStream(file, isAppend)) { - IOUtils.write(data, out, Charsets.toCharset(charsetName)); + try (OutputStream output = IOUtils.openOutputStream(file, isAppend)) { + if (data != null) { + output.write(data.getBytes(Charsets.toCharset(charsetName))); + } } } @@ -491,7 +494,17 @@ public class FileUtils extends FileHelper { return new String(bytes, Charsets.toCharset(charsetName)); } else { try (InputStream inputStream = IOUtils.openInputStream(file)) { - return IOUtils.toString(inputStream, Charsets.toCharset(charsetName)); + ByteArrayOutputStream result = new ByteArrayOutputStream(); + byte[] buffer = new byte[BUFFER_SIZE]; + int length; + + while ((length = inputStream.read(buffer)) != -1) { + result.write(buffer, 0, length); + } + + charsetName = charsetName==null ? Charset.defaultCharset().name() : charsetName; + + return result.toString(charsetName); } } } @@ -523,7 +536,7 @@ public class FileUtils extends FileHelper { deleteFileOrDirectory(zipFile); } - byte[] buffer = new byte[1024*10]; + byte[] buffer = new byte[BUFFER_SIZE * 10]; FileInputStream fis = null; BufferedInputStream bis = null; FileOutputStream fos = null; @@ -540,9 +553,9 @@ public class FileUtils extends FileHelper { zos.putNextEntry(zipEntry); fis = new FileInputStream(srcFile); - bis = new BufferedInputStream(fis, 1024*10); + bis = new BufferedInputStream(fis, BUFFER_SIZE * 10); int read = 0; - while ((read=bis.read(buffer, 0, 1024*10)) != -1) { + while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) { zos.write(buffer, 0, read); } zos.flush(); @@ -569,9 +582,9 @@ public class FileUtils extends FileHelper { zos.putNextEntry(zipEntry); fis = new FileInputStream(file); - bis = new BufferedInputStream(fis, 1024*10); + bis = new BufferedInputStream(fis, BUFFER_SIZE * 10); int read = 0; - while ((read=bis.read(buffer, 0, 1024*10)) != -1) { + while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) { zos.write(buffer, 0, read); } @@ -601,7 +614,7 @@ public class FileUtils extends FileHelper { File file = new File(zipPath); FileHandler.requireFile(file); - byte[] buffer = new byte[1024*10]; + byte[] buffer = new byte[BUFFER_SIZE * 10]; ZipFile zipFile = null; try { @@ -624,11 +637,11 @@ public class FileUtils extends FileHelper { targetFile.createNewFile(); // 将压缩文件内容写入到这个文件中 InputStream in = zipFile.getInputStream(entry); - BufferedInputStream bis = new BufferedInputStream(in, 1024*10); + BufferedInputStream bis = new BufferedInputStream(in, BUFFER_SIZE * 10); FileOutputStream fos = new FileOutputStream(targetFile); int read; - while ((read=bis.read(buffer, 0, 1024*10)) != -1) { + while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) { fos.write(buffer, 0, read); } @@ -661,8 +674,8 @@ public class FileUtils extends FileHelper { newFileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length()); } - InputStream in = PathHandler.getInputStreamFromResource(filePath); - downloadFile(response, in, newFileName); + InputStream inputStream = PathHandler.getInputStreamFromResource(filePath); + downloadFile(response, inputStream, newFileName); } /** @@ -741,11 +754,9 @@ public class FileUtils extends FileHelper { byte[] buff = new byte[BUFFER_SIZE]; while (true) { int bytesRead; - if (-1 == (bytesRead=bis.read(buff, 0, buff.length))) { break; } - bos.write(buff, 0, bytesRead); } @@ -781,7 +792,7 @@ public class FileUtils extends FileHelper { } } - final int index = FilenameHandler.indexOfExtension(fileName); + int index = FilenameHandler.indexOfExtension(fileName); if (index == NOT_FOUND) { return EMPTY_STRING; } @@ -822,7 +833,7 @@ public class FileUtils extends FileHelper { return fileName; } - final int index = FilenameHandler.indexOfLastSeparator(fileName); + int index = FilenameHandler.indexOfLastSeparator(fileName); return fileName.substring(index + 1); } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java index 904e3bc..8098616 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java @@ -5,16 +5,9 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; -import java.nio.charset.Charset; import java.util.Objects; import cn.javaex.htool.core.io.handler.FileHandler; -import cn.javaex.htool.core.io.output.StringBuilderWriter; /** * IO流工具类 @@ -24,99 +17,6 @@ import cn.javaex.htool.core.io.output.StringBuilderWriter; */ public class IOUtils { - /** - * CR char. - * - * @since 2.9.0 - */ - public static final int CR = '\r'; - - /** - * The default buffer size ({@value}) to use in copy methods. - */ - public static final int DEFAULT_BUFFER_SIZE = 8192; - - /** - * The system directory separator character. - */ - public static final char DIR_SEPARATOR = File.separatorChar; - - /** - * The Unix directory separator character. - */ - public static final char DIR_SEPARATOR_UNIX = '/'; - - /** - * The Windows directory separator character. - */ - public static final char DIR_SEPARATOR_WINDOWS = '\\'; - - /** - * A singleton empty byte array. - * - * @since 2.9.0 - */ - public static final byte[] EMPTY_BYTE_ARRAY = {}; - - /** - * Represents the end-of-file (or stream). - * - * @since 2.5 (made public) - */ - public static final int EOF = -1; - - /** - * LF char. - * - * @since 2.9.0 - */ - public static final int LF = '\n'; - - /** - * Internal byte array buffer. - */ - private static final ThreadLocal SKIP_BYTE_BUFFER = ThreadLocal.withInitial(IOUtils::byteArray); - - /** - * Internal byte array buffer. - */ - private static final ThreadLocal SKIP_CHAR_BUFFER = ThreadLocal.withInitial(IOUtils::charArray); - - /** - * Returns a new byte array of size {@link #DEFAULT_BUFFER_SIZE}. - * - * @return a new byte array of size {@link #DEFAULT_BUFFER_SIZE}. - * @since 2.9.0 - */ - public static byte[] byteArray() { - return byteArray(DEFAULT_BUFFER_SIZE); - } - - /** - * Returns a new char array of size {@link #DEFAULT_BUFFER_SIZE}. - * - * @return a new char array of size {@link #DEFAULT_BUFFER_SIZE}. - * @since 2.9.0 - */ - private static char[] charArray() { - return charArray(DEFAULT_BUFFER_SIZE); - } - - /** - * Returns a new char array of the given size. - * - * TODO Consider guarding or warning against large allocations... - * - * @param size array size. - * @return a new char array of the given size. - * @since 2.9.0 - */ - private static char[] charArray(int size) { - return new char[size]; - } - - // 关闭流 - // ----------------------------------------------------------------------- /** * 关闭一个IO流、socket、或者selector且不抛出异常 */ @@ -130,196 +30,8 @@ public class IOUtils { } } - // copy - // ----------------------------------------------------------------------- - /** - * 将InputStream中的内容复制到Writer中 - * - * @param input InputStream - * @param writer Writer - * @param charset 字符集 - * @throws IOException if an I/O error occurs - */ - public static void copy(InputStream input, Writer writer, Charset charset) - throws IOException { - InputStreamReader reader = new InputStreamReader(input, charset); - copy(reader, writer); - } - - /** - * 将Reader中的内容复制到Writer中 - *

- * 此方法在内部缓冲输入,因此不需要使用BufferedReader - *

- * 大型流(超过2GB)将返回字符复制值 - *

- * - * @param reader Reader - * @param writer Writer - * @return the number of characters copied, or -1 if > Integer.MAX_VALUE - * @throws IOException if an I/O error occurs - */ - public static int copy(Reader reader, Writer writer) throws IOException { - long count = copyLarge(reader, writer); - if (count > Integer.MAX_VALUE) { - return -1; - } - return (int) count; - } - - /** - * Copies bytes from a large (over 2GB) {@code InputStream} to an - * {@code OutputStream}. - *

- * This method buffers the input internally, so there is no need to use a - * {@code BufferedInputStream}. - *

- *

- * The buffer size is given by {@link #DEFAULT_BUFFER_SIZE}. - *

- * - * @param inputStream the {@code InputStream} to read. - * @param outputStream the {@code OutputStream} to write. - * @return the number of bytes copied. - * @throws NullPointerException if the InputStream is {@code null}. - * @throws NullPointerException if the OutputStream is {@code null}. - * @throws IOException if an I/O error occurs. - * @since 1.3 - */ - public static long copyLarge(InputStream inputStream, OutputStream outputStream) throws IOException { - return copy(inputStream, outputStream, DEFAULT_BUFFER_SIZE); - } - - /** - * Copies chars from a large (over 2GB) {@code Reader} to a {@code Writer}. - *

- * This method buffers the input internally, so there is no need to use a - * {@code BufferedReader}. - *

- * The buffer size is given by {@link #DEFAULT_BUFFER_SIZE}. - * - * @param reader the {@code Reader} to source. - * @param writer the {@code Writer} to target. - * @return the number of characters copied - * @throws NullPointerException if the input or output is null - * @throws IOException if an I/O error occurs - * @since 1.3 - */ - public static long copyLarge(Reader reader, Writer writer) throws IOException { - return copyLarge(reader, writer, getCharArray()); - } - - /** - * Copies chars from a large (over 2GB) {@code Reader} to a {@code Writer}. - *

- * This method uses the provided buffer, so there is no need to use a - * {@code BufferedReader}. - *

- * - * @param reader the {@code Reader} to source. - * @param writer the {@code Writer} to target. - * @param buffer the buffer to be used for the copy - * @return the number of characters copied - * @throws NullPointerException if the input or output is null - * @throws IOException if an I/O error occurs - * @since 2.2 - */ - public static long copyLarge(Reader reader, Writer writer, char[] buffer) throws IOException { - long count = 0; - int n; - while (-1 != (n = reader.read(buffer))) { - writer.write(buffer, 0, n); - count += n; - } - return count; - } - - public static long copy(InputStream inputStream, OutputStream outputStream, int bufferSize) - throws IOException { - return copyLarge(inputStream, outputStream, IOUtils.byteArray(bufferSize)); - } - - /** - * 将InputStream(字节超过2GB)中的内容复制到OutputStream中 - *

- * - * @param inputStream InputStream - * @param outputStream OutputStream - * @param 缓冲区用于复制的缓冲区 - * @return the number of bytes copied. - * - * @throws IOException if an I/O error occurs. - */ - public static long copyLarge(InputStream inputStream, OutputStream outputStream, byte[] buffer) - throws IOException { - Objects.requireNonNull(inputStream, "inputStream cannot be empty"); - Objects.requireNonNull(outputStream, "outputStream cannot be empty"); - long count = 0; - int n; - while (EOF != (n = inputStream.read(buffer))) { - outputStream.write(buffer, 0, n); - count += n; - } - return count; - } - - // toString - // ----------------------------------------------------------------------- - public static String toString(InputStream input) throws IOException { - return toString(input, Charset.defaultCharset()); - } - - public static String toString(InputStream input, Charset charset) throws IOException { - try (StringBuilderWriter sw = new StringBuilderWriter()) { - copy(input, sw, charset); - return sw.toString(); - } - } - - /** - * Gets the thread local char array. - * - * @return the thread local char array. - */ - static char[] getCharArray() { - return SKIP_CHAR_BUFFER.get(); - } - - /** - * Returns a new byte array of the given size. - * - * TODO Consider guarding or warning against large allocations... - * - * @param size array size. - * @return a new byte array of the given size. - * @since 2.9.0 - */ - public static byte[] byteArray(int size) { - return new byte[size]; - } - - /** - * Writes chars from a {@code String} to bytes on an {@code OutputStream} using - * the specified character encoding. - *

- * This method uses {@link String#getBytes(String)}. - * - * @param data the {@code String} to write, null ignored - * @param output the {@code OutputStream} to write to - * @param charset the charset to use, null means platform default - * @throws NullPointerException if output is null - * @throws IOException if an I/O error occurs - * @since 2.3 - */ - public static void write(String data, OutputStream output, Charset charset) throws IOException { - if (data != null) { - output.write(data.getBytes(Charsets.toCharset(charset))); - } - } - /** * 打开指定文件的FileOutputStream,并检查如果父级目录不存在,则创建父级目录 - * * @param file * @param append * @return @@ -338,7 +50,6 @@ public class IOUtils { /** * 打开指定文件的FileInputStream - * * @param file * @return * @throws IOException diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java index 5a4f69c..bc9cc35 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java @@ -12,16 +12,7 @@ import javax.servlet.http.HttpServletRequest; * @Date 2022年12月1日 */ public class PathHandler { - - /** - * 路径转换 - * @param str - * @return - */ - public static String slashify(String str) { - return str.replace('\\', '/'); - } - + /** * 判断是否是绝对路径 * @param path @@ -67,18 +58,6 @@ public class PathHandler { } } - /** - * 获取服务路径 - * @param request - * @return - */ - public static String getServerPath(HttpServletRequest request) { - String domain = request.getScheme() + "://" + request.getServerName(); - int port = request.getServerPort(); - - return port==80 ? domain : domain + ":" + port; - } - /** * 根据resources下的文件路径获取流 * @param path 例如:template/excel/模板.xlsx diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java b/htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java deleted file mode 100644 index be10f6b..0000000 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java +++ /dev/null @@ -1,138 +0,0 @@ -package cn.javaex.htool.core.io.output; - -import java.io.IOException; -import java.io.Serializable; -import java.io.Writer; - -public class StringBuilderWriter extends Writer implements Serializable { - private static final long serialVersionUID = 1L; - private final StringBuilder builder; - - /** - * Constructs a new {@link StringBuilder} instance with default capacity. - */ - public StringBuilderWriter() { - this.builder = new StringBuilder(); - } - - /** - * Constructs a new {@link StringBuilder} instance with the specified capacity. - * - * @param capacity The initial capacity of the underlying {@link StringBuilder} - */ - public StringBuilderWriter(final int capacity) { - this.builder = new StringBuilder(capacity); - } - - /** - * Constructs a new instance with the specified {@link StringBuilder}. - * - *

If {@code builder} is null a new instance with default capacity will be created.

- * - * @param builder The String builder. May be null. - */ - public StringBuilderWriter(final StringBuilder builder) { - this.builder = builder != null ? builder : new StringBuilder(); - } - - /** - * Appends a single character to this Writer. - * - * @param value The character to append - * @return This writer instance - */ - @Override - public Writer append(final char value) { - builder.append(value); - return this; - } - - /** - * Appends a character sequence to this Writer. - * - * @param value The character to append - * @return This writer instance - */ - @Override - public Writer append(final CharSequence value) { - builder.append(value); - return this; - } - - /** - * Appends a portion of a character sequence to the {@link StringBuilder}. - * - * @param value The character to append - * @param start The index of the first character - * @param end The index of the last character + 1 - * @return This writer instance - */ - @Override - public Writer append(final CharSequence value, final int start, final int end) { - builder.append(value, start, end); - return this; - } - - /** - * Closing this writer has no effect. - */ - @Override - public void close() { - // no-op - } - - /** - * Flushing this writer has no effect. - */ - @Override - public void flush() { - // no-op - } - - - /** - * Writes a String to the {@link StringBuilder}. - * - * @param value The value to write - */ - @Override - public void write(final String value) { - if (value != null) { - builder.append(value); - } - } - - /** - * Writes a portion of a character array to the {@link StringBuilder}. - * - * @param value The value to write - * @param offset The index of the first character - * @param length The number of characters to write - */ - @Override - public void write(final char[] value, final int offset, final int length) { - if (value != null) { - builder.append(value, offset, length); - } - } - - /** - * Returns the underlying builder. - * - * @return The underlying builder - */ - public StringBuilder getBuilder() { - return builder; - } - - /** - * Returns {@link StringBuilder#toString()}. - * - * @return The contents of the String builder. - */ - @Override - public String toString() { - return builder.toString(); - } - -} -- Gitee From e3205e8b5c833035c4af1394ad139797b798c1e0 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Mon, 2 Jan 2023 22:30:58 +0800 Subject: [PATCH 34/44] 20130102 --- htool-all/pom.xml | 5 -- .../cn/javaex/htool/core}/date/DateUtils.java | 8 +-- .../htool/core}/date/TimeConversion.java | 10 +-- .../core}/date/constant/DatePattern.java | 2 +- .../htool/core}/date/enums/TimeUnit.java | 2 +- .../htool/core}/date/handler/DateHandler.java | 6 +- .../core}/date/handler/LocalDateHandler.java | 4 +- .../date/handler/LocalDateTimeHandler.java | 4 +- .../htool/core}/date/handler/TimeHandler.java | 14 ++-- .../cn/javaex/htool/core/io/PropUtils.java | 71 +++++++++++++++++++ htool-date/pom.xml | 11 --- pom.xml | 1 - 12 files changed, 98 insertions(+), 40 deletions(-) rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/DateUtils.java (98%) rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/TimeConversion.java (93%) rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/constant/DatePattern.java (96%) rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/enums/TimeUnit.java (95%) rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/handler/DateHandler.java (96%) rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/handler/LocalDateHandler.java (95%) rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/handler/LocalDateTimeHandler.java (95%) rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/handler/TimeHandler.java (95%) create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/PropUtils.java delete mode 100644 htool-date/pom.xml diff --git a/htool-all/pom.xml b/htool-all/pom.xml index de8900e..ffaaf86 100644 --- a/htool-all/pom.xml +++ b/htool-all/pom.xml @@ -25,11 +25,6 @@ htool-crypto ${project.parent.version}
- - cn.javaex - htool-date - ${project.parent.version} - cn.javaex htool-http diff --git a/htool-date/src/main/java/cn/javaex/htool/date/DateUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java similarity index 98% rename from htool-date/src/main/java/cn/javaex/htool/date/DateUtils.java rename to htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java index 6a05020..d000099 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/DateUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.date; +package cn.javaex.htool.core.date; import java.text.ParseException; import java.time.LocalDate; @@ -8,9 +8,9 @@ import java.time.Year; import java.time.temporal.TemporalAdjusters; import java.util.Date; -import cn.javaex.htool.date.constant.DatePattern; -import cn.javaex.htool.date.enums.TimeUnit; -import cn.javaex.htool.date.handler.TimeHandler; +import cn.javaex.htool.core.date.constant.DatePattern; +import cn.javaex.htool.core.date.enums.TimeUnit; +import cn.javaex.htool.core.date.handler.TimeHandler; /** * 日期时间工具类 diff --git a/htool-date/src/main/java/cn/javaex/htool/date/TimeConversion.java b/htool-core/src/main/java/cn/javaex/htool/core/date/TimeConversion.java similarity index 93% rename from htool-date/src/main/java/cn/javaex/htool/date/TimeConversion.java rename to htool-core/src/main/java/cn/javaex/htool/core/date/TimeConversion.java index e901b90..99fb486 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/TimeConversion.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/date/TimeConversion.java @@ -1,14 +1,14 @@ -package cn.javaex.htool.date; +package cn.javaex.htool.core.date; import java.text.ParseException; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; -import cn.javaex.htool.date.handler.DateHandler; -import cn.javaex.htool.date.handler.LocalDateHandler; -import cn.javaex.htool.date.handler.LocalDateTimeHandler; -import cn.javaex.htool.date.handler.TimeHandler; +import cn.javaex.htool.core.date.handler.DateHandler; +import cn.javaex.htool.core.date.handler.LocalDateHandler; +import cn.javaex.htool.core.date.handler.LocalDateTimeHandler; +import cn.javaex.htool.core.date.handler.TimeHandler; /** * 日期时间转换 diff --git a/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java b/htool-core/src/main/java/cn/javaex/htool/core/date/constant/DatePattern.java similarity index 96% rename from htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java rename to htool-core/src/main/java/cn/javaex/htool/core/date/constant/DatePattern.java index 2e32080..48a61b2 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/date/constant/DatePattern.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.date.constant; +package cn.javaex.htool.core.date.constant; /** * 日期格式化常量 diff --git a/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java b/htool-core/src/main/java/cn/javaex/htool/core/date/enums/TimeUnit.java similarity index 95% rename from htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java rename to htool-core/src/main/java/cn/javaex/htool/core/date/enums/TimeUnit.java index 2b80c89..743c151 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/date/enums/TimeUnit.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.date.enums; +package cn.javaex.htool.core.date.enums; import java.util.Arrays; diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/DateHandler.java similarity index 96% rename from htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java rename to htool-core/src/main/java/cn/javaex/htool/core/date/handler/DateHandler.java index 9fa19c9..b1ea3fe 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/DateHandler.java @@ -1,6 +1,4 @@ -package cn.javaex.htool.date.handler; - -import cn.javaex.htool.date.constant.DatePattern; +package cn.javaex.htool.core.date.handler; import java.lang.reflect.Field; import java.text.ParseException; @@ -13,6 +11,8 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; +import cn.javaex.htool.core.date.constant.DatePattern; + /** * java.util.Date处理器 * diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateHandler.java similarity index 95% rename from htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java rename to htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateHandler.java index 869cb79..4d1ae8d 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateHandler.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.date.handler; +package cn.javaex.htool.core.date.handler; import java.lang.reflect.Field; import java.time.Instant; @@ -11,7 +11,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; -import cn.javaex.htool.date.constant.DatePattern; +import cn.javaex.htool.core.date.constant.DatePattern; /** * java.time.LocalDate处理器 diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateTimeHandler.java similarity index 95% rename from htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java rename to htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateTimeHandler.java index 7c4b161..2223114 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateTimeHandler.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.date.handler; +package cn.javaex.htool.core.date.handler; import java.lang.reflect.Field; import java.time.Instant; @@ -10,7 +10,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; -import cn.javaex.htool.date.constant.DatePattern; +import cn.javaex.htool.core.date.constant.DatePattern; /** * java.time.LocalDateTime处理器 diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/TimeHandler.java similarity index 95% rename from htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java rename to htool-core/src/main/java/cn/javaex/htool/core/date/handler/TimeHandler.java index b083478..d9ee53e 100644 --- a/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/TimeHandler.java @@ -1,16 +1,20 @@ -package cn.javaex.htool.date.handler; - -import cn.javaex.htool.date.DateUtils; -import cn.javaex.htool.date.constant.DatePattern; +package cn.javaex.htool.core.date.handler; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.*; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.Period; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.function.Function; +import cn.javaex.htool.core.date.DateUtils; +import cn.javaex.htool.core.date.constant.DatePattern; + /** * 时间处理器 * diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/PropUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/PropUtils.java new file mode 100644 index 0000000..6add4ef --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/PropUtils.java @@ -0,0 +1,71 @@ +package cn.javaex.htool.core.io; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Properties; + +/** + * 读取properties的配置信息 + * + * @author 陈霓清 + * @Date 2023年1月2日 + */ +public class PropUtils { + + /** + * 从配置文件中获取配置参数 + * @param path + * @param filename + * @param key + * @return + */ + public static String getValue(String path, String filename, String key) { + String propertieValue = ""; + InputStream in = null; + + try { + in = new BufferedInputStream(new FileInputStream(path + File.separator + filename)); + Properties prop = new Properties(); + prop.load(in); + propertieValue = prop.getProperty(key,""); + in.close(); + prop.clear(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + IOUtils.closeQuietly(in); + } + + return propertieValue; + } + + /** + * 从配置文件中获取配置参数 + * @param filename + * @param key + * @return + */ + public static String getValue(String filename, String key) { + String propertieValue = ""; + InputStream in = null; + + try { + in = new BufferedInputStream (new FileInputStream(PropUtils.class.getClassLoader().getResource(filename).getFile())); + + Properties prop = new Properties(); + prop.load(in); + propertieValue = prop.getProperty(key); + in.close(); + prop.clear(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + IOUtils.closeQuietly(in); + } + + return propertieValue; + } + +} diff --git a/htool-date/pom.xml b/htool-date/pom.xml deleted file mode 100644 index 4073200..0000000 --- a/htool-date/pom.xml +++ /dev/null @@ -1,11 +0,0 @@ - - 4.0.0 - - cn.javaex - htool - 1.0.0 - - htool-date - htool-date - 日期时间处理 - \ No newline at end of file diff --git a/pom.xml b/pom.xml index ec58daf..1f304b5 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,6 @@ htool-cache htool-core htool-crypto - htool-date htool-http htool-picture -- Gitee From 52e631332cadd1b37ac05c6539b680c1c8efea9e Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Tue, 3 Jan 2023 14:23:37 +0800 Subject: [PATCH 35/44] =?UTF-8?q?=E6=AD=A3=E5=88=99=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E5=92=8C=E8=BA=AB=E4=BB=BD=E8=AF=81=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/core/date/DateUtils.java | 8 +- .../javaex/htool/core/regular/CheckUtils.java | 421 +++++++++++++ .../javaex/htool/core/string/IDCardUtils.java | 577 ++++++++++++++++++ .../cn/javaex/htool/regular/RegularUtil.java | 106 ---- .../java/cn/javaex/htool/http/HttpUtils.java | 316 +++++++++- 5 files changed, 1313 insertions(+), 115 deletions(-) create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/string/IDCardUtils.java delete mode 100644 htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java index d000099..52eb176 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java @@ -490,11 +490,11 @@ public class DateUtils extends TimeConversion { * @return * @throws ParseException */ - public static long age(String time, String pattern) throws ParseException { + public static int age(String time, String pattern) throws ParseException { LocalDate time1 = DateUtils.parseLocalDate(time, pattern); LocalDate time2 = LocalDate.now(); - return DateUtils.timeDifference(time1, time2, TimeUnit.YEAR.getValue()); + return (int) DateUtils.timeDifference(time1, time2, TimeUnit.YEAR.getValue()); } /** @@ -504,13 +504,13 @@ public class DateUtils extends TimeConversion { * @return * @throws ParseException */ - public static long age(T time) throws ParseException { + public static int age(T time) throws ParseException { String timestr1 = new TimeHandler().format(time, DatePattern.yyyyMMdd); LocalDate time1 = parseLocalDate(timestr1, DatePattern.yyyyMMdd); LocalDate time2 = LocalDate.now(); - return DateUtils.timeDifference(time1, time2, TimeUnit.YEAR.getValue()); + return (int) DateUtils.timeDifference(time1, time2, TimeUnit.YEAR.getValue()); } /** diff --git a/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java new file mode 100644 index 0000000..f307767 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java @@ -0,0 +1,421 @@ +package cn.javaex.htool.core.regular; + +import java.util.regex.Pattern; + +import cn.javaex.htool.core.string.IDCardUtils; + +/** + * 文字校验工具类 + * + * @author 陈霓清 + * @Date 2023年1月2日 + */ +public class CheckUtils { + + /** + * 给定内容是否匹配正则 + * @param pattern 模式 + * @param content 内容 + * @return 正则为null或者""时不检查,返回true,内容为null返回false + */ + public static boolean isMatch(Pattern pattern, CharSequence content) { + if (content==null || pattern==null) { + return false; + } + return pattern.matcher(content).matches(); + } + + /** + * 验证是否为(中国大陆)手机号码 + * 中国大陆: +86 133 9511 1345,2位区域码标示+11位数字 + * @param value + * @return + */ + public static boolean isMobile(String value) { + String regex = "(?:0|86|\\+86)?1[3-9]\\d{9}"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为(中国香港)手机号码 + * 中国香港: +852 5100 4870, 三位区域码+10位数字, 中国香港手机号码8位数 + * @param value + * @return + */ + public static boolean isMobileHK(String value) { + String regex = "(?:0|852|\\+852)?\\d{8}"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为(中国台湾)手机号码 + * 中国台湾: +886 09 60 000000, 三位区域码+号码以数字09开头 + 8位数字, 中国台湾手机号码10位数 + * @param value + * @return + */ + public static boolean isMobileTW(String value) { + String regex = "(?:0|886|\\+886)?(?:|-)09\\d{8}"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为(中国澳门)手机号码 + * 中国澳门: +853 68 00000, 三位区域码 +号码以数字6开头 + 7位数字, 中国澳门手机号码8位数 + * @param value + * @return + */ + public static boolean isMobileMO(String value) { + String regex = "(?:0|853|\\+853)?(?:|-)6\\d{7}"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为座机号码(中国) + * @param value + * @return + */ + public static boolean isTel(String value) { + String regex = "(010|02\\d|0[3-9]\\d{2})-?(\\d{6,8})"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为座机服务号码(中国+400 +800) + * @param value + * @return + */ + public static boolean isTel400800(String value) { + String regex = "0\\d{2,3}[\\- ]?[1-9]\\d{6,7}|[48]00[\\- ]?[1-9]\\d{6}"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为邮箱 + * @param value + * @return + */ + public static boolean isEmail(String value) { + String regex = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)])"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为邮政编码 + * @param value + * @return + */ + public static boolean isPostCode(String value) { + String regex = "^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[0-7]|6[0-7]|7[0-5]|8[0-9]|9[0-8])\\d{4}|99907[78]$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为IPV4地址 + * @param value + * @return + */ + public static boolean isIpv4(String value) { + String regex = "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为IPV6地址 + * @param value + * @return + */ + public static boolean isIpv6(String value) { + String regex = "(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为MAC地址 + * @param value + * @return + */ + public static boolean isMac(String value) { + String regex = "((?:[a-fA-F0-9]{1,2}[:-]){5}[a-fA-F0-9]{1,2})|0x(\\d{12}).+ETHER"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为中国车牌号(兼容新能源车牌) + * @param value + * @return + */ + public static boolean isCarNumber(String value) { + String regex = "^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[ABCDEFGHJK])|([ABCDEFGHJK]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]\\d{3}\\d{1,3}[领])|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为车架号 + * 行驶证编号 车辆识别代号 车辆识别码 + * @param value + * @return + */ + public static boolean isCarVin(String value) { + String regex = "^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{2}\\d{6}$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为驾驶证 别名:驾驶证档案编号、行驶证编号 + * @param value + * @return + */ + public static boolean isCarDrivingLicence(String value) { + String regex = "^[0-9]{12}$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为身份证号码(支持18位、15位和港澳台的10位) + * @param value + * @return + */ + public static boolean isIDCard(String value) { + return IDCardUtils.isIDCard(value); + } + + /** + * 验证是否为统一社会信用代码 + * @param value + * @return + */ + public static boolean isCreditCode(String value) { + String regex = "^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为纯汉字 + * @param value + * @return + */ + public static boolean isChinese(String value) { + /** + * 单个中文汉字
+ * 参照维基百科汉字Unicode范围(https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97 页面右侧) + */ + String chinese = "[\u2E80-\u2EFF\u2F00-\u2FDF\u31C0-\u31EF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\uD840\uDC00-\uD869\uDEDF\uD869\uDF00-\uD86D\uDF3F\uD86D\uDF40-\uD86E\uDC1F\uD86E\uDC20-\uD873\uDEAF\uD87E\uDC00-\uD87E\uDE1F]"; + /** + * 中文汉字 + */ + String chineses = chinese + "+"; + + Pattern pattern = Pattern.compile(chineses); + return isMatch(pattern, value); + } + + /** + * 验证是否为纯字母 + * @param value + * @return + */ + public static boolean isWord(String value) { + String regex = "[a-zA-Z]+"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为Hex(16进制)字符串 + * @param value + * @return + */ + public static boolean isHex(String value) { + String regex = "^[a-fA-F0-9]+$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为纯数字 + * @param value + * @return + */ + public static boolean isNumber(String value) { + if (value != null && value.trim().length() > 0) { + value = value.trim(); + value = (value.charAt(0) == '-' ? value.substring(1) : value); + String regex = "^\\d+$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + return false; + } + + /** + * 验证是否为价格 + * @param value + * @return + */ + public static boolean isMoney(String value) { + String regex = "^(\\d+(?:\\.\\d+)?)$"; + Pattern pattern = Pattern.compile(regex); + if (!isMatch(pattern, value)) { + return false; + } + + // 判断2位小数位 + if (value.indexOf(".") > 0) { + String decimal = value.split("\\.")[1]; + if (decimal.length() > 2) { + return false; + } + } + + return true; + } + + /** + * 验证是否为整数 + * @param value + * @return + */ + public static boolean isInt(String value) { + String regex = "^-?\\d+$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为正整数 + * @param value + * @return + */ + public static boolean isPositiveInt(String value) { + String regex = "^[0-9]*[1-9][0-9]*$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为负整数 + * @param value + * @return + */ + public static boolean isNegativeInt(String value) { + String regex = "^-[0-9]*[1-9][0-9]*$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为非负整数:正整数 + 0 + * @param value + * @return + */ + public static boolean isNonnegativeInt(String value) { + String regex = "^\\d+$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为非正整数:负整数 + 0 + * @param value + * @return + */ + public static boolean isNonpositiveInt(String value) { + String regex = "^((-\\d+)|(0+))$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为正数 + * @param value + * @return + */ + public static boolean isPositiveDecimal(String value) { + String regex = "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为负数 + * @param value + * @return + */ + public static boolean isNegativeDecimal(String value) { + String regex = "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为非负数:0 + 正整数 + 正小数 + * @param value + * @return + */ + public static boolean isNonnegativeDecimal(String value) { + String regex = "^\\d+(\\.\\d+)?$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为非正数:0 + 负整数 + 负小数 + * @param value + * @return + */ + public static boolean isNonpositiveDecimal(String value) { + String regex = "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为账号:只能输入5-10个以字母开头,可带数字、下划线的字符串 + * @param value + * @return + */ + public static boolean isAccount(String value) { + String regex = "^[a-zA-Z]{1}([a-zA-Z0-9_]){5,10}$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为昵称:长度限制为2-10个字,只允许中文、字母、数字和下划线 + * @param value + * @return + */ + public static boolean isNickname(String value) { + String regex = "^[a-zA-Z0-9_\u4e00-\u9fa5]{2,10}$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + + /** + * 验证是否为密码:6到16位,允许有字母、数字和一些特殊字符 + * @param value + * @return + */ + public static boolean isPassword(String value) { + String regex = "^[a-zA-Z0-9\\W_!@#$%^&*`~()-+=]{6,16}$"; + Pattern pattern = Pattern.compile(regex); + return isMatch(pattern, value); + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/IDCardUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/IDCardUtils.java new file mode 100644 index 0000000..bc241a8 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/IDCardUtils.java @@ -0,0 +1,577 @@ +package cn.javaex.htool.core.string; + +import java.text.ParseException; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import cn.javaex.htool.core.date.DateUtils; +import cn.javaex.htool.core.date.constant.DatePattern; +import cn.javaex.htool.core.regular.CheckUtils; + +/** + * 身份证号工具类 + * + * @author 陈霓清 + * @Date 2023年1月2日 + */ +public class IDCardUtils { + + /** + * 省市代码表 + */ + private static final Map PROVINCE_CODES = new HashMap<>(); + + /** + * 台湾身份首字母对应数字 + */ + private static final Map TW_FIRST_CODE = new HashMap<>(); + + /** + * 每位加权因子 + */ + private static final int[] POWER = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; + + static { + PROVINCE_CODES.put("11", "北京市"); + PROVINCE_CODES.put("12", "天津市"); + PROVINCE_CODES.put("13", "河北省"); + PROVINCE_CODES.put("14", "山西省"); + PROVINCE_CODES.put("15", "内蒙古自治区"); + PROVINCE_CODES.put("21", "辽宁省"); + PROVINCE_CODES.put("22", "吉林省"); + PROVINCE_CODES.put("23", "黑龙江省"); + PROVINCE_CODES.put("31", "上海市"); + PROVINCE_CODES.put("32", "江苏省"); + PROVINCE_CODES.put("33", "浙江省"); + PROVINCE_CODES.put("34", "安徽省"); + PROVINCE_CODES.put("35", "福建省"); + PROVINCE_CODES.put("36", "江西省"); + PROVINCE_CODES.put("37", "山东省"); + PROVINCE_CODES.put("41", "河南省"); + PROVINCE_CODES.put("42", "湖北省"); + PROVINCE_CODES.put("43", "湖南省"); + PROVINCE_CODES.put("44", "广东省"); + PROVINCE_CODES.put("45", "广西壮族自治区"); + PROVINCE_CODES.put("46", "海南省"); + PROVINCE_CODES.put("50", "重庆市"); + PROVINCE_CODES.put("51", "四川省"); + PROVINCE_CODES.put("52", "贵州省"); + PROVINCE_CODES.put("53", "云南省"); + PROVINCE_CODES.put("54", "西藏自治区"); + PROVINCE_CODES.put("61", "陕西省"); + PROVINCE_CODES.put("62", "甘肃省"); + PROVINCE_CODES.put("63", "青海省"); + PROVINCE_CODES.put("64", "宁夏回族自治区"); + PROVINCE_CODES.put("65", "新疆维吾尔自治区"); + PROVINCE_CODES.put("71", "台湾省"); + PROVINCE_CODES.put("81", "香港"); + PROVINCE_CODES.put("82", "澳门"); + PROVINCE_CODES.put("83", "台湾"); + PROVINCE_CODES.put("91", "国外"); + + TW_FIRST_CODE.put('A', 10); + TW_FIRST_CODE.put('B', 11); + TW_FIRST_CODE.put('C', 12); + TW_FIRST_CODE.put('D', 13); + TW_FIRST_CODE.put('E', 14); + TW_FIRST_CODE.put('F', 15); + TW_FIRST_CODE.put('G', 16); + TW_FIRST_CODE.put('H', 17); + TW_FIRST_CODE.put('J', 18); + TW_FIRST_CODE.put('K', 19); + TW_FIRST_CODE.put('L', 20); + TW_FIRST_CODE.put('M', 21); + TW_FIRST_CODE.put('N', 22); + TW_FIRST_CODE.put('P', 23); + TW_FIRST_CODE.put('Q', 24); + TW_FIRST_CODE.put('R', 25); + TW_FIRST_CODE.put('S', 26); + TW_FIRST_CODE.put('T', 27); + TW_FIRST_CODE.put('U', 28); + TW_FIRST_CODE.put('V', 29); + TW_FIRST_CODE.put('X', 30); + TW_FIRST_CODE.put('Y', 31); + TW_FIRST_CODE.put('W', 32); + TW_FIRST_CODE.put('Z', 33); + TW_FIRST_CODE.put('I', 34); + TW_FIRST_CODE.put('O', 35); + } + + /** + * 验证是否为身份证号码(支持18位、15位和港澳台的10位) + * @param value + * @return + */ + public static boolean isIDCard(String idCard) { + if (StringUtils.isBlank(idCard)) { + return false; + } + + int length = idCard.length(); + switch (length) { + case 18: // 18位身份证 + return isIDCard18(idCard); + case 15: // 15位身份证 + return isIDCard15(idCard); + case 10: { // 10位身份证,港澳台地区 + String[] cardVal = isIDCard10(idCard); + return null != cardVal && "true".equals(cardVal[2]); + } + default: + return false; + } + } + + /** + * 根据身份证号获取生日,只支持15或18位身份证号码 + * @param idCard 身份证号 + * @return 生日(yyyy-MM-dd) + */ + public static String getBirthday(String idCard) { + if (!isIDCard(idCard)) { + return ""; + } + + String birthday = ""; + int len = idCard.length(); + if (len == 18) { + birthday = idCard.substring(6, 14); + } else { + birthday = "19" + idCard.substring(6, 12); + } + + return birthday.substring(0, 4) + "-" + birthday.substring(4, 6) + "-" + birthday.substring(6, 8); + } + + /** + * 根据身份证号获取年龄 + * 只支持15或18位身份证号码 + * @param idCard 身份证号 + * @return + */ + public static int getAge(String idCard) { + if (!isIDCard(idCard)) { + return 0; + } + + String birthday = ""; + int len = idCard.length(); + if (len == 18) { + birthday = idCard.substring(6, 14); + } else { + birthday = "19" + idCard.substring(6, 12); + } + + try { + return DateUtils.age(birthday, DatePattern.yyyyMMdd.replace("-", "")); + } catch (ParseException e) { + e.printStackTrace(); + } + + return 0; + } + + /** + * 根据身份证号获取性别 + * 只支持15或18位身份证号码 + * @param idCard 身份证号 + * @return 性别(1 : 男 , 0 : 女) + */ + public static int getGender(String idCard) { + if (!isIDCard(idCard)) { + throw new IllegalArgumentException("Invalid IDCard"); + } + + int len = idCard.length(); + if (len == 15) { + idCard = convert15To18(idCard); + } + + char sCardChar = Objects.requireNonNull(idCard).charAt(16); + return (sCardChar % 2 != 0) ? 1 : 0; + } + + /** + * 将15位身份证号码转换为18位 + * @param idCard 15位身份证号 + * @return 18位身份证号 + */ + public static String convert15To18(String idCard) { + if (!isIDCard(idCard)) { + throw new IllegalArgumentException("Invalid IDCard"); + } + if (idCard.length() != 15) { + return null; + } + + String birthday = "19" + idCard.substring(6, 12); + + StringBuffer idCard18 = new StringBuffer(); + idCard18.append(idCard, 0, 6).append(birthday.substring(0, 4)).append(idCard.substring(8)); + + // 获取校验位 + char val = getCheckCode18(idCard18.toString()); + idCard18.append(val); + + return idCard18.toString(); + } + + /** + * 根据身份证号获取户籍省份编码 + * 只支持15或18位身份证号码 + * @param idCard 身份证码 + * @return 省份编码 + */ + public static String getProvinceCode(String idCard) { + int len = idCard.length(); + + if (len == 15 || len == 18) { + return idCard.substring(0, 2); + } + + return null; + } + + /** + * 根据身份编号获取户籍省份,只支持15或18位身份证号码 + * + * @param idCard 身份证号 + * @return 省份名称 + */ + public static String getProvince(String idCard) { + String code = getProvinceCode(idCard); + + if (StringUtils.isNotBlank(code)) { + return PROVINCE_CODES.get(code); + } + + return null; + } + + /** + * 根据身份编号获取地市级编码,只支持15或18位身份证号码 + * 获取编码为4位 + * @param idCard 身份证号 + * @return 地市级编码 + */ + public static String getCityCode(String idCard) { + int len = idCard.length(); + + if (len == 15 || len == 18) { + return idCard.substring(0, 4); + } + + return null; + } + + /** + * 根据身份编号获取区县级编码,只支持15或18位身份证号码 + * 获取编码为6位 + * @param idCard 身份证号 + * @return 地市级编码 + */ + public static String getDistrictCode(String idCard) { + int len = idCard.length(); + + if (len == 15 || len == 18) { + return idCard.substring(0, 6); + } + + return null; + } + + /** + *

+ * 判断18位身份证的合法性 + *

+ * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
+ * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 + *

+ * 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。 + *

+ *
    + *
  1. 第1、2位数字表示:所在省份的代码
  2. + *
  3. 第3、4位数字表示:所在城市的代码
  4. + *
  5. 第5、6位数字表示:所在区县的代码
  6. + *
  7. 第7~14位数字表示:出生年、月、日
  8. + *
  9. 第15、16位数字表示:所在地的派出所的代码
  10. + *
  11. 第17位数字表示性别:奇数表示男性,偶数表示女性
  12. + *
  13. 第18位数字是校检码,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示
  14. + *
+ *

+ * 第十八位数字(校验码)的计算方法为: + *

    + *
  1. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
  2. + *
  3. 将这17位数字和系数相乘的结果相加
  4. + *
  5. 用加出来和除以11,看余数是多少
  6. + *
  7. 余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2
  8. + *
  9. 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2
  10. + *
+ * + * @param idCard 待验证的身份证 + * @param ignoreCase 是否忽略大小写。{@code true}则忽略X大小写,否则严格匹配大写。 + * @return 是否有效的18位身份证 + */ + private static boolean isIDCard18(String idCard) { + // 省份 + final String proCode = idCard.substring(0, 2); + if (null == PROVINCE_CODES.get(proCode)) { + return false; + } + + // 校验生日 + String birthday = idCard.substring(6, 14); + int year = Integer.parseInt(birthday.substring(0, 4)); + int month = Integer.parseInt(birthday.substring(4, 6)); + int day = Integer.parseInt(birthday.substring(6, 8)); + if (!isBirthday(year, month, day)) { + return false; + } + + // 前17位 + final String code17 = idCard.substring(0, 17); + if (CheckUtils.isNumber(code17)) { + // 获取校验位 + char val = getCheckCode18(code17); + // 第18位 + return Character.toLowerCase(val) == Character.toLowerCase(idCard.charAt(17)); + } + return false; + } + + /** + * 验证15位身份证号是否合法 + * @param idCard + * @return + */ + private static boolean isIDCard15(String idCard) { + if (CheckUtils.isNumber(idCard)) { + // 省份 + String proCode = idCard.substring(0, 2); + if (null == PROVINCE_CODES.get(proCode)) { + return false; + } + + // 校验生日(两位年份,补充为19XX) + String birthday = "19" + idCard.substring(6, 12); + int year = Integer.parseInt(birthday.substring(0, 4)); + int month = Integer.parseInt(birthday.substring(4, 6)); + int day = Integer.parseInt(birthday.substring(6, 8)); + + return isBirthday(year, month, day); + } + + return false; + } + + /** + * 验证10位身份证号是否合法 + * + * @param idCard 身份证号 + * @return 身份证信息数组 + *

+ * [0] - 台湾、澳门、香港 [1] - 性别(男M,女F,未知N) [2] - 是否合法(合法true,不合法false) 若不是身份证件号码则返回null + *

+ */ + private static String[] isIDCard10(String idCard) { + String[] info = new String[3]; + String card = idCard.replaceAll("[()]", ""); + if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) { + return null; + } + + // 台湾 + if (idCard.matches("^[a-zA-Z][0-9]{9}$")) { + info[0] = "台湾"; + char char2 = idCard.charAt(1); + if ('1' == char2) { + info[1] = "M"; + } else if ('2' == char2) { + info[1] = "F"; + } else { + info[1] = "N"; + info[2] = "false"; + return info; + } + info[2] = isTWIDCard(idCard) ? "true" : "false"; + } + // 澳门 + else if (idCard.matches("^[157][0-9]{6}\\(?[0-9A-Z]\\)?$")) { + info[0] = "澳门"; + info[1] = "N"; + info[2] = "true"; + } + // 香港 + else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?$")) { + info[0] = "香港"; + info[1] = "N"; + info[2] = isHKIDCard(idCard) ? "true" : "false"; + } + else { + return null; + } + + return info; + } + + /** + * 验证香港身份证号码(存在Bug,部份特殊身份证无法检查) + *

+ * 身份证前2位为英文字符,如果只出现一个英文字符则表示第一位是空格,对应数字58 前2位英文字符A-Z分别对应数字10-35 最后一位校验码为0-9的数字加上字符"A","A"代表10 + *

+ *

+ * 将身份证号码全部转换为数字,分别对应乘9-1相加的总和,整除11则证件号码有效 + *

+ * + * @param idCard 身份证号码 + * @return 验证码是否符合 + */ + private static boolean isHKIDCard(String idCard) { + String card = idCard.replaceAll("[()]", ""); + int sum; + if (card.length() == 9) { + sum = (Character.toUpperCase(card.charAt(0)) - 55) * 9 + (Character.toUpperCase(card.charAt(1)) - 55) * 8; + card = card.substring(1, 9); + } else { + sum = 522 + (Character.toUpperCase(card.charAt(0)) - 55) * 8; + } + + // 首字母A-Z,A表示1,以此类推 + String mid = card.substring(1, 7); + String end = card.substring(7, 8); + char[] chars = mid.toCharArray(); + int iflag = 7; + for (char c : chars) { + sum = sum + Integer.parseInt(String.valueOf(c)) * iflag; + iflag--; + } + + if ("A".equalsIgnoreCase(end)) { + sum += 10; + } else { + sum += Integer.parseInt(end); + } + + return sum % 11 == 0; + } + + /** + * 验证台湾身份证号码 + * @param idCard + * @return + */ + private static boolean isTWIDCard(String idCard) { + Integer iStart = TW_FIRST_CODE.get(idCard.charAt(0)); + if (null == iStart) { + return false; + } + int sum = iStart / 10 + (iStart % 10) * 9; + + String mid = idCard.substring(1, 9); + char[] chars = mid.toCharArray(); + int iflag = 8; + for (char c : chars) { + sum += Integer.parseInt(String.valueOf(c)) * iflag; + iflag--; + } + + String end = idCard.substring(9, 10); + return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.parseInt(end); + } + + /** + * 获得18位身份证校验码 + * @param code17 18位身份证号中的前17位 + * @return 第18位 + */ + private static char getCheckCode18(String code17) { + int sum = getPowerSum(code17.toCharArray()); + return getCheckCode18(sum); + } + + /** + * 将身份证的每位和对应位的加权因子相乘之后,再得到和值 + * @param iArr 身份证号码的数组 + * @return 身份证编码 + */ + private static int getPowerSum(char[] iArr) { + int sum = 0; + if (POWER.length == iArr.length) { + for (int i = 0; i < iArr.length; i++) { + sum += Integer.parseInt(String.valueOf(iArr[i])) * POWER[i]; + } + } + return sum; + } + + /** + * 将power和值与11取模获得余数进行校验码判断 + * @param sum 加权和 + * @return 校验位 + */ + private static char getCheckCode18(int sum) { + switch (sum % 11) { + case 10: + return '2'; + case 9: + return '3'; + case 8: + return '4'; + case 7: + return '5'; + case 6: + return '6'; + case 5: + return '7'; + case 4: + return '8'; + case 3: + return '9'; + case 2: + return 'X'; + case 1: + return '0'; + case 0: + return '1'; + default: + return ' '; + } + } + + /** + * 验证是否为生日 + * @param year 年,从1900年开始计算 + * @param month 月,从1开始计数 + * @param day 日,从1开始计数 + * @return 是否为生日 + */ + private static boolean isBirthday(int year, int month, int day) { + // 验证年 + int thisYear = DateUtils.getYear(); + if (year < 1900 || year > thisYear) { + return false; + } + + // 验证月 + if (month < 1 || month > 12) { + return false; + } + + // 验证日 + if (day < 1 || day > 31) { + return false; + } + // 检查几个特殊月的最大天数 + if (day == 31 && (month == 4 || month == 6 || month == 9 || month == 11)) { + return false; + } + // 2月,非闰年最大28,闰年最大29 + if (month == 2) { + return day < 29 || (day == 29 && DateUtils.isLeapYear(year)); + } + + return true; + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java b/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java deleted file mode 100644 index 769b696..0000000 --- a/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java +++ /dev/null @@ -1,106 +0,0 @@ -package cn.javaex.htool.regular; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * 常用正则表达式 - * - * @author 杨伟辰 - * @Date 2022年11月27日16:32:36 - */ -public class RegularUtil { - - /** - * 中文 正则 - */ - private static Pattern ZH_Pattern = Pattern.compile("[\u4e00-\u9fa5]"); - - /** - * 匹配正则 - * - * @param regular 正则规则 - * @param msg 内容 - * @return 返回所有匹配结果 - */ - public static List getRegular(String regular, String msg) { - ArrayList ids = new ArrayList<>(); - Pattern pattern = Pattern.compile(regular); - Matcher matcher = pattern.matcher(msg); - while (matcher.find()) { - String str = matcher.group(0); - ids.add(str); - } - return ids; - } - - /** - * 获取URL中的参数名和参数值的Map集合 - * - * @param url url - * @return 返回Map集合保存 - */ - private static Map getUrlPramNameAndValue(String url) { - //匹配参数名和参数值的正则表达式 - String regEx = "(\\?|&+)(.+?)=([^&]*)"; - Pattern p = Pattern.compile(regEx); - Matcher m = p.matcher(url); - // LinkedHashMap是有序的Map集合,遍历时会按照加入的顺序遍历输出 - Map paramMap = new LinkedHashMap(); - while (m.find()) { - //获取参数名 - String paramName = m.group(2); - //获取参数值 - String paramVal = m.group(3); - paramMap.put(paramName, paramVal); - } - return paramMap; - } - - /** - * 传过来一堆字符串,就算有html标签也行,可以提取里面包含图片格式的url - * 常用在提取富文本中的图片链接 - * - * @param htmlStr html字符 - * @return - */ - public static List getImgStr(String htmlStr) { - List list = new ArrayList<>(); - String img = ""; - Pattern pImage; - Matcher mImage; - String regExImg = "]*?>"; - pImage = Pattern.compile(regExImg, Pattern.CASE_INSENSITIVE); - mImage = pImage.matcher(htmlStr); - while (mImage.find()) { - // 得到数据 - img = mImage.group(); - // 匹配中的src数据 - String regEx = "src\\s*=\\s*\"?(.*?)(\"|>|\\s+)"; - Matcher m = Pattern.compile(regEx).matcher(img); - while (m.find()) { - list.add(m.group(1)); - } - } - return list; - } - - /** - * 判断字符串中是否包含中文 - * - * @param str 待校验字符串 - * @return 是否为中文 - * @warn 不能校验是否为中文标点符号 - */ - public static boolean isContainChinese(String str) { - Matcher m = ZH_Pattern.matcher(str); - if (m.find()) { - return true; - } - return false; - } -} diff --git a/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java index bccc26b..a7c8e48 100644 --- a/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java @@ -1,5 +1,311 @@ -package cn.javaex.htool.http; - -public class HttpUtils { - -} +//package cn.javaex.htool.http; +// +//import java.io.UnsupportedEncodingException; +//import java.net.URLEncoder; +//import java.security.KeyManagementException; +//import java.security.NoSuchAlgorithmException; +//import java.security.cert.X509Certificate; +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Map; +// +//import javax.net.ssl.SSLContext; +//import javax.net.ssl.TrustManager; +//import javax.net.ssl.X509TrustManager; +// +//import org.apache.http.HttpResponse; +//import org.apache.http.NameValuePair; +//import org.apache.http.client.HttpClient; +//import org.apache.http.client.entity.UrlEncodedFormEntity; +//import org.apache.http.client.methods.HttpDelete; +//import org.apache.http.client.methods.HttpGet; +//import org.apache.http.client.methods.HttpPost; +//import org.apache.http.client.methods.HttpPut; +//import org.apache.http.conn.ClientConnectionManager; +//import org.apache.http.conn.scheme.Scheme; +//import org.apache.http.conn.scheme.SchemeRegistry; +//import org.apache.http.conn.ssl.SSLSocketFactory; +//import org.apache.http.entity.ByteArrayEntity; +//import org.apache.http.entity.StringEntity; +//import org.apache.http.impl.client.DefaultHttpClient; +//import org.apache.http.message.BasicNameValuePair; +// +//public class HttpUtils { +// +// /** +// * get +// * +// * @param host +// * @param path +// * @param method +// * @param headers +// * @param querys +// * @return +// * @throws Exception +// */ +// public static HttpResponse doGet(String host, String path, String method, +// Map headers, +// Map querys) +// throws Exception { +// HttpClient httpClient = wrapClient(host); +// +// HttpGet request = new HttpGet(buildUrl(host, path, querys)); +// for (Map.Entry e : headers.entrySet()) { +// request.addHeader(e.getKey(), e.getValue()); +// } +// +// return httpClient.execute(request); +// } +// +// /** +// * post form +// * +// * @param host +// * @param path +// * @param method +// * @param headers +// * @param querys +// * @param bodys +// * @return +// * @throws Exception +// */ +// public static HttpResponse doPost(String host, String path, String method, +// Map headers, +// Map querys, +// Map bodys) +// throws Exception { +// HttpClient httpClient = wrapClient(host); +// +// HttpPost request = new HttpPost(buildUrl(host, path, querys)); +// for (Map.Entry e : headers.entrySet()) { +// request.addHeader(e.getKey(), e.getValue()); +// } +// +// if (bodys != null) { +// List nameValuePairList = new ArrayList(); +// +// for (String key : bodys.keySet()) { +// nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key))); +// } +// UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8"); +// formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); +// request.setEntity(formEntity); +// } +// +// return httpClient.execute(request); +// } +// +// /** +// * Post String +// * +// * @param host +// * @param path +// * @param method +// * @param headers +// * @param querys +// * @param body +// * @return +// * @throws Exception +// */ +// public static HttpResponse doPost(String host, String path, String method, +// Map headers, +// Map querys, +// String body) +// throws Exception { +// HttpClient httpClient = wrapClient(host); +// +// HttpPost request = new HttpPost(buildUrl(host, path, querys)); +// for (Map.Entry e : headers.entrySet()) { +// request.addHeader(e.getKey(), e.getValue()); +// } +// +// if (StringUtils.isNotBlank(body)) { +// request.setEntity(new StringEntity(body, "utf-8")); +// } +// +// return httpClient.execute(request); +// } +// +// /** +// * Post stream +// * +// * @param host +// * @param path +// * @param method +// * @param headers +// * @param querys +// * @param body +// * @return +// * @throws Exception +// */ +// public static HttpResponse doPost(String host, String path, String method, +// Map headers, +// Map querys, +// byte[] body) +// throws Exception { +// HttpClient httpClient = wrapClient(host); +// +// HttpPost request = new HttpPost(buildUrl(host, path, querys)); +// for (Map.Entry e : headers.entrySet()) { +// request.addHeader(e.getKey(), e.getValue()); +// } +// +// if (body != null) { +// request.setEntity(new ByteArrayEntity(body)); +// } +// +// return httpClient.execute(request); +// } +// +// /** +// * Put String +// * @param host +// * @param path +// * @param method +// * @param headers +// * @param querys +// * @param body +// * @return +// * @throws Exception +// */ +// public static HttpResponse doPut(String host, String path, String method, +// Map headers, +// Map querys, +// String body) +// throws Exception { +// HttpClient httpClient = wrapClient(host); +// +// HttpPut request = new HttpPut(buildUrl(host, path, querys)); +// for (Map.Entry e : headers.entrySet()) { +// request.addHeader(e.getKey(), e.getValue()); +// } +// +// if (StringUtils.isNotBlank(body)) { +// request.setEntity(new StringEntity(body, "utf-8")); +// } +// +// return httpClient.execute(request); +// } +// +// /** +// * Put stream +// * @param host +// * @param path +// * @param method +// * @param headers +// * @param querys +// * @param body +// * @return +// * @throws Exception +// */ +// public static HttpResponse doPut(String host, String path, String method, +// Map headers, +// Map querys, +// byte[] body) +// throws Exception { +// HttpClient httpClient = wrapClient(host); +// +// HttpPut request = new HttpPut(buildUrl(host, path, querys)); +// for (Map.Entry e : headers.entrySet()) { +// request.addHeader(e.getKey(), e.getValue()); +// } +// +// if (body != null) { +// request.setEntity(new ByteArrayEntity(body)); +// } +// +// return httpClient.execute(request); +// } +// +// /** +// * Delete +// * +// * @param host +// * @param path +// * @param method +// * @param headers +// * @param querys +// * @return +// * @throws Exception +// */ +// public static HttpResponse doDelete(String host, String path, String method, +// Map headers, +// Map querys) +// throws Exception { +// HttpClient httpClient = wrapClient(host); +// +// HttpDelete request = new HttpDelete(buildUrl(host, path, querys)); +// for (Map.Entry e : headers.entrySet()) { +// request.addHeader(e.getKey(), e.getValue()); +// } +// +// return httpClient.execute(request); +// } +// +// private static String buildUrl(String host, String path, Map querys) throws UnsupportedEncodingException { +// StringBuilder sbUrl = new StringBuilder(); +// sbUrl.append(host); +// if (!StringUtils.isBlank(path)) { +// sbUrl.append(path); +// } +// if (null != querys) { +// StringBuilder sbQuery = new StringBuilder(); +// for (Map.Entry query : querys.entrySet()) { +// if (0 < sbQuery.length()) { +// sbQuery.append("&"); +// } +// if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) { +// sbQuery.append(query.getValue()); +// } +// if (!StringUtils.isBlank(query.getKey())) { +// sbQuery.append(query.getKey()); +// if (!StringUtils.isBlank(query.getValue())) { +// sbQuery.append("="); +// sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8")); +// } +// } +// } +// if (0 < sbQuery.length()) { +// sbUrl.append("?").append(sbQuery); +// } +// } +// +// return sbUrl.toString(); +// } +// +// private static HttpClient wrapClient(String host) { +// HttpClient httpClient = new DefaultHttpClient(); +// if (host.startsWith("https://")) { +// sslClient(httpClient); +// } +// +// return httpClient; +// } +// +// private static void sslClient(HttpClient httpClient) { +// try { +// SSLContext ctx = SSLContext.getInstance("TLS"); +// X509TrustManager tm = new X509TrustManager() { +// public X509Certificate[] getAcceptedIssuers() { +// return null; +// } +// public void checkClientTrusted(X509Certificate[] xcs, String str) { +// +// } +// public void checkServerTrusted(X509Certificate[] xcs, String str) { +// +// } +// }; +// ctx.init(null, new TrustManager[] { tm }, null); +// SSLSocketFactory ssf = new SSLSocketFactory(ctx); +// ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); +// ClientConnectionManager ccm = httpClient.getConnectionManager(); +// SchemeRegistry registry = ccm.getSchemeRegistry(); +// registry.register(new Scheme("https", 443, ssf)); +// } catch (KeyManagementException ex) { +// throw new RuntimeException(ex); +// } catch (NoSuchAlgorithmException ex) { +// throw new RuntimeException(ex); +// } +// } +//} -- Gitee From 7444ba05caf21685d7b6fc62c1887a21bc714191 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Tue, 3 Jan 2023 14:31:53 +0800 Subject: [PATCH 36/44] =?UTF-8?q?=E5=B0=86=E6=96=87=E4=BB=B6=E8=A7=A3?= =?UTF-8?q?=E5=8E=8B=E7=BC=A9=E5=8D=95=E7=8B=AC=E6=8F=90=E5=8F=96=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/core/io/FileUtils.java | 154 ---------------- .../cn/javaex/htool/core/io/ZipUtils.java | 174 ++++++++++++++++++ .../htool/core/io/handler/FileHelper.java | 5 + .../javaex/htool/core/regular/CheckUtils.java | 2 +- 4 files changed, 180 insertions(+), 155 deletions(-) create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java index 4c41148..0cdbc98 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java @@ -5,7 +5,6 @@ import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -15,11 +14,7 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.ArrayList; -import java.util.Enumeration; import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import java.util.zip.ZipOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -38,8 +33,6 @@ import cn.javaex.htool.core.string.StringUtils; * @Date 2022年12月1日 */ public class FileUtils extends FileHelper { - /** 默认缓冲区大小 */ - private static final int BUFFER_SIZE = 1024; /** * 递归删除文件或目录(目录本身也删除) @@ -509,153 +502,6 @@ public class FileUtils extends FileHelper { } } - /** - * 创建一个zip压缩文件,并存放到新的路径中 - * @param srcPath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx - * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip - * @throws IOException - */ - public static void zip(String srcPath, String zipPath) throws IOException { - zip(srcPath, zipPath, true); - } - - /** - * 创建一个zip压缩文件,并存放到新的路径中 - * @param srcPath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx - * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip - * @param isKeepFolder 是否将目录名称也一起压缩 - * @throws IOException - */ - public static void zip(String srcPath, String zipPath, boolean isKeepFolder) throws IOException { - File srcFile = new File(srcPath); - FileHandler.requireExists(srcFile); - - File zipFile = new File(zipPath); - // 如果压缩包已存在,则先删除 - if (zipFile.exists()) { - deleteFileOrDirectory(zipFile); - } - - byte[] buffer = new byte[BUFFER_SIZE * 10]; - FileInputStream fis = null; - BufferedInputStream bis = null; - FileOutputStream fos = null; - ZipOutputStream zos = null; - - try { - // 判断是否是一个具体的文件 - if (srcFile.isFile()) { - fos = new FileOutputStream(zipFile); - zos = new ZipOutputStream(new BufferedOutputStream(fos)); - - // 创建zip实体,并添加进压缩包 - ZipEntry zipEntry = new ZipEntry(srcFile.getName()); - zos.putNextEntry(zipEntry); - - fis = new FileInputStream(srcFile); - bis = new BufferedInputStream(fis, BUFFER_SIZE * 10); - int read = 0; - while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) { - zos.write(buffer, 0, read); - } - zos.flush(); - } - // 目录 - else if (srcFile.isDirectory()) { - // 获取文件源中的所有文件 - List fileList = listDeepFiles(srcFile); - - fos = new FileOutputStream(zipFile); - zos = new ZipOutputStream(new BufferedOutputStream(fos)); - - // 将每个文件放入zip流中 - for (File file : fileList) { - String name = FileHandler.getRealName(srcPath, file); // 获取文件相对路径,保持文件原有结构 - ZipEntry zipEntry = null; - if (isKeepFolder) { - zipEntry = new ZipEntry(new File(srcPath).getName() + File.separator + name); - } else { - zipEntry = new ZipEntry(name); - } - - zipEntry.setSize(file.length()); - zos.putNextEntry(zipEntry); - - fis = new FileInputStream(file); - bis = new BufferedInputStream(fis, BUFFER_SIZE * 10); - int read = 0; - while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) { - zos.write(buffer, 0, read); - } - - zos.flush(); - bis.close(); - fis.close(); - } - zos.close(); - } - } catch (IOException e) { - throw new IOException(e); - } finally { - IOUtils.closeQuietly(zos); - IOUtils.closeQuietly(fos); - IOUtils.closeQuietly(bis); - IOUtils.closeQuietly(fis); - } - } - - /** - * zip解压 - * @param zipPath zip文件的绝对路径,例如:D:\\Temp\\xx.zip - * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Temp - * @throws IOException - */ - public static void unZip(String zipPath, String destDirPath) throws IOException { - File file = new File(zipPath); - FileHandler.requireFile(file); - - byte[] buffer = new byte[BUFFER_SIZE * 10]; - ZipFile zipFile = null; - - try { - zipFile = new ZipFile(zipPath); - Enumeration entries = zipFile.entries(); - while (entries.hasMoreElements()) { - ZipEntry entry = (ZipEntry) entries.nextElement(); - // 如果是文件夹,就创建个文件夹 - if (entry.isDirectory()) { - String dirPath = destDirPath + File.separator + entry.getName(); - File dir = new File(dirPath); - dir.mkdirs(); - } else { - // 如果是文件,就先创建一个文件,然后用io流把内容copy过去 - File targetFile = new File(destDirPath + File.separator + entry.getName()); - // 保证这个文件的父文件夹必须要存在 - if (!targetFile.getParentFile().exists()) { - targetFile.getParentFile().mkdirs(); - } - targetFile.createNewFile(); - // 将压缩文件内容写入到这个文件中 - InputStream in = zipFile.getInputStream(entry); - BufferedInputStream bis = new BufferedInputStream(in, BUFFER_SIZE * 10); - FileOutputStream fos = new FileOutputStream(targetFile); - - int read; - while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) { - fos.write(buffer, 0, read); - } - - fos.close(); - in.close(); - } - } - } catch (IOException e) { - throw new IOException(e); - } finally { - IOUtils.closeQuietly(zipFile); - } - } - /** * 下载resources文件夹下的文件(不重命名) * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java new file mode 100644 index 0000000..58f2120 --- /dev/null +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java @@ -0,0 +1,174 @@ +package cn.javaex.htool.core.io; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +import cn.javaex.htool.core.io.handler.FileHandler; +import cn.javaex.htool.core.io.handler.FileHelper; + +/** + * 文件压缩工具类 + * + * @author 陈霓清 + * @Date 2023年1月3日 + */ +public class ZipUtils extends FileHelper { + + /** + * 创建一个zip压缩文件,并存放到新的路径中 + * @param srcPath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx + * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip + * @throws IOException + */ + public static void zip(String srcPath, String zipPath) throws IOException { + zip(srcPath, zipPath, true); + } + + /** + * 创建一个zip压缩文件,并存放到新的路径中 + * @param srcPath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx + * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip + * @param isKeepFolder 是否将目录名称也一起压缩 + * @throws IOException + */ + public static void zip(String srcPath, String zipPath, boolean isKeepFolder) throws IOException { + File srcFile = new File(srcPath); + FileHandler.requireExists(srcFile); + + File zipFile = new File(zipPath); + // 如果压缩包已存在,则先删除 + if (zipFile.exists()) { + FileUtils.deleteFileOrDirectory(zipFile); + } + + byte[] buffer = new byte[BUFFER_SIZE * 10]; + FileInputStream fis = null; + BufferedInputStream bis = null; + FileOutputStream fos = null; + ZipOutputStream zos = null; + + try { + // 判断是否是一个具体的文件 + if (srcFile.isFile()) { + fos = new FileOutputStream(zipFile); + zos = new ZipOutputStream(new BufferedOutputStream(fos)); + + // 创建zip实体,并添加进压缩包 + ZipEntry zipEntry = new ZipEntry(srcFile.getName()); + zos.putNextEntry(zipEntry); + + fis = new FileInputStream(srcFile); + bis = new BufferedInputStream(fis, BUFFER_SIZE * 10); + int read = 0; + while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) { + zos.write(buffer, 0, read); + } + zos.flush(); + } + // 目录 + else if (srcFile.isDirectory()) { + // 获取文件源中的所有文件 + List fileList = FileUtils.listDeepFiles(srcFile); + + fos = new FileOutputStream(zipFile); + zos = new ZipOutputStream(new BufferedOutputStream(fos)); + + // 将每个文件放入zip流中 + for (File file : fileList) { + String name = FileHandler.getRealName(srcPath, file); // 获取文件相对路径,保持文件原有结构 + ZipEntry zipEntry = null; + if (isKeepFolder) { + zipEntry = new ZipEntry(new File(srcPath).getName() + File.separator + name); + } else { + zipEntry = new ZipEntry(name); + } + + zipEntry.setSize(file.length()); + zos.putNextEntry(zipEntry); + + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis, BUFFER_SIZE * 10); + int read = 0; + while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) { + zos.write(buffer, 0, read); + } + + zos.flush(); + bis.close(); + fis.close(); + } + zos.close(); + } + } catch (IOException e) { + throw new IOException(e); + } finally { + IOUtils.closeQuietly(zos); + IOUtils.closeQuietly(fos); + IOUtils.closeQuietly(bis); + IOUtils.closeQuietly(fis); + } + } + + /** + * zip解压 + * @param zipPath zip文件的绝对路径,例如:D:\\Temp\\xx.zip + * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Temp + * @throws IOException + */ + public static void unZip(String zipPath, String destDirPath) throws IOException { + File file = new File(zipPath); + FileHandler.requireFile(file); + + byte[] buffer = new byte[BUFFER_SIZE * 10]; + ZipFile zipFile = null; + + try { + zipFile = new ZipFile(zipPath); + Enumeration entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = (ZipEntry) entries.nextElement(); + // 如果是文件夹,就创建个文件夹 + if (entry.isDirectory()) { + String dirPath = destDirPath + File.separator + entry.getName(); + File dir = new File(dirPath); + dir.mkdirs(); + } else { + // 如果是文件,就先创建一个文件,然后用io流把内容copy过去 + File targetFile = new File(destDirPath + File.separator + entry.getName()); + // 保证这个文件的父文件夹必须要存在 + if (!targetFile.getParentFile().exists()) { + targetFile.getParentFile().mkdirs(); + } + targetFile.createNewFile(); + // 将压缩文件内容写入到这个文件中 + InputStream in = zipFile.getInputStream(entry); + BufferedInputStream bis = new BufferedInputStream(in, BUFFER_SIZE * 10); + FileOutputStream fos = new FileOutputStream(targetFile); + + int read; + while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) { + fos.write(buffer, 0, read); + } + + fos.close(); + in.close(); + } + } + } catch (IOException e) { + throw new IOException(e); + } finally { + IOUtils.closeQuietly(zipFile); + } + } + +} diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java index cc0c4ab..08d8bfc 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java @@ -10,6 +10,11 @@ import java.util.regex.Pattern; * @Date 2022年12月8日 */ public class FileHelper { + /** + * 默认缓冲区大小 + */ + public static final int BUFFER_SIZE = 1024; + /** * 文件扩展分隔符(字符) */ diff --git a/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java index f307767..6346cfc 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java @@ -5,7 +5,7 @@ import java.util.regex.Pattern; import cn.javaex.htool.core.string.IDCardUtils; /** - * 文字校验工具类 + * 字符串校验工具类 * * @author 陈霓清 * @Date 2023年1月2日 -- Gitee From b55668c5d962a367cd332feb5c783e7a423d8eec Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Tue, 3 Jan 2023 14:43:27 +0800 Subject: [PATCH 37/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9base64=E5=92=8CID?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E7=9A=84=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/javaex/htool/core/{ => codec}/Base64Utils.java | 2 +- .../src/main/java/cn/javaex/htool/core/{ => id}/IdUtils.java | 2 +- .../src/main/java/cn/javaex/htool/crypto/rsa/RSA.java | 2 +- .../src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java | 2 +- .../src/main/java/cn/javaex/htool/crypto/sign/Sign.java | 2 +- .../src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java | 2 +- .../cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java | 2 +- .../cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java | 2 +- .../src/main/java/cn/javaex/htool/picture/PictureUtils.java | 4 ++-- 9 files changed, 10 insertions(+), 10 deletions(-) rename htool-core/src/main/java/cn/javaex/htool/core/{ => codec}/Base64Utils.java (98%) rename htool-core/src/main/java/cn/javaex/htool/core/{ => id}/IdUtils.java (99%) diff --git a/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java b/htool-core/src/main/java/cn/javaex/htool/core/codec/Base64Utils.java similarity index 98% rename from htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java rename to htool-core/src/main/java/cn/javaex/htool/core/codec/Base64Utils.java index fb9bbc7..63e60a0 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/codec/Base64Utils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.core; +package cn.javaex.htool.core.codec; import java.util.Base64; diff --git a/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/id/IdUtils.java similarity index 99% rename from htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java rename to htool-core/src/main/java/cn/javaex/htool/core/id/IdUtils.java index 89e9f14..ba32b83 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/id/IdUtils.java @@ -1,4 +1,4 @@ -package cn.javaex.htool.core; +package cn.javaex.htool.core.id; import java.net.InetAddress; import java.net.NetworkInterface; diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java index 24ae176..bcd3440 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java @@ -7,7 +7,7 @@ import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; -import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.codec.Base64Utils; import cn.javaex.htool.core.string.StringUtils; /** diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java index 13f7638..cf42954 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java @@ -9,7 +9,7 @@ import java.util.List; import javax.crypto.Cipher; -import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.codec.Base64Utils; import cn.javaex.htool.core.string.StringUtils; /** diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java index 355c855..8193d63 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java @@ -7,7 +7,7 @@ import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; -import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.codec.Base64Utils; import cn.javaex.htool.core.string.StringUtils; /** diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java index eec1003..95d1d1f 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java @@ -7,7 +7,7 @@ import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; -import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.codec.Base64Utils; import cn.javaex.htool.core.string.StringUtils; /** diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java index 0a2efa1..8e40f53 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java @@ -4,7 +4,7 @@ import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; -import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.codec.Base64Utils; /** * AES对称加密 diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java index 57da38d..639a635 100644 --- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java +++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java @@ -7,7 +7,7 @@ import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; -import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.codec.Base64Utils; /** * DES对称加密 diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java index eee852f..e3e4392 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java @@ -1,7 +1,7 @@ package cn.javaex.htool.picture; -import cn.javaex.htool.core.IdUtils; -import cn.javaex.htool.core.Base64Utils; +import cn.javaex.htool.core.codec.Base64Utils; +import cn.javaex.htool.core.id.IdUtils; import cn.javaex.htool.picture.util.BufferedImageBuilder; import javax.imageio.*; -- Gitee From d8b33c387b7a81903c8c4aab7b3b9d2f3a325eb4 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Tue, 3 Jan 2023 16:23:09 +0800 Subject: [PATCH 38/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{PictureUtils.java => ImageUtils.java} | 143 +++++++++++++++--- 1 file changed, 126 insertions(+), 17 deletions(-) rename htool-picture/src/main/java/cn/javaex/htool/picture/{PictureUtils.java => ImageUtils.java} (71%) diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java similarity index 71% rename from htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java rename to htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java index e3e4392..087c38c 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java @@ -1,12 +1,14 @@ package cn.javaex.htool.picture; -import cn.javaex.htool.core.codec.Base64Utils; -import cn.javaex.htool.core.id.IdUtils; -import cn.javaex.htool.picture.util.BufferedImageBuilder; - -import javax.imageio.*; -import javax.imageio.stream.ImageOutputStream; -import java.awt.*; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.RenderingHints; +import java.awt.Shape; +import java.awt.Toolkit; +import java.awt.Transparency; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; @@ -16,13 +18,30 @@ import java.awt.image.CropImageFilter; import java.awt.image.FilteredImageSource; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageTypeSpecifier; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; + +import cn.javaex.htool.core.codec.Base64Utils; +import cn.javaex.htool.core.id.IdUtils; +import cn.javaex.htool.picture.util.BufferedImageBuilder; /** * @author 韩建东 2022年11月27日 */ -public class PictureUtils { +public class ImageUtils { /** * 改变 图片 最低 宽度 */ @@ -133,7 +152,6 @@ public class PictureUtils { imageOutputStream.close(); return read; } catch (Exception e) { - // TODO: handle exception e.printStackTrace(); System.err.println("图片压缩失败"); return null; @@ -153,7 +171,7 @@ public class PictureUtils { } /** - * @author 韩建东 + * @author 韩建东 * @param srcBuffer 图片流 * @param text 水印文字 * @param color 水印颜色 @@ -205,7 +223,7 @@ public class PictureUtils { } /** - * @author 韩建东 + * @author 韩建东 * @param srcBuffer 图 流 * @param x 裁剪 x坐标 * @param y 裁剪 y 坐标 @@ -213,7 +231,7 @@ public class PictureUtils { * @param height 裁剪 高度 * @return BufferedImage */ - public static BufferedImage cut(BufferedImage srcBuffer,int x,int y,int width,int height) { + public static BufferedImage cut(BufferedImage srcBuffer,int x,int y,int width,int height) { int picheight = srcBuffer.getHeight(); int picwidth = srcBuffer.getWidth(); if(picheight < y+height || picwidth < x+width) { @@ -232,21 +250,23 @@ public class PictureUtils { } /** - * 将图片转为 base64 string + * 将图片转为 base64 string * @author 韩建东 * @param srcBuffer * @return String */ - public static String toBase64Str(BufferedImage srcBuffer){ - String base64Str = ""; + public static String toBase64Str(BufferedImage srcBuffer) { + String base64Str = ""; + try { ByteArrayOutputStream os = new ByteArrayOutputStream(); - ImageIO.write(srcBuffer,"jpg",os); + ImageIO.write(srcBuffer, "jpg", os); byte[] bytes = os.toByteArray(); - return Base64Utils.encodeByte(bytes); + return "data:image/jpeg;base64," + Base64Utils.encodeByte(bytes); } catch (IOException e) { System.err.printf("转换base64错误"); } + return base64Str; } @@ -261,4 +281,93 @@ public class PictureUtils { public static String rgb2Hex(int r, int g, int b) { return String.format("#%02X%02X%02X", r, g, b); } + + /** + * base64转url + * @author 陈霓清 + * @param base64Image + * @param imageFilePath : "D:\\test\\1.jpg" + * @return + * @throws IOException + */ + public static void base64ToFile(String base64Image, String imageFilePath) throws IOException { + String image = base64Image.substring(22); + if (image.startsWith(",")) { + image = base64Image.substring(23); + } + + byte[] bytes = Base64Utils.decodeByte(image); + + try (OutputStream outStream = new FileOutputStream(imageFilePath)) { + outStream.write(bytes); + outStream.flush(); + } + } + + /** + * 根据图片地址转换为base64编码字符串 + * @author 陈霓清 + * @param imageFilePath : "D:\\test\\1.jpg" + * @return + */ + public static String toBase64Str(String imageFilePath) { + byte[] bytes = null; + + try (InputStream inputStream = new FileInputStream(imageFilePath)) { + bytes = new byte[inputStream.available()]; + inputStream.read(bytes); + } catch (IOException e) { + e.printStackTrace(); + } + + // 返回Base64编码过的字节数组字符串 + return "data:image/jpeg;base64," + Base64Utils.encodeByte(bytes); + } + + /** + * 得到网页中图片的地址 + * @author 陈霓清 + * @param htmlStr + * @return + */ + public static java.util.List listImages(String htmlStr) { + java.util.List list = new ArrayList(); + Pattern p = Pattern.compile("<(img|IMG)(.*?)(>|>|/>)"); + Matcher matcher = p.matcher(htmlStr); + boolean hasPic = matcher.find(); + + // 判断是否含有图片 + if (hasPic) { + // 如果含有图片,那么持续进行查找,直到匹配不到 + while (hasPic) { + // 获取第二个分组的内容,也就是 (.*?)匹配到的 + String group = matcher.group(2); + // 匹配图片的地址 + Pattern srcText = Pattern.compile("(src|SRC)=(\"|\')(.*?)(\"|\')"); + Matcher matcher2 = srcText.matcher(group); + if (matcher2.find()) { + try { + list.add(matcher2.group(3)); + } catch (Exception e) { + + } + } + // 判断是否还有img标签 + hasPic = matcher.find(); + } + } + + return list; + } + + public static void main(String[] args) throws IOException { + BufferedImage bufferedImage = ImageIO.read(new File("D:\\test\\1.jpg")); + String base64Str = toBase64Str(bufferedImage); + System.err.println("base64Str:" + base64Str); + +// String base64Str2 = toBase64Str("D:\\test\\1.jpg"); +// System.err.println("base64Str2:" + base64Str2); + + } + } -- Gitee From 5005bc58bb762c3914d27e380f1e4bf43e0045bc Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Tue, 3 Jan 2023 17:22:04 +0800 Subject: [PATCH 39/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/picture/ImageUtils.java | 262 +++++++++--------- 1 file changed, 132 insertions(+), 130 deletions(-) diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java index 087c38c..1029ed0 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java @@ -8,14 +8,11 @@ import java.awt.Image; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.Toolkit; -import java.awt.Transparency; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.CropImageFilter; -import java.awt.image.FilteredImageSource; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; @@ -24,18 +21,13 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.imageio.IIOImage; import javax.imageio.ImageIO; -import javax.imageio.ImageTypeSpecifier; -import javax.imageio.ImageWriteParam; -import javax.imageio.ImageWriter; -import javax.imageio.stream.ImageOutputStream; import cn.javaex.htool.core.codec.Base64Utils; -import cn.javaex.htool.core.id.IdUtils; import cn.javaex.htool.picture.util.BufferedImageBuilder; /** @@ -73,91 +65,6 @@ public class ImageUtils { */ private static final int NUM_TWO = 2; - /** - * @author 韩建东 - * 自定义修改图片 大小 - * - * @param srcBuffer 修改的 图片 的流 - * @param width 自定义 变化 的 图片 宽度 - * @param height 自定义 变化 的 图片 高度 - * @return BufferedImage 图片buffer - */ - public static BufferedImage sizeChange(BufferedImage srcBuffer, int width, int height) { - if (width < MIN_PIC_WIDTH || height < MIN_PIC_HEIGHT) { - System.err.println("图片尺寸不能小于10*10"); - return null; - } - BufferedImage to = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics2D g2d = to.createGraphics(); - to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); - g2d.dispose(); - g2d = to.createGraphics(); - Image from = srcBuffer.getScaledInstance(width, height, BufferedImage.SCALE_AREA_AVERAGING); - g2d.drawImage(from, 0, 0, null); - return to; - } - - /** - * @author 韩建东 - * 等比例 处理 图片大小尺寸 - * - * @param srcBuffer 需要处理的图片流 - * @param scale 等比例数值 (0,100] 原尺寸 = 原尺寸*scale - * @return BufferedImage 图片buffer - */ - public static BufferedImage sizeProportion(BufferedImage srcBuffer, double scale) { - int width = srcBuffer.getWidth(); - int height = srcBuffer.getHeight(); - int targetWidth = (int) (width * scale); - int targetHeight = (int) (height * scale); - if (targetWidth < MIN_PIC_WIDTH || targetHeight < MIN_PIC_HEIGHT) { - System.err.println("尺寸不能再缩小"); - return null; - } - return sizeChange(srcBuffer, targetWidth, targetHeight); - } - - /** - * @author 韩建东 - * 图片的压缩 算法 - * - * @param srcBuffer 图片流 - * @param quality 质量 (0,1] - * @return BufferedImage - */ - public static BufferedImage qualityCompress(BufferedImage srcBuffer, float quality) { - if (quality <= 0 || quality > 1) { - System.err.println("参数不合法"); - return null; - } - ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next(); - ImageWriteParam imageWriteParam = writer.getDefaultWriteParam(); - ColorModel colorModel = srcBuffer.getColorModel(); - try { - String uuid = IdUtils.getUUID(); - File tempFile = File.createTempFile("quality_" + uuid, ".jpg"); - FileOutputStream fileOutputStream = new FileOutputStream(tempFile); - ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(fileOutputStream); - writer.setOutput(imageOutputStream); - if (imageWriteParam.canWriteCompressed()) { - imageWriteParam.setDestinationType(new ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16))); - imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); - imageWriteParam.setCompressionQuality(quality); - imageWriteParam.setProgressiveMode(ImageWriteParam.MODE_DISABLED); - } - writer.write(null, new IIOImage(srcBuffer, null, null), imageWriteParam); - BufferedImage read = ImageIO.read(tempFile); - tempFile.delete(); - fileOutputStream.close(); - imageOutputStream.close(); - return read; - } catch (Exception e) { - e.printStackTrace(); - System.err.println("图片压缩失败"); - return null; - } - } - /** * @author 韩建东 * 获得图片的BufferedImage 处理 图片 变红 的bug @@ -222,33 +129,6 @@ public class ImageUtils { return srcBuffer; } - /** - * @author 韩建东 - * @param srcBuffer 图 流 - * @param x 裁剪 x坐标 - * @param y 裁剪 y 坐标 - * @param width 裁剪 宽度 - * @param height 裁剪 高度 - * @return BufferedImage - */ - public static BufferedImage cut(BufferedImage srcBuffer,int x,int y,int width,int height) { - int picheight = srcBuffer.getHeight(); - int picwidth = srcBuffer.getWidth(); - if(picheight < y+height || picwidth < x+width) { - System.err.println("裁剪过高或者过宽"); - return null; - } - - CropImageFilter cropImageFilter = new CropImageFilter(x, y, width, height); - Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(srcBuffer.getSource(),cropImageFilter)); - BufferedImage destBuffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics2D g2d = destBuffer.createGraphics(); - //绘制切割后的图 - g2d.drawImage(img, 0, 0, width, height, null); - g2d.dispose(); - return destBuffer; - } - /** * 将图片转为 base64 string * @author 韩建东 @@ -324,14 +204,37 @@ public class ImageUtils { return "data:image/jpeg;base64," + Base64Utils.encodeByte(bytes); } + /** + * 图片路径转BufferedImage + * @author 陈霓清 + * @param imageFilePath + * @return + * @throws IOException + */ + public static BufferedImage read(String imageFilePath) throws IOException { + return ImageIO.read(new File(imageFilePath)); + } + + /** + * BufferedImage转图片路径 + * @author 陈霓清 + * @param bufferedImage + * @param imageFilePath : "D:\\test\\2.jpg" + * @param imageType : "JEPG" + * @throws IOException + */ + public static void write(BufferedImage bufferedImage, String imageFilePath, String imageType) throws IOException { + ImageIO.write(bufferedImage, imageType, new File(imageFilePath)); + } + /** * 得到网页中图片的地址 * @author 陈霓清 * @param htmlStr * @return */ - public static java.util.List listImages(String htmlStr) { - java.util.List list = new ArrayList(); + public static List listImages(String htmlStr) { + List list = new ArrayList(); Pattern p = Pattern.compile("<(img|IMG)(.*?)(>|>|/>)"); Matcher matcher = p.matcher(htmlStr); boolean hasPic = matcher.find(); @@ -360,14 +263,113 @@ public class ImageUtils { return list; } - public static void main(String[] args) throws IOException { - BufferedImage bufferedImage = ImageIO.read(new File("D:\\test\\1.jpg")); - String base64Str = toBase64Str(bufferedImage); - System.err.println("base64Str:" + base64Str); + /** + * 图片压缩(自定义尺寸) + * @author 陈霓清 + * @param srcBuffer 要缩放的图片 + * @param width 目标宽度像素 + * @param height 目标高度像素 + */ + public final static BufferedImage compress(BufferedImage srcBuffer, int width, int height) { + if (width < MIN_PIC_WIDTH) { + width = MIN_PIC_WIDTH; + } + if (height < MIN_PIC_HEIGHT) { + height = MIN_PIC_HEIGHT; + } + + double ratio = 0.0; // 缩放比例 + // bi.SCALE_SMOOTH 选择图像平滑度比缩放速度具有更高优先级的图像缩放算法 + Image itemp = srcBuffer.getScaledInstance(width, height, Image.SCALE_DEFAULT); + // 计算比例 + if ((srcBuffer.getHeight()>height) || (srcBuffer.getWidth()>width)) { + double ratioHeight = (new Integer(height)).doubleValue() / srcBuffer.getHeight(); + double ratioWhidth = (new Integer(width)).doubleValue() / srcBuffer.getWidth(); + if (ratioHeight > ratioWhidth) { + ratio = ratioHeight; + } else { + ratio = ratioWhidth; + } + // 仿射转换 + // 返回表示剪切变换的变换 + AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null); + // 转换源 BufferedImage 并将结果存储在目标 BufferedImage 中 + itemp = op.filter(srcBuffer, null); + } -// String base64Str2 = toBase64Str("D:\\test\\1.jpg"); -// System.err.println("base64Str2:" + base64Str2); + // 补白 + // 构造一个类型为预定义图像类型之一的 BufferedImage + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + //创建一个 Graphics2D,可以将它绘制到此 BufferedImage 中 + Graphics2D g = image.createGraphics(); + g.setColor(Color.white); //控制颜色 + g.fillRect(0, 0, width, height); // 使用 Graphics2D 上下文的设置,填充 Shape 的内部区域 + if (width == itemp.getWidth(null)) { + g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, + itemp.getWidth(null), itemp.getHeight(null), + Color.white, null); + } else { + g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, + itemp.getWidth(null), itemp.getHeight(null), + Color.white, null); + } + g.dispose(); + itemp = image; + return (BufferedImage) itemp; + } + + /** + * 图片压缩(等比例压缩) + * @author 陈霓清 + * @param srcBuffer 要缩放的图片 + * @param quality 压缩率(0~1之间) + */ + public final static BufferedImage compress(BufferedImage srcBuffer, float quality) { + if (quality <= 0 || quality > 1) { + System.err.println("参数不合法"); + return null; + } + + int width = (int) (srcBuffer.getWidth() * quality); + int height = (int) (srcBuffer.getHeight() * quality); + + return compress(srcBuffer, height, width); + } + + /** + * 裁剪图片方法 + * @author 陈霓清 + * @param bufferedImage 图像源 + * @param startX 裁剪开始x坐标 + * @param startY 裁剪开始y坐标 + * @param endX 裁剪结束x坐标 + * @param endY 裁剪结束y坐标 + * @return + */ + public static BufferedImage cut(BufferedImage bufferedImage, int startX, int startY, int endX, int endY) { + int width = bufferedImage.getWidth(); + int height = bufferedImage.getHeight(); + if (startX == -1) { + startX = 0; + } + if (startY == -1) { + startY = 0; + } + if (endX == -1) { + endX = width - 1; + } + if (endY == -1) { + endY = height - 1; + } + BufferedImage result = new BufferedImage(endX-startX, endY-startY, 4); + for (int x=startX; x Date: Wed, 4 Jan 2023 11:01:49 +0800 Subject: [PATCH 40/44] =?UTF-8?q?=E6=96=B0=E5=A2=9EHttpClient=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaex/htool/core/string/StringUtils.java | 18 + htool-http/pom.xml | 16 + .../java/cn/javaex/htool/http/HtmlUtils.java | 25 ++ .../java/cn/javaex/htool/http/HttpUtils.java | 311 ------------------ .../http/httpclient/HttpClientResult.java | 76 +++++ .../htool/http/httpclient/HttpUtils.java | 258 +++++++++++++++ .../httpclient/handler/HttpClientHandler.java | 199 +++++++++++ 7 files changed, 592 insertions(+), 311 deletions(-) delete mode 100644 htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java create mode 100644 htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java create mode 100644 htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java create mode 100644 htool-http/src/main/java/cn/javaex/htool/http/httpclient/handler/HttpClientHandler.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java index 023d158..9464954 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java @@ -660,4 +660,22 @@ public class StringUtils { return str.substring(0, str.length() - 1); } + /** + * 含unicode字符串转utf-8 + * @param str + * @return + */ + public static String unicodeToString(String str) { + Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))"); + Matcher matcher = pattern.matcher(str); + char ch; + while (matcher.find()) { + String group = matcher.group(2); + ch = (char) Integer.parseInt(group, 16); + String group1 = matcher.group(1); + str = str.replace(group1, ch + ""); + } + return str; + } + } diff --git a/htool-http/pom.xml b/htool-http/pom.xml index bac0e02..b64afac 100644 --- a/htool-http/pom.xml +++ b/htool-http/pom.xml @@ -17,6 +17,22 @@ provided
+ + org.apache.httpcomponents + httpclient + 4.5.14 + + + + cn.javaex + htool-core + ${project.parent.version} + + + com.alibaba + fastjson + 1.2.62 + eu.bitwalker UserAgentUtils diff --git a/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java index c4a3df7..f5b9e6a 100644 --- a/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java @@ -1,5 +1,30 @@ package cn.javaex.htool.http; +/** + * html文本内容工具类 + * + * @author 陈霓清 + * @Date 2023年1月3日 + */ public class HtmlUtils { + /** + * 过滤HTML文本,防止XSS攻击 + * + * @param htmlContent HTML内容 + * @return 过滤后的内容 + */ + public static String filter(String htmlContent) { + if (htmlContent==null || htmlContent.length()==0) { + return htmlContent; + } + + // 删除普通标签 + htmlContent = htmlContent.replaceAll("<(S*?)[^>]*>.*?|<.*? />", ""); + // 删除转义字符 + htmlContent = htmlContent.replaceAll("&.{2,6}?;", ""); + + return htmlContent; + } + } diff --git a/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java deleted file mode 100644 index a7c8e48..0000000 --- a/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java +++ /dev/null @@ -1,311 +0,0 @@ -//package cn.javaex.htool.http; -// -//import java.io.UnsupportedEncodingException; -//import java.net.URLEncoder; -//import java.security.KeyManagementException; -//import java.security.NoSuchAlgorithmException; -//import java.security.cert.X509Certificate; -//import java.util.ArrayList; -//import java.util.List; -//import java.util.Map; -// -//import javax.net.ssl.SSLContext; -//import javax.net.ssl.TrustManager; -//import javax.net.ssl.X509TrustManager; -// -//import org.apache.http.HttpResponse; -//import org.apache.http.NameValuePair; -//import org.apache.http.client.HttpClient; -//import org.apache.http.client.entity.UrlEncodedFormEntity; -//import org.apache.http.client.methods.HttpDelete; -//import org.apache.http.client.methods.HttpGet; -//import org.apache.http.client.methods.HttpPost; -//import org.apache.http.client.methods.HttpPut; -//import org.apache.http.conn.ClientConnectionManager; -//import org.apache.http.conn.scheme.Scheme; -//import org.apache.http.conn.scheme.SchemeRegistry; -//import org.apache.http.conn.ssl.SSLSocketFactory; -//import org.apache.http.entity.ByteArrayEntity; -//import org.apache.http.entity.StringEntity; -//import org.apache.http.impl.client.DefaultHttpClient; -//import org.apache.http.message.BasicNameValuePair; -// -//public class HttpUtils { -// -// /** -// * get -// * -// * @param host -// * @param path -// * @param method -// * @param headers -// * @param querys -// * @return -// * @throws Exception -// */ -// public static HttpResponse doGet(String host, String path, String method, -// Map headers, -// Map querys) -// throws Exception { -// HttpClient httpClient = wrapClient(host); -// -// HttpGet request = new HttpGet(buildUrl(host, path, querys)); -// for (Map.Entry e : headers.entrySet()) { -// request.addHeader(e.getKey(), e.getValue()); -// } -// -// return httpClient.execute(request); -// } -// -// /** -// * post form -// * -// * @param host -// * @param path -// * @param method -// * @param headers -// * @param querys -// * @param bodys -// * @return -// * @throws Exception -// */ -// public static HttpResponse doPost(String host, String path, String method, -// Map headers, -// Map querys, -// Map bodys) -// throws Exception { -// HttpClient httpClient = wrapClient(host); -// -// HttpPost request = new HttpPost(buildUrl(host, path, querys)); -// for (Map.Entry e : headers.entrySet()) { -// request.addHeader(e.getKey(), e.getValue()); -// } -// -// if (bodys != null) { -// List nameValuePairList = new ArrayList(); -// -// for (String key : bodys.keySet()) { -// nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key))); -// } -// UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8"); -// formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); -// request.setEntity(formEntity); -// } -// -// return httpClient.execute(request); -// } -// -// /** -// * Post String -// * -// * @param host -// * @param path -// * @param method -// * @param headers -// * @param querys -// * @param body -// * @return -// * @throws Exception -// */ -// public static HttpResponse doPost(String host, String path, String method, -// Map headers, -// Map querys, -// String body) -// throws Exception { -// HttpClient httpClient = wrapClient(host); -// -// HttpPost request = new HttpPost(buildUrl(host, path, querys)); -// for (Map.Entry e : headers.entrySet()) { -// request.addHeader(e.getKey(), e.getValue()); -// } -// -// if (StringUtils.isNotBlank(body)) { -// request.setEntity(new StringEntity(body, "utf-8")); -// } -// -// return httpClient.execute(request); -// } -// -// /** -// * Post stream -// * -// * @param host -// * @param path -// * @param method -// * @param headers -// * @param querys -// * @param body -// * @return -// * @throws Exception -// */ -// public static HttpResponse doPost(String host, String path, String method, -// Map headers, -// Map querys, -// byte[] body) -// throws Exception { -// HttpClient httpClient = wrapClient(host); -// -// HttpPost request = new HttpPost(buildUrl(host, path, querys)); -// for (Map.Entry e : headers.entrySet()) { -// request.addHeader(e.getKey(), e.getValue()); -// } -// -// if (body != null) { -// request.setEntity(new ByteArrayEntity(body)); -// } -// -// return httpClient.execute(request); -// } -// -// /** -// * Put String -// * @param host -// * @param path -// * @param method -// * @param headers -// * @param querys -// * @param body -// * @return -// * @throws Exception -// */ -// public static HttpResponse doPut(String host, String path, String method, -// Map headers, -// Map querys, -// String body) -// throws Exception { -// HttpClient httpClient = wrapClient(host); -// -// HttpPut request = new HttpPut(buildUrl(host, path, querys)); -// for (Map.Entry e : headers.entrySet()) { -// request.addHeader(e.getKey(), e.getValue()); -// } -// -// if (StringUtils.isNotBlank(body)) { -// request.setEntity(new StringEntity(body, "utf-8")); -// } -// -// return httpClient.execute(request); -// } -// -// /** -// * Put stream -// * @param host -// * @param path -// * @param method -// * @param headers -// * @param querys -// * @param body -// * @return -// * @throws Exception -// */ -// public static HttpResponse doPut(String host, String path, String method, -// Map headers, -// Map querys, -// byte[] body) -// throws Exception { -// HttpClient httpClient = wrapClient(host); -// -// HttpPut request = new HttpPut(buildUrl(host, path, querys)); -// for (Map.Entry e : headers.entrySet()) { -// request.addHeader(e.getKey(), e.getValue()); -// } -// -// if (body != null) { -// request.setEntity(new ByteArrayEntity(body)); -// } -// -// return httpClient.execute(request); -// } -// -// /** -// * Delete -// * -// * @param host -// * @param path -// * @param method -// * @param headers -// * @param querys -// * @return -// * @throws Exception -// */ -// public static HttpResponse doDelete(String host, String path, String method, -// Map headers, -// Map querys) -// throws Exception { -// HttpClient httpClient = wrapClient(host); -// -// HttpDelete request = new HttpDelete(buildUrl(host, path, querys)); -// for (Map.Entry e : headers.entrySet()) { -// request.addHeader(e.getKey(), e.getValue()); -// } -// -// return httpClient.execute(request); -// } -// -// private static String buildUrl(String host, String path, Map querys) throws UnsupportedEncodingException { -// StringBuilder sbUrl = new StringBuilder(); -// sbUrl.append(host); -// if (!StringUtils.isBlank(path)) { -// sbUrl.append(path); -// } -// if (null != querys) { -// StringBuilder sbQuery = new StringBuilder(); -// for (Map.Entry query : querys.entrySet()) { -// if (0 < sbQuery.length()) { -// sbQuery.append("&"); -// } -// if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) { -// sbQuery.append(query.getValue()); -// } -// if (!StringUtils.isBlank(query.getKey())) { -// sbQuery.append(query.getKey()); -// if (!StringUtils.isBlank(query.getValue())) { -// sbQuery.append("="); -// sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8")); -// } -// } -// } -// if (0 < sbQuery.length()) { -// sbUrl.append("?").append(sbQuery); -// } -// } -// -// return sbUrl.toString(); -// } -// -// private static HttpClient wrapClient(String host) { -// HttpClient httpClient = new DefaultHttpClient(); -// if (host.startsWith("https://")) { -// sslClient(httpClient); -// } -// -// return httpClient; -// } -// -// private static void sslClient(HttpClient httpClient) { -// try { -// SSLContext ctx = SSLContext.getInstance("TLS"); -// X509TrustManager tm = new X509TrustManager() { -// public X509Certificate[] getAcceptedIssuers() { -// return null; -// } -// public void checkClientTrusted(X509Certificate[] xcs, String str) { -// -// } -// public void checkServerTrusted(X509Certificate[] xcs, String str) { -// -// } -// }; -// ctx.init(null, new TrustManager[] { tm }, null); -// SSLSocketFactory ssf = new SSLSocketFactory(ctx); -// ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); -// ClientConnectionManager ccm = httpClient.getConnectionManager(); -// SchemeRegistry registry = ccm.getSchemeRegistry(); -// registry.register(new Scheme("https", 443, ssf)); -// } catch (KeyManagementException ex) { -// throw new RuntimeException(ex); -// } catch (NoSuchAlgorithmException ex) { -// throw new RuntimeException(ex); -// } -// } -//} diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java new file mode 100644 index 0000000..3038917 --- /dev/null +++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java @@ -0,0 +1,76 @@ +package cn.javaex.htool.http.httpclient; + +import java.io.Serializable; + +import org.apache.http.HttpEntity; + +/** + * http响应结果封装 + * + * @author 陈霓清 + * @Date 2023年1月3日 + */ +public class HttpClientResult implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 响应状态码 + */ + private int code; + /** + * 响应数据 + */ + private HttpEntity entity; + /** + * 响应数据转byte[] + */ + private byte[] body; + /** + * 响应数据转String + */ + private String content; + + public HttpClientResult(int scInternalServerError) { + this.code = scInternalServerError; + } + + public HttpClientResult(int code, HttpEntity entity, byte[] body, String content) { + this.code = code; + this.entity = entity; + this.body = body; + this.content = content; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public HttpEntity getEntity() { + return entity; + } + + public void setEntity(HttpEntity entity) { + this.entity = entity; + } + + public byte[] getBody() { + return body; + } + + public void setBody(byte[] body) { + this.body = body; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + +} diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java new file mode 100644 index 0000000..34a4ca1 --- /dev/null +++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java @@ -0,0 +1,258 @@ +package cn.javaex.htool.http.httpclient; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.entity.StringEntity; +import org.apache.http.message.BasicNameValuePair; + +import com.alibaba.fastjson.JSON; + +import cn.javaex.htool.core.string.StringUtils; +import cn.javaex.htool.http.httpclient.handler.HttpClientHandler; + +/** + * HttpClient工具类 + * + * @author 陈霓清 + * @Date 2023年1月4日 + */ +public class HttpUtils { + + public static void main(String[] args) throws Exception { + // http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E5%85%B3%E9%94%AE%E5%AD%97&bk_length=600 +// Map querys = new HashMap(); +// querys.put("scope", "103"); +// querys.put("format", "json"); +// querys.put("appid", "379020"); +// querys.put("bk_key", "梅西"); +// querys.put("bk_length", "600"); +// +// HttpClientResult result = doGet("https://baike.baidu.com/api/openapi/BaikeLemmaCardApi", new HashMap(), querys); +// System.out.println(result.getContent()); + + + // 请求数据 + String url="https://qajjmtsfe-api.jjmc.cn/token/create"; + Map reqParam=new HashMap<>(); + reqParam.put("key","e8e881e7-8202-ed11-bb3a-0017fa025f41"); + HttpClientResult httpClientResult = HttpUtils.doPostWithJson(url, null, null, JSON.toJSONString(reqParam)); + System.out.println(httpClientResult.getContent()); + + System.out.println("OK"); + } + + /** + * GET请求 + * @param url + * @param headers + * @param querys + * @return + * @throws Exception + */ + public static HttpClientResult doGet(String url, Map headers, Map querys) throws Exception { + HttpClientHandler httpClientHandler = new HttpClientHandler(); + + HttpClient httpClient = httpClientHandler.wrapClient(url); + HttpGet request = new HttpGet(httpClientHandler.buildUrl(url, querys)); + // 封装请求头 + httpClientHandler.packageHeader(request, headers); + + HttpResponse httpResponse = httpClient.execute(request); + return httpClientHandler.getHttpClientResult(httpResponse); + } + + /** + * POST请求 + * @param url + * @param headers + * @param querys + * @param bodys + * @return + * @throws Exception + */ + public static HttpClientResult doPost(String url, Map headers, Map querys, Map bodys) throws Exception { + HttpClientHandler httpClientHandler = new HttpClientHandler(); + + HttpClient httpClient = httpClientHandler.wrapClient(url); + HttpPost request = new HttpPost(httpClientHandler.buildUrl(url, querys)); + // 封装请求头 + httpClientHandler.packageHeader(request, headers); + + if (bodys != null) { + List nameValuePairList = new ArrayList(); + + for (String key : bodys.keySet()) { + nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key))); + } + UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "UTF-8"); + formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); + request.setEntity(formEntity); + } + + HttpResponse httpResponse = httpClient.execute(request); + return httpClientHandler.getHttpClientResult(httpResponse); + } + + /** + * POST请求 + * @param url + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpClientResult doPost(String url, Map headers, Map querys, String body) throws Exception { + HttpClientHandler httpClientHandler = new HttpClientHandler(); + + HttpClient httpClient = httpClientHandler.wrapClient(url); + HttpPost request = new HttpPost(httpClientHandler.buildUrl(url, querys)); + // 封装请求头 + httpClientHandler.packageHeader(request, headers); + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "UTF-8")); + } + + HttpResponse httpResponse = httpClient.execute(request); + return httpClientHandler.getHttpClientResult(httpResponse); + } + + /** + * POST请求 + * @param url + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpClientResult doPost(String url, Map headers, Map querys, byte[] body) throws Exception { + HttpClientHandler httpClientHandler = new HttpClientHandler(); + + HttpClient httpClient = httpClientHandler.wrapClient(url); + HttpPost request = new HttpPost(httpClientHandler.buildUrl(url, querys)); + // 封装请求头 + httpClientHandler.packageHeader(request, headers); + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + HttpResponse httpResponse = httpClient.execute(request); + return httpClientHandler.getHttpClientResult(httpResponse); + } + + /** + * POST请求 + * @param url + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpClientResult doPostWithJson(String url, Map headers, Map querys, String body) throws Exception { + HttpClientHandler httpClientHandler = new HttpClientHandler(); + + HttpClient httpClient = httpClientHandler.wrapClient(url); + HttpPost request = new HttpPost(httpClientHandler.buildUrl(url, querys)); + // 封装请求头 + Map reqHeaders = new HashMap<>(); + reqHeaders.put("Content-type", "application/json"); + if (headers != null) { + reqHeaders.putAll(headers); + } + httpClientHandler.packageHeader(request, reqHeaders); + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "UTF-8")); + } + + HttpResponse httpResponse = httpClient.execute(request); + return httpClientHandler.getHttpClientResult(httpResponse); + } + + /** + * PUT请求 + * @param url + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpClientResult doPut(String url, Map headers, Map querys, String body) throws Exception { + HttpClientHandler httpClientHandler = new HttpClientHandler(); + + HttpClient httpClient = httpClientHandler.wrapClient(url); + HttpPut request = new HttpPut(httpClientHandler.buildUrl(url, querys)); + // 封装请求头 + httpClientHandler.packageHeader(request, headers); + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "UTF-8")); + } + + HttpResponse httpResponse = httpClient.execute(request); + return httpClientHandler.getHttpClientResult(httpResponse); + } + + /** + * PUT请求 + * @param url + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpClientResult doPut(String url, Map headers, Map querys, byte[] body) throws Exception { + HttpClientHandler httpClientHandler = new HttpClientHandler(); + + HttpClient httpClient = httpClientHandler.wrapClient(url); + HttpPut request = new HttpPut(httpClientHandler.buildUrl(url, querys)); + // 封装请求头 + httpClientHandler.packageHeader(request, headers); + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + HttpResponse httpResponse = httpClient.execute(request); + return httpClientHandler.getHttpClientResult(httpResponse); + } + + /** + * DELETE请求 + * @param url + * @param headers + * @param querys + * @return + * @throws Exception + */ + public static HttpClientResult doDelete(String url, Map headers, Map querys) throws Exception { + HttpClientHandler httpClientHandler = new HttpClientHandler(); + + HttpClient httpClient = httpClientHandler.wrapClient(url); + HttpDelete request = new HttpDelete(httpClientHandler.buildUrl(url, querys)); + // 封装请求头 + httpClientHandler.packageHeader(request, headers); + + HttpResponse httpResponse = httpClient.execute(request); + return httpClientHandler.getHttpClientResult(httpResponse); + } + +} diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/handler/HttpClientHandler.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/handler/HttpClientHandler.java new file mode 100644 index 0000000..867a280 --- /dev/null +++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/handler/HttpClientHandler.java @@ -0,0 +1,199 @@ +package cn.javaex.htool.http.httpclient.handler; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.util.Map; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; + +import cn.javaex.htool.core.string.StringUtils; +import cn.javaex.htool.http.httpclient.HttpClientResult; + +/** + * HttpClient公共方法 + * + * @author 陈霓清 + * @Date 2023年1月4日 + */ +public class HttpClientHandler { + + /** + * 构造HttpClient + * @param host + * @return + * @throws Exception + */ + public HttpClient wrapClient(String host) throws Exception { + HttpClient httpClient = new DefaultHttpClient(); + if (host.startsWith("https://")) { + this.sslClient(httpClient); + } + + return httpClient; + } + + /** + * SSL + * @param httpClient + */ + @SuppressWarnings("deprecation") + private void sslClient(HttpClient httpClient) { + try { + SSLContext ctx = SSLContext.getInstance("TLS"); + X509TrustManager tm = new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + public void checkClientTrusted(X509Certificate[] xcs, String str) { + + } + public void checkServerTrusted(X509Certificate[] xcs, String str) { + + } + }; + ctx.init(null, new TrustManager[] { tm }, null); + SSLSocketFactory ssf = new SSLSocketFactory(ctx); + ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + ClientConnectionManager ccm = httpClient.getConnectionManager(); + SchemeRegistry registry = ccm.getSchemeRegistry(); + registry.register(new Scheme("https", 443, ssf)); + } catch (KeyManagementException ex) { + throw new RuntimeException(ex); + } catch (NoSuchAlgorithmException ex) { + throw new RuntimeException(ex); + } + } + + /** + * 拼接URL + * @param url + * @param querys 查询参数 + * @return + * @throws UnsupportedEncodingException + */ + public String buildUrl(String url, Map querys) throws UnsupportedEncodingException { + StringBuffer sbUrl = new StringBuffer(); + sbUrl.append(url); + + if (querys != null) { + StringBuffer sbQuery = new StringBuffer(); + for (Map.Entry query : querys.entrySet()) { + if (0 < sbQuery.length()) { + sbQuery.append("&"); + } + if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) { + sbQuery.append(query.getValue()); + } + if (!StringUtils.isBlank(query.getKey())) { + sbQuery.append(query.getKey()); + if (!StringUtils.isBlank(query.getValue())) { + sbQuery.append("="); + sbQuery.append(URLEncoder.encode(query.getValue(), "UTF-8")); + } + } + } + if (0 < sbQuery.length()) { + sbUrl.append("?").append(sbQuery); + } + } + + return sbUrl.toString(); + } + + /** + * 封装请求头 + * @param request + * @param headers + */ + public void packageHeader(HttpGet request, Map headers) { + if (headers != null) { + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + } + } + + /** + * 封装请求头 + * @param request + * @param headers + */ + public void packageHeader(HttpPost request, Map headers) { + if (headers != null) { + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + } + } + + /** + * 封装请求头 + * @param request + * @param headers + */ + public void packageHeader(HttpPut request, Map headers) { + if (headers != null) { + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + } + } + + /** + * 封装请求头 + * @param request + * @param headers + */ + public void packageHeader(HttpDelete request, Map headers) { + if (headers != null) { + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + } + } + + /** + * 获取返回结果 + * @param httpResponse + * @return + * @throws IOException + */ + public HttpClientResult getHttpClientResult(HttpResponse httpResponse) throws IOException { + if (httpResponse != null && httpResponse.getStatusLine() != null) { + byte[] body = null; + String content = ""; + + if (httpResponse.getEntity() != null) { + body = EntityUtils.toByteArray(httpResponse.getEntity()); + + content = new String(body, "UTF-8"); + content = StringUtils.unicodeToString(content); + } + + return new HttpClientResult(httpResponse.getStatusLine().getStatusCode(), httpResponse.getEntity(), body, content); + } + + return new HttpClientResult(HttpStatus.SC_INTERNAL_SERVER_ERROR); + } + +} -- Gitee From 64d39bf3b202bffcfadcf519a7f1047b4bb8fdbe Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Wed, 4 Jan 2023 11:53:44 +0800 Subject: [PATCH 41/44] 20230104 --- .../cn/javaex/htool/core/io/FileUtils.java | 138 +++++++++--------- .../htool/core/io/handler/PathHandler.java | 73 --------- .../http/httpclient/HttpClientResult.java | 21 +-- .../htool/http/httpclient/HttpUtils.java | 25 ---- 4 files changed, 77 insertions(+), 180 deletions(-) delete mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java index 0cdbc98..4b4753c 100644 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java +++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java @@ -16,13 +16,11 @@ import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.javaex.htool.core.io.handler.FileHandler; import cn.javaex.htool.core.io.handler.FileHelper; import cn.javaex.htool.core.io.handler.FilenameHandler; -import cn.javaex.htool.core.io.handler.PathHandler; import cn.javaex.htool.core.io.model.TreeFile; import cn.javaex.htool.core.string.StringUtils; @@ -512,35 +510,35 @@ public class FileUtils extends FileHelper { /** * 下载resources文件夹下的文件 - * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx - * @param newFileName 重命名文件名称(带后缀) + * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx + * @param newFilename 重命名文件名称(带后缀) */ - public static void downloadFileFromResource(HttpServletResponse response, String filePath, String newFileName) { - if (newFileName==null || newFileName.length()==0) { - newFileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length()); + public static void downloadFileFromResource(HttpServletResponse response, String filePath, String newFilename) { + if (filePath.startsWith("/")) { + filePath = filePath.substring(1); } - InputStream inputStream = PathHandler.getInputStreamFromResource(filePath); - downloadFile(response, inputStream, newFileName); + InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath); + downloadFile(response, inputStream, newFilename); } /** * 下载文件(InputStream流) - * @param in InputStream流 - * @param newFileName 重命名文件名称(带后缀) + * @param inputStream + * @param newFilename 重命名文件名称(带后缀) */ - public static void downloadFile(HttpServletResponse response, InputStream in, String newFileName) { + public static void downloadFile(HttpServletResponse response, InputStream inputStream, String newFilename) { OutputStream out = null; try { + newFilename = java.net.URLEncoder.encode(newFilename, "UTF-8"); response.setContentType("application/octet-stream"); - newFileName = java.net.URLEncoder.encode(newFileName, "UTF-8"); - response.setHeader("Content-disposition", "attachment; filename=" + newFileName); + response.setHeader("Content-disposition", "attachment; filename=" + newFilename); out = response.getOutputStream(); int b = 0; byte[] buffer = new byte[BUFFER_SIZE]; - while ((b = in.read(buffer)) != -1) { + while ((b = inputStream.read(buffer)) != -1) { out.write(buffer, 0, b); } @@ -549,42 +547,46 @@ public class FileUtils extends FileHelper { e.printStackTrace(); } finally { IOUtils.closeQuietly(out); - IOUtils.closeQuietly(in); + IOUtils.closeQuietly(inputStream); } } + /** + * 下载文件(byte[]字节数组) + * @param bytes + * @param newFilename 重命名文件名称(带后缀) + */ + public static void downloadFile(HttpServletResponse response, byte[] bytes, String newFilename) { + try (OutputStream out = response.getOutputStream()) { + if (bytes != null) { + newFilename = java.net.URLEncoder.encode(newFilename, "UTF-8"); + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment; filename=" + newFilename); + out.write(bytes); + out.flush(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + /** * 下载文件(不重命名) - * @param filePath 文件的路径(带具体的文件名) - * 如果是相对路径,则认为是项目的同级目录 - * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 + * @param filePath 文件的绝对路径(带具体的文件名) */ - public static void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath) { - downloadFile(request, response, filePath, null); + public static void downloadFile(HttpServletResponse response, String filePath) { + downloadFile(response, filePath, null); } /** * 下载文件(重命名) - * @param filePath 文件的路径(带具体的文件名) - * 如果是相对路径,则认为是项目的同级目录 - * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径 - * @param newFileName 重命名文件名称(带后缀) - */ - public static void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath, String newFileName) { - // 传入的路径是否是绝对路径 - boolean isAbsolutePath = PathHandler.isAbsolutePath(filePath); - // 存储文件的物理路径 - String fileAbsolutePath = ""; - if (isAbsolutePath) { - fileAbsolutePath = filePath; - } else { - String projectPath = PathHandler.getProjectPath(request); - fileAbsolutePath = projectPath + File.separator + filePath; - } - - File file = new File(fileAbsolutePath); - if (newFileName==null || newFileName.length()==0) { - newFileName = file.getName(); + * @param filePath 文件的绝对路径(带具体的文件名) + * @param newFilename 重命名文件名称(带后缀) + */ + public static void downloadFile(HttpServletResponse response, String filePath, String newFilename) { + File file = new File(filePath); + if (StringUtils.isEmpty(newFilename)) { + newFilename = file.getName(); } BufferedInputStream bis = null; @@ -592,7 +594,7 @@ public class FileUtils extends FileHelper { try { response.setContentType("application/octet-stream"); - response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(newFileName, "UTF-8")); + response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(newFilename, "UTF-8")); response.setHeader("Content-Length", String.valueOf(file.length())); bis = new BufferedInputStream(new FileInputStream(file)); @@ -623,44 +625,44 @@ public class FileUtils extends FileHelper { * a/b.txt/c --> "" * a/b/c --> "" * - * @param fileName + * @param filename * @return */ - public static String getExtension(String fileName) { - if (StringUtils.isEmpty(fileName)) { - return fileName; + public static String getExtension(String filename) { + if (StringUtils.isEmpty(filename)) { + return filename; } // 如果是Linux下的特殊文件后缀,则直接返回 for (String specialExtension : SPECIAL_EXTENSION) { - if (fileName.endsWith(EXTENSION_SEPARATOR_STR + specialExtension)) { + if (filename.endsWith(EXTENSION_SEPARATOR_STR + specialExtension)) { return specialExtension; } } - int index = FilenameHandler.indexOfExtension(fileName); + int index = FilenameHandler.indexOfExtension(filename); if (index == NOT_FOUND) { return EMPTY_STRING; } - return fileName.substring(index + 1); + return filename.substring(index + 1); } /** * 获取文件的名称,不包括文件后缀和文件路径 *
 	 * a/b/c.txt --> c
-	 * a.txt	 --> a
-	 * a/b/c	 --> c
-	 * a/b/c/	--> ""
+	 * a.txt     --> a
+	 * a/b/c     --> c
+	 * a/b/c/    --> ""
 	 * 
- * @param fileName + * @param filename * @return */ - public static String getBaseName(String fileName) { - fileName = FilenameHandler.getName(fileName); - String extension = getExtension(fileName); + public static String getBaseName(String filename) { + filename = FilenameHandler.getName(filename); + String extension = getExtension(filename); - return fileName.replace(EXTENSION_SEPARATOR_STR + extension, ""); + return filename.replace(EXTENSION_SEPARATOR_STR + extension, ""); } /** @@ -671,16 +673,16 @@ public class FileUtils extends FileHelper { * a/b/c --> c * a/b/c/ --> "" * - * @param fileName + * @param filename * @return */ - public static String getName(String fileName) { - if (StringUtils.isEmpty(fileName)) { - return fileName; + public static String getName(String filename) { + if (StringUtils.isEmpty(filename)) { + return filename; } - int index = FilenameHandler.indexOfLastSeparator(fileName); - return fileName.substring(index + 1); + int index = FilenameHandler.indexOfLastSeparator(filename); + return filename.substring(index + 1); } /** @@ -692,13 +694,13 @@ public class FileUtils extends FileHelper { * a/b/c --> a/b/ * *

- * @param fileName + * @param filename * @return */ - public static String getFullPath(String fileName) { - String name = getName(fileName); - int indexOf = fileName.indexOf(name); - return fileName.substring(0, indexOf); + public static String getFullPath(String filename) { + String name = getName(filename); + int indexOf = filename.indexOf(name); + return filename.substring(0, indexOf); } } diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java deleted file mode 100644 index bc9cc35..0000000 --- a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java +++ /dev/null @@ -1,73 +0,0 @@ -package cn.javaex.htool.core.io.handler; - -import java.io.File; -import java.io.InputStream; - -import javax.servlet.http.HttpServletRequest; - -/*** - * 路径工具类 - * - * @author 陈霓清 - * @Date 2022年12月1日 - */ -public class PathHandler { - - /** - * 判断是否是绝对路径 - * @param path - * @return - */ - public static boolean isAbsolutePath(String path) { - path = path.substring(0, 2); - return path.startsWith("/") || path.endsWith(":"); - } - - /** - * 获取项目所在磁盘的文件夹路径,并设置临时目录 - * @param request - * @return - */ - public static String getFolderPath(HttpServletRequest request) { - String projectPath = getProjectPath(request); - String folderPath = projectPath + File.separator + "temp_download"; - File file = new File(folderPath); - file.mkdirs(); - - return folderPath; - } - - /** - * 获取项目所在磁盘的文件夹路径 - * @return - */ - public static String getProjectPath(HttpServletRequest request) { - try { - // 获取地址内容,原路径(项目名) - String realPath = request.getSession().getServletContext().getRealPath("/"); - // tomcat webapps下部署 - if (realPath!=null && realPath.length()>0 && realPath.contains("apache-tomcat")) { - String path = request.getContextPath(); // 项目名 - path = path.replace("/", File.separator) + File.separator; - return realPath.replace(path, ""); - } - - return System.getProperty("user.dir"); - } catch (Exception e) { - return System.getProperty("user.dir"); - } - } - - /** - * 根据resources下的文件路径获取流 - * @param path 例如:template/excel/模板.xlsx - * @return - */ - public static InputStream getInputStreamFromResource(String path) { - if (path.startsWith("/")) { - path = path.substring(1); - } - - return Thread.currentThread().getContextClassLoader().getResourceAsStream(path); - } -} diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java index 3038917..126e427 100644 --- a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java @@ -24,7 +24,7 @@ public class HttpClientResult implements Serializable { /** * 响应数据转byte[] */ - private byte[] body; + private byte[] bytes; /** * 响应数据转String */ @@ -34,41 +34,34 @@ public class HttpClientResult implements Serializable { this.code = scInternalServerError; } - public HttpClientResult(int code, HttpEntity entity, byte[] body, String content) { + public HttpClientResult(int code, HttpEntity entity, byte[] bytes, String content) { this.code = code; this.entity = entity; - this.body = body; + this.bytes = bytes; this.content = content; } public int getCode() { return code; } - public void setCode(int code) { this.code = code; } - public HttpEntity getEntity() { return entity; } - public void setEntity(HttpEntity entity) { this.entity = entity; } - - public byte[] getBody() { - return body; + public byte[] getBytes() { + return bytes; } - - public void setBody(byte[] body) { - this.body = body; + public void setBytes(byte[] bytes) { + this.bytes = bytes; } - public String getContent() { return content; } - public void setContent(String content) { this.content = content; } diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java index 34a4ca1..cbc361e 100644 --- a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java @@ -17,8 +17,6 @@ import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.StringEntity; import org.apache.http.message.BasicNameValuePair; -import com.alibaba.fastjson.JSON; - import cn.javaex.htool.core.string.StringUtils; import cn.javaex.htool.http.httpclient.handler.HttpClientHandler; @@ -30,29 +28,6 @@ import cn.javaex.htool.http.httpclient.handler.HttpClientHandler; */ public class HttpUtils { - public static void main(String[] args) throws Exception { - // http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E5%85%B3%E9%94%AE%E5%AD%97&bk_length=600 -// Map querys = new HashMap(); -// querys.put("scope", "103"); -// querys.put("format", "json"); -// querys.put("appid", "379020"); -// querys.put("bk_key", "梅西"); -// querys.put("bk_length", "600"); -// -// HttpClientResult result = doGet("https://baike.baidu.com/api/openapi/BaikeLemmaCardApi", new HashMap(), querys); -// System.out.println(result.getContent()); - - - // 请求数据 - String url="https://qajjmtsfe-api.jjmc.cn/token/create"; - Map reqParam=new HashMap<>(); - reqParam.put("key","e8e881e7-8202-ed11-bb3a-0017fa025f41"); - HttpClientResult httpClientResult = HttpUtils.doPostWithJson(url, null, null, JSON.toJSONString(reqParam)); - System.out.println(httpClientResult.getContent()); - - System.out.println("OK"); - } - /** * GET请求 * @param url -- Gitee From bb482ba440424ceeb2a8c5ad12b6f37597a12bcc Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Wed, 4 Jan 2023 13:07:55 +0800 Subject: [PATCH 42/44] 20230104 --- .../core/collection/CollectionUtils.java | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java diff --git a/htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java deleted file mode 100644 index 4a54a9b..0000000 --- a/htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.javaex.htool.core.collection; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 集合操作工具类 - * - * @author 陈霓清 - * @Date 2022年12月5日 - */ -public class CollectionUtils { - - -} -- Gitee From 24fcade0d9086ead17ac14e6de7b7c9db42cb7c9 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Wed, 4 Jan 2023 13:34:30 +0800 Subject: [PATCH 43/44] 20230104 --- .../htool/http/httpclient/HttpClientResult.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java index 126e427..fd0bbc3 100644 --- a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java +++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java @@ -24,7 +24,7 @@ public class HttpClientResult implements Serializable { /** * 响应数据转byte[] */ - private byte[] bytes; + private byte[] body; /** * 响应数据转String */ @@ -34,10 +34,10 @@ public class HttpClientResult implements Serializable { this.code = scInternalServerError; } - public HttpClientResult(int code, HttpEntity entity, byte[] bytes, String content) { + public HttpClientResult(int code, HttpEntity entity, byte[] body, String content) { this.code = code; this.entity = entity; - this.bytes = bytes; + this.body = body; this.content = content; } @@ -53,11 +53,11 @@ public class HttpClientResult implements Serializable { public void setEntity(HttpEntity entity) { this.entity = entity; } - public byte[] getBytes() { - return bytes; + public byte[] getBody() { + return body; } - public void setBytes(byte[] bytes) { - this.bytes = bytes; + public void setBody(byte[] body) { + this.body = body; } public String getContent() { return content; -- Gitee From d43901ee8be0355496bbd361854102c31fe9d940 Mon Sep 17 00:00:00 2001 From: "291026192@qq.com" <291026192@qq.com> Date: Wed, 4 Jan 2023 14:22:52 +0800 Subject: [PATCH 44/44] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/javaex/htool/picture/ImageUtils.java | 192 ++++++++---------- .../picture/util/BufferedImageBuilder.java | 59 ------ 2 files changed, 89 insertions(+), 162 deletions(-) delete mode 100644 htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java index 1029ed0..7585d28 100644 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java +++ b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java @@ -5,15 +5,12 @@ import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; -import java.awt.RenderingHints; import java.awt.Shape; -import java.awt.Toolkit; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -28,10 +25,12 @@ import java.util.regex.Pattern; import javax.imageio.ImageIO; import cn.javaex.htool.core.codec.Base64Utils; -import cn.javaex.htool.picture.util.BufferedImageBuilder; /** - * @author 韩建东 2022年11月27日 + * 图片工具类 + * + * @author 陈霓清 + * @Date 2023年1月4日 */ public class ImageUtils { /** @@ -50,15 +49,11 @@ public class ImageUtils { /** * 每个水印水平间隔 */ - private static final int X_PADDING = 20; + private static final int X_PADDING = 150; /** * 每个水印垂直间隔 */ - private static final int Y_PADDING = 70; - /** - * 水印字体大小 - */ - private static final int FONT_SIZE = 50; + private static final int Y_PADDING = 200; /** * 数值 2 @@ -66,105 +61,103 @@ public class ImageUtils { private static final int NUM_TWO = 2; /** - * @author 韩建东 - * 获得图片的BufferedImage 处理 图片 变红 的bug - * - * @param file 图片路径 - * @return BufferedImage - */ - public static BufferedImage getSrcBufferedImage(File file) { - Image src = Toolkit.getDefaultToolkit().getImage(file.getPath()); - return BufferedImageBuilder.toBufferedImage(src); - } - - /** - * @author 韩建东 - * @param srcBuffer 图片流 - * @param text 水印文字 - * @param color 水印颜色 - * @return BufferedImage + * 添加水印(水印在右下角) + * @param srcBuffer + * @param text 水印内容,例如 https://www.javaex.cn + * @param font 水印字体,例如 Font font = new Font("宋体", Font.BOLD, 26); + * @param color 水印颜色,为null时,显示白色水印 + * @return */ - public static BufferedImage addWaterMark(BufferedImage srcBuffer,String text,Color color){ - int width = srcBuffer.getWidth(); - int height = srcBuffer.getHeight(); - - Graphics2D g = srcBuffer.createGraphics(); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - float alpha = 1F; - AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); - g.setComposite(ac); - g.drawImage(srcBuffer, 0, 0, width, height, null); - g.setBackground(Color.BLACK); - Font oldfont = g.getFont(); - Font font = new Font( oldfont.getFamily(), Font.BOLD, FONT_SIZE); - g.setFont(font); - FontRenderContext frc = g.getFontRenderContext(); - TextLayout tl = new TextLayout(text, font, frc); - //水印串宽度 - int stringWidth = g.getFontMetrics(g.getFont()).charsWidth(text.toCharArray(), 0, text.length()); - - //旋转水印 - g.rotate(Math.toRadians(PIC_ANGEL), (double) width / NUM_TWO, (double) height / NUM_TWO); - //水印透明度 - g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5F)); - // 字体色 - g.setColor(color); - - int x = -height / NUM_TWO; - int y; - - //循环绘制 - while (x < width + height / NUM_TWO) { - y = -width / NUM_TWO; - while (y < height + width / NUM_TWO) { - Shape sha = tl.getOutline(AffineTransform.getTranslateInstance(x, y)); - g.fill(sha); - - y += Y_PADDING; + public static BufferedImage addWatermark(BufferedImage srcBuffer, String text, Font font, Color color) { + try { + int srcImgWidth = srcBuffer.getWidth(); + int srcImgHeight = srcBuffer.getHeight(); + BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); + Graphics2D g = bufImg.createGraphics(); + g.drawImage(srcBuffer, 0, 0, srcImgWidth, srcImgHeight, null); + if (color==null) { + g.setColor(Color.WHITE); + } else { + g.setColor(color); } - x += stringWidth + X_PADDING; + g.setFont(font); + + // 水印串宽度 + int stringWidth = g.getFontMetrics(g.getFont()).charsWidth(text.toCharArray(), 0, text.length()); + // 水印透明度 + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); + // 设置水印的坐标 + int x = srcImgWidth - stringWidth - 20; + int y = srcImgHeight - 20; + // 从坐标x,y开始添加水印 + g.drawString(text, x, y); + // 释放资源 + g.dispose(); + + return bufImg; + } catch (Exception e) { + e.printStackTrace(); } - //释放资源 - g.dispose(); + return srcBuffer; } /** - * 将图片转为 base64 string - * @author 韩建东 + * 添加水印(铺满) * @param srcBuffer - * @return String + * @param text 水印内容,例如 https://www.javaex.cn + * @param font 水印字体,例如 Font font = new Font("宋体", Font.BOLD, 26); + * @param color 水印颜色,为null时,显示白色水印 + * @return */ - public static String toBase64Str(BufferedImage srcBuffer) { - String base64Str = ""; - + public static BufferedImage addWatermarks(BufferedImage srcBuffer, String text, Font font, Color color) { try { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - ImageIO.write(srcBuffer, "jpg", os); - byte[] bytes = os.toByteArray(); - return "data:image/jpeg;base64," + Base64Utils.encodeByte(bytes); - } catch (IOException e) { - System.err.printf("转换base64错误"); + int srcImgWidth = srcBuffer.getWidth(); + int srcImgHeight = srcBuffer.getHeight(); + BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); + Graphics2D g = bufImg.createGraphics(); + g.drawImage(srcBuffer, 0, 0, srcImgWidth, srcImgHeight, null); + if (color==null) { + g.setColor(Color.WHITE); + } else { + g.setColor(color); + } + g.setFont(font); + FontRenderContext frc = g.getFontRenderContext(); + TextLayout tl = new TextLayout(text, font, frc); + // 水印串宽度 + int stringWidth = g.getFontMetrics(g.getFont()).charsWidth(text.toCharArray(), 0, text.length()); + // 旋转水印 + g.rotate(Math.toRadians(PIC_ANGEL), (double) srcImgWidth / NUM_TWO, (double) srcImgHeight / NUM_TWO); + // 水印透明度 + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); + // 设置水印的坐标 + int x = -srcImgHeight / NUM_TWO; + int y; + // 循环绘制 + while (x < srcImgWidth + srcImgHeight / NUM_TWO) { + y = -srcImgWidth / NUM_TWO; + while (y < srcImgHeight + srcImgWidth / NUM_TWO) { + Shape sha = tl.getOutline(AffineTransform.getTranslateInstance(x, y)); + g.fill(sha); + + y += Y_PADDING; + } + x += stringWidth + X_PADDING; + } + // 释放资源 + g.dispose(); + + return bufImg; + } catch (Exception e) { + e.printStackTrace(); } - return base64Str; - } - - /** - * RGB转换成16进制 - * - * @param r R - * @param g G - * @param b B - * @return String - */ - public static String rgb2Hex(int r, int g, int b) { - return String.format("#%02X%02X%02X", r, g, b); + return srcBuffer; } - /** + /** * base64转url - * @author 陈霓清 * @param base64Image * @param imageFilePath : "D:\\test\\1.jpg" * @return @@ -186,7 +179,6 @@ public class ImageUtils { /** * 根据图片地址转换为base64编码字符串 - * @author 陈霓清 * @param imageFilePath : "D:\\test\\1.jpg" * @return */ @@ -206,7 +198,6 @@ public class ImageUtils { /** * 图片路径转BufferedImage - * @author 陈霓清 * @param imageFilePath * @return * @throws IOException @@ -217,10 +208,9 @@ public class ImageUtils { /** * BufferedImage转图片路径 - * @author 陈霓清 * @param bufferedImage * @param imageFilePath : "D:\\test\\2.jpg" - * @param imageType : "JEPG" + * @param imageType : "jpg" * @throws IOException */ public static void write(BufferedImage bufferedImage, String imageFilePath, String imageType) throws IOException { @@ -229,7 +219,6 @@ public class ImageUtils { /** * 得到网页中图片的地址 - * @author 陈霓清 * @param htmlStr * @return */ @@ -265,7 +254,6 @@ public class ImageUtils { /** * 图片压缩(自定义尺寸) - * @author 陈霓清 * @param srcBuffer 要缩放的图片 * @param width 目标宽度像素 * @param height 目标高度像素 @@ -321,7 +309,6 @@ public class ImageUtils { /** * 图片压缩(等比例压缩) - * @author 陈霓清 * @param srcBuffer 要缩放的图片 * @param quality 压缩率(0~1之间) */ @@ -339,7 +326,6 @@ public class ImageUtils { /** * 裁剪图片方法 - * @author 陈霓清 * @param bufferedImage 图像源 * @param startX 裁剪开始x坐标 * @param startY 裁剪开始y坐标 diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java b/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java deleted file mode 100644 index 9ab93ab..0000000 --- a/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.javaex.htool.picture.util; - -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; - -/** - * @author 韩建东 2022年11月27日 - */ -public class BufferedImageBuilder { - public static BufferedImage toBufferedImage(Image image) { - - if (image instanceof BufferedImage) { - return (BufferedImage) image; - - } - - image = new ImageIcon(image).getImage(); - - BufferedImage bimage = null; - - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - - try { - - int transparency = Transparency.OPAQUE; - - GraphicsDevice gs = ge.getDefaultScreenDevice(); - - GraphicsConfiguration gc = gs.getDefaultConfiguration(); - - bimage = gc.createCompatibleImage(image.getWidth(null), - - image.getHeight(null), transparency); - - } catch (HeadlessException e) { - System.err.println("报错"); - } - - if (bimage == null) { - - int type = BufferedImage.TYPE_INT_RGB; - - bimage = new BufferedImage(image.getWidth(null), - - image.getHeight(null), type); - - } - - Graphics g = bimage.createGraphics(); - - g.drawImage(image, 0, 0, null); - - g.dispose(); - - return bimage; - - } -} -- Gitee