1 ;'use strict';
  2 
  3 /**
  4  * @author Rui.Zhang
  5  * @class 前端开发辅助工具类
  6  * @date 2016-09-04 22:32:09
  7  * @description Mtils 是 My Utils 的简写, 本工具提供前台常用的文本处理、 表单处理、 数据校验、 数据安全等函数。<br />
  8  * @description 除了基本的函数封装外, 本工具还对原生的对象进行一定的扩展, 更方便使用。
  9  * @site https://github.com/MisterChangRay/Mtils2
 10  * @since version 2.0.0
 11  */
 12 window.Mtils = {
 13 	/**
 14 	 * @author Rui.Zhang
 15 	 * @class 常量类
 16 	 * @description 提供一些常量
 17 	 */
 18 	constant : {
 19 		/**
 20 		 * @description 常用键盘控制键常量
 21 		 */
 22 		CONTROL_KEY : {
 23 			BACK_SPACE:8, TAB:9, ENTER:13, SHIFT:16, CTRL:17, ALT:18, CAPS_LOCK:20, ESC:27,
 24 			SPACE:32, END:35, HOME:36, INSERT:45, PAGE_UP:33, PAGE_DOWN:34, DELETE:46, CONTEXT_MENU:93,
 25 			8: "BACK_SPACE", 9 : "TAB", 13 : "ENTER", 16 : "SHIFT", 17 : "CTRL", 18 : "ALT", 20:"CAPS_LOCK", 27:"ESC",
 26 			32:"SPACE", 35:"END", 36:"HOME", 45:"INSERT", 33:"PAGE_UP", 34:"PAGE_DOWN", 46:"DELETE", 93:"CONTEXT_MENU",
 27 		},
 28 		/**
 29 		 * @description 性别常量女(0)
 30 		 */
 31 		WOMAN : 0,
 32 		/**
 33 		 * @description 性别常量男(1)
 34 		 */
 35 		MAN : 1,
 36 		/**
 37 		 * @description 进制转换基础数据
 38 		 */
 39 		BASE_DECIMAL : "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_@",
 40 		/**
 41 		 * @description 拼音转换基础数据
 42 		 */
 43 		PY_MAPS : {"a":"\u554a\u963f\u9515","ai":"\u57c3\u6328\u54ce\u5509\u54c0\u7691\u764c\u853c\u77ee\u827e\u788d\u7231\u9698\u8bf6\u6371\u55f3\u55cc\u5ad2\u7477\u66a7\u7839\u953f\u972d","an":"\u978d\u6c28\u5b89\u4ffa\u6309\u6697\u5cb8\u80fa\u6848\u8c19\u57ef\u63de\u72b4\u5eb5\u6849\u94f5\u9e4c\u9878\u9eef","ang":"\u80ae\u6602\u76ce","ao":"\u51f9\u6556\u71ac\u7ff1\u8884\u50b2\u5965\u61ca\u6fb3\u5773\u62d7\u55f7\u5662\u5c99\u5ed2\u9068\u5aaa\u9a9c\u8071\u87af\u93ca\u9ccc\u93d6","ba":"\u82ad\u634c\u6252\u53ed\u5427\u7b06\u516b\u75a4\u5df4\u62d4\u8dcb\u9776\u628a\u8019\u575d\u9738\u7f62\u7238\u8307\u83dd\u8406\u636d\u5c9c\u705e\u6777\u94af\u7c91\u9c85\u9b43","bai":"\u767d\u67cf\u767e\u6446\u4f70\u8d25\u62dc\u7a17\u859c\u63b0\u97b4","ban":"\u6591\u73ed\u642c\u6273\u822c\u9881\u677f\u7248\u626e\u62cc\u4f34\u74e3\u534a\u529e\u7eca\u962a\u5742\u8c73\u94a3\u7622\u764d\u8228","bang":"\u90a6\u5e2e\u6886\u699c\u8180\u7ed1\u68d2\u78c5\u868c\u9551\u508d\u8c24\u84a1\u8783","bao":"\u82de\u80de\u5305\u8912\u96f9\u4fdd\u5821\u9971\u5b9d\u62b1\u62a5\u66b4\u8c79\u9c8d\u7206\u52f9\u8446\u5b80\u5b62\u7172\u9e28\u8913\u8db5\u9f85","bo":"\u5265\u8584\u73bb\u83e0\u64ad\u62e8\u94b5\u6ce2\u535a\u52c3\u640f\u94c2\u7b94\u4f2f\u5e1b\u8236\u8116\u818a\u6e24\u6cca\u9a73\u4eb3\u8543\u5575\u997d\u6a97\u64d8\u7934\u94b9\u9e41\u7c38\u8ddb","bei":"\u676f\u7891\u60b2\u5351\u5317\u8f88\u80cc\u8d1d\u94a1\u500d\u72c8\u5907\u60eb\u7119\u88ab\u5b5b\u9642\u90b6\u57e4\u84d3\u5457\u602b\u6096\u789a\u9e4e\u8919\u943e","ben":"\u5954\u82ef\u672c\u7b28\u755a\u574c\u951b","beng":"\u5d29\u7ef7\u752d\u6cf5\u8e66\u8ff8\u552a\u5623\u750f","bi":"\u903c\u9f3b\u6bd4\u9119\u7b14\u5f7c\u78a7\u84d6\u853d\u6bd5\u6bd9\u6bd6\u5e01\u5e87\u75f9\u95ed\u655d\u5f0a\u5fc5\u8f9f\u58c1\u81c2\u907f\u965b\u5315\u4ef3\u4ffe\u8298\u835c\u8378\u5421\u54d4\u72f4\u5eb3\u610e\u6ed7\u6fde\u5f3c\u59a3\u5a62\u5b16\u74a7\u8d32\u7540\u94cb\u79d5\u88e8\u7b5a\u7b85\u7be6\u822d\u895e\u8df8\u9ac0","bian":"\u97ad\u8fb9\u7f16\u8d2c\u6241\u4fbf\u53d8\u535e\u8fa8\u8fa9\u8fab\u904d\u533e\u5f01\u82c4\u5fed\u6c74\u7f0f\u7178\u782d\u78a5\u7a39\u7a86\u8759\u7b3e\u9cca","biao":"\u6807\u5f6a\u8198\u8868\u5a4a\u9aa0\u98d1\u98d9\u98da\u706c\u9556\u9573\u762d\u88f1\u9cd4","bie":"\u9cd6\u618b\u522b\u762a\u8e69\u9cd8","bin":"\u5f6c\u658c\u6fd2\u6ee8\u5bbe\u6448\u50a7\u6d5c\u7f24\u73a2\u6ba1\u8191\u9554\u9acc\u9b13","bing":"\u5175\u51b0\u67c4\u4e19\u79c9\u997c\u70b3\u75c5\u5e76\u7980\u90b4\u6452\u7ee0\u678b\u69df\u71f9","bu":"\u6355\u535c\u54fa\u8865\u57e0\u4e0d\u5e03\u6b65\u7c3f\u90e8\u6016\u62ca\u535f\u900b\u74ff\u6661\u949a\u91ad","ca":"\u64e6\u5693\u7924","cai":"\u731c\u88c1\u6750\u624d\u8d22\u776c\u8e29\u91c7\u5f69\u83dc\u8521","can":"\u9910\u53c2\u8695\u6b8b\u60ed\u60e8\u707f\u9a96\u74a8\u7cb2\u9eea","cang":"\u82cd\u8231\u4ed3\u6ca7\u85cf\u4f27","cao":"\u64cd\u7cd9\u69fd\u66f9\u8349\u8279\u5608\u6f15\u87ac\u825a","ce":"\u5395\u7b56\u4fa7\u518c\u6d4b\u5202\u5e3b\u607b","ceng":"\u5c42\u8e6d\u564c","cha":"\u63d2\u53c9\u832c\u8336\u67e5\u78b4\u643d\u5bdf\u5c94\u5dee\u8be7\u7339\u9987\u6c4a\u59f9\u6748\u6942\u69ce\u6aab\u9497\u9538\u9572\u8869","chai":"\u62c6\u67f4\u8c7a\u4faa\u8308\u7625\u867f\u9f87","chan":"\u6400\u63ba\u8749\u998b\u8c17\u7f20\u94f2\u4ea7\u9610\u98a4\u5181\u8c04\u8c36\u8487\u5edb\u5fcf\u6f7a\u6fb6\u5b71\u7fbc\u5a75\u5b17\u9aa3\u89c7\u7985\u9561\u88e3\u87fe\u8e94","chang":"\u660c\u7316\u573a\u5c1d\u5e38\u957f\u507f\u80a0\u5382\u655e\u7545\u5531\u5021\u4f25\u9b2f\u82cc\u83d6\u5f9c\u6005\u60dd\u960a\u5a3c\u5ae6\u6636\u6c05\u9cb3","chao":"\u8d85\u6284\u949e\u671d\u5632\u6f6e\u5de2\u5435\u7092\u600a\u7ec9\u6641\u8016","che":"\u8f66\u626f\u64a4\u63a3\u5f7b\u6f88\u577c\u5c6e\u7817","chen":"\u90f4\u81e3\u8fb0\u5c18\u6668\u5ff1\u6c89\u9648\u8d81\u886c\u79f0\u8c0c\u62bb\u55d4\u5bb8\u741b\u6987\u809c\u80c2\u789c\u9f80","cheng":"\u6491\u57ce\u6a59\u6210\u5448\u4e58\u7a0b\u60e9\u6f84\u8bda\u627f\u901e\u9a8b\u79e4\u57d5\u5d4a\u5fb5\u6d48\u67a8\u67fd\u6a18\u665f\u584d\u77a0\u94d6\u88ce\u86cf\u9172","chi":"\u5403\u75f4\u6301\u5319\u6c60\u8fdf\u5f1b\u9a70\u803b\u9f7f\u4f88\u5c3a\u8d64\u7fc5\u65a5\u70bd\u50ba\u5880\u82aa\u830c\u640b\u53f1\u54e7\u557b\u55e4\u5f73\u996c\u6cb2\u5ab8\u6555\u80dd\u7719\u7735\u9e31\u761b\u892b\u86a9\u87ad\u7b1e\u7bea\u8c49\u8e05\u8e1f\u9b51","chong":"\u5145\u51b2\u866b\u5d07\u5ba0\u833a\u5fe1\u61a7\u94f3\u825f","chou":"\u62bd\u916c\u7574\u8e0c\u7a20\u6101\u7b79\u4ec7\u7ef8\u7785\u4e11\u4fe6\u5733\u5e31\u60c6\u6eb4\u59af\u7633\u96e0\u9c8b","chu":"\u81ed\u521d\u51fa\u6a71\u53a8\u8e87\u9504\u96cf\u6ec1\u9664\u695a\u7840\u50a8\u77d7\u6410\u89e6\u5904\u4e8d\u520d\u61b7\u7ecc\u6775\u696e\u6a17\u870d\u8e70\u9edc","chuan":"\u63e3\u5ddd\u7a7f\u693d\u4f20\u8239\u5598\u4e32\u63be\u821b\u60f4\u9044\u5ddb\u6c1a\u948f\u9569\u8221","chuang":"\u75ae\u7a97\u5e62\u5e8a\u95ef\u521b\u6006","chui":"\u5439\u708a\u6376\u9524\u5782\u9672\u68f0\u69cc","chun":"\u6625\u693f\u9187\u5507\u6df3\u7eaf\u8822\u4fc3\u83bc\u6c8c\u80ab\u6710\u9e51\u877d","chuo":"\u6233\u7ef0\u851f\u8fb6\u8f8d\u955e\u8e14\u9f8a","ci":"\u75b5\u8328\u78c1\u96cc\u8f9e\u6148\u74f7\u8bcd\u6b64\u523a\u8d50\u6b21\u8360\u5472\u5d6f\u9e5a\u8785\u7ccd\u8d91","cong":"\u806a\u8471\u56f1\u5306\u4ece\u4e1b\u506c\u82c1\u6dd9\u9aa2\u742e\u7481\u679e","cu":"\u51d1\u7c97\u918b\u7c07\u731d\u6b82\u8e59","cuan":"\u8e7f\u7be1\u7a9c\u6c46\u64ba\u6615\u7228","cui":"\u6467\u5d14\u50ac\u8106\u7601\u7cb9\u6dec\u7fe0\u8403\u60b4\u7480\u69b1\u96b9","cun":"\u6751\u5b58\u5bf8\u78cb\u5fd6\u76b4","cuo":"\u64ae\u6413\u63aa\u632b\u9519\u539d\u811e\u9509\u77ec\u75e4\u9e7e\u8e49\u8e9c","da":"\u642d\u8fbe\u7b54\u7629\u6253\u5927\u8037\u54d2\u55d2\u601b\u59b2\u75b8\u8921\u7b2a\u977c\u9791","dai":"\u5446\u6b79\u50a3\u6234\u5e26\u6b86\u4ee3\u8d37\u888b\u5f85\u902e\u6020\u57ed\u7519\u5454\u5cb1\u8fe8\u902f\u9a80\u7ed0\u73b3\u9edb","dan":"\u803d\u62c5\u4e39\u5355\u90f8\u63b8\u80c6\u65e6\u6c2e\u4f46\u60ee\u6de1\u8bde\u5f39\u86cb\u4ebb\u510b\u5369\u840f\u5556\u6fb9\u6a90\u6b9a\u8d55\u7708\u7605\u8043\u7baa","dang":"\u5f53\u6321\u515a\u8361\u6863\u8c20\u51fc\u83ea\u5b95\u7800\u94db\u88c6","dao":"\u5200\u6363\u8e48\u5012\u5c9b\u7977\u5bfc\u5230\u7a3b\u60bc\u9053\u76d7\u53e8\u5541\u5fc9\u6d2e\u6c18\u7118\u5fd1\u7e9b","de":"\u5fb7\u5f97\u7684\u951d","deng":"\u8e6c\u706f\u767b\u7b49\u77aa\u51f3\u9093\u5654\u5d9d\u6225\u78f4\u956b\u7c26","di":"\u5824\u4f4e\u6ef4\u8fea\u654c\u7b1b\u72c4\u6da4\u7fdf\u5ae1\u62b5\u5e95\u5730\u8482\u7b2c\u5e1d\u5f1f\u9012\u7f14\u6c10\u7c74\u8bcb\u8c1b\u90b8\u577b\u839c\u837b\u5600\u5a23\u67e2\u68e3\u89cc\u7825\u78b2\u7747\u955d\u7f9d\u9ab6","dian":"\u98a0\u6382\u6ec7\u7898\u70b9\u5178\u975b\u57ab\u7535\u4f43\u7538\u5e97\u60e6\u5960\u6dc0\u6bbf\u4e36\u963d\u576b\u57dd\u5dc5\u73b7\u765c\u766b\u7c1f\u8e2e","diao":"\u7889\u53fc\u96d5\u51cb\u5201\u6389\u540a\u9493\u8c03\u8f7a\u94de\u8729\u7c9c\u8c82","die":"\u8dcc\u7239\u789f\u8776\u8fed\u8c0d\u53e0\u4f5a\u57a4\u581e\u63f2\u558b\u6e2b\u8f76\u7252\u74de\u8936\u800b\u8e40\u9cbd\u9cce","ding":"\u4e01\u76ef\u53ee\u9489\u9876\u9f0e\u952d\u5b9a\u8ba2\u4e22\u4ec3\u5576\u738e\u815a\u7887\u753a\u94e4\u7594\u8035\u914a","dong":"\u4e1c\u51ac\u8463\u61c2\u52a8\u680b\u4f97\u606b\u51bb\u6d1e\u578c\u549a\u5cbd\u5cd2\u5902\u6c21\u80e8\u80f4\u7850\u9e2b","dou":"\u515c\u6296\u6597\u9661\u8c46\u9017\u75d8\u8538\u94ad\u7aa6\u7aac\u86aa\u7bfc\u9161","du":"\u90fd\u7763\u6bd2\u728a\u72ec\u8bfb\u5835\u7779\u8d4c\u675c\u9540\u809a\u5ea6\u6e21\u5992\u828f\u561f\u6e0e\u691f\u6a50\u724d\u8839\u7b03\u9ad1\u9ee9","duan":"\u7aef\u77ed\u953b\u6bb5\u65ad\u7f0e\u5f56\u6934\u7145\u7c16","dui":"\u5806\u5151\u961f\u5bf9\u603c\u619d\u7893","dun":"\u58a9\u5428\u8e72\u6566\u987f\u56e4\u949d\u76fe\u9041\u7096\u7818\u7905\u76f9\u9566\u8db8","duo":"\u6387\u54c6\u591a\u593a\u579b\u8eb2\u6735\u8dfa\u8235\u5241\u60f0\u5815\u5484\u54da\u7f0d\u67c1\u94ce\u88f0\u8e31","e":"\u86fe\u5ce8\u9e45\u4fc4\u989d\u8bb9\u5a25\u6076\u5384\u627c\u904f\u9102\u997f\u5669\u8c14\u57a9\u57ad\u82ca\u83aa\u843c\u5443\u6115\u5c59\u5a40\u8f6d\u66f7\u816d\u786a\u9507\u9537\u9e57\u989a\u9cc4","en":"\u6069\u84bd\u6441\u5514\u55ef","er":"\u800c\u513f\u8033\u5c14\u9975\u6d31\u4e8c\u8d30\u8fe9\u73e5\u94d2\u9e38\u9c95","fa":"\u53d1\u7f5a\u7b4f\u4f10\u4e4f\u9600\u6cd5\u73d0\u57a1\u781d","fan":"\u85e9\u5e06\u756a\u7ffb\u6a0a\u77fe\u9492\u7e41\u51e1\u70e6\u53cd\u8fd4\u8303\u8d29\u72af\u996d\u6cdb\u8629\u5e61\u72ad\u68b5\u6535\u71d4\u7548\u8e6f","fang":"\u574a\u82b3\u65b9\u80aa\u623f\u9632\u59a8\u4eff\u8bbf\u7eba\u653e\u531a\u90a1\u5f77\u94ab\u822b\u9c82","fei":"\u83f2\u975e\u5561\u98de\u80a5\u532a\u8bfd\u5420\u80ba\u5e9f\u6cb8\u8d39\u82be\u72d2\u60b1\u6ddd\u5983\u7ecb\u7eef\u69a7\u8153\u6590\u6249\u7953\u7829\u9544\u75f1\u871a\u7bda\u7fe1\u970f\u9cb1","fen":"\u82ac\u915a\u5429\u6c1b\u5206\u7eb7\u575f\u711a\u6c7e\u7c89\u594b\u4efd\u5fff\u6124\u7caa\u507e\u7035\u68fc\u610d\u9cbc\u9f22","feng":"\u4e30\u5c01\u67ab\u8702\u5cf0\u950b\u98ce\u75af\u70fd\u9022\u51af\u7f1d\u8bbd\u5949\u51e4\u4ff8\u9146\u8451\u6ca3\u781c","fu":"\u4f5b\u5426\u592b\u6577\u80a4\u5b75\u6276\u62c2\u8f90\u5e45\u6c1f\u7b26\u4f0f\u4fd8\u670d\u6d6e\u6daa\u798f\u88b1\u5f17\u752b\u629a\u8f85\u4fef\u91dc\u65a7\u812f\u8151\u5e9c\u8150\u8d74\u526f\u8986\u8d4b\u590d\u5085\u4ed8\u961c\u7236\u8179\u8d1f\u5bcc\u8ba3\u9644\u5987\u7f1a\u5490\u5310\u51eb\u90db\u8299\u82fb\u832f\u83a9\u83d4\u544b\u5e5e\u6ecf\u8274\u5b5a\u9a78\u7ec2\u6874\u8d59\u9efb\u9efc\u7f58\u7a03\u99a5\u864d\u86a8\u8709\u8760\u876e\u9eb8\u8dba\u8dd7\u9cc6","ga":"\u5676\u560e\u86e4\u5c2c\u5477\u5c15\u5c1c\u65ee\u9486","gai":"\u8be5\u6539\u6982\u9499\u76d6\u6e89\u4e10\u9654\u5793\u6224\u8d45\u80f2","gan":"\u5e72\u7518\u6746\u67d1\u7aff\u809d\u8d76\u611f\u79c6\u6562\u8d63\u5769\u82f7\u5c34\u64c0\u6cd4\u6de6\u6f89\u7ec0\u6a44\u65f0\u77f8\u75b3\u9150","gang":"\u5188\u521a\u94a2\u7f38\u809b\u7eb2\u5c97\u6e2f\u6206\u7f61\u9883\u7b7b","gong":"\u6760\u5de5\u653b\u529f\u606d\u9f9a\u4f9b\u8eac\u516c\u5bab\u5f13\u5de9\u6c5e\u62f1\u8d21\u5171\u857b\u5efe\u54a3\u73d9\u80b1\u86a3\u86e9\u89e5","gao":"\u7bd9\u768b\u9ad8\u818f\u7f94\u7cd5\u641e\u9550\u7a3f\u544a\u777e\u8bf0\u90dc\u84bf\u85c1\u7f1f\u69d4\u69c1\u6772\u9506","ge":"\u54e5\u6b4c\u6401\u6208\u9e3d\u80f3\u7599\u5272\u9769\u845b\u683c\u9601\u9694\u94ec\u4e2a\u5404\u9b32\u4ee1\u54ff\u5865\u55dd\u7ea5\u643f\u8188\u784c\u94ea\u9549\u88bc\u988c\u867c\u8238\u9abc\u9ac2","gei":"\u7ed9","gen":"\u6839\u8ddf\u4e98\u831b\u54cf\u826e","geng":"\u8015\u66f4\u5e9a\u7fb9\u57c2\u803f\u6897\u54fd\u8d53\u9ca0","gou":"\u94a9\u52fe\u6c9f\u82df\u72d7\u57a2\u6784\u8d2d\u591f\u4f5d\u8bdf\u5ca3\u9058\u5abe\u7f11\u89cf\u5f40\u9e32\u7b31\u7bdd\u97b2","gu":"\u8f9c\u83c7\u5495\u7b8d\u4f30\u6cbd\u5b64\u59d1\u9f13\u53e4\u86ca\u9aa8\u8c37\u80a1\u6545\u987e\u56fa\u96c7\u560f\u8bc2\u83f0\u54cc\u5d2e\u6c69\u688f\u8f71\u726f\u727f\u80cd\u81cc\u6bc2\u77bd\u7f5f\u94b4\u9522\u74e0\u9e2a\u9e44\u75fc\u86c4\u9164\u89da\u9cb4\u9ab0\u9e58","gua":"\u522e\u74dc\u5250\u5be1\u6302\u8902\u5366\u8bd6\u5471\u681d\u9e39","guai":"\u4e56\u62d0\u602a\u54d9","guan":"\u68fa\u5173\u5b98\u51a0\u89c2\u7ba1\u9986\u7f50\u60ef\u704c\u8d2f\u500c\u839e\u63bc\u6dab\u76e5\u9e73\u9ccf","guang":"\u5149\u5e7f\u901b\u72b7\u6844\u80f1\u7592","gui":"\u7470\u89c4\u572d\u7845\u5f52\u9f9f\u95fa\u8f68\u9b3c\u8be1\u7678\u6842\u67dc\u8dea\u8d35\u523d\u5326\u523f\u5e8b\u5b84\u59ab\u6867\u7085\u6677\u7688\u7c0b\u9c91\u9cdc","gun":"\u8f8a\u6eda\u68cd\u4e28\u886e\u7ef2\u78d9\u9ca7","guo":"\u9505\u90ed\u56fd\u679c\u88f9\u8fc7\u9998\u8803\u57da\u63b4\u5459\u56d7\u5e3c\u5d1e\u7313\u6901\u8662\u951e\u8052\u872e\u873e\u8748","ha":"\u54c8","hai":"\u9ab8\u5b69\u6d77\u6c26\u4ea5\u5bb3\u9a87\u54b4\u55e8\u988f\u91a2","han":"\u9163\u61a8\u90af\u97e9\u542b\u6db5\u5bd2\u51fd\u558a\u7f55\u7ff0\u64bc\u634d\u65f1\u61be\u608d\u710a\u6c57\u6c49\u9097\u83e1\u6496\u961a\u701a\u6657\u7113\u9894\u86b6\u9f3e","hen":"\u592f\u75d5\u5f88\u72e0\u6068","hang":"\u676d\u822a\u6c86\u7ed7\u73e9\u6841","hao":"\u58d5\u568e\u8c6a\u6beb\u90dd\u597d\u8017\u53f7\u6d69\u8585\u55e5\u5686\u6fe0\u704f\u660a\u7693\u98a2\u869d","he":"\u5475\u559d\u8377\u83cf\u6838\u79be\u548c\u4f55\u5408\u76d2\u8c89\u9602\u6cb3\u6db8\u8d6b\u8910\u9e64\u8d3a\u8bc3\u52be\u58d1\u85ff\u55d1\u55ec\u9616\u76cd\u86b5\u7fee","hei":"\u563f\u9ed1","heng":"\u54fc\u4ea8\u6a2a\u8861\u6052\u8a07\u8605","hong":"\u8f70\u54c4\u70d8\u8679\u9e3f\u6d2a\u5b8f\u5f18\u7ea2\u9ec9\u8ba7\u836d\u85a8\u95f3\u6cd3","hou":"\u5589\u4faf\u7334\u543c\u539a\u5019\u540e\u5820\u5f8c\u9005\u760a\u7bcc\u7cc7\u9c8e\u9aba","hu":"\u547c\u4e4e\u5ffd\u745a\u58f6\u846b\u80e1\u8774\u72d0\u7cca\u6e56\u5f27\u864e\u552c\u62a4\u4e92\u6caa\u6237\u51b1\u553f\u56eb\u5cb5\u7322\u6019\u60da\u6d52\u6ef9\u7425\u69f2\u8f77\u89f3\u70c0\u7173\u623d\u6248\u795c\u9e55\u9e71\u7b0f\u9190\u659b","hua":"\u82b1\u54d7\u534e\u733e\u6ed1\u753b\u5212\u5316\u8bdd\u5290\u6d4d\u9a85\u6866\u94e7\u7a1e","huai":"\u69d0\u5f8a\u6000\u6dee\u574f\u8fd8\u8e1d","huan":"\u6b22\u73af\u6853\u7f13\u6362\u60a3\u5524\u75ea\u8c62\u7115\u6da3\u5ba6\u5e7b\u90c7\u5942\u57b8\u64d0\u571c\u6d39\u6d63\u6f36\u5bf0\u902d\u7f33\u953e\u9ca9\u9b1f","huang":"\u8352\u614c\u9ec4\u78fa\u8757\u7c27\u7687\u51f0\u60f6\u714c\u6643\u5e4c\u604d\u8c0e\u968d\u5fa8\u6e5f\u6f62\u9051\u749c\u8093\u7640\u87e5\u7bc1\u9cc7","hui":"\u7070\u6325\u8f89\u5fbd\u6062\u86d4\u56de\u6bc1\u6094\u6167\u5349\u60e0\u6666\u8d3f\u79fd\u4f1a\u70e9\u6c47\u8bb3\u8bf2\u7ed8\u8bd9\u8334\u835f\u8559\u54d5\u5599\u96b3\u6d04\u5f57\u7f0b\u73f2\u6656\u605a\u867a\u87ea\u9ebe","hun":"\u8364\u660f\u5a5a\u9b42\u6d51\u6df7\u8be8\u9984\u960d\u6eb7\u7f17","huo":"\u8c41\u6d3b\u4f19\u706b\u83b7\u6216\u60d1\u970d\u8d27\u7978\u6509\u56af\u5925\u94ac\u952a\u956c\u8020\u8816","ji":"\u51fb\u573e\u57fa\u673a\u7578\u7a3d\u79ef\u7b95\u808c\u9965\u8ff9\u6fc0\u8ba5\u9e21\u59ec\u7ee9\u7f09\u5409\u6781\u68d8\u8f91\u7c4d\u96c6\u53ca\u6025\u75be\u6c72\u5373\u5ac9\u7ea7\u6324\u51e0\u810a\u5df1\u84df\u6280\u5180\u5b63\u4f0e\u796d\u5242\u60b8\u6d4e\u5bc4\u5bc2\u8ba1\u8bb0\u65e2\u5fcc\u9645\u5993\u7ee7\u7eaa\u5c45\u4e0c\u4e69\u525e\u4f76\u4f74\u8114\u58bc\u82a8\u82b0\u8401\u84ba\u857a\u638e\u53fd\u54ad\u54dc\u5527\u5c8c\u5d74\u6d0e\u5f50\u5c50\u9aa5\u757f\u7391\u696b\u6b9b\u621f\u6222\u8d4d\u89ca\u7284\u9f51\u77f6\u7f81\u5d47\u7a37\u7620\u7635\u866e\u7b08\u7b04\u66a8\u8dfb\u8dfd\u9701\u9c9a\u9cab\u9afb\u9e82","jia":"\u5609\u67b7\u5939\u4f73\u5bb6\u52a0\u835a\u988a\u8d3e\u7532\u94be\u5047\u7a3c\u4ef7\u67b6\u9a7e\u5ac1\u4f3d\u90cf\u62ee\u5cac\u6d43\u8fe6\u73c8\u621b\u80db\u605d\u94d7\u9553\u75c2\u86f1\u7b33\u8888\u8dcf","jian":"\u6b7c\u76d1\u575a\u5c16\u7b3a\u95f4\u714e\u517c\u80a9\u8270\u5978\u7f04\u8327\u68c0\u67ec\u78b1\u7877\u62e3\u6361\u7b80\u4fed\u526a\u51cf\u8350\u69db\u9274\u8df5\u8d31\u89c1\u952e\u7bad\u4ef6\u5065\u8230\u5251\u996f\u6e10\u6e85\u6da7\u5efa\u50ed\u8c0f\u8c2b\u83c5\u84b9\u641b\u56dd\u6e54\u8e47\u8b07\u7f23\u67a7\u67d9\u6957\u620b\u622c\u726e\u728d\u6bfd\u8171\u7751\u950f\u9e63\u88e5\u7b15\u7bb4\u7fe6\u8dbc\u8e3a\u9ca3\u97af","jiang":"\u50f5\u59dc\u5c06\u6d46\u6c5f\u7586\u848b\u6868\u5956\u8bb2\u5320\u9171\u964d\u8333\u6d1a\u7edb\u7f30\u729f\u7913\u8029\u7ce8\u8c47","jiao":"\u8549\u6912\u7901\u7126\u80f6\u4ea4\u90ca\u6d47\u9a84\u5a07\u56bc\u6405\u94f0\u77eb\u4fa5\u811a\u72e1\u89d2\u997a\u7f34\u7ede\u527f\u6559\u9175\u8f7f\u8f83\u53eb\u4f7c\u50ec\u832d\u6322\u564d\u5ce4\u5fbc\u59e3\u7e9f\u656b\u768e\u9e6a\u86df\u91ae\u8de4\u9c9b","jie":"\u7a96\u63ed\u63a5\u7686\u79f8\u8857\u9636\u622a\u52ab\u8282\u6854\u6770\u6377\u776b\u7aed\u6d01\u7ed3\u89e3\u59d0\u6212\u85c9\u82a5\u754c\u501f\u4ecb\u75a5\u8beb\u5c4a\u5048\u8ba6\u8bd8\u5588\u55df\u736c\u5a55\u5b51\u6840\u7352\u78a3\u9534\u7596\u88b7\u9889\u86a7\u7faf\u9c92\u9ab1\u9aeb","jin":"\u5dfe\u7b4b\u65a4\u91d1\u4eca\u6d25\u895f\u7d27\u9526\u4ec5\u8c28\u8fdb\u9773\u664b\u7981\u8fd1\u70ec\u6d78\u5c3d\u537a\u8369\u5807\u5664\u9991\u5ed1\u5997\u7f19\u747e\u69ff\u8d46\u89d0\u9485\u9513\u887f\u77dc","jing":"\u52b2\u8346\u5162\u830e\u775b\u6676\u9cb8\u4eac\u60ca\u7cbe\u7cb3\u7ecf\u4e95\u8b66\u666f\u9888\u9759\u5883\u656c\u955c\u5f84\u75c9\u9756\u7adf\u7ade\u51c0\u522d\u5106\u9631\u83c1\u734d\u61ac\u6cfe\u8ff3\u5f2a\u5a67\u80bc\u80eb\u8148\u65cc","jiong":"\u70af\u7a98\u5182\u8fe5\u6243","jiu":"\u63ea\u7a76\u7ea0\u7396\u97ed\u4e45\u7078\u4e5d\u9152\u53a9\u6551\u65e7\u81fc\u8205\u548e\u5c31\u759a\u50e6\u557e\u9604\u67e9\u6855\u9e6b\u8d73\u9b0f","ju":"\u97a0\u62d8\u72d9\u75bd\u9a79\u83ca\u5c40\u5480\u77e9\u4e3e\u6cae\u805a\u62d2\u636e\u5de8\u5177\u8ddd\u8e1e\u952f\u4ff1\u53e5\u60e7\u70ac\u5267\u5028\u8bb5\u82e3\u82f4\u8392\u63ac\u907d\u5c66\u741a\u67b8\u6910\u6998\u6989\u6a58\u728b\u98d3\u949c\u9514\u7aad\u88fe\u8d84\u91b5\u8e3d\u9f83\u96ce\u97ab","juan":"\u6350\u9e43\u5a1f\u5026\u7737\u5377\u7ee2\u9104\u72f7\u6d93\u684a\u8832\u9529\u954c\u96bd","jue":"\u6485\u652b\u6289\u6398\u5014\u7235\u89c9\u51b3\u8bc0\u7edd\u53a5\u5282\u8c32\u77cd\u8568\u5658\u5d1b\u7357\u5b53\u73cf\u6877\u6a5b\u721d\u9562\u8e76\u89d6","jun":"\u5747\u83cc\u94a7\u519b\u541b\u5cfb\u4fca\u7ae3\u6d5a\u90e1\u9a8f\u6343\u72fb\u76b2\u7b60\u9e87","ka":"\u5580\u5496\u5361\u4f67\u5494\u80e9","ke":"\u54af\u5777\u82db\u67ef\u68f5\u78d5\u9897\u79d1\u58f3\u54b3\u53ef\u6e34\u514b\u523b\u5ba2\u8bfe\u5ca2\u606a\u6e98\u9a92\u7f02\u73c2\u8f72\u6c2a\u778c\u94b6\u75b4\u7aa0\u874c\u9ac1","kai":"\u5f00\u63e9\u6977\u51ef\u6168\u5240\u57b2\u8488\u5ffe\u607a\u94e0\u950e","kan":"\u520a\u582a\u52d8\u574e\u780d\u770b\u4f83\u51f5\u83b0\u83b6\u6221\u9f9b\u77b0","kang":"\u5eb7\u6177\u7ce0\u625b\u6297\u4ea2\u7095\u5751\u4f09\u95f6\u94aa","kao":"\u8003\u62f7\u70e4\u9760\u5c3b\u6832\u7292\u94d0","ken":"\u80af\u5543\u57a6\u6073\u57a0\u88c9\u9880","keng":"\u542d\u5fd0\u94ff","kong":"\u7a7a\u6050\u5b54\u63a7\u5025\u5d06\u7b9c","kou":"\u62a0\u53e3\u6263\u5bc7\u82a4\u853b\u53e9\u770d\u7b58","ku":"\u67af\u54ed\u7a9f\u82e6\u9177\u5e93\u88e4\u5233\u5800\u55be\u7ed4\u9ab7","kua":"\u5938\u57ae\u630e\u8de8\u80ef\u4f89","kuai":"\u5757\u7b77\u4fa9\u5feb\u84af\u90d0\u8489\u72ef\u810d","kuan":"\u5bbd\u6b3e\u9acb","kuang":"\u5321\u7b50\u72c2\u6846\u77ff\u7736\u65f7\u51b5\u8bd3\u8bf3\u909d\u5739\u593c\u54d0\u7ea9\u8d36","kui":"\u4e8f\u76d4\u5cbf\u7aa5\u8475\u594e\u9b41\u5080\u9988\u6127\u6e83\u9997\u532e\u5914\u9697\u63c6\u55b9\u559f\u609d\u6126\u9615\u9035\u668c\u777d\u8069\u8770\u7bd1\u81fe\u8dec","kun":"\u5764\u6606\u6346\u56f0\u6083\u9603\u7428\u951f\u918c\u9cb2\u9ae1","kuo":"\u62ec\u6269\u5ed3\u9614\u86de","la":"\u5783\u62c9\u5587\u8721\u814a\u8fa3\u5566\u524c\u647a\u908b\u65ef\u782c\u760c","lai":"\u83b1\u6765\u8d56\u5d03\u5f95\u6d9e\u6fd1\u8d49\u7750\u94fc\u765e\u7c41","lan":"\u84dd\u5a6a\u680f\u62e6\u7bee\u9611\u5170\u6f9c\u8c30\u63fd\u89c8\u61d2\u7f06\u70c2\u6ee5\u5549\u5c9a\u61d4\u6f24\u6984\u6593\u7f71\u9567\u8934","lang":"\u7405\u6994\u72fc\u5eca\u90ce\u6717\u6d6a\u83a8\u8497\u5577\u9606\u9512\u7a02\u8782","lao":"\u635e\u52b3\u7262\u8001\u4f6c\u59e5\u916a\u70d9\u6d9d\u5520\u5d02\u6833\u94d1\u94f9\u75e8\u91aa","le":"\u52d2\u4e50\u808b\u4ec2\u53fb\u561e\u6cd0\u9cd3","lei":"\u96f7\u956d\u857e\u78ca\u7d2f\u5121\u5792\u64c2\u7c7b\u6cea\u7fb8\u8bd4\u837d\u54a7\u6f2f\u5ad8\u7f27\u6a91\u8012\u9179","ling":"\u68f1\u51b7\u62ce\u73b2\u83f1\u96f6\u9f84\u94c3\u4f36\u7f9a\u51cc\u7075\u9675\u5cad\u9886\u53e6\u4ee4\u9143\u5844\u82d3\u5464\u56f9\u6ce0\u7eeb\u67c3\u68c2\u74f4\u8046\u86c9\u7fce\u9cae","leng":"\u695e\u6123","li":"\u5398\u68a8\u7281\u9ece\u7bf1\u72f8\u79bb\u6f13\u7406\u674e\u91cc\u9ca4\u793c\u8389\u8354\u540f\u6817\u4e3d\u5389\u52b1\u783e\u5386\u5229\u5088\u4f8b\u4fd0\u75e2\u7acb\u7c92\u6ca5\u96b6\u529b\u7483\u54e9\u4fea\u4fda\u90e6\u575c\u82c8\u8385\u84e0\u85dc\u6369\u5456\u5533\u55b1\u7301\u6ea7\u6fa7\u9026\u5a0c\u5ae0\u9a8a\u7f21\u73de\u67a5\u680e\u8f79\u623e\u783a\u8a48\u7f79\u9502\u9e42\u75a0\u75ac\u86ce\u870a\u8821\u7b20\u7be5\u7c9d\u91b4\u8dde\u96f3\u9ca1\u9ce2\u9ee7","lian":"\u4fe9\u8054\u83b2\u8fde\u9570\u5ec9\u601c\u6d9f\u5e18\u655b\u8138\u94fe\u604b\u70bc\u7ec3\u631b\u8539\u5941\u6f4b\u6fc2\u5a08\u740f\u695d\u6b93\u81c1\u81a6\u88e2\u880a\u9ca2","liang":"\u7cae\u51c9\u6881\u7cb1\u826f\u4e24\u8f86\u91cf\u667e\u4eae\u8c05\u589a\u690b\u8e09\u9753\u9b49","liao":"\u64a9\u804a\u50da\u7597\u71ce\u5be5\u8fbd\u6f66\u4e86\u6482\u9563\u5ed6\u6599\u84fc\u5c25\u5639\u7360\u5bee\u7f2d\u948c\u9e69\u8022","lie":"\u5217\u88c2\u70c8\u52a3\u730e\u51bd\u57d2\u6d0c\u8d94\u8e90\u9b23","lin":"\u7433\u6797\u78f7\u9716\u4e34\u90bb\u9cde\u6dcb\u51db\u8d41\u541d\u853a\u5d99\u5eea\u9074\u6aa9\u8f9a\u77b5\u7cbc\u8e8f\u9e9f","liu":"\u6e9c\u7409\u69b4\u786b\u998f\u7559\u5218\u7624\u6d41\u67f3\u516d\u62a1\u507b\u848c\u6cd6\u6d4f\u905b\u9a9d\u7efa\u65d2\u7198\u950d\u954f\u9e68\u938f","long":"\u9f99\u804b\u5499\u7b3c\u7abf\u9686\u5784\u62e2\u9647\u5f04\u5785\u830f\u6cf7\u73d1\u680a\u80e7\u783b\u7643","lou":"\u697c\u5a04\u6402\u7bd3\u6f0f\u964b\u55bd\u5d5d\u9542\u7618\u8027\u877c\u9ac5","lu":"\u82a6\u5362\u9885\u5e90\u7089\u63b3\u5364\u864f\u9c81\u9e93\u788c\u9732\u8def\u8d42\u9e7f\u6f5e\u7984\u5f55\u9646\u622e\u5786\u6445\u64b8\u565c\u6cf8\u6e0c\u6f09\u7490\u680c\u6a79\u8f73\u8f82\u8f98\u6c07\u80ea\u9565\u9e2c\u9e6d\u7c0f\u823b\u9c88","lv":"\u9a74\u5415\u94dd\u4fa3\u65c5\u5c65\u5c61\u7f15\u8651\u6c2f\u5f8b\u7387\u6ee4\u7eff\u634b\u95fe\u6988\u8182\u7a06\u891b","luan":"\u5ce6\u5b6a\u6ee6\u5375\u4e71\u683e\u9e3e\u92ae","lue":"\u63a0\u7565\u950a","lun":"\u8f6e\u4f26\u4ed1\u6ca6\u7eb6\u8bba\u56f5","luo":"\u841d\u87ba\u7f57\u903b\u9523\u7ba9\u9aa1\u88f8\u843d\u6d1b\u9a86\u7edc\u502e\u8366\u645e\u7321\u6cfa\u6924\u8136\u9559\u7630\u96d2","ma":"\u5988\u9ebb\u739b\u7801\u8682\u9a6c\u9a82\u561b\u5417\u551b\u72b8\u5b37\u6769\u9ebd","mai":"\u57cb\u4e70\u9ea6\u5356\u8fc8\u8109\u52a2\u836c\u54aa\u973e","man":"\u7792\u9992\u86ee\u6ee1\u8513\u66fc\u6162\u6f2b\u8c29\u5881\u5e54\u7f26\u71b3\u9558\u989f\u87a8\u9cd7\u9794","mang":"\u8292\u832b\u76f2\u5fd9\u83bd\u9099\u6f2d\u6726\u786d\u87d2","meng":"\u6c13\u840c\u8499\u6aac\u76df\u9530\u731b\u68a6\u5b5f\u52d0\u750d\u77a2\u61f5\u791e\u867b\u8722\u8813\u824b\u8268\u9efe","miao":"\u732b\u82d7\u63cf\u7784\u85d0\u79d2\u6e3a\u5e99\u5999\u55b5\u9088\u7f08\u7f2a\u676a\u6dfc\u7707\u9e4b\u8731","mao":"\u8305\u951a\u6bdb\u77db\u94c6\u536f\u8302\u5192\u5e3d\u8c8c\u8d38\u4f94\u88a4\u52d6\u8306\u5cc1\u7441\u6634\u7266\u8004\u65c4\u61cb\u7780\u86d1\u8765\u87ca\u9ae6","me":"\u4e48","mei":"\u73ab\u679a\u6885\u9176\u9709\u7164\u6ca1\u7709\u5a92\u9541\u6bcf\u7f8e\u6627\u5bd0\u59b9\u5a9a\u5776\u8393\u5d4b\u7338\u6d7c\u6e44\u6963\u9545\u9e5b\u8882\u9b45","men":"\u95e8\u95f7\u4eec\u626a\u739f\u7116\u61d1\u9494","mi":"\u772f\u919a\u9761\u7cdc\u8ff7\u8c1c\u5f25\u7c73\u79d8\u89c5\u6ccc\u871c\u5bc6\u5e42\u8288\u5196\u8c27\u863c\u5627\u7315\u736f\u6c68\u5b93\u5f2d\u8112\u6549\u7cf8\u7e3b\u9e8b","mian":"\u68c9\u7720\u7ef5\u5195\u514d\u52c9\u5a29\u7f05\u9762\u6c94\u6e4e\u817c\u7704","mie":"\u8511\u706d\u54a9\u881b\u7bfe","min":"\u6c11\u62bf\u76bf\u654f\u60af\u95fd\u82e0\u5cb7\u95f5\u6cef\u73c9","ming":"\u660e\u879f\u9e23\u94ed\u540d\u547d\u51a5\u8317\u6e9f\u669d\u7791\u9169","miu":"\u8c2c","mo":"\u6478\u6479\u8611\u6a21\u819c\u78e8\u6469\u9b54\u62b9\u672b\u83ab\u58a8\u9ed8\u6cab\u6f20\u5bde\u964c\u8c1f\u8309\u84e6\u998d\u5aeb\u9546\u79e3\u763c\u8031\u87c6\u8c8a\u8c98","mou":"\u8c0b\u725f\u67d0\u53b6\u54de\u5a7a\u7738\u936a","mu":"\u62c7\u7261\u4ea9\u59c6\u6bcd\u5893\u66ae\u5e55\u52df\u6155\u6728\u76ee\u7766\u7267\u7a46\u4eeb\u82dc\u5452\u6c90\u6bea\u94bc","na":"\u62ff\u54ea\u5450\u94a0\u90a3\u5a1c\u7eb3\u5185\u637a\u80ad\u954e\u8872\u7bac","nai":"\u6c16\u4e43\u5976\u8010\u5948\u9f10\u827f\u8418\u67f0","nan":"\u5357\u7537\u96be\u56ca\u5583\u56e1\u6960\u8169\u877b\u8d67","nao":"\u6320\u8111\u607c\u95f9\u5b6c\u57b4\u7331\u7459\u7847\u94d9\u86f2","ne":"\u6dd6\u5462\u8bb7","nei":"\u9981","nen":"\u5ae9\u80fd\u6798\u6041","ni":"\u59ae\u9713\u502a\u6ce5\u5c3c\u62df\u4f60\u533f\u817b\u9006\u6eba\u4f32\u576d\u730a\u6029\u6ee0\u6635\u65ce\u7962\u615d\u7768\u94cc\u9cb5","nian":"\u852b\u62c8\u5e74\u78be\u64b5\u637b\u5ff5\u5eff\u8f87\u9ecf\u9c87\u9cb6","niang":"\u5a18\u917f","niao":"\u9e1f\u5c3f\u8311\u5b32\u8132\u8885","nie":"\u634f\u8042\u5b7d\u556e\u954a\u954d\u6d85\u4e5c\u9667\u8616\u55eb\u8080\u989e\u81ec\u8e51","nin":"\u60a8\u67e0","ning":"\u72de\u51dd\u5b81\u62e7\u6cde\u4f5e\u84e5\u549b\u752f\u804d","niu":"\u725b\u626d\u94ae\u7ebd\u72c3\u5ff8\u599e\u86b4","nong":"\u8113\u6d53\u519c\u4fac","nu":"\u5974\u52aa\u6012\u5476\u5e11\u5f29\u80ec\u5b65\u9a7d","nv":"\u5973\u6067\u9495\u8844","nuan":"\u6696","nuenue":"\u8650","nue":"\u759f\u8c11","nuo":"\u632a\u61e6\u7cef\u8bfa\u50a9\u6426\u558f\u9518","ou":"\u54e6\u6b27\u9e25\u6bb4\u85d5\u5455\u5076\u6ca4\u6004\u74ef\u8026","pa":"\u556a\u8db4\u722c\u5e15\u6015\u7436\u8469\u7b62","pai":"\u62cd\u6392\u724c\u5f98\u6e43\u6d3e\u4ff3\u848e","pan":"\u6500\u6f58\u76d8\u78d0\u76fc\u7554\u5224\u53db\u723f\u6cee\u88a2\u897b\u87e0\u8e52","pang":"\u4e53\u5e9e\u65c1\u802a\u80d6\u6ec2\u9004","pao":"\u629b\u5486\u5228\u70ae\u888d\u8dd1\u6ce1\u530f\u72cd\u5e96\u812c\u75b1","pei":"\u5478\u80da\u57f9\u88f4\u8d54\u966a\u914d\u4f69\u6c9b\u638a\u8f94\u5e14\u6de0\u65c6\u952b\u9185\u9708","pen":"\u55b7\u76c6\u6e53","peng":"\u7830\u62a8\u70f9\u6f8e\u5f6d\u84ec\u68da\u787c\u7bf7\u81a8\u670b\u9e4f\u6367\u78b0\u576f\u580b\u562d\u6026\u87db","pi":"\u7812\u9739\u6279\u62ab\u5288\u7435\u6bd7\u5564\u813e\u75b2\u76ae\u5339\u75de\u50fb\u5c41\u8b6c\u4e15\u9674\u90b3\u90eb\u572e\u9f19\u64d7\u567c\u5e80\u5ab2\u7eb0\u6787\u7513\u7765\u7f74\u94cd\u75e6\u7656\u758b\u868d\u8c94","pian":"\u7bc7\u504f\u7247\u9a97\u8c1d\u9a88\u728f\u80fc\u890a\u7fe9\u8e41","piao":"\u98d8\u6f02\u74e2\u7968\u527d\u560c\u5ad6\u7f25\u6b8d\u779f\u87b5","pie":"\u6487\u77a5\u4e3f\u82e4\u6c15","pin":"\u62fc\u9891\u8d2b\u54c1\u8058\u62da\u59d8\u5ad4\u6980\u725d\u98a6","ping":"\u4e52\u576a\u82f9\u840d\u5e73\u51ed\u74f6\u8bc4\u5c4f\u4fdc\u5a09\u67b0\u9c86","po":"\u5761\u6cfc\u9887\u5a46\u7834\u9b44\u8feb\u7c95\u53f5\u9131\u6ea5\u73c0\u948b\u94b7\u76a4\u7b38","pou":"\u5256\u88d2\u8e23","pu":"\u6251\u94fa\u4ec6\u8386\u8461\u83e9\u84b2\u57d4\u6734\u5703\u666e\u6d66\u8c31\u66dd\u7011\u530d\u5657\u6fee\u749e\u6c06\u9564\u9568\u8e7c","qi":"\u671f\u6b3a\u6816\u621a\u59bb\u4e03\u51c4\u6f06\u67d2\u6c8f\u5176\u68cb\u5947\u6b67\u7566\u5d0e\u8110\u9f50\u65d7\u7948\u7941\u9a91\u8d77\u5c82\u4e5e\u4f01\u542f\u5951\u780c\u5668\u6c14\u8fc4\u5f03\u6c7d\u6ce3\u8bab\u4e9f\u4e93\u573b\u8291\u840b\u847a\u5601\u5c7a\u5c90\u6c54\u6dc7\u9a90\u7eee\u742a\u7426\u675e\u6864\u69ed\u6b39\u797a\u61a9\u789b\u86f4\u871e\u7da6\u7dae\u8dbf\u8e4a\u9ccd\u9e92","qia":"\u6390\u6070\u6d3d\u845c","qian":"\u7275\u6266\u948e\u94c5\u5343\u8fc1\u7b7e\u4edf\u8c26\u4e7e\u9ed4\u94b1\u94b3\u524d\u6f5c\u9063\u6d45\u8c34\u5811\u5d4c\u6b20\u6b49\u4f65\u9621\u828a\u82a1\u8368\u63ae\u5c8d\u60ad\u614a\u9a9e\u6434\u8930\u7f31\u6920\u80b7\u6106\u94a4\u8654\u7b9d","qiang":"\u67aa\u545b\u8154\u7f8c\u5899\u8537\u5f3a\u62a2\u5af1\u6a2f\u6217\u709d\u9516\u9535\u956a\u8941\u8723\u7f9f\u8deb\u8dc4","qiao":"\u6a47\u9539\u6572\u6084\u6865\u77a7\u4e54\u4fa8\u5de7\u9798\u64ac\u7fd8\u5ced\u4fcf\u7a8d\u5281\u8bee\u8c2f\u835e\u6100\u6194\u7f32\u6a35\u6bf3\u7857\u8df7\u9792","qie":"\u5207\u8304\u4e14\u602f\u7a83\u90c4\u553c\u60ec\u59be\u6308\u9532\u7ba7","qin":"\u94a6\u4fb5\u4eb2\u79e6\u7434\u52e4\u82b9\u64d2\u79bd\u5bdd\u6c81\u82a9\u84c1\u8572\u63ff\u5423\u55ea\u5659\u6eb1\u6a8e\u8793\u887e","qing":"\u9752\u8f7b\u6c22\u503e\u537f\u6e05\u64ce\u6674\u6c30\u60c5\u9877\u8bf7\u5e86\u5029\u82d8\u570a\u6aa0\u78ec\u873b\u7f44\u7b90\u8b26\u9cad\u9ee5","qiong":"\u743c\u7a77\u909b\u8315\u7a79\u7b47\u928e","qiu":"\u79cb\u4e18\u90b1\u7403\u6c42\u56da\u914b\u6cc5\u4fc5\u6c3d\u5def\u827d\u72b0\u6e6b\u9011\u9052\u6978\u8d47\u9e20\u866c\u86af\u8764\u88d8\u7cd7\u9cc5\u9f3d","qu":"\u8d8b\u533a\u86c6\u66f2\u8eaf\u5c48\u9a71\u6e20\u53d6\u5a36\u9f8b\u8da3\u53bb\u8bce\u52ac\u8556\u8627\u5c96\u8862\u9612\u74a9\u89d1\u6c0d\u795b\u78f2\u766f\u86d0\u883c\u9eb4\u77bf\u9ee2","quan":"\u5708\u98a7\u6743\u919b\u6cc9\u5168\u75ca\u62f3\u72ac\u5238\u529d\u8be0\u8343\u737e\u609b\u7efb\u8f81\u754e\u94e8\u8737\u7b4c\u9b08","que":"\u7f3a\u7094\u7638\u5374\u9e4a\u69b7\u786e\u96c0\u9619\u60ab","qun":"\u88d9\u7fa4\u9021","ran":"\u7136\u71c3\u5189\u67d3\u82d2\u9aef","rang":"\u74e4\u58e4\u6518\u56b7\u8ba9\u79b3\u7a70","rao":"\u9976\u6270\u7ed5\u835b\u5a06\u6861","ruo":"\u60f9\u82e5\u5f31","re":"\u70ed\u504c","ren":"\u58ec\u4ec1\u4eba\u5fcd\u97e7\u4efb\u8ba4\u5203\u598a\u7eab\u4ede\u834f\u845a\u996a\u8f6b\u7a14\u887d","reng":"\u6254\u4ecd","ri":"\u65e5","rong":"\u620e\u8338\u84c9\u8363\u878d\u7194\u6eb6\u5bb9\u7ed2\u5197\u5d58\u72e8\u7f1b\u6995\u877e","rou":"\u63c9\u67d4\u8089\u7cc5\u8e42\u97a3","ru":"\u8339\u8815\u5112\u5b7a\u5982\u8fb1\u4e73\u6c5d\u5165\u8925\u84d0\u85b7\u5685\u6d33\u6ebd\u6fe1\u94f7\u8966\u98a5","ruan":"\u8f6f\u962e\u670a","rui":"\u854a\u745e\u9510\u82ae\u8564\u777f\u868b","run":"\u95f0\u6da6","sa":"\u6492\u6d12\u8428\u5345\u4ee8\u6332\u98d2","sai":"\u816e\u9cc3\u585e\u8d5b\u567b","san":"\u4e09\u53c1\u4f1e\u6563\u5f61\u9993\u6c35\u6bf5\u7cc1\u9730","sang":"\u6851\u55d3\u4e27\u6421\u78c9\u98a1","sao":"\u6414\u9a9a\u626b\u5ac2\u57fd\u81ca\u7619\u9ccb","se":"\u745f\u8272\u6da9\u556c\u94e9\u94ef\u7a51","sen":"\u68ee","seng":"\u50e7","sha":"\u838e\u7802\u6740\u5239\u6c99\u7eb1\u50bb\u5565\u715e\u810e\u6b43\u75e7\u88df\u970e\u9ca8","shai":"\u7b5b\u6652\u917e","shan":"\u73ca\u82eb\u6749\u5c71\u5220\u717d\u886b\u95ea\u9655\u64c5\u8d61\u81b3\u5584\u6c55\u6247\u7f2e\u5261\u8baa\u912f\u57cf\u829f\u6f78\u59d7\u9a9f\u81bb\u9490\u759d\u87ee\u8222\u8dda\u9cdd","shang":"\u5892\u4f24\u5546\u8d4f\u664c\u4e0a\u5c1a\u88f3\u57a7\u7ef1\u6b87\u71b5\u89de","shao":"\u68a2\u634e\u7a0d\u70e7\u828d\u52fa\u97f6\u5c11\u54e8\u90b5\u7ecd\u52ad\u82d5\u6f72\u86f8\u7b24\u7b72\u8244","she":"\u5962\u8d4a\u86c7\u820c\u820d\u8d66\u6444\u5c04\u6151\u6d89\u793e\u8bbe\u538d\u4f58\u731e\u7572\u9e9d","shen":"\u7837\u7533\u547b\u4f38\u8eab\u6df1\u5a20\u7ec5\u795e\u6c88\u5ba1\u5a76\u751a\u80be\u614e\u6e17\u8bdc\u8c02\u5432\u54c2\u6e16\u6939\u77e7\u8703","sheng":"\u58f0\u751f\u7525\u7272\u5347\u7ef3\u7701\u76db\u5269\u80dc\u5723\u4e1e\u6e11\u5ab5\u771a\u7b19","shi":"\u5e08\u5931\u72ee\u65bd\u6e7f\u8bd7\u5c38\u8671\u5341\u77f3\u62fe\u65f6\u4ec0\u98df\u8680\u5b9e\u8bc6\u53f2\u77e2\u4f7f\u5c4e\u9a76\u59cb\u5f0f\u793a\u58eb\u4e16\u67ff\u4e8b\u62ed\u8a93\u901d\u52bf\u662f\u55dc\u566c\u9002\u4ed5\u4f8d\u91ca\u9970\u6c0f\u5e02\u6043\u5ba4\u89c6\u8bd5\u8c25\u57d8\u83b3\u84cd\u5f11\u5511\u9963\u8f7c\u8006\u8d33\u70bb\u793b\u94c8\u94ca\u87ab\u8210\u7b6e\u8c55\u9ca5\u9cba","shou":"\u6536\u624b\u9996\u5b88\u5bff\u6388\u552e\u53d7\u7626\u517d\u624c\u72e9\u7ef6\u824f","shu":"\u852c\u67a2\u68b3\u6b8a\u6292\u8f93\u53d4\u8212\u6dd1\u758f\u4e66\u8d4e\u5b70\u719f\u85af\u6691\u66d9\u7f72\u8700\u9ecd\u9f20\u5c5e\u672f\u8ff0\u6811\u675f\u620d\u7ad6\u5885\u5eb6\u6570\u6f31\u6055\u500f\u587e\u83fd\u5fc4\u6cad\u6d91\u6f8d\u59dd\u7ebe\u6bf9\u8167\u6bb3\u956f\u79eb\u9e6c","shua":"\u5237\u800d\u5530\u6dae","shuai":"\u6454\u8870\u7529\u5e05\u87c0","shuan":"\u6813\u62f4\u95e9","shuang":"\u971c\u53cc\u723d\u5b40","shui":"\u8c01\u6c34\u7761\u7a0e","shun":"\u542e\u77ac\u987a\u821c\u6042","shuo":"\u8bf4\u7855\u6714\u70c1\u84b4\u6420\u55cd\u6fef\u5981\u69ca\u94c4","si":"\u65af\u6495\u5636\u601d\u79c1\u53f8\u4e1d\u6b7b\u8086\u5bfa\u55e3\u56db\u4f3a\u4f3c\u9972\u5df3\u53ae\u4fdf\u5155\u83e5\u549d\u6c5c\u6cd7\u6f8c\u59d2\u9a77\u7f0c\u7940\u7960\u9536\u9e36\u801c\u86f3\u7b25","song":"\u677e\u8038\u6002\u9882\u9001\u5b8b\u8bbc\u8bf5\u51c7\u83d8\u5d27\u5d69\u5fea\u609a\u6dde\u7ae6","sou":"\u641c\u8258\u64de\u55fd\u53df\u55d6\u55fe\u998a\u6eb2\u98d5\u778d\u953c\u878b","su":"\u82cf\u9165\u4fd7\u7d20\u901f\u7c9f\u50f3\u5851\u6eaf\u5bbf\u8bc9\u8083\u5919\u8c21\u850c\u55c9\u612b\u7c0c\u89eb\u7a23","suan":"\u9178\u849c\u7b97","sui":"\u867d\u968b\u968f\u7ee5\u9ad3\u788e\u5c81\u7a57\u9042\u96a7\u795f\u84d1\u51ab\u8c07\u6fc9\u9083\u71e7\u772d\u7762","sun":"\u5b59\u635f\u7b0b\u836a\u72f2\u98e7\u69ab\u8de3\u96bc","suo":"\u68ad\u5506\u7f29\u7410\u7d22\u9501\u6240\u5522\u55e6\u5a11\u686b\u7743\u7fa7","ta":"\u584c\u4ed6\u5b83\u5979\u5854\u736d\u631e\u8e4b\u8e0f\u95fc\u6ebb\u9062\u69bb\u6c93","tai":"\u80ce\u82d4\u62ac\u53f0\u6cf0\u915e\u592a\u6001\u6c70\u90b0\u85b9\u80bd\u70b1\u949b\u8dc6\u9c90","tan":"\u574d\u644a\u8d2a\u762b\u6ee9\u575b\u6a80\u75f0\u6f6d\u8c2d\u8c08\u5766\u6bef\u8892\u78b3\u63a2\u53f9\u70ad\u90ef\u8548\u6619\u94bd\u952c\u8983","tang":"\u6c64\u5858\u642a\u5802\u68e0\u819b\u5510\u7cd6\u50a5\u9967\u6e8f\u746d\u94f4\u9557\u8025\u8797\u87b3\u7fb0\u91a3","thang":"\u5018\u8eba\u6dcc","theng":"\u8d9f\u70eb","tao":"\u638f\u6d9b\u6ed4\u7ee6\u8404\u6843\u9003\u6dd8\u9676\u8ba8\u5957\u6311\u9f17\u5555\u97ec\u9955","te":"\u7279","teng":"\u85e4\u817e\u75bc\u8a8a\u6ed5","ti":"\u68af\u5254\u8e22\u9511\u63d0\u9898\u8e44\u557c\u4f53\u66ff\u568f\u60d5\u6d95\u5243\u5c49\u8351\u608c\u9016\u7ee8\u7f07\u9e48\u88fc\u918d","tian":"\u5929\u6dfb\u586b\u7530\u751c\u606c\u8214\u8146\u63ad\u5fdd\u9617\u6b84\u754b\u94bf\u86ba","tiao":"\u6761\u8fe2\u773a\u8df3\u4f7b\u7967\u94eb\u7a95\u9f86\u9ca6","tie":"\u8d34\u94c1\u5e16\u841c\u992e","ting":"\u5385\u542c\u70c3\u6c40\u5ef7\u505c\u4ead\u5ead\u633a\u8247\u839b\u8476\u5a77\u6883\u8713\u9706","tong":"\u901a\u6850\u916e\u77b3\u540c\u94dc\u5f64\u7ae5\u6876\u6345\u7b52\u7edf\u75db\u4f5f\u50ee\u4edd\u833c\u55f5\u6078\u6f7c\u783c","tou":"\u5077\u6295\u5934\u900f\u4ea0","tu":"\u51f8\u79c3\u7a81\u56fe\u5f92\u9014\u6d82\u5c60\u571f\u5410\u5154\u580d\u837c\u83df\u948d\u9174","tuan":"\u6e4d\u56e2\u7583","tui":"\u63a8\u9893\u817f\u8715\u892a\u9000\u5fd2\u717a","tun":"\u541e\u5c6f\u81c0\u9968\u66be\u8c5a\u7a80","tuo":"\u62d6\u6258\u8131\u9e35\u9640\u9a6e\u9a7c\u692d\u59a5\u62d3\u553e\u4e47\u4f57\u5768\u5eb9\u6cb1\u67dd\u7823\u7ba8\u8204\u8dce\u9f0d","wa":"\u6316\u54c7\u86d9\u6d3c\u5a03\u74e6\u889c\u4f64\u5a32\u817d","wai":"\u6b6a\u5916","wan":"\u8c4c\u5f2f\u6e7e\u73a9\u987d\u4e38\u70f7\u5b8c\u7897\u633d\u665a\u7696\u60cb\u5b9b\u5a49\u4e07\u8155\u525c\u8284\u82cb\u83c0\u7ea8\u7efe\u742c\u8118\u7579\u873f\u7ba2","wang":"\u6c6a\u738b\u4ea1\u6789\u7f51\u5f80\u65fa\u671b\u5fd8\u5984\u7f54\u5c22\u60d8\u8f8b\u9b4d","wei":"\u5a01\u5dcd\u5fae\u5371\u97e6\u8fdd\u6845\u56f4\u552f\u60df\u4e3a\u6f4d\u7ef4\u82c7\u840e\u59d4\u4f1f\u4f2a\u5c3e\u7eac\u672a\u851a\u5473\u754f\u80c3\u5582\u9b4f\u4f4d\u6e2d\u8c13\u5c09\u6170\u536b\u502d\u504e\u8bff\u9688\u8473\u8587\u5e0f\u5e37\u5d34\u5d6c\u7325\u732c\u95f1\u6ca9\u6d27\u6da0\u9036\u5a13\u73ae\u97ea\u8ece\u709c\u7168\u71a8\u75ff\u8249\u9c94","wen":"\u761f\u6e29\u868a\u6587\u95fb\u7eb9\u543b\u7a33\u7d0a\u95ee\u520e\u6120\u960c\u6c76\u74ba\u97eb\u6b81\u96ef","weng":"\u55e1\u7fc1\u74ee\u84ca\u8579","wo":"\u631d\u8717\u6da1\u7a9d\u6211\u65a1\u5367\u63e1\u6c83\u83b4\u5e44\u6e25\u674c\u809f\u9f8c","wu":"\u5deb\u545c\u94a8\u4e4c\u6c61\u8bec\u5c4b\u65e0\u829c\u68a7\u543e\u5434\u6bcb\u6b66\u4e94\u6342\u5348\u821e\u4f0d\u4fae\u575e\u620a\u96fe\u6664\u7269\u52ff\u52a1\u609f\u8bef\u5140\u4ef5\u9622\u90ac\u572c\u82b4\u5e91\u6003\u5fe4\u6d6f\u5be4\u8fd5\u59a9\u9a9b\u727e\u7110\u9e49\u9e5c\u8708\u92c8\u9f2f","xi":"\u6614\u7199\u6790\u897f\u7852\u77fd\u6670\u563b\u5438\u9521\u727a\u7a00\u606f\u5e0c\u6089\u819d\u5915\u60dc\u7184\u70ef\u6eaa\u6c50\u7280\u6a84\u88ad\u5e2d\u4e60\u5ab3\u559c\u94e3\u6d17\u7cfb\u9699\u620f\u7ec6\u50d6\u516e\u96b0\u90d7\u831c\u8478\u84f0\u595a\u550f\u5f99\u9969\u960b\u6d60\u6dc5\u5c63\u5b09\u73ba\u6a28\u66e6\u89cb\u6b37\u71b9\u798a\u79a7\u94b8\u7699\u7a78\u8725\u87cb\u823e\u7fb2\u7c9e\u7fd5\u91af\u9f37","xia":"\u778e\u867e\u5323\u971e\u8f96\u6687\u5ce1\u4fa0\u72ed\u4e0b\u53a6\u590f\u5413\u6380\u846d\u55c4\u72ce\u9050\u7455\u7856\u7615\u7f45\u9ee0","xian":"\u9528\u5148\u4ed9\u9c9c\u7ea4\u54b8\u8d24\u8854\u8237\u95f2\u6d8e\u5f26\u5acc\u663e\u9669\u73b0\u732e\u53bf\u817a\u9985\u7fa1\u5baa\u9677\u9650\u7ebf\u51bc\u85d3\u5c98\u7303\u66b9\u5a34\u6c19\u7946\u9e47\u75eb\u86ac\u7b45\u7c7c\u9170\u8df9","xiang":"\u76f8\u53a2\u9576\u9999\u7bb1\u8944\u6e58\u4e61\u7fd4\u7965\u8be6\u60f3\u54cd\u4eab\u9879\u5df7\u6a61\u50cf\u5411\u8c61\u8297\u8459\u9977\u5ea0\u9aa7\u7f03\u87d3\u9c9e\u98e8","xiao":"\u8427\u785d\u9704\u524a\u54ee\u56a3\u9500\u6d88\u5bb5\u6dc6\u6653\u5c0f\u5b5d\u6821\u8096\u5578\u7b11\u6548\u54d3\u54bb\u5d24\u6f47\u900d\u9a81\u7ee1\u67ad\u67b5\u7b71\u7bab\u9b48","xie":"\u6954\u4e9b\u6b47\u874e\u978b\u534f\u631f\u643a\u90aa\u659c\u80c1\u8c10\u5199\u68b0\u5378\u87f9\u61c8\u6cc4\u6cfb\u8c22\u5c51\u5055\u4eb5\u52f0\u71ee\u85a4\u64b7\u5ee8\u7023\u9082\u7ec1\u7f2c\u69ad\u698d\u6b59\u8e9e","xin":"\u85aa\u82af\u950c\u6b23\u8f9b\u65b0\u5ffb\u5fc3\u4fe1\u8845\u56df\u99a8\u8398\u6b46\u94fd\u946b","xing":"\u661f\u8165\u7329\u60fa\u5174\u5211\u578b\u5f62\u90a2\u884c\u9192\u5e78\u674f\u6027\u59d3\u9649\u8347\u8365\u64e4\u60bb\u784e","xiong":"\u5144\u51f6\u80f8\u5308\u6c79\u96c4\u718a\u828e","xiu":"\u4f11\u4fee\u7f9e\u673d\u55c5\u9508\u79c0\u8896\u7ee3\u83a0\u5cab\u9990\u5ea5\u9e3a\u8c85\u9af9","xu":"\u589f\u620c\u9700\u865a\u5618\u987b\u5f90\u8bb8\u84c4\u9157\u53d9\u65ed\u5e8f\u755c\u6064\u7d6e\u5a7f\u7eea\u7eed\u8bb4\u8be9\u5729\u84ff\u6035\u6d2b\u6e86\u987c\u6829\u7166\u7809\u76f1\u80e5\u7cc8\u9191","xuan":"\u8f69\u55a7\u5ba3\u60ac\u65cb\u7384\u9009\u7663\u7729\u7eda\u5107\u8c16\u8431\u63ce\u9994\u6ceb\u6d35\u6e32\u6f29\u7487\u6966\u6684\u70ab\u714a\u78b9\u94c9\u955f\u75c3","xue":"\u9774\u859b\u5b66\u7a74\u96ea\u8840\u5671\u6cf6\u9cd5","xun":"\u52cb\u718f\u5faa\u65ec\u8be2\u5bfb\u9a6f\u5de1\u6b89\u6c5b\u8bad\u8baf\u900a\u8fc5\u5dfd\u57d9\u8340\u85b0\u5ccb\u5f87\u6d54\u66db\u7aa8\u91ba\u9c9f","ya":"\u538b\u62bc\u9e26\u9e2d\u5440\u4e2b\u82bd\u7259\u869c\u5d16\u8859\u6daf\u96c5\u54d1\u4e9a\u8bb6\u4f22\u63e0\u5416\u5c88\u8fd3\u5a05\u740a\u6860\u6c29\u7811\u775a\u75d6","yan":"\u7109\u54bd\u9609\u70df\u6df9\u76d0\u4e25\u7814\u8712\u5ca9\u5ef6\u8a00\u989c\u960e\u708e\u6cbf\u5944\u63a9\u773c\u884d\u6f14\u8273\u5830\u71d5\u538c\u781a\u96c1\u5501\u5f66\u7130\u5bb4\u8c1a\u9a8c\u53a3\u9765\u8d5d\u4fe8\u5043\u5156\u8ba0\u8c33\u90fe\u9122\u82ab\u83f8\u5d26\u6079\u95eb\u960f\u6d07\u6e6e\u6edf\u598d\u5ae3\u7430\u664f\u80ed\u814c\u7131\u7f68\u7b75\u917d\u9b47\u990d\u9f39","yang":"\u6b83\u592e\u9e2f\u79e7\u6768\u626c\u4f6f\u75a1\u7f8a\u6d0b\u9633\u6c27\u4ef0\u75d2\u517b\u6837\u6f3e\u5f89\u600f\u6cf1\u7080\u70ca\u6059\u86d8\u9785","yao":"\u9080\u8170\u5996\u7476\u6447\u5c27\u9065\u7a91\u8c23\u59da\u54ac\u8200\u836f\u8981\u8000\u592d\u723b\u5406\u5d3e\u5fad\u7039\u5e7a\u73e7\u6773\u66dc\u80b4\u9e5e\u7a88\u7e47\u9cd0","ye":"\u6930\u564e\u8036\u7237\u91ce\u51b6\u4e5f\u9875\u6396\u4e1a\u53f6\u66f3\u814b\u591c\u6db2\u8c12\u90ba\u63f6\u9980\u6654\u70e8\u94d8","yi":"\u4e00\u58f9\u533b\u63d6\u94f1\u4f9d\u4f0a\u8863\u9890\u5937\u9057\u79fb\u4eea\u80f0\u7591\u6c82\u5b9c\u59e8\u5f5d\u6905\u8681\u501a\u5df2\u4e59\u77e3\u4ee5\u827a\u6291\u6613\u9091\u5c79\u4ebf\u5f79\u81c6\u9038\u8084\u75ab\u4ea6\u88d4\u610f\u6bc5\u5fc6\u4e49\u76ca\u6ea2\u8be3\u8bae\u8c0a\u8bd1\u5f02\u7ffc\u7fcc\u7ece\u5208\u5293\u4f7e\u8bd2\u572a\u572f\u57f8\u61ff\u82e1\u858f\u5f08\u5955\u6339\u5f0b\u5453\u54a6\u54bf\u566b\u5cc4\u5db7\u7317\u9974\u603f\u6021\u6092\u6f2a\u8fe4\u9a7f\u7f22\u6baa\u8d3b\u65d6\u71a0\u9487\u9552\u9571\u75cd\u7617\u7654\u7fca\u8864\u8734\u8223\u7fbf\u7ff3\u914f\u9edf","yin":"\u8335\u836b\u56e0\u6bb7\u97f3\u9634\u59fb\u541f\u94f6\u6deb\u5bc5\u996e\u5c39\u5f15\u9690\u5370\u80e4\u911e\u5819\u831a\u5591\u72fa\u5924\u6c24\u94df\u763e\u8693\u972a\u9f88","ying":"\u82f1\u6a31\u5a74\u9e70\u5e94\u7f28\u83b9\u8424\u8425\u8367\u8747\u8fce\u8d62\u76c8\u5f71\u9896\u786c\u6620\u5b34\u90e2\u8314\u83ba\u8426\u6484\u5624\u81ba\u6ee2\u6f46\u701b\u745b\u748e\u6979\u9e66\u763f\u988d\u7f42","yo":"\u54df\u5537","yong":"\u62e5\u4f63\u81c3\u75c8\u5eb8\u96cd\u8e0a\u86f9\u548f\u6cf3\u6d8c\u6c38\u607f\u52c7\u7528\u4fd1\u58c5\u5889\u6175\u9095\u955b\u752c\u9cd9\u9954","you":"\u5e7d\u4f18\u60a0\u5fe7\u5c24\u7531\u90ae\u94c0\u72b9\u6cb9\u6e38\u9149\u6709\u53cb\u53f3\u4f51\u91c9\u8bf1\u53c8\u5e7c\u5363\u6538\u4f91\u83b8\u5466\u56ff\u5ba5\u67da\u7337\u7256\u94d5\u75a3\u8763\u9c7f\u9edd\u9f2c","yu":"\u8fc2\u6de4\u4e8e\u76c2\u6986\u865e\u611a\u8206\u4f59\u4fde\u903e\u9c7c\u6109\u6e1d\u6e14\u9685\u4e88\u5a31\u96e8\u4e0e\u5c7f\u79b9\u5b87\u8bed\u7fbd\u7389\u57df\u828b\u90c1\u5401\u9047\u55bb\u5cea\u5fa1\u6108\u6b32\u72f1\u80b2\u8a89\u6d74\u5bd3\u88d5\u9884\u8c6b\u9a6d\u79ba\u6bd3\u4f1b\u4fe3\u8c00\u8c15\u8438\u84e3\u63c4\u5581\u5704\u5709\u5d5b\u72f3\u996b\u5ebe\u9608\u59aa\u59a4\u7ea1\u745c\u6631\u89ce\u8174\u6b24\u65bc\u715c\u71e0\u807f\u94b0\u9e46\u7610\u7600\u7ab3\u8753\u7afd\u8201\u96e9\u9f89","yuan":"\u9e33\u6e0a\u51a4\u5143\u57a3\u8881\u539f\u63f4\u8f95\u56ed\u5458\u5706\u733f\u6e90\u7f18\u8fdc\u82d1\u613f\u6028\u9662\u586c\u6c85\u5a9b\u7457\u6a7c\u7230\u7722\u9e22\u8788\u9f0b","yue":"\u66f0\u7ea6\u8d8a\u8dc3\u94a5\u5cb3\u7ca4\u6708\u60a6\u9605\u9fa0\u6a3e\u5216\u94ba","yun":"\u8018\u4e91\u90e7\u5300\u9668\u5141\u8fd0\u8574\u915d\u6655\u97f5\u5b55\u90d3\u82b8\u72c1\u607d\u7ead\u6b92\u6600\u6c32","za":"\u531d\u7838\u6742\u62f6\u5482","zai":"\u683d\u54c9\u707e\u5bb0\u8f7d\u518d\u5728\u54b1\u5d3d\u753e","zan":"\u6512\u6682\u8d5e\u74d2\u661d\u7c2a\u7ccc\u8db1\u933e","zang":"\u8d43\u810f\u846c\u5958\u6215\u81e7","zao":"\u906d\u7cdf\u51ff\u85fb\u67a3\u65e9\u6fa1\u86a4\u8e81\u566a\u9020\u7682\u7076\u71e5\u5523\u7f2b","ze":"\u8d23\u62e9\u5219\u6cfd\u4ec4\u8d5c\u5567\u8fee\u6603\u7b2e\u7ba6\u8234","zei":"\u8d3c","zen":"\u600e\u8c2e","zeng":"\u589e\u618e\u66fe\u8d60\u7f2f\u7511\u7f7e\u9503","zha":"\u624e\u55b3\u6e23\u672d\u8f67\u94e1\u95f8\u7728\u6805\u69a8\u548b\u4e4d\u70b8\u8bc8\u63f8\u5412\u54a4\u54f3\u600d\u781f\u75c4\u86b1\u9f44","zhai":"\u6458\u658b\u5b85\u7a84\u503a\u5be8\u7826","zhan":"\u77bb\u6be1\u8a79\u7c98\u6cbe\u76cf\u65a9\u8f97\u5d2d\u5c55\u8638\u6808\u5360\u6218\u7ad9\u6e5b\u7efd\u8c35\u640c\u65c3","zhang":"\u6a1f\u7ae0\u5f70\u6f33\u5f20\u638c\u6da8\u6756\u4e08\u5e10\u8d26\u4ed7\u80c0\u7634\u969c\u4ec9\u9123\u5e5b\u5d82\u7350\u5adc\u748b\u87d1","zhao":"\u62db\u662d\u627e\u6cbc\u8d75\u7167\u7f69\u5146\u8087\u53ec\u722a\u8bcf\u68f9\u948a\u7b0a","zhe":"\u906e\u6298\u54f2\u86f0\u8f99\u8005\u9517\u8517\u8fd9\u6d59\u8c2a\u966c\u67d8\u8f84\u78d4\u9e67\u891a\u8707\u8d6d","zhen":"\u73cd\u659f\u771f\u7504\u7827\u81fb\u8d1e\u9488\u4fa6\u6795\u75b9\u8bca\u9707\u632f\u9547\u9635\u7f1c\u6862\u699b\u8f78\u8d48\u80d7\u6715\u796f\u755b\u9e29","zheng":"\u84b8\u6323\u7741\u5f81\u72f0\u4e89\u6014\u6574\u62ef\u6b63\u653f\u5e27\u75c7\u90d1\u8bc1\u8be4\u5ce5\u94b2\u94ee\u7b5d","zhi":"\u829d\u679d\u652f\u5431\u8718\u77e5\u80a2\u8102\u6c41\u4e4b\u7ec7\u804c\u76f4\u690d\u6b96\u6267\u503c\u4f84\u5740\u6307\u6b62\u8dbe\u53ea\u65e8\u7eb8\u5fd7\u631a\u63b7\u81f3\u81f4\u7f6e\u5e1c\u5cd9\u5236\u667a\u79e9\u7a1a\u8d28\u7099\u75d4\u6ede\u6cbb\u7a92\u536e\u965f\u90c5\u57f4\u82b7\u646d\u5e19\u5fee\u5f58\u54ab\u9a98\u6809\u67b3\u6800\u684e\u8f75\u8f7e\u6534\u8d3d\u81a3\u7949\u7957\u9ef9\u96c9\u9e37\u75e3\u86ed\u7d77\u916f\u8dd6\u8e2c\u8e2f\u8c78\u89ef","zhong":"\u4e2d\u76c5\u5fe0\u949f\u8877\u7ec8\u79cd\u80bf\u91cd\u4ef2\u4f17\u51a2\u953a\u87bd\u8202\u822f\u8e35","zhou":"\u821f\u5468\u5dde\u6d32\u8bcc\u7ca5\u8f74\u8098\u5e1a\u5492\u76b1\u5b99\u663c\u9aa4\u5544\u7740\u501c\u8bf9\u836e\u9b3b\u7ea3\u80c4\u78a1\u7c40\u8233\u914e\u9cb7","zhu":"\u73e0\u682a\u86db\u6731\u732a\u8bf8\u8bdb\u9010\u7af9\u70db\u716e\u62c4\u77a9\u5631\u4e3b\u8457\u67f1\u52a9\u86c0\u8d2e\u94f8\u7b51\u4f4f\u6ce8\u795d\u9a7b\u4f2b\u4f8f\u90be\u82ce\u8331\u6d19\u6e1a\u6f74\u9a7a\u677c\u69e0\u6a65\u70b7\u94e2\u75b0\u7603\u86b0\u7afa\u7bb8\u7fe5\u8e85\u9e88","zhua":"\u6293","zhuai":"\u62fd","zhuan":"\u4e13\u7816\u8f6c\u64b0\u8d5a\u7bc6\u629f\u556d\u989b","zhuang":"\u6869\u5e84\u88c5\u5986\u649e\u58ee\u72b6\u4e2c","zhui":"\u690e\u9525\u8ffd\u8d58\u5760\u7f00\u8411\u9a93\u7f12","zhun":"\u8c06\u51c6","zhuo":"\u6349\u62d9\u5353\u684c\u7422\u8301\u914c\u707c\u6d4a\u502c\u8bfc\u5ef4\u855e\u64e2\u555c\u6d5e\u6dbf\u6753\u712f\u799a\u65ab","zi":"\u5179\u54a8\u8d44\u59ff\u6ecb\u6dc4\u5b5c\u7d2b\u4ed4\u7c7d\u6ed3\u5b50\u81ea\u6e0d\u5b57\u8c18\u5d6b\u59ca\u5b73\u7f01\u6893\u8f8e\u8d40\u6063\u7726\u9531\u79ed\u8014\u7b2b\u7ca2\u89dc\u8a3e\u9cbb\u9aed","zong":"\u9b03\u68d5\u8e2a\u5b97\u7efc\u603b\u7eb5\u8159\u7cbd","zou":"\u90b9\u8d70\u594f\u63cd\u9139\u9cb0","zu":"\u79df\u8db3\u5352\u65cf\u7956\u8bc5\u963b\u7ec4\u4fce\u83f9\u5550\u5f82\u9a75\u8e74","zuan":"\u94bb\u7e82\u6525\u7f35","zui":"\u5634\u9189\u6700\u7f6a","zun":"\u5c0a\u9075\u6499\u6a3d\u9cdf","zuo":"\u6628\u5de6\u4f50\u67de\u505a\u4f5c\u5750\u5ea7\u961d\u963c\u80d9\u795a\u9162","cou":"\u85ae\u6971\u8f8f\u8160","nang":"\u652e\u54dd\u56d4\u9995\u66e9","o":"\u5594","dia":"\u55f2","chuai":"\u562c\u81aa\u8e39","cen":"\u5c91\u6d94","diu":"\u94e5","nou":"\u8028","fou":"\u7f36","bia":"\u9adf"},
 44 	},
 45 
 46 
 47 
 48 	/**
 49 	 * @author Rui.Zhang
 50 	 * @class 数据校验类
 51 	 * @description 提供一些数据校验函数
 52 	 */
 53 	validation : {
 54 
 55 	
 56 
 57 		/**
 58 		 * @author Rui.Zhang
 59 		 * @description 通过正则判断数据是否为小数
 60 		 * @param {String} str_data 待校验的数据
 61 		 * @returns {Boolean}, true:是小数
 62 		 **/
 63 		isDecimal : function (str_data) {
 64 			str_data = str_data || String(this);
 65 
 66 		    var reg =  /^[0-9]+\.[0-9]+$/;
 67 		    return reg.test(str_data);
 68 		},
 69 
 70 
 71 		/**
 72 		 * @author Rui.Zhang
 73 		 * @description 通过正则来判断数据是否为整数
 74 		 * @param {String} str_data 待校验的数据
 75 		 * @returns {Boolean}, true:是整数
 76 		 **/
 77 		isInteger : function (str_data) {
 78 			str_data = str_data || String(this);
 79 		    var reg =  /^[0-9]+$/;
 80 		    return reg.test(str_data);
 81 		},
 82 
 83 
 84 		/**
 85 		 * @author Rui.Zhang
 86 		 * @description 通过正则来判断数据是否为数字(包括小数)
 87 		 * @param {String} str_data 待校验的数据
 88 		 * @returns {Boolean}, true:是数字
 89 		 **/
 90 		isNumber : function (str_data) {
 91 			str_data = str_data || String(this);
 92 		    var reg =  /^[0-9]+(\.[0-9]+)?$/;
 93 		    return reg.test(str_data);
 94 		},
 95 
 96 
 97 		/**
 98 		 * @author Rui.Zhang
 99 		 * @description 判断数据是否为QQ
100 		 * @param {String} str_data 待校验的数据
101 		 * @returns {Boolean}, true:是QQ
102 		 **/
103 		isQQ : function (str_data) {
104 			str_data = str_data || String(this);
105 		    var reg =  /^[1-9][0-9]{4,10}$/;
106 		    return reg.test(str_data);
107 		},
108 
109 
110 		/**
111 		 * @author Rui.Zhang
112 		 * @description 判断数据是否全为英文, 即全为字母
113 		 * @param {String} str_data 待校验的数据
114 		 * @returns {Boolean}, true:全为字母
115 		 **/
116 		isEnglish : function (str_data) {
117 			str_data = str_data || String(this);
118 		    var reg =  /^[a-zA-Z]+$/;
119 		    return reg.test(str_data);
120 		},
121 
122 
123 		/**
124 		 * @author Rui.Zhang
125 		 * @description 判断数据是否为IPV4地址
126 		 * @param {String} str_data 待校验的数据
127 		 * @returns {Boolean}, true:是IPV4地址
128 		 **/
129 		isIpV4 : function (str_data) {
130 			str_data = str_data || String(this);
131 		    var reg =  /^([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/;
132 		    return reg.test(str_data);
133 		},
134 
135 
136 		/**
137 		 * @author Rui.Zhang
138 		 * @description   判断数据是否为网址(URL),请传入满足http标准协议的链接
139 		 * @param {String} str_data 待校验的数据
140 		 * @param {Boolean} flag 是否使用严格模式,默认为false
141 		 * @returns {Boolean}, true:是网址
142 		 **/
143 		isUrl : function (str_data, flag) {
144 			str_data = str_data || String(this);
145 			flag = flag || false;
146 
147 		    var regular = /^\b(((https?|ftp):\/\/)?[-a-z0-9]+(\.[-a-z0-9]+)*\.(?:com|edu|gov|int|mil|net|org|biz|info|name|museum|asia|coop|aero|[a-z][a-z]|((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d))\b(\/[-a-z0-9_:\@&?=+,.!\/~%\$]*)?)$/i
148 		    var regular2 = /^((https?|ftp):\/\/)(www\.)?\S{0,30}\.\S+$/i
149 
150 		    if (regular2.test(str_data) && !flag) {
151 		        return true;
152 		    } else if(regular.test(str_data) && flag) {
153 		    	return true;
154 		    } else {
155 		        return false;
156 		    }
157 		},
158 
159 
160 		/**
161 		 * @author Rui.Zhang
162 		 * @description 判断数据是否为邮箱
163 		 * @param {String} str_data 待校验的数据
164 		 * @returns {Boolean}, true:是邮箱
165 		 **/
166 		isEmail : function (str_data) {
167 			str_data = str_data || String(this);
168 		    return  /^([a-zA-Z0-9_-]{1,16})@([a-zA-Z0-9]{1,9})(\.[a-zA-Z0-9]{1,9}){0,3}(\.(?:com|net|org|edu|gov|mil|cn|us)){1,4}$/.test(str_data);
169 		},
170 
171 
172 		/**
173 		 * @author Rui.Zhang
174 		 * @description 判断数据是否包含特殊字符, 包含中文标点
175 		 * @param {String} str_data 待校验的数据
176 		 * @returns {Boolean}, true:包含特殊字符, null表示传入参数为null 或者传入参数为空串
177 		 **/
178 		isContainsSpecialChar : function (str_data) {
179 		    if (str_data) {
180 		        //英文符号
181 		        var containSpecialForEnglish = RegExp(/[(\s)(\`)(\~)(\!)(\@)(\#)(\$)(\%)(\^)(\&)(\*)(\()(\))(\-)(\_)(\+)(\=)(\[)(\])(\{)(\})(\|)(\\)(\;)(\:)(\')(\")(\,)(\.)(\/)(\<)(\>)(\?)(\)]+/);
182 		        //中文符号
183 		        var containSpecialForChinese = RegExp(/[(\·)(\~)(\!)(\¥)(\%)(\……)(\&)(\*)(\()(\))(\——)(\【)(\】)(\;)(\:)(\”)(\“)(\’)(\,)(\《)(\。)(\》)(\?)(\、)(\‘)(\’)]+/);
184 
185 		        str_data = str_data || String(this);
186 		        return (containSpecialForEnglish.test(str_data) || containSpecialForChinese.test(str_data));
187 		    }
188 		    return null;
189 		},
190 
191 
192 		/**
193 		 * @author Rui.Zhang
194 		 * @description 判断数据是否为手机号
195 		 * @param {String} str_data 待校验的数据
196 		 * @returns {Boolean}, true:是手机号
197 		 **/
198 		isMobile : function (str_data) {
199 			str_data = str_data || String(this);
200 		    var length = str_data.length;
201 		    return length == 11 && /^1\d{10}$/.test(str_data);
202 		},
203 
204 
205 		/**
206 		 * @author Rui.Zhang
207 		 * @description 判断数据是否为座机号(固定电话)
208 		 * @param {String} str_data 待校验的数据
209 		 * @returns {Boolean}, true:是座机号
210 		 **/
211 		isTelephone : function (str_data) {
212 			str_data = str_data || String(this);
213 		    if (str_data.match(/^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/) == null) {
214 		        return false;
215 		    } else {
216 		        return true;
217 		    }
218 		},
219 
220 
221 		/**
222 		 * @author Rui.Zhang
223 		 * @description 判断数据是否全为中文
224 		 * @param {String} str_data 待校验的数据
225 		 * @returns {Boolean}, true:全中文
226 		 **/
227 		isChinese : function (str_data) {
228 			str_data = str_data || String(this);
229 		    return /^[\u4E00-\u9FA5]*$/.test(str_data);
230 		},
231 
232 
233 		/**
234 		 * @author Rui.Zhang
235 		 * @description 判断是否为统一社会信用代码
236 		 * @param {String} str_data 待校验的数据
237 		 * @returns {Boolean}, true:社会信用代码正确
238 		 **/
239 		isCreditCode : function (str_data) {
240 			var patrn = /^[0-9A-Z]+$/;
241 			//18位校验及大写校验
242 			if ((str_data.length != 18) || (patrn.test(str_data) == false)) { 
243 				return false;
244 			} else { 
245 			var Ancode;//统一社会信用代码的每一个值
246 			var Ancodevalue;//统一社会信用代码每一个值的权重 
247 			var total = 0; 
248 			var weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];//加权因子 
249 			var str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
250 			//不用I、O、S、V、Z 
251 			for (var i = 0; i < str_data.length - 1; i++) 
252 			{
253 			Ancode = str_data.substring(i, i + 1); 
254 			Ancodevalue = str.indexOf(Ancode); 
255 			total = total + Ancodevalue * weightedfactors[i];
256 			//权重与加权因子相乘之和 
257 			}
258 			var logiccheckcode = 31 - total % 31;
259 			if (logiccheckcode == 31) {
260 			logiccheckcode = 0;
261 			}
262 			var Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y";
263 			var Array_Str = Str.split(',');
264 			logiccheckcode = Array_Str[logiccheckcode];
265 
266 
267 			var checkcode = str_data.substring(17, 18);
268 			if (logiccheckcode != checkcode) { 
269 				return false;
270 			}
271 				return true;
272 			}
273 		},
274 
275 
276 		/**
277 		 * @author Rui.Zhang
278 		 * @description 判断是否为银行卡号
279 		 * @param {String} str_cardNo 待校验的数据
280 		 * @returns {Boolean}, true:是银行卡号
281 		 **/
282 		isBankCard : function (str_cardNo) {
283 			str_cardNo = str_cardNo || String(this);
284 		    if ("" == str_cardNo.trim() || undefined == str_cardNo) {
285 		        return false;
286 		    }
287 		    var lastNum = str_cardNo.substr(str_cardNo.length - 1, 1);//取出最后一位(与luhm进行比较)
288 
289 		    var first15Num = str_cardNo.substr(0, str_cardNo.length - 1);//前15或18位
290 		    var newArr=new Array();
291 		    for(var i=first15Num.length-1;i>-1;i--){    //前15或18位倒序存进数组
292 		        newArr.push(first15Num.substr(i,1));
293 		    }
294 		    var arrJiShu=new Array();  //奇数位*2的积 <9
295 		    var arrJiShu2=new Array(); //奇数位*2的积 >9
296 
297 		    var arrOuShu=new Array();  //偶数位数组
298 		    for(var j=0;j<newArr.length;j++){
299 		        if((j+1)%2==1){//奇数位
300 		            if(parseInt(newArr[j])*2<9)
301 		                arrJiShu.push(parseInt(newArr[j])*2);
302 		            else
303 		                arrJiShu2.push(parseInt(newArr[j])*2);
304 		        }
305 		        else //偶数位
306 		            arrOuShu.push(newArr[j]);
307 		    }
308 
309 		    var jishu_child1=new Array();//奇数位*2 >9 的分割之后的数组个位数
310 		    var jishu_child2=new Array();//奇数位*2 >9 的分割之后的数组十位数
311 		    for(var h=0;h<arrJiShu2.length;h++){
312 		        jishu_child1.push(parseInt(arrJiShu2[h])%10);
313 		        jishu_child2.push(parseInt(arrJiShu2[h])/10);
314 		    }
315 
316 		    var sumJiShu=0; //奇数位*2 < 9 的数组之和
317 		    var sumOuShu=0; //偶数位数组之和
318 		    var sumJiShuChild1=0; //奇数位*2 >9 的分割之后的数组个位数之和
319 		    var sumJiShuChild2=0; //奇数位*2 >9 的分割之后的数组十位数之和
320 		    var sumTotal=0;
321 		    for(var m=0;m<arrJiShu.length;m++){
322 		        sumJiShu=sumJiShu+parseInt(arrJiShu[m]);
323 		    }
324 
325 		    for(var n=0;n<arrOuShu.length;n++){
326 		        sumOuShu=sumOuShu+parseInt(arrOuShu[n]);
327 		    }
328 
329 		    for(var p=0;p<jishu_child1.length;p++){
330 		        sumJiShuChild1=sumJiShuChild1+parseInt(jishu_child1[p]);
331 		        sumJiShuChild2=sumJiShuChild2+parseInt(jishu_child2[p]);
332 		    }
333 		    //计算总和
334 		    sumTotal=parseInt(sumJiShu)+parseInt(sumOuShu)+parseInt(sumJiShuChild1)+parseInt(sumJiShuChild2);
335 
336 		    //计算Luhm值
337 		    var k= parseInt(sumTotal)%10==0?10:parseInt(sumTotal)%10;
338 		    var luhm= 10-k;
339 
340 		    if(lastNum==luhm){
341 		        return true;
342 		    }
343 		    else{
344 		        return false;
345 		    }
346 		},
347 
348 
349 		/**
350 		 * @author Rui.Zhang
351 		 * @description 判断是否为身份证号码
352 		 * @param {String} str_idCard 待校验的数据
353 		 * @param {String} [sex] 可选参数,传入时同时校验性别,不传则不校验性别,此值只可能 constant.WOMAN(0) 或者 constant.MAN(1)
354 		 * @returns {Boolean}, true:是身份证
355 		 **/
356 		isIdCard : function (str_idCard, sex) {
357 			str_idCard = str_idCard || String(this);
358 	        var check = function() {
359 	            var factorArr = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
360 	            var parityBit = new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2");
361 	            var varArray = new Array();
362 	            var lngProduct = 0;
363 	            var intCheckDigit;
364 	            var intStrLen = str_idCard.length;
365 	            var idNumber = str_idCard;
366 	            // initialize
367 	            if ((intStrLen != 15) && (intStrLen != 18)) {
368 	                return false;
369 	            }
370 	            // check and set value
371 	            for (i = 0; i < intStrLen; i++) {
372 	                varArray[i] = idNumber.charAt(i);
373 	                if ((varArray[i] < '0' || varArray[i] > '9') && (i != 17)) {
374 	                    return false;
375 	                } else if (i < 17) {
376 	                    varArray[i] = varArray[i] * factorArr[i];
377 	                }
378 	            }
379 
380 	            if (intStrLen == 18) {
381 	                //check date
382 	                var date8 = idNumber.substring(6, 14);
383 
384 	                if (!/^[0-9]{8}$/.test(date8)) {
385 	                    return false;
386 	                }
387 	                var year, month, day;
388 	                year = date8.substring(0, 4);
389 	                month = date8.substring(4, 6);
390 	                day = date8.substring(6, 8);
391 	                var iaMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
392 	                if (year < 1700 || year > 2500) return false;
393 	                if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29;
394 	                if (month < 1 || month > 12) return false;
395 	                if (day < 1 || day > iaMonthDays[month - 1]) return false;
396 
397 	                // calculate the sum of the products
398 	                for (i = 0; i < 17; i++) {
399 	                    lngProduct = lngProduct + varArray[i];
400 	                }
401 	                // calculate the check digit
402 	                intCheckDigit = parityBit[lngProduct % 11];
403 	                // check last digit
404 	                if (varArray[17] != intCheckDigit) {
405 	                    return false;
406 	                }
407 	            }
408 	            //length is 15
409 	            else {
410 	                //check date
411 	                var date6 = idNumber.substring(6, 12);
412 
413 	                if (!/^[0-9]{6}$/.test(date6)) {
414 	                    return false;
415 	                }
416 	                var  month, day, year;
417 	                year = date6.substring(0, 2);	
418 	                month = date6.substring(2, 4);
419 	                day = date6.substring(4, 6);
420 	                if (!/^\d{2}$/.test(year)) return false;
421 	                if (month < 1 || month > 12) return false;
422 	                if (day < 1 || day > 31) return false;
423 	            }
424 	            return true;
425 	        }
426 	        if(str_idCard && check(str_idCard)) {
427 	            if(undefined != sex) {
428 	                var sexStr = undefined, tmp = 0;
429 	                if (15 == str_idCard.length) {
430 	                    tmp = str_idCard.substring(str_idCard.length - 1, str_idCard.length);
431 	                } else if (18 == str_idCard.length) {
432 	                    tmp = str_idCard.substr(str_idCard.length - 2, 1);
433 	                }
434 	                if (0 == tmp % 2) {
435 	                    sexStr = 0;
436 	                } else {
437 	                    sexStr = 1;
438 	                }
439 
440 	                if (sex != sexStr) return false;
441 	            }
442 	            return true;
443 	        }
444 	        return false;
445 	    }
446 	},
447 
448 
449 
450 	/**
451 	 * @author Rui.Zhang
452 	 * @class 数据安全类
453 	 * @description 提供一些数据安全函数
454 	 */
455 	security : {
456 		/**
457 		 * @author Rui.Zhang
458 		 * @description 生成uuid, 该函数已扩展至Mtils对象中
459 		 * @param {int} [len]   可选,生成uuid的长度,默认36位,建议20位以上
460 		 * @param {int} [radix]   可选,生成的进制基数,8是8进制,10是10进制等等
461 		 * @returns {String}, 生成的UUID
462 		 **/
463 		uuid : function (len, radix) {
464 		  var uuid;
465 		  var chars, i, r, uuid;
466 		  chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
467 		  uuid = [];
468 		  i = void 0;
469 		  radix = radix || chars.length;
470 		  if (len) {
471 		    i = 0;
472 		    while (i < len) {
473 		      uuid[i] = chars[0 | Math.random() * radix];
474 		      i++;
475 		    }
476 		  } else {
477 		    r = void 0;
478 		    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
479 		    uuid[14] = '4';
480 		    i = 0;
481 		    while (i < 36) {
482 		      if (!uuid[i]) {
483 		        r = 0 | Math.random() * 16;
484 		        uuid[i] = chars[i === 19 ? r & 0x3 | 0x8 : r];
485 		      }
486 		      i++;
487 		    }
488 		  }
489 		  return uuid.join('');
490 		},
491 
492 		/**
493 		 * @author Rui.Zhang
494 		 * @description  密码强度检测
495 		 * @param {String} str_psw  待签名数据
496 		 * @returns {Object}, 检测结果,对象应为{"level":"2", "desc" : "检测提示:您的密码强度较差!"}, level为密码强度等级(1-5), desc为默认提示信息
497 		 * @example 示例:Mtils.security.passwordStrengthMeter("asd##AS123"), 您可以通过如下方式来得到密码强度等级<br />
498 		 * @example Mtils.security.passwordStrengthMeter("asd##AS123").level;
499 		 * 也可以如下得到密码的检测信息:<br />
500 		 * @example Mtils.security.checkerPasswordStrength("asd##AS123").level;
501 		 **/
502 		checkerPasswordStrength : function (str_psw) {
503 		    var a = /[^ \f\n\r\t\v\da-zA-Z]/, b = /\d/, c = /[a-zA-Z]/;
504 		    var d = /^[^ \f\n\r\t\v\da-zA-Z]+$/, e = /^\d+$/, f = /^[a-zA-Z]+$/;
505 		    if (6 <= str_psw.length) {
506 		        if (a.test(str_psw) && b.test(str_psw) && c.test(str_psw)) {
507 		            if (8 > str_psw.length) {
508 		                return {"level": "2", "desc": "检测提示:您的密码强度较差!"};
509 		            }
510 		            if (12 > str_psw.length) {
511 		                return {"level": "3", "desc": "检测提示:您的密码强度良好!"};
512 		            }
513 		            if (15 > str_psw.length) {
514 		                return {"level": "4", "desc": "检测提示:您的密码强度很高!"};
515 		            }
516 		            if (15 <= str_psw.length) {
517 		                return {"level": "5", "desc": "检测提示:您的密码强度极高!"};
518 		            }
519 		        }
520 		        if (a.test(str_psw) && b.test(str_psw) || a.test(str_psw) && c.test(str_psw) || b.test(str_psw) && c.test(str_psw)) {
521 		            if (8 > str_psw.length) {
522 		                return {"level": "2", "desc": "检测提示:您的密码强度较差!"};
523 		            }
524 		            if (12 > str_psw.length) {
525 		                return {"level": "3", "desc": "检测提示:您的密码强度良好!"};
526 		            }
527 		            if (15 > str_psw.length) {
528 		                return {"level": "4", "desc": "检测提示:您的密码强度很高!"};
529 		            }
530 		            if (15 <= str_psw.length) {
531 		                return {"level": "4", "desc": "检测提示:您的密码强度很高!"};
532 		            }
533 		        }
534 		        if (d.test(str_psw) || e.test(str_psw) || f.test(str_psw)) {
535 		            if (8 <= str_psw.length) {
536 		                return {"level": "2", "desc": "检测提示:您的密码强度较差!"};
537 		            }
538 		        }
539 		        return {"level": "1", "desc": "检测提示:您的密码过于简单!"};
540 		    }
541 		    return {"level": "-1", "desc": "检测提示:通常您的密码应该在6位以上!"};
542 		},
543 
544 
545 		/**
546 		 * @author Rui.Zhang
547 		 * @description 生成一个制定长度的随机数
548 		 * @param {String} [length]   可选,生成随机数的长度, 默认为5位
549 		 * @returns {Integer}, 生成的随机数
550 		 **/
551 		random : function(length) {
552 		        var result, tmp, flag = true;
553 		        if(length) {
554 		            while(flag) {
555 		                tmp = Math.random();
556 		                if(tmp > 0.1) {
557 		                    result = Math.floor(tmp * Math.pow(10, length));
558 		                    flag = false;
559 		                    return result;
560 		                }
561 		            }
562 		        } else {
563 		            while(flag) {
564 		                tmp = Math.random();
565 		                if(tmp > 0.1) {
566 		                    result = Math.floor(tmp * Math.pow(10, 5));
567 		                    flag = false;
568 		                    return result;
569 		                }
570 		            }
571 		        }
572 		},
573 
574 
575 		/**
576 		 * @author Rui.Zhang
577 		 * @description 生成一个随机数,并介于最小值和最大值之间(包括最小值和最大值). 如果不传参数, 则返回一个大于0的随机数
578 		 * @param {String} [min]         可选,生成随机数的最小值
579 		 * @param {Array} [max]          可选,生成随机数的最大值
580 		 * @returns {Integer}, 生成的随机数
581 		 **/
582 		randomBetween : function(min, max) {
583 		    var length;
584 		    var result;
585 		    var tmp;
586 		    if(min && max) {
587 		        result = min + Math.floor( Math.random() * (max - min +1) ) ;
588 		        return result;
589 		    }
590 		    if(!min && !max) {
591 		        result =  Math.floor(Math.random() * 100000);
592 		        return result;
593 		    }
594 
595 		    if(min) {
596 		        length = 100000;
597 		        result = min + Math.floor(Math.random() * length);
598 		        return result;
599 		    }
600 		},
601 
602 
603 		/**
604 		 * @author Rui.Zhang
605 		 * @description 对给定数据进行 hex_sha256 摘要计算
606 		 * @param {String} str_data  待计算的数据
607 		 * @returns {String}, hex_sha256 计算结果
608 		 **/
609 		hex_sha256 : function (str_data) {
610 		    /* SHA256 logical functions */
611 		    var rotateRight = function (n, x) {
612 		        return ((x >>> n) | (x << (32 - n)));
613 		    }
614 		    var choice = function (x, y, z) {
615 		        return ((x & y) ^ (~x & z));
616 		    }
617 		    var majority = function (x, y, z) {
618 		        return ((x & y) ^ (x & z) ^ (y & z));
619 		    }
620 		    var sha256_Sigma0 = function (x) {
621 		        return (rotateRight(2, x) ^ rotateRight(13, x) ^ rotateRight(22, x));
622 		    }
623 		    var sha256_Sigma1 = function (x) {
624 		        return (rotateRight(6, x) ^ rotateRight(11, x) ^ rotateRight(25, x));
625 		    }
626 		    var sha256_sigma0 = function (x) {
627 		        return (rotateRight(7, x) ^ rotateRight(18, x) ^ (x >>> 3));
628 		    }
629 		    var sha256_sigma1 = function (x) {
630 		        return (rotateRight(17, x) ^ rotateRight(19, x) ^ (x >>> 10));
631 		    }
632 		    var sha256_expand = function (W, j) {
633 		        return (W[j & 0x0f] += sha256_sigma1(W[(j + 14) & 0x0f]) + W[(j + 9) & 0x0f] +
634 		        sha256_sigma0(W[(j + 1) & 0x0f]));
635 		    }
636 
637 		    /* Hash constant words K: */
638 		    var K256 = new Array(
639 		        0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
640 		        0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
641 		        0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
642 		        0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
643 		        0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
644 		        0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
645 		        0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
646 		        0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
647 		        0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
648 		        0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
649 		        0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
650 		        0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
651 		        0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
652 		        0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
653 		        0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
654 		        0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
655 		    );
656 
657 		    /* global arrays */
658 		    var ihash, count, buffer;
659 		    var sha256_hex_digits = "0123456789abcdef";
660 
661 		    /* Add 32-bit integers with 16-bit operations (bug in some JS-interpreters:
662 		     overflow) */
663 		    var safe_add = function (x, y) {
664 		        var lsw = (x & 0xffff) + (y & 0xffff);
665 		        var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
666 		        return (msw << 16) | (lsw & 0xffff);
667 		    }
668 
669 		    /* Initialise the SHA256 computation */
670 		    var sha256_init = function () {
671 		        ihash = new Array(8);
672 		        count = new Array(2);
673 		        buffer = new Array(64);
674 		        count[0] = count[1] = 0;
675 		        ihash[0] = 0x6a09e667;
676 		        ihash[1] = 0xbb67ae85;
677 		        ihash[2] = 0x3c6ef372;
678 		        ihash[3] = 0xa54ff53a;
679 		        ihash[4] = 0x510e527f;
680 		        ihash[5] = 0x9b05688c;
681 		        ihash[6] = 0x1f83d9ab;
682 		        ihash[7] = 0x5be0cd19;
683 		    }
684 
685 		    /* Transform a 512-bit message block */
686 		    var sha256_transform = function () {
687 		        var a, b, c, d, e, f, g, h, T1, T2;
688 		        var W = new Array(16);
689 
690 		        /* Initialize registers with the previous intermediate value */
691 		        a = ihash[0];
692 		        b = ihash[1];
693 		        c = ihash[2];
694 		        d = ihash[3];
695 		        e = ihash[4];
696 		        f = ihash[5];
697 		        g = ihash[6];
698 		        h = ihash[7];
699 
700 		        /* make 32-bit words */
701 		        for (var i = 0; i < 16; i++)
702 		            W[i] = ((buffer[(i << 2) + 3]) | (buffer[(i << 2) + 2] << 8) | (buffer[(i << 2) + 1]
703 		            << 16) | (buffer[i << 2] << 24));
704 
705 		        for (var j = 0; j < 64; j++) {
706 		            T1 = h + sha256_Sigma1(e) + choice(e, f, g) + K256[j];
707 		            if (j < 16) T1 += W[j];
708 		            else T1 += sha256_expand(W, j);
709 		            T2 = sha256_Sigma0(a) + majority(a, b, c);
710 		            h = g;
711 		            g = f;
712 		            f = e;
713 		            e = safe_add(d, T1);
714 		            d = c;
715 		            c = b;
716 		            b = a;
717 		            a = safe_add(T1, T2);
718 		        }
719 
720 		        /* Compute the current intermediate hash value */
721 		        ihash[0] += a;
722 		        ihash[1] += b;
723 		        ihash[2] += c;
724 		        ihash[3] += d;
725 		        ihash[4] += e;
726 		        ihash[5] += f;
727 		        ihash[6] += g;
728 		        ihash[7] += h;
729 		    }
730 
731 		    /* Read the next chunk of data and update the SHA256 computation */
732 		    var sha256_update = function (data, inputLen) {
733 		        var i, index, curpos = 0;
734 		        /* Compute number of bytes mod 64 */
735 		        index = ((count[0] >> 3) & 0x3f);
736 		        var remainder = (inputLen & 0x3f);
737 
738 		        /* Update number of bits */
739 		        if ((count[0] += (inputLen << 3)) < (inputLen << 3)) count[1]++;
740 		        count[1] += (inputLen >> 29);
741 
742 		        /* Transform as many times as possible */
743 		        for (i = 0; i + 63 < inputLen; i += 64) {
744 		            for (var j = index; j < 64; j++)
745 		                buffer[j] = data.charCodeAt(curpos++);
746 		            sha256_transform();
747 		            index = 0;
748 		        }
749 
750 		        /* Buffer remaining input */
751 		        for (var j = 0; j < remainder; j++)
752 		            buffer[j] = data.charCodeAt(curpos++);
753 		    }
754 
755 		    /* Finish the computation by operations such as padding */
756 		    var sha256_final = function () {
757 		        var index = ((count[0] >> 3) & 0x3f);
758 		        buffer[index++] = 0x80;
759 		        if (index <= 56) {
760 		            for (var i = index; i < 56; i++)
761 		                buffer[i] = 0;
762 		        } else {
763 		            for (var i = index; i < 64; i++)
764 		                buffer[i] = 0;
765 		            sha256_transform();
766 		            for (var i = 0; i < 56; i++)
767 		                buffer[i] = 0;
768 		        }
769 		        buffer[56] = (count[1] >>> 24) & 0xff;
770 		        buffer[57] = (count[1] >>> 16) & 0xff;
771 		        buffer[58] = (count[1] >>> 8) & 0xff;
772 		        buffer[59] = count[1] & 0xff;
773 		        buffer[60] = (count[0] >>> 24) & 0xff;
774 		        buffer[61] = (count[0] >>> 16) & 0xff;
775 		        buffer[62] = (count[0] >>> 8) & 0xff;
776 		        buffer[63] = count[0] & 0xff;
777 		        sha256_transform();
778 		    }
779 
780 		    /* Get the internal hash as a hex string */
781 		    var sha256_encode_hex = function () {
782 		        var output = new String();
783 		        for (var i = 0; i < 8; i++) {
784 		            for (var j = 28; j >= 0; j -= 4)
785 		                output += sha256_hex_digits.charAt((ihash[i] >>> j) & 0x0f);
786 		        }
787 		        return output;
788 		    }
789 
790 		    sha256_init();
791 		    sha256_update(str_data, str_data.length);
792 		    sha256_final();
793 		    return sha256_encode_hex();
794 		},
795 
796 
797 		/**
798 		 * @author Rui.Zhang
799 		 * @description 对给定数据进行 base64 解码
800 		 * @param {String} str_data  待解码的数据
801 		 * @returns {String}, base64 解码后的数据
802 		 **/
803 		base64_decode : function (str_data) {
804 		    var output = "";
805 		    var chr1, chr2, chr3;
806 		    var enc1, enc2, enc3, enc4;
807 		    var i = 0;
808 		    // private property
809 		    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
810 		    // private method for UTF-8 decoding
811 		    var _utf8_decode = function (utftext) {
812 		        var string = "";
813 		        var i = 0;
814 		        var c = c1 = c2 = 0;
815 		        while (i < utftext.length) {
816 		            c = utftext.charCodeAt(i);
817 		            if (c < 128) {
818 		                string += String.fromCharCode(c);
819 		                i++;
820 		            } else if ((c > 191) && (c < 224)) {
821 		                c2 = utftext.charCodeAt(i + 1);
822 		                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
823 		                i += 2;
824 		            } else {
825 		                c2 = utftext.charCodeAt(i + 1);
826 		                c3 = utftext.charCodeAt(i + 2);
827 		                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
828 		                i += 3;
829 		            }
830 		        }
831 		        return string;
832 		    }
833 
834 		    str_data = str_data.replace(/[^A-Za-z0-9\+\/\=]/g, "");
835 		    while (i < str_data.length) {
836 		        enc1 = _keyStr.indexOf(str_data.charAt(i++));
837 		        enc2 = _keyStr.indexOf(str_data.charAt(i++));
838 		        enc3 = _keyStr.indexOf(str_data.charAt(i++));
839 		        enc4 = _keyStr.indexOf(str_data.charAt(i++));
840 		        chr1 = (enc1 << 2) | (enc2 >> 4);
841 		        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
842 		        chr3 = ((enc3 & 3) << 6) | enc4;
843 		        output = output + String.fromCharCode(chr1);
844 		        if (enc3 != 64) {
845 		            output = output + String.fromCharCode(chr2);
846 		        }
847 		        if (enc4 != 64) {
848 		            output = output + String.fromCharCode(chr3);
849 		        }
850 		    }
851 		    output = _utf8_decode(output);
852 		    return output;
853 		},
854 
855 
856 		/**
857 		 * @author Rui.Zhang
858 		 * @description 对给定数据进行 base64 编码
859 		 * @param {String} str_data  待编码的数据
860 		 * @returns {String}, base64 编码后的数据
861 		 **/
862 		base64_encode : function (str_data) {
863 		    // private property
864 		    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
865 		    // private method for UTF-8 encoding
866 		    var _utf8_encode = function (string) {
867 		        string = string.replace(/\r\n/g, "\n");
868 		        var utftext = "";
869 		        for (var n = 0; n < string.length; n++) {
870 		            var c = string.charCodeAt(n);
871 		            if (c < 128) {
872 		                utftext += String.fromCharCode(c);
873 		            } else if ((c > 127) && (c < 2048)) {
874 		                utftext += String.fromCharCode((c >> 6) | 192);
875 		                utftext += String.fromCharCode((c & 63) | 128);
876 		            } else {
877 		                utftext += String.fromCharCode((c >> 12) | 224);
878 		                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
879 		                utftext += String.fromCharCode((c & 63) | 128);
880 		            }
881 
882 		        }
883 		        return utftext;
884 		    }
885 
886 
887 		    var output = "";
888 		    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
889 		    var i = 0;
890 		    str_data = _utf8_encode(str_data);
891 		    while (i < str_data.length) {
892 		        chr1 = str_data.charCodeAt(i++);
893 		        chr2 = str_data.charCodeAt(i++);
894 		        chr3 = str_data.charCodeAt(i++);
895 		        enc1 = chr1 >> 2;
896 		        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
897 		        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
898 		        enc4 = chr3 & 63;
899 		        if (isNaN(chr2)) {
900 		            enc3 = enc4 = 64;
901 		        } else if (isNaN(chr3)) {
902 		            enc4 = 64;
903 		        }
904 		        output = output +
905 		        _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
906 		        _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
907 		    }
908 		    return output;
909 		},
910 
911 
912 		/**
913 		 * @author Rui.Zhang
914 		 * @description 对给定数据进行 sha1 摘要计算
915 		 * @param {String} str_data  待计算的数据
916 		 * @returns {String}, sha1 计算结果
917 		 **/
918 		hex_sha1 : function (str_data) {
919 		    var hexcase = 0;
920 		    /*   hex   output   format.   0   -   lowercase;   1   -   uppercase                 */
921 		    var chrsz = 8;
922 		    /*   bits   per   input   character.   8   -   ASCII;   16   -   Unicode             */
923 
924 		    /*
925 		     *   Convert   an   array   of   big-endian   words   to   a   hex   string.
926 		     */
927 		    var binb2hex = function (binarray) {
928 		        var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
929 		        var str = "";
930 		        for (var i = 0; i < binarray.length * 4; i++) {
931 		            str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);
932 		        }
933 		        return str;
934 		    }
935 
936 		    /*
937 		     *   Bitwise   rotate   a   32-bit   number   to   the   left.
938 		     */
939 		    var rol = function (num, cnt) {
940 		        return (num << cnt) | (num >>> (32 - cnt));
941 		    }
942 
943 		    /*
944 		     *   Calculate   the   SHA-1   of   an   array   of   big-endian   words,   and   a   bit   length
945 		     */
946 		    var core_sha1 = function (x, len) {
947 		        /*   append   padding   */
948 		        x[len >> 5] |= 0x80 << (24 - len % 32);
949 		        x[((len + 64 >> 9) << 4) + 15] = len;
950 
951 		        var w = Array(80);
952 		        var a = 1732584193;
953 		        var b = -271733879;
954 		        var c = -1732584194;
955 		        var d = 271733878;
956 		        var e = -1009589776;
957 
958 		        for (var i = 0; i < x.length; i += 16) {
959 		            var olda = a;
960 		            var oldb = b;
961 		            var oldc = c;
962 		            var oldd = d;
963 		            var olde = e;
964 
965 		            for (var j = 0; j < 80; j++) {
966 		                if (j < 16) w[j] = x[i + j];
967 		                else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
968 		                var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));
969 		                e = d;
970 		                d = c;
971 		                c = rol(b, 30);
972 		                b = a;
973 		                a = t;
974 		            }
975 
976 		            a = safe_add(a, olda);
977 		            b = safe_add(b, oldb);
978 		            c = safe_add(c, oldc);
979 		            d = safe_add(d, oldd);
980 		            e = safe_add(e, olde);
981 		        }
982 		        return Array(a, b, c, d, e);
983 
984 		    }
985 
986 		    /*
987 		     *   Convert   an   8-bit   or   16-bit   string   to   an   array   of   big-endian   words
988 		     *   In   8-bit   function,   characters   >255   have   their   hi-byte   silently   ignored.
989 		     */
990 		    var str2binb = function (str) {
991 		        var bin = Array();
992 		        var mask = (1 << chrsz) - 1;
993 		        for (var i = 0; i < str.length * chrsz; i += chrsz)
994 		            bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i % 32);
995 		        return bin;
996 		    }
997 
998 		    /*
999 		     *   Add   integers,   wrapping   at   2^32.   This   uses   16-bit   operations   internally
1000 		     *   to   work   around   bugs   in   some   JS   interpreters.
1001 		     */
1002 		    var safe_add = function (x, y) {
1003 		        var lsw = (x & 0xFFFF) + (y & 0xFFFF);
1004 		        var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
1005 		        return (msw << 16) | (lsw & 0xFFFF);
1006 		    }
1007 
1008 		    /*
1009 		     *   Perform   the   appropriate   triplet   combination   function   for   the   current
1010 		     *   iteration
1011 		     */
1012 		    var sha1_ft = function (t, b, c, d) {
1013 		        if (t < 20) return (b & c) | ((~b) & d);
1014 		        if (t < 40) return b ^ c ^ d;
1015 		        if (t < 60) return (b & c) | (b & d) | (c & d);
1016 		        return b ^ c ^ d;
1017 		    }
1018 
1019 		    /*
1020 		     *   Determine   the   appropriate   additive   constant   for   the   current   iteration
1021 		     */
1022 		    var sha1_kt = function (t) {
1023 		        return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;
1024 		    }
1025 
1026 		    return binb2hex(core_sha1(str2binb(str_data), str_data.length * chrsz));
1027 		},
1028 
1029 
1030 		/**
1031 		 * @author Rui.Zhang
1032 		 * @description 对给定数据进行 md5 摘要计算
1033 		 * @param {String} str_data  待计算的数据
1034 		 * @returns {String}, md5 计算结果
1035 		 **/
1036 		hex_md5 : function (str_data) {
1037 		    var chrsz = 8;
1038 		    /* bits per input character. 8 - ASCII; 16 - Unicode      */
1039 		    var hexcase = 0;
1040 		    /* hex output format. 0 - lowercase; 1 - uppercase        */
1041 
1042 		    /*
1043 		     * Convert an array of little-endian words to a base-64 string
1044 		     */
1045 		    var binl2b64 = function (binarray) {
1046 		        var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1047 		        var str = "";
1048 		        for (var i = 0; i < binarray.length * 4; i += 3) {
1049 		            var triplet = (((binarray[i >> 2] >> 8 * ( i % 4)) & 0xFF) << 16)
1050 		                | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8 )
1051 		                | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF);
1052 		            for (var j = 0; j < 4; j++) {
1053 		                if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
1054 		                else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);
1055 		            }
1056 		        }
1057 		        return str;
1058 		    }
1059 
1060 		    /*
1061 		     * These functions implement the four basic operations the algorithm uses.
1062 		     */
1063 		    var md5_cmn = function (q, a, b, x, s, t) {
1064 		        return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
1065 		    }
1066 		    var md5_ff = function (a, b, c, d, x, s, t) {
1067 		        return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
1068 		    }
1069 		    var md5_gg = function (a, b, c, d, x, s, t) {
1070 		        return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
1071 		    }
1072 		    var md5_hh = function (a, b, c, d, x, s, t) {
1073 		        return md5_cmn(b ^ c ^ d, a, b, x, s, t);
1074 		    }
1075 		    var md5_ii = function (a, b, c, d, x, s, t) {
1076 		        return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
1077 		    }
1078 
1079 		    /*
1080 		     * Convert an array of little-endian words to a base-64 string
1081 		     */
1082 		    var binl2b64 = function (binarray) {
1083 		        var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1084 		        var str = "";
1085 		        for (var i = 0; i < binarray.length * 4; i += 3) {
1086 		            var triplet = (((binarray[i >> 2] >> 8 * ( i % 4)) & 0xFF) << 16)
1087 		                | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8 )
1088 		                | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF);
1089 		            for (var j = 0; j < 4; j++) {
1090 		                if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
1091 		                else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);
1092 		            }
1093 		        }
1094 		        return str;
1095 		    }
1096 
1097 		    /*
1098 		     * Calculate the MD5 of an array of little-endian words, and a bit length
1099 		     */
1100 		    var core_md5 = function (x, len) {
1101 		        /* append padding */
1102 		        x[len >> 5] |= 0x80 << ((len) % 32);
1103 		        x[(((len + 64) >>> 9) << 4) + 14] = len;
1104 
1105 		        var a = 1732584193;
1106 		        var b = -271733879;
1107 		        var c = -1732584194;
1108 		        var d = 271733878;
1109 
1110 		        for (var i = 0; i < x.length; i += 16) {
1111 		            var olda = a;
1112 		            var oldb = b;
1113 		            var oldc = c;
1114 		            var oldd = d;
1115 
1116 		            a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
1117 		            d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
1118 		            c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
1119 		            b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
1120 		            a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
1121 		            d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
1122 		            c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
1123 		            b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
1124 		            a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
1125 		            d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
1126 		            c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
1127 		            b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
1128 		            a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
1129 		            d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
1130 		            c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
1131 		            b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
1132 
1133 		            a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
1134 		            d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
1135 		            c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
1136 		            b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
1137 		            a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
1138 		            d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
1139 		            c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
1140 		            b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
1141 		            a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
1142 		            d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
1143 		            c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
1144 		            b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
1145 		            a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
1146 		            d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
1147 		            c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
1148 		            b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
1149 
1150 		            a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
1151 		            d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
1152 		            c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
1153 		            b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
1154 		            a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
1155 		            d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
1156 		            c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
1157 		            b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
1158 		            a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
1159 		            d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
1160 		            c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
1161 		            b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
1162 		            a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
1163 		            d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
1164 		            c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
1165 		            b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
1166 
1167 		            a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
1168 		            d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
1169 		            c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
1170 		            b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
1171 		            a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
1172 		            d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
1173 		            c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
1174 		            b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
1175 		            a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
1176 		            d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
1177 		            c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
1178 		            b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
1179 		            a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
1180 		            d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
1181 		            c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
1182 		            b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
1183 
1184 		            a = safe_add(a, olda);
1185 		            b = safe_add(b, oldb);
1186 		            c = safe_add(c, oldc);
1187 		            d = safe_add(d, oldd);
1188 		        }
1189 		        return Array(a, b, c, d);
1190 		    }
1191 
1192 
1193 		    /*
1194 		     * These functions implement the four basic operations the algorithm uses.
1195 		     */
1196 		    var md5_cmn = function (q, a, b, x, s, t) {
1197 		        return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
1198 		    }
1199 
1200 		    /*
1201 		     * Convert an array of little-endian words to a hex string.
1202 		     */
1203 		    var binl2hex = function (binarray) {
1204 		        var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
1205 		        var str = "";
1206 		        for (var i = 0; i < binarray.length * 4; i++) {
1207 		            str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) +
1208 		            hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8  )) & 0xF);
1209 		        }
1210 		        return str;
1211 		    }
1212 
1213 		    /*
1214 		     * Convert a string to an array of little-endian words
1215 		     * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
1216 		     */
1217 		    var str2binl = function (str) {
1218 		        var bin = Array();
1219 		        var mask = (1 << chrsz) - 1;
1220 		        for (var i = 0; i < str.length * chrsz; i += chrsz)
1221 		            bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
1222 		        return bin;
1223 		    }
1224 
1225 		    /*
1226 		     * Add integers, wrapping at 2^32. This uses 16-bit operations internally
1227 		     * to work around bugs in some JS interpreters.
1228 		     */
1229 		    var safe_add = function (x, y) {
1230 		        var lsw = (x & 0xFFFF) + (y & 0xFFFF);
1231 		        var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
1232 		        return (msw << 16) | (lsw & 0xFFFF);
1233 		    }
1234 
1235 		    /*
1236 		     * Bitwise rotate a 32-bit number to the left.
1237 		     */
1238 		    var bit_rol = function (num, cnt) {
1239 		        return (num << cnt) | (num >>> (32 - cnt));
1240 		    }
1241 
1242 		    return binl2hex(core_md5(str2binl(str_data), str_data.length * chrsz));
1243 		}
1244 	},
1245 
1246 
1247 
1248 	/**
1249 	 * @author Rui.Zhang
1250 	 * @class 扩展类
1251 	 * @description 提供一些扩展加强的函数
1252 	 */
1253 	extention : {
1254 		/**
1255 		 * @author Rui.Zhang
1256 		 * @description 数组排序;可以排序简单数组或对象数组;
1257 		 * @description 例如;根据年龄排序以下对象数组. <br> var arr = [{name:"张三", age:11}, {name:"李四", age:13}]; <br> result = arr.sort(sortBy("age", false)); <br> 排序结果为 [{name:"李四", age:13}, {name:"张三", age:11}];<br> 又例如排序简单数组 arr = [1,2,3,4,5];<br>正序排序调用 arr.sort(Mtils.extention.sortBy(true); <br> 逆序排序用 arr.sort(Mtils.extention.sortBy(false);
1258 		 * @param {string} arg1  排序对象数组时;此参数为欲排序的属性;当排序简单数组时,此参数含义与第二个参数相同
1259 		 * @param {boolean} arg2  true/升序;false/降序
1260 		 * @returns {boolean}
1261 		 **/
1262 		sortBy : function(attr, rev) {
1263 			if(!Mtils.isString(attr)) rev = attr;
1264 		    //第二个参数没有传递 默认升序排列
1265 	        if(rev ==  undefined){
1266 	            rev = 1;
1267 	        }else{
1268 	            rev = (rev) ? 1 : -1;
1269 	        }
1270 
1271 	        return function(a,b){
1272 	        	if(Mtils.isString(attr)) {
1273 					if(Mtils.isObject(a)) a = a[attr];
1274 		            if(Mtils.isObject(b)) b = b[attr];
1275 	        	}
1276 	        
1277 	            if(a < b){
1278 	                return rev * -1;
1279 	            }
1280 	            if(a > b){
1281 	                return rev * 1;
1282 	            }
1283 	            return 0;
1284 	        }
1285 		},
1286 		
1287 
1288 		/**
1289 		 * @author Rui.Zhang
1290 		 * @description 将一个对象进行拷贝,可以传入多个对象,第一个参数会覆盖第二个参数的属性.该对象已扩展到Mtils
1291 		 * @param {any} arg1  欲拷贝属性的对象1,若为true则为深拷贝
1292 		 * @param {any} arg2  欲拷贝属性的对象2
1293 		 * @returns {boolean}
1294 		 **/
1295 		extend : function() {
1296 		    var src, copyIsArray, copy, name, options, clone,
1297 		        target = arguments[0] || {},
1298 		        i = 1,
1299 		        length = arguments.length,
1300 		        deep = false;
1301 
1302 		    // Handle a deep copy situation
1303 		    if ( typeof target === "boolean" ) {
1304 		        deep = target;
1305 		        target = arguments[1] || {};
1306 		        // skip the boolean and the target
1307 		        i = 2;
1308 		    }
1309 
1310 		    // Handle case when target is a string or something (possible in deep copy)
1311 		    if ( !Mtils.isObject(target)) {
1312 		        target = {};
1313 		    }
1314 
1315 		    for ( ; i < length; i++ ) {
1316 		        // Only deal with non-null/undefined values
1317 		        if ( (options = arguments[ i ]) != null ) {
1318 		            // Extend the base object
1319 		            for ( name in options ) {
1320 		                src = target[ name ];
1321 		                copy = options[ name ];
1322 
1323 		                // Prevent never-ending loop
1324 		                if ( target === copy ) {
1325 		                    continue;
1326 		                }
1327 
1328 		                // Recurse if we're merging plain objects or arrays
1329 		                if ( deep && copy && ( Mtils.isEmpty(copy) || (copyIsArray = Mtils.extend(copy)) ) ) {
1330 		                    if ( copyIsArray ) {
1331 		                        copyIsArray = false;
1332 		                        clone = src && Mtils.isArray(src) ? src : [];
1333 
1334 		                    } else {
1335 		                        clone = src && Mtils.isEmpty(src) ? src : {};
1336 		                    }
1337 
1338 		                    // Never move original objects, clone them
1339 		                    target[ name ] = Mtils.extend( deep, clone, copy );
1340 
1341 		                // Don't bring in undefined values
1342 		                } else if ( copy !== undefined ) {
1343 		                    target[ name ] = copy;
1344 		                }
1345 		            }
1346 		        }
1347 		    }
1348 
1349 		    // Return the modified object
1350 		    return target;
1351 		},
1352 		
1353 		/**
1354 		 * @author Rui.Zhang
1355 		 * @description 判断数据中是否包含指定数据,该对象已经扩展到Array,String.
1356 		 * @param {any} param  被搜寻的数据
1357 		 * @param {any} include  欲搜寻的数据
1358 		 * @returns {boolean}
1359 		 **/
1360 		includes : function (param, include) {
1361 			if(1 == arguments.length && Mtils.extention !== this) {
1362 				include = param;
1363 				return -1 !== this.indexOf(include);
1364 			} else if(2 === arguments.length) {
1365 				return -1 !== param.indexOf(include);
1366 			}
1367 		},
1368 
1369 
1370 		/**
1371 		 * @author Rui.Zhang
1372 		 * @description 将非严格模式的JSON字符串转换为JSON对象, 也可用于字符串转普通数据类型, 如'true'转为true, 该函数已扩展到window/Mtils对象中;
1373 		 * @param {String} str  待转换的JSON字符串
1374 		 * @returns {any}
1375 		 **/
1376 		strToJson : function (str) {
1377 		    return (new Function("return " + str))();
1378 		},
1379 
1380 
1381 		/**
1382 		 * @author Rui.Zhang
1383 		 * @description 返回服务器的当前时间时间,可以格式化后返回,默认返回时间戳. 该函数已扩展到Date/Mtils对象中
1384 		 * @description 注意:当在本地使用此函数将会返回本地时间,服务器请求地址为:location.href
1385 		 * @param {String} format  时间格式化参数
1386 		 * @returns {float/Int}
1387 		 **/
1388 		now : function (format) {
1389 		    var timestamp = null;
1390 			var ajax = null;
1391 			if("file:" != location.protocol) {
1392 				try{
1393 			    	ajax = new ActiveXObject("microsoft.xmlhttp");
1394 				}catch(e1){
1395 				    try{
1396 				        ajax = new XMLHttpRequest();
1397 				    }catch(e2){
1398 				        console.log("你的浏览器中不支持异步对象,请换浏览器");
1399 				    }
1400 				}
1401 				ajax.open("HEAD", location.href, false);
1402 				ajax.send(null);
1403 				timestamp = ajax.getResponseHeader("Date");
1404 			} else {
1405 				timestamp = new Date().getTime();
1406 			}
1407 			
1408 
1409 			if(!timestamp) return null;
1410 			timestamp = new Date(timestamp).getTime();
1411 
1412 		    if(format) 
1413 		    	return Mtils.extention.formatDate(timestamp, format);
1414 		    return timestamp;	
1415 		},
1416 
1417 
1418 		/**
1419 		 * @author Rui.Zhang
1420 		 * @description 加法函数,用来得到精确的加法结果, 该函数已扩展到Math对象中
1421 		 * @param {Float/Int} arg1  数值1
1422 		 * @param {Float/Int} arg2  数值2
1423 		 * @returns {float/Int}
1424 		 **/
1425 		accAdd : function (arg1, arg2) {
1426 		    var r1, r2, m, c;
1427 		    try {
1428 		        r1 = arg1.toString().split(".")[1].length;
1429 		    }
1430 		    catch (e) {
1431 		        r1 = 0;
1432 		    }
1433 		    try {
1434 		        r2 = arg2.toString().split(".")[1].length;
1435 		    }
1436 		    catch (e) {
1437 		        r2 = 0;
1438 		    }
1439 		    c = Math.abs(r1 - r2);
1440 		    m = Math.pow(10, Math.max(r1, r2));
1441 		    if (c > 0) {
1442 		        var cm = Math.pow(10, c);
1443 		        if (r1 > r2) {
1444 		            arg1 = Number(arg1.toString().replace(".", ""));
1445 		            arg2 = Number(arg2.toString().replace(".", "")) * cm;
1446 		        } else {
1447 		            arg1 = Number(arg1.toString().replace(".", "")) * cm;
1448 		            arg2 = Number(arg2.toString().replace(".", ""));
1449 		        }
1450 		    } else {
1451 		        arg1 = Number(arg1.toString().replace(".", ""));
1452 		        arg2 = Number(arg2.toString().replace(".", ""));
1453 		    }
1454 		    return (arg1 + arg2) / m;
1455 		},
1456 
1457 
1458 		/**
1459 		 * @author Rui.Zhang
1460 		 * @description 减法函数,用来得到精确的减法结果, 该函数已扩展到Math对象中
1461 		 * @param {Float/Int} arg1  数值1
1462 		 * @param {Float/Int} arg2  数值2
1463 		 * @returns {float/Int}
1464 		 **/
1465 		accSub : function (arg1, arg2) {
1466 		    var r1, r2, m, n;
1467 		    try {
1468 		        r1 = arg1.toString().split(".")[1].length;
1469 		    }
1470 		    catch (e) {
1471 		        r1 = 0;
1472 		    }
1473 		    try {
1474 		        r2 = arg2.toString().split(".")[1].length;
1475 		    }
1476 		    catch (e) {
1477 		        r2 = 0;
1478 		    }
1479 		    m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
1480 		    n = (r1 >= r2) ? r1 : r2;
1481 		    return ((arg1 * m - arg2 * m) / m).toFixed(n);
1482 		},
1483 
1484 
1485 		/**
1486 		 * @author Rui.Zhang
1487 		 * @description 减法乘法,用来得到精确的乘法结果, 该函数已扩展到Math对象中
1488 		 * @param {Float/Int} arg1  数值1
1489 		 * @param {Float/Int} arg2  数值2
1490 		 * @returns {float/Int}
1491 		 **/
1492 		accMul : function (arg1, arg2) {
1493 		    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
1494 		    try {
1495 		        m += s1.split(".")[1].length;
1496 		    }
1497 		    catch (e) {
1498 		    }
1499 		    try {
1500 		        m += s2.split(".")[1].length;
1501 		    }
1502 		    catch (e) {
1503 		    }
1504 		    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
1505 		},
1506 
1507 
1508 		/**
1509 		 * @author Rui.Zhang
1510 		 * @description 除法函数,用来得到精确的除法结果, 该函数已扩展到Math对象中
1511 		 * @param {Float/Int} arg1  数值1
1512 		 * @param {Float/Int} arg2  数值2
1513 		 * @returns {float/Int}
1514 		 **/
1515 		accDiv : function (arg1, arg2) {
1516 		    var t1 = 0, t2 = 0, r1, r2;
1517 		    try {
1518 		        t1 = arg1.toString().split(".")[1].length;
1519 		    }
1520 		    catch (e) {
1521 		    }
1522 		    try {
1523 		        t2 = arg2.toString().split(".")[1].length;
1524 		    }
1525 		    catch (e) {
1526 		    }
1527 	        r1 = Number(arg1.toString().replace(".", ""));
1528 	        r2 = Number(arg2.toString().replace(".", ""));
1529 	        return (r1 / r2) * Math.pow(10, t2 - t1);
1530 		},
1531 
1532 
1533 		/**
1534 		 * @author Rui.Zhang
1535 		 * @description 时间格式化,该函数已扩展到Date对象中
1536 		 * @param {String} timestamp  时间戳
1537 		 * @param {String} pattern 格式化字符串,如 "yy-MM-dd hh:mm:ss"
1538 		 * @returns {String}, 格式化后的时间
1539 		 * @example Mtils.text.formatDate(new Date().getTime(), "yy年MM月dd日  hh时mm分ss秒");
1540 		 * @example new Date().format("yy年MM月dd日  hh时mm分ss秒");
1541 		 **/
1542 		formatDate : function (timestamp, pattern) {
1543 			if(this !== Mtils.extention) {
1544 				pattern = timestamp || "yyyy-MM-dd";
1545 				timestamp = this;
1546 			} else {
1547 				pattern = pattern || "yyyy-MM-dd";
1548 			}
1549 
1550 
1551 		  	var tmp = new Date(timestamp);
1552 		    var o = {
1553 		        "M+": tmp.getMonth() + 1, //month
1554 		        "d+": tmp.getDate(), //day
1555 		        "h+": tmp.getHours(), //hour
1556 		        "m+": tmp.getMinutes(), //minute
1557 		        "s+": tmp.getSeconds(), //second
1558 		        "q+": Math.floor((tmp.getMonth() + 3) / 3), //quarter
1559 		        "S": tmp.getMilliseconds() //millisecond
1560 		    }
1561 
1562 		    if (/(y+)/.test(pattern)) {
1563 		        pattern = pattern.replace(RegExp.$1, (tmp.getFullYear() + "").substr(4 - RegExp.$1.length));
1564 		    }
1565 
1566 		    for (var k in o) {
1567 		        if (new RegExp("(" + k + ")").test(pattern)) {
1568 		            pattern = pattern.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
1569 		        }
1570 		    }
1571 		    return pattern;
1572 		},
1573 
1574 
1575 		/**
1576 		 * @author Rui.Zhang
1577 		 * @description 去除数组中的重复元素, 该函数已扩展到Mtils对象中
1578 		 * @param {Arr} array  待去重数组
1579 		 * @returns {Arr}, 去重后的数组
1580 		 **/
1581 		uniqueArray : function(arr) {
1582             var _this = arr || this;
1583             if(undefined === _this || null === _this || 0 === _this.length) return [];
1584             _this.sort();
1585             var re=[_this[0]];
1586             for(var i = 1; i < _this.length; i++) {
1587                 if( _this[i] !== re[re.length-1]) {
1588                     re.push(_this[i]);
1589                 }
1590             }
1591             return re;
1592         },
1593 
1594         
1595 		/**
1596 		 * @author Rui.Zhang
1597 		 * @description  清除文本右边的空白字符,包括空格/Tab/换行等, 该函数已扩展到String对象中
1598 		 * @param {String} str_data    欲清除的文本
1599 		 * @returns {String}, 清除空白字符后的文本
1600 		 **/
1601 		rtrim : function (str_data) {
1602 			str_data = str_data || String(this);
1603 		    return str_data.replace(/(\s*| *)$/, "");
1604 		},
1605 
1606 
1607 		/**
1608 		 * @author Rui.Zhang
1609 		 * @description  清除文本左边的空白字符,包括空格/Tab/换行等, 该函数已扩展到String对象中
1610 		 * @param {String} str_data    欲清除的文本
1611 		 * @returns {String}, 清除空白字符后的文本
1612 		 **/
1613 		ltrim : function (str_data) {
1614 			str_data = str_data || String(this);
1615 		    return str_data.replace(/^(\s*| *)/, "");
1616 		},
1617 
1618 
1619 		/**
1620 		 * @author Rui.Zhang
1621 		 * @description  清除文本中所有的空白字符,包括空格/Tab/换行等, 该函数已扩展到String对象中
1622 		 * @param {String} str_data    欲清除的文本
1623 		 * @returns {String}, 清除空白字符后的文本
1624 		 **/
1625 		atrim : function (str_data) {
1626 			str_data = str_data || String(this);
1627 		    return str_data.replace(/\s+/g, "");
1628 		},
1629 
1630 
1631 		/**
1632 		 * @author Rui.Zhang
1633 		 * @description  替换源文本中的所有目标文本, 该函数已扩展到String对象中
1634 		 * @param {String} str_origin    被替换的文本
1635 		 * @param {String} str_target    欲替换的文本
1636 		 * @param {String} str_replace   用作替换的文本
1637 		 * @returns {String}, 替换后的文本
1638 		 **/
1639 		replaceAll : function (str_origin, str_target, str_replace) {
1640 			if(this !== Mtils.extention) {
1641 				str_replace = str_target;
1642 				str_target = str_origin;
1643 				str_origin = this;
1644 			}
1645 		    return str_origin.replace(new RegExp(str_target, "gm"), str_replace)
1646 		},
1647 
1648 
1649 		 /**
1650 		 * @author Rui.Zhang
1651 		 * @description 判断变量是否为普通对象, 该函数已扩展到Mtils对象中
1652 		 * @param {varName} varName  待判断数据类型的变量
1653 		 * @returns {boolean}, true/false
1654 		 **/
1655         isObject : function(varName) {
1656 			return varName !== null && Mtils.utils.getVarType(varName) === '[object Object]';
1657         },
1658 
1659 
1660 		/**
1661 		 * @author Rui.Zhang
1662 		 * @description 判断变量是否为window对象, 该函数已扩展到Mtils对象中
1663 		 * @param {varName} varName  待判断数据类型的变量
1664 		 * @returns {boolean}, true/false
1665 		 **/
1666         isWindow : function(varName) {
1667         	return varName && varName.window === varName;
1668         },
1669 
1670 
1671 		/**
1672 		 * @author Rui.Zhang
1673 		 * @description 判断变量是否为文件, 该函数已扩展到Mtils对象中
1674 		 * @param {varName} varName  待判断数据类型的变量
1675 		 * @returns {boolean}, true/false
1676 		 **/
1677         isFile : function(varName) {
1678         	return Mtils.utils.getVarType(varName) === '[object File]';
1679         },
1680 
1681 
1682 		/**
1683 		 * @author Rui.Zhang
1684 		 * @description 判断变量是否为表单数据, 该函数已扩展到Mtils对象中
1685 		 * @param {varName} varName  待判断数据类型的变量
1686 		 * @returns {boolean}, true/false
1687 		 **/
1688         isFormData : function(varName) {
1689         	return Mtils.utils.getVarType(varName) === '[object FormData]';
1690         },
1691 
1692 
1693 		/**
1694 		 * @author Rui.Zhang
1695 		 * @description 判断变量是否为正则表达式, 该函数已扩展到Mtils对象中
1696 		 * @param {varName} varName  待判断数据类型的变量
1697 		 * @returns {boolean}, true/false
1698 		 **/
1699         isRegExp : function(varName) {
1700         	return Mtils.utils.getVarType(varName) === '[object RegExp]';
1701         },
1702 
1703 
1704         /**
1705 		 * @author Rui.Zhang
1706 		 * @description 判断变量是否为数组, 该函数已扩展到Mtils对象中
1707 		 * @param {varName} varName  待判断数据类型的变量
1708 		 * @returns {boolean}, true/false
1709 		 **/
1710 		isArray : Array.isArray,
1711 
1712 
1713 		/**
1714 		 * @author Rui.Zhang
1715 		 * @description 判断变量是否为NaN
1716 		 * @param {varName} varName  待判断数据类型的变量
1717 		 * @returns {boolean}, true/false
1718 		 **/
1719 		isNaN : function(val) {
1720 			return Mtils.isNumber(val) && val !== val; 
1721 		},
1722 
1723         /**
1724 		 * @author Rui.Zhang
1725 		 * @description 通过数据类型判断变量是否为数字, 该函数已扩展到Mtils对象中
1726 		 * @param {varName} varName  待判断数据类型的变量
1727 		 * @returns {boolean}, true/false
1728 		 **/
1729         isNumber : function(varName) {
1730         	return Mtils.utils.getVarType(varName) === '[object Number]';
1731         },
1732 
1733 
1734         /**
1735 		 * @author Rui.Zhang
1736 		 * @description 判断变量是否为函数, 该函数已扩展到Mtils对象中
1737 		 * @param {varName} varName  待判断数据类型的变量
1738 		 * @returns {boolean}, true/false
1739 		 **/
1740         isFunction : function(varName) {
1741         	return Mtils.utils.getVarType(varName) === '[object Function]';
1742         },
1743 
1744 
1745         /**
1746 		 * @author Rui.Zhang
1747 		 * @description 判断变量是否为日期, 该函数已扩展到Mtils对象中
1748 		 * @param {varName} varName  待判断数据类型的变量
1749 		 * @returns {boolean}, true/false
1750 		 **/
1751         isDate : function(varName) {
1752         	return Mtils.utils.getVarType(varName) === '[object Date]';
1753         },
1754 
1755 
1756         /**
1757 		 * @author Rui.Zhang
1758 		 * @description 判断变量是否为字符串, 该函数已扩展到Mtils对象中
1759 		 * @param {varName} varName  待判断数据类型的变量
1760 		 * @returns {boolean}, true/false
1761 		 **/
1762         isString : function(varName) {
1763         	return Mtils.utils.getVarType(varName) === '[object String]';
1764         },
1765 	},
1766 
1767 
1768 
1769 	/**
1770 	 * @author Rui.Zhang
1771 	 * @class 浏览器类
1772 	 * @description 提供一些与当前运行环境相关的函数
1773 	 */
1774 	browser : {
1775 
1776 		/**
1777 		 * @author Rui.Zhang
1778 		 * @description 获取当前浏览器平台内核
1779 		 * @returns {Object}, 该对象描述了一系列可能的浏览器内核,它包含以下属性:trident: IE内核, presto: opera内核, webKit: 苹果、谷歌内核, gecko: 火狐内核Gecko, mobile: 是否为移动终端, ios: ios ,android: android, iPhone: iPhone, iPad: iPad, webApp: Safari, weChat: 微信
1780 		 **/
1781 		version : function () {
1782 			var u = navigator.userAgent; 
1783 	        return { 
1784 	            trident: u.indexOf('Trident') > -1, //IE内核 
1785 	            presto: u.indexOf('Presto') > -1, //opera内核 
1786 	            webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 
1787 	            gecko: u.indexOf('Firefox') > -1, //火狐内核Gecko 
1788 	            mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 
1789 	            ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios 
1790 	            android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android 
1791 	            iPhone: u.indexOf('iPhone') > -1 , //iPhone 
1792 	            iPad: u.indexOf('iPad') > -1, //iPad 
1793 	            webApp: u.indexOf('Safari') > -1, //Safari 
1794 	            weChat: u.indexOf('MicroMessenger') > -1 //微信
1795 	        }; 
1796 		},
1797 
1798 
1799 		/**
1800 		 * @author Rui.Zhang
1801 		 * @description 获取URL中的请求参数,该函数已扩展到window/Mtils对象中
1802 		 * @param {String} [Url]  可选,带参数的URL, 默认为当前访问的URL
1803 		 * @returns {Object}, 序列化后的参数对象 array[param_Key] = param_value
1804 		 **/
1805 		getUrlParam : function (Url) {
1806 		    var result = new Object();
1807 		    if(Url) {
1808 		        var tmp = Url.split("?")[1];
1809 		        if(tmp) {
1810 		            tmp = tmp.split("&");
1811 		            for(var j=0;j<tmp.length;j++) {
1812 		                result[tmp[j].split("=")[0]] = tmp[j].split("=")[1];
1813 		            }
1814 		        }
1815 		    } else {
1816 		        var tmp = location.search.substring(1);
1817 		        if(tmp) {
1818 		            tmp = tmp.split("&");
1819 		            for(var j=0;j<tmp.length;j++) {
1820 		                result[tmp[j].split("=")[0]] = tmp[j].split("=")[1];
1821 		            }
1822 		        }
1823 		    }
1824 		    return result;
1825 		},
1826 		
1827 
1828 		/**
1829 		 * @author Rui.Zhang
1830 		 * @description  删除所有cookie
1831 		 * @returns {boolean}, true: 删除成功
1832 		 **/
1833 		delAllCookie : function () {
1834 		    try {
1835 		        var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
1836 		        if (keys) {
1837 		            for (var i = 0; i < keys.length; i++) {
1838 		                document.cookie = keys[i] + '=null;path=/;expires=' + new Date(0).toGMTString();
1839 		            }
1840 		        }
1841 		    } catch (ae) {
1842 		        return false;
1843 		    }
1844 		    return true;
1845 		},
1846 
1847 
1848 		/**
1849 		 * @author Rui.Zhang
1850 		 * @description  删除cookie
1851 		 * @param {String} str_name    欲删除的cookie名称
1852 		 * @returns {boolean}, true: 删除成功
1853 		 **/
1854 		delCookie : function (str_name) {
1855 		    try {
1856 		        var exp = new Date();
1857 		        exp.setTime(exp.getTime() - 10000);
1858 		        document.cookie = str_name + "=null;path=/;expires=" + exp.toGMTString() + ";";
1859 		    } catch (ae) {
1860 		        return false;
1861 		    }
1862 		    return true;
1863 		},
1864 
1865 
1866 		/**
1867 		 * @author Rui.Zhang
1868 		 * @description  设置cookie
1869 		 * @param {String} str_name    欲设置的cookie名称
1870 		 * @param {String} value       cookie值
1871 		 * @param {String} [expires]   可选 , cookie过期时间,以分钟为单位
1872 		 * @returns {boolean}, true: 设置成功
1873 		 **/
1874 		setCookie : function (str_name, value, expires) {
1875 		    var exp = new Date();
1876 		    try {
1877 		        exp.setTime(exp.getTime() + expires * 60 * 1000);
1878 		        if (expires) {
1879 		            document.cookie = str_name + "=" + decodeURIComponent(value) + ";path=/;expires=" + exp.toGMTString() + ";";
1880 		        } else {
1881 		            document.cookie = str_name + "=" + decodeURIComponent(value) + ";path=/;";
1882 		        }
1883 		    } catch (ae) {
1884 		        return false;
1885 		    }
1886 		    return true;
1887 		},
1888 
1889 
1890 		/**
1891 		 * @author Rui.Zhang
1892 		 * @description  获取cookie值
1893 		 * @param {String} str_name    欲获取的cookie名称
1894 		 * @returns {String}, cookie值, null表示未找到
1895 		 **/
1896 		getCookie : function (str_name) {
1897 		    var arr = document.cookie.match(new RegExp("(^| )" + str_name + "=([^;]*)(;|$)"));
1898 		    if (arr != null) return decodeURI(arr[2]);
1899 		    return null;
1900 		},
1901 	},
1902 
1903 
1904 
1905 	/**
1906 	 * @author Rui.Zhang
1907 	 * @class 工具类
1908 	 * @description 提供一些辅助代码封装
1909 	 */
1910 	utils : {
1911 
1912 		/**
1913 		 * @author Rui.Zhang
1914 		 * @description 清除数组或者对象中的Empty属性,以下会被判断为Empty:空数组/空对象/null/undefined/NaN/'', 该函数已扩展到Mtils对象中
1915 		 * @param {Array|Object} param 欲清除的目标对象
1916 		 * @returns {any} result  已清除empty属性的对象
1917 		 **/
1918 		clearEmpty : function() {
1919 			var target = arguments[0] || this, key, i, length, tmpArray = [];
1920 
1921 			if(!Mtils.isObject(target) && !Mtils.isArray(target)) return target;
1922 
1923 			if(Mtils.isObject(target)) {
1924 				for(key in target) {
1925 					if(Mtils.isEmpty(target[key])) {
1926 						if(Reflect && Reflect.deleteProperty) {
1927 							Reflect.deleteProperty(target, key);
1928 						} else {
1929 							delete target[key];
1930 						}
1931 					} else if(Mtils.isObject(target) || Mtils.isArray(target)) {
1932 						Mtils.utils.clearEmpty(target[key])
1933 					}
1934 					
1935 				}
1936 			}
1937 
1938 			if(Mtils.isArray(target)) {
1939 				tmpArray = [];
1940 				for(i=0,length=target.length; i<length; i++) {
1941 					if(!Mtils.isEmpty(target[i])) tmpArray.push(target[i]);
1942 				}
1943 				target = tmpArray;
1944 			}
1945 
1946 			return target;
1947 
1948 		},
1949 
1950 
1951 		/**
1952 		 * @author Rui.Zhang
1953 		 * @description 在数组中根据ID获取对象, 该函数已扩展到Mtils对象中
1954 		 * @param {string|number|array} id   欲获取的ID值
1955 		 * @param {array} arr  数据源
1956 		 * @param {string} key  如指定此参数则使用此参数为key进行查询
1957 		 * @returns {array} result 符合条件的返回结果集,如果传入的不是数组则返回结果集中的第一个元素
1958 		 **/
1959 		getById : function(search, key) {
1960         	var result = [], arr = this, searchs = [], querys = [], key = key || "id", tmp;
1961 
1962         	if(Mtils.isEmpty(search)) return result[0];
1963 
1964         	if(Mtils.isArray(search)) {
1965         		searchs = searchs.concat(search);
1966         	} else {
1967         		searchs.push(search);
1968         	}
1969         	searchs.forEach(function(item) {
1970         		tmp = {};
1971 
1972 	        	if(Mtils.isObject(item) && item[key]) {
1973 	        		tmp[key] = item[key];
1974 	        		querys.push(tmp);
1975 	        	}
1976 	        	if(Mtils.isString(item) || Mtils.isNumber(item)) {
1977 	        		tmp[key] = item;
1978 	        		querys.push(tmp);
1979 	        	}
1980         	});
1981 			result = Mtils.findInArray(querys, arr);
1982 			if(!Mtils.isArray(search)) {
1983 	        	return result [0];
1984 			}
1985 			return result;
1986         },
1987 
1988 
1989 		/**
1990 		 * @author Rui.Zhang
1991 		 * @description 在数组中根据根据条件进行过滤, 该函数已扩展到Mtils对象中
1992 		 * @param {any} serch   查询条件,可以为字符串,也可以用数组一次查询多个
1993 		 * @param {array} arr  数据源
1994 		 * @param {boolean} regular  在匹配字符串时是否启用正则,启用正则后,查询条件中的值将转化为正则表达式
1995 		 * @returns {array} result 符合条件的返回结果集
1996 		 **/
1997         findInArray : function(search, arr, regular) {
1998         	var result = [], keys , reg, searchs = [];
1999         	arr = arr || this;
2000         	if(undefined === search) result = arr;
2001         	if(!Array.isArray(arr)) return result;
2002 
2003         	if(Mtils.isArray(search)) {
2004         		searchs = searchs.concat(search);
2005         	} else {
2006         		searchs.push(search);
2007         	}
2008 	        	
2009 
2010         	searchs.forEach(function(search) {
2011         		if(Mtils.isObject(search)) keys = Object.keys(search);
2012 
2013         		result = result.concat(arr.filter(function(item) {
2014         			if(typeof(item) === typeof(search)) {
2015         				if(Mtils.isString(search)) {
2016         					if(true === regular) {
2017 								reg = new RegExp(search);
2018 	        					if(reg.test(item)) return true;
2019         					} else {
2020         						if(item === search) return true;
2021         					}
2022         				} else
2023         				if(Mtils.isObject(search)) {
2024 							if(keys.every(function(key) {
2025 		        				if(true === regular && Mtils.isString(item[key]) && Mtils.isString(search[key])) {
2026 		        					reg = new RegExp(search[key]);
2027 		        					if(reg.test(item[key])) return true;
2028 		        				} else {
2029 			        				if(item[key] === search[key]) return true;
2030 		        				}
2031 		        			})) return true;
2032         				} else
2033         				if(item === search) return true;
2034         			}
2035         		}))
2036         	});
2037         	return result;
2038         },
2039 
2040 
2041 		/**
2042 		 * @author Rui.Zhang
2043 		 * @description 判断变量是否定义, 该函数已扩展到Mtils/window对象中
2044 		 * @param {varName} varName  待判断的变量
2045 		 * @returns {boolean}, true/false
2046 		 **/
2047         isDefined : function(varName) {
2048         	return typeof varName !== 'undefined';
2049         },
2050 
2051 
2052 		/**
2053 		 * @author Rui.Zhang
2054 		 * @description 保存数据到localStorage中,该函数已扩展到Mtils对象中
2055 		 * @param {string} key 存取键值, key值重复会导致数据覆盖, 如果参数2为对象, key值可以为该对象属性
2056 		 * @param {String} data 欲存取数据
2057 		 * @param {String} [objKey] 可选项, 当存取数据为对象时, 指定此选项后, 可以通过data[objKey]的值来存取数据
2058 		 * @returns {any}
2059 		 * @example 
2060 		 * 1: Mtils.cache("Authorization", "uc43d452bdb373e4a36c3efc0f91c928d7"), 这里存入了一个名为'Authorization'的数据, 取回方式:  Mtils.cache("Authorization")
2061 		 * 2: Mtils.cache("id", {id:235, name:'mr.zr', age:34}), 这里存入了一个对象, 取回方式如下:  Mtils.cache(235) 或者 Mtils.cache("id")
2062 		 * 3: Mtils.cache("man", {id:235, name:'mr.zr', age:34}, "id"), 这里存入了一个对象, 取回方式如下:  Mtils.cache(235) 或者 Mtils.cache("man")
2063 		 *
2064 		 **/
2065 		cache : function(key, data, obj_key) {
2066 			if(key && data && arguments.length > 1) {
2067 				var mtilsData = localStorage.mtilsData || '{}';
2068 				mtilsData = JSON.parse(mtilsData);
2069 
2070 				if(!obj_key && Mtils.utils.isObject(data) && data[key] && !mtilsData[data[key]]) {
2071 					mtilsData[data[key]] = data;
2072 				} else if(obj_key) {
2073 					mtilsData[data[obj_key]] = data;
2074 				}
2075 				mtilsData[key] = data;
2076 				
2077 				localStorage.mtilsData = JSON.stringify(mtilsData);
2078 			} else {
2079 				var mtilsData = localStorage.mtilsData || '{}';
2080 				mtilsData = JSON.parse(mtilsData);
2081 				return mtilsData[key];
2082 			}
2083 		},
2084 
2085 
2086 		/**
2087 		 * @author Rui.Zhang
2088 		 * @description 深复制, 该函数已扩展到Mtils对象上
2089 		 * @param {any} varName  待复制的数据
2090 		 * @returns {any},  返回深复制的新对象
2091 		 **/
2092         copy : function(obj) {
2093             return JSON.parse(JSON.stringify(obj));
2094         },
2095 
2096 
2097 		/**
2098 		 * @author Rui.Zhang
2099 		 * @description 简单版本的链式语法函数调用,该函数已扩展到Window/Mtils对象中
2100 		 * @param {none} 无参数
2101 		 * @returns {none}, 无返回值 
2102 		 * @example 此方案简单解决回调的解决方案,使用如下:
2103 		 * 
2104 		 * ChainCallManager() 返回一个链式调用对象,可以调用.then(fn)来注册需要调用的函数
2105          * 当函数注册完毕后,调用.start()或.run(),方法启动函数链的调用
2106          * .start()该函数需要你在函数中使用this.next()或this.callNext()方法来手动调用下一个函数,适用于函数之间有先后顺序的调用.比如异步且有顺序,.next()/.callNext()可以传递参数给下一个函数
2107          * .run()函数则系统自动按注册顺序调用调用,适合于函数之间没有关联的调用.比如:函数中有异步请求,则系统不会消耗时间等待异步请求返回.会在发送异步请求后直接调用下一个函数
2108 		 * ChainCallManager().then(function(params) {
2109 	 	 *	 console.log('this is one function', params);
2110 	 	 *   this.next('call function2'); //请注意,如果这里不调用.next(),函数调用将在这里终止,.next()函数中的参数将会传递给下一个函数
2111 		 * }).then(function(params) {
2112 	     *   console.log('this is two function', params);
2113 		 * }).start('start');  //携带启动参数 start
2114 		 * 
2115 		 * 上面将会依次输出: 
2116 		 * line1: this is one function start
2117 		 * line2: this is two function call function2
2118 		 * 
2119 		 * 
2120 		 * ChainCallManager().then(function(params) {
2121 	 	 *	 console.log('this is one function', params);
2122 	 	 *   return 'call funtcion2';    //这里的返回值将会传递给下一个函数
2123 		 * }).then(function(params) {
2124 	     *   console.log('this is two function', params);
2125 		 * }).run('start'); //携带启动参数 start
2126 		 *
2127 		 *
2128 		 * 上面将会依次输出: 
2129 		 * line1: this is one function start
2130 		 * line2: this is two function call funtcion2
2131 		 *
2132 		 **/
2133 		 ChainCallManager : function () {
2134 		    var fn = function() {
2135 		        this.methodsRunIndex = 0;
2136 		        this.methods = [];
2137 		        this.autoCall = false;
2138 
2139 
2140 		        this.next = this.callNext = function(params) {
2141 		            if(!this.autoCall) {
2142 		                this.methodsRunIndex ++;
2143 		                if(this.methods[this.methodsRunIndex]) {
2144 		                    this.methods[this.methodsRunIndex].call(this, params);
2145 		                }
2146 		            }
2147 		            return this;
2148 		        };
2149 
2150 		        this.then = function(fn) {
2151 		            if(fn && "function" === typeof(fn)) {
2152 		                this.methods.push(fn);
2153 		            }
2154 		            return this;
2155 		        };
2156 
2157 		        this.start = function(params) {
2158 		            this.autoCall = false;
2159 
2160 		            this.methods[this.methodsRunIndex].call(this, params);
2161 		        };
2162 
2163 		        this.run = function(params) {
2164 		            var preResult = params || undefined;
2165 
2166 		            this.autoCall = true;
2167 
2168 		            for(var i=0; i<this.methods.length; i++) {
2169 		                this.methodsRunIndex = i;
2170 
2171 		                preResult = this.methods[this.methodsRunIndex].call(this, preResult);
2172 		            }
2173 		        };
2174 		    };
2175 
2176    			return new fn();
2177 		},
2178 
2179 
2180 	 	/**
2181 		 * @author Rui.Zhang
2182 		 * @description 用字符串创建map, 该函数已扩展到Mtils对象中
2183 		 * @param {string} keys 主键字符串,使用','分隔多个key, 例如'key1, key2,...'
2184 		 * @param {any} defaultVal 创建对象时使用的默认值
2185 		 * @returns {object}, 返回创建完成的对象
2186 		 * @example Mtils.utils.makeMap('id,name,sex');  返回值: {id:true, name:true, sex:true}
2187 		 **/
2188 		 makeMap : function(str, defaultVal) {
2189 		  var obj = {}, items = Mtils.extention.trim(str).split(","), i;
2190 		  for (i = 0; i < items.length; i++)
2191 		    obj[ items[i] ] = defaultVal;
2192 		  return obj;
2193 		},
2194 
2195 
2196 		/**
2197 		 * @author Rui.Zhang
2198 		 * @description 获取变量的数据类型, 推荐使用Mtils.extention下的数据类型校验方法
2199 		 * @param {varName} varName  待取数据类型的变量
2200 		 * @returns {string}, 变量的数据类型,可能能为以下类型object,array,number,string,function,date,null,undefined
2201 		 **/
2202         getVarType : function(varName) {
2203             return Object.prototype.toString.call(varName);
2204         },
2205        
2206 
2207         /**
2208 		 * @author Rui.Zhang
2209 		 * @description 判断变量是否为空值,请注意以下对象会被判断为空值:空数组/空对象/null/undefined/NaN/'', 该函数已扩展到Mtils/Window对象中
2210 		 * @param {varName} varName  待判断数据类型的变量
2211 		 * @returns {boolean}, true/false
2212 		 **/
2213         isEmpty : function(varName) {
2214         	if(varName === undefined) return true;
2215         	if(varName === null) return true;
2216         	if(Mtils.isNaN(varName)) return true;
2217         	if(Mtils.isString(varName) && 0 === varName.length) return true;
2218         	if(Mtils.isArray(varName) && 0 === varName.length) return true;
2219         	if(Mtils.isObject(varName) && 0 === Object.keys(varName).length) return true;
2220 
2221         	return false;
2222         },
2223 
2224 
2225      	/**
2226 		 * @author Rui.Zhang
2227 		 * @description 根据对象属性在数组中抽取所有该对象属性的值组成新数组返回
2228 		 * @param {array} sourceArr  待查找的数组
2229 		 * @param {string} properties  要获取的字段
2230 		 * @param {string} defaultVal  默认值
2231 		 * @returns {Array}, 指定属性的集合 
2232 		 **/
2233         extractPropertyValuesInArray : function(sourceArr ,properties, defaultVal) {
2234             var result = [];
2235 
2236             if(sourceArr && Array.isArray(sourceArr)) {
2237                 for(var i= 0, item; i<sourceArr.length; i ++) {
2238                     item = sourceArr[i];
2239                     if(properties && "object" == typeof(item)) {
2240                         if(item[properties]) {
2241                             result.push(item[properties]);
2242                         } else if(undefined != defaultVal) {
2243                             result.push(defaultVal);
2244                         }
2245                     } else {
2246                         if(item) {
2247                             result.push(String(item));
2248                         }else if(undefined != defaultVal) {
2249                             result.push(defaultVal);
2250                         }
2251                     }
2252                 }
2253             }
2254             return result;
2255         },
2256 
2257 
2258 		/**
2259 		 * @author Rui.Zhang
2260 		 * @description 提供进制转换,最大为64进制
2261 		 * @param {String} number  待转换进制序列
2262 		 * @param {number} from  待转换进制(2-64)
2263 		 * @param {number} to  转换到进制(2-64)
2264 		 * @returns {String}, 转换后的进制序列
2265 		 * @example 把16进制0x7b转为2进制, Mtils.utils.decimalConversion("7b",16,2);
2266 		 **/
2267 		decimalConversion : function(number, from, to) {
2268 			var origin = Mtils.constant.BASE_DECIMAL,  tmp, decimal = 0, result = "";
2269 			if(undefined == number || !String(number).replace(/ /gi,"")) return "";
2270 			if(!from) return "";
2271 
2272 			try {
2273 				if(from)
2274 					from = Number(from);    
2275 				if(to)
2276 					to = Number(to);
2277 
2278 				//先将其转换为10进制
2279 				tmp = String(number);
2280 				for(var i=0, j=1;i<tmp.length; i++, j++) {
2281 					decimal +=  origin.indexOf(tmp.charAt(i)) * Math.pow(from, tmp.length - j);
2282 				}
2283 				if(to == '10' || !to) return decimal;
2284 
2285 				//再转换为指定进制
2286 				while(decimal != 0) {
2287 					tmp = decimal % to;
2288 					result = origin.charAt(tmp) + result;
2289 					decimal = (decimal - tmp) / to;
2290 				}
2291 				return result;
2292 			} catch(e) {
2293 				console.log(e);
2294 				return "";
2295 			}
2296 		},
2297 
2298 
2299 		/**
2300 		 * @author Rui.Zhang
2301 		 * @description 获取汉字拼音或首字母
2302 		 * @param {String} str 待获取拼音的字符串,除汉字外其余字符会直接返回
2303 		 * @param {Boolean} extractFirst 只获取汉字拼音首字母
2304 		 * @returns {String} 目标的拼音字符串
2305 		 **/
2306 	    makePy : function (str, extractFirst) {
2307 	    	var i, tmp, key, result = '', flag, firstChar, PYMaps;
2308 
2309 	    	extractFirst = extractFirst || false;
2310 	    	PYMaps = Mtils.constant.PY_MAPS;
2311 
2312 			for(i=0; i<str.length; i++) {
2313 				tmp = str.substr(i, 1);
2314 				flag = false;
2315 				for (key in PYMaps){
2316 		        	if (Mtils.extention.isString(PYMaps[key]) && PYMaps[key].indexOf(tmp) != -1) {
2317 		        	    firstChar = key.substr(0, 1).toUpperCase();
2318 
2319 		        		if(true == extractFirst) {
2320 		        			result += firstChar;
2321 		        		} else {
2322 		        			result += firstChar + key.substr(1, key.length).toLowerCase();
2323 		        		}
2324 		        		
2325 		        		flag = true;
2326 		        		break;
2327 		        	} 
2328 		        }
2329 		        if(!flag ) {
2330 		        	result += tmp;
2331 		        }
2332 		    }
2333 		    return result;
2334 	    },
2335 
2336 
2337 		/**
2338 		 * @author Rui.Zhang
2339 		 * @description 计算年龄
2340 		 * @param {Date} birth 待设置的对象
2341 		 * @param {Date} now 待设置属性名称
2342 		 * @returns {Int} 计算出的年龄
2343 		 **/
2344 		 calcAge : function(birth, now) {
2345 		 	now = now || new Date();
2346 	         if(birth && now) {
2347 	             try {
2348 	                 var birth, now, age;
2349 	                 if("string" === typeof (birth) || "number" === typeof (now)) {
2350 	                     birth = new Date(birth);
2351 	                 }
2352 	                 if("string" === typeof (now) || "number" === typeof (now)) {
2353 	                     now = new Date(now);
2354 	                 }
2355 
2356 	                 age = now.getFullYear() - birth.getFullYear();
2357 	                 if(0 >= age) {
2358 	                     age = 0;
2359 	                 } else if(0 < age) {
2360 	                     if(birth.getMonth() == now.getMonth()) {
2361 	                         if(birth.getDate() > now.getDate()) {
2362 	                             age --;
2363 	                         }
2364 	                     } else if(birth.getMonth() >= now.getMonth()) {
2365 	                         age --;
2366 	                     }
2367 	                 }
2368 	                 return age + "";
2369 	             } catch(e) {
2370 	             	 console.log("Invalid Date, please input like '1992-08-12' or '1992/12/12'");
2371 	                 return "";
2372 	             }
2373 	         }
2374 	         return "";
2375      	},
2376 
2377 
2378 	    /**
2379 		 * @author Rui.Zhang
2380 		 * @description 设置对象属性值
2381 		 * @param {String} obj 待设置的对象
2382 		 * @param {String} propName 待设置属性名称
2383 		 * @param {String} defaultVal 待设置属性的值
2384 		 * @param {String} isCreate 如没有该属性是否创建,默认不创建
2385 		 * @returns {Void}
2386 		 **/
2387 	    setObjectPropertyVal : function (obj, propName, propVal, isCreate) {
2388 	        if(obj && propName ) {
2389 	            if(propName.length > 0 && "object" == typeof obj) {
2390 	                var props = propName.split("."), varStr = "obj";
2391 	                for(var i= 0, attr;i<props.length;i++) {
2392 	                    attr = props[i];
2393 	                    varStr += "." + attr ;
2394 
2395 	                    if(isCreate) {
2396 	                        try {
2397                                 if(undefined == eval(varStr)) {
2398                                     eval(varStr + "={}");
2399                                 }
2400 	                        } catch(e) {
2401 	                            console.log(e)
2402 	                        }
2403 	                    }
2404 	                }
2405 	                varStr += "=propVal";
2406 
2407 	                try {
2408                         eval(varStr);
2409 	                } catch(e) {
2410 	                    console.log(e)
2411 	                }
2412 	            } else {
2413 	                console.log("obj is not object or propName not value");
2414 	            }
2415 	        } else {
2416 	            console.log("params error");
2417 	        }
2418 	    },
2419 
2420 
2421 	    /**
2422 		 * @author Rui.Zhang
2423 		 * @description 获取对象属性值
2424 		 * @param {String} obj 待获取长度的数据
2425 		 * @param {String} propName 待获取属性名称
2426 		 * @param {String} defaultVal 待获取属性未定义则返回此值
2427 		 * @returns {Any}, 获取的属性值
2428 		 **/
2429 	    getObjectPropertyVal : function (obj, propName, defaultVal) {
2430 	        if(obj && propName ) {
2431 	            if(propName.length > 0 && "object" == typeof obj) {
2432 	                var props = propName.split("."), varStr = "obj";
2433 	                for(var i=0;i<props.length;i++) {
2434 	                    varStr += "." + props[i];
2435 
2436 	                    if(null != defaultVal || undefined != defaultVal) {
2437 	                        try {
2438                                 if(undefined == eval(varStr)) {
2439                                    return defaultVal;
2440                                 }
2441 	                        } catch(e) {
2442 	                            console.log(e)
2443 	                        }
2444 	                    }
2445 	                }
2446 
2447 	                try {
2448                         var tmp = eval(varStr);
2449                         if(null == tmp || undefined == tmp) {
2450                             return defaultVal;
2451                         } else {
2452                             return tmp;
2453                         }
2454 	                } catch(e) {
2455 	                    console.log(e)
2456 	                }
2457 	            } else {
2458 	                console.log("obj is not object or propName not value");
2459 	            }
2460 	        } else {
2461 	            console.log("params error");
2462 	        }
2463 	    },
2464 
2465 
2466 		/**
2467 		 * @author Rui.Zhang
2468 		 * @description 获取字符串的字节长度
2469 		 * @param {String} str_data 待获取长度的数据
2470 		 * @returns {Long}, 字符串长度 
2471 		 **/
2472 		getByteLength : function(str_data) {
2473 			str_data = str_data || String(this);
2474 			if(Mtils.utils.isString(str_data)) {
2475 				var Zhlength = 0;// 全角
2476 		        var Enlength = 0;// 半角
2477 		        if(str_data) {
2478 		            for (var i = 0; i < str_data.length; i++) {
2479 		                if (str_data.substring(i, i + 1).match(/[^\x00-\xff]/ig) != null)
2480 		                    Zhlength += 1;
2481 		                else
2482 		                    Enlength += 1;
2483 		            }
2484 		        }
2485 		        // 返回当前字符串字节长度
2486 		        return  (Zhlength * 2) + Enlength; //所占字节数
2487 			}
2488 			return 0;
2489 		},
2490 
2491 
2492 		/**
2493 		 * @author Rui.Zhang
2494 		 * @description  格式化金额, 展示位银行金额格式
2495 		 * @param {Long} long_data     待格式化数值
2496 		 * @param {Integer} [length]     可选,格式化金额精度, 即小数点位数. 如: 3 标示保留小数点后三位, 默认为2位
2497 		 * @returns {String}, 格式化后金额
2498 		 **/
2499 		formatMoney : function (long_data, length) {
2500 		    length = length > 0 && length <= 20 ? length : 2;
2501 		    long_data = parseFloat((long_data + "").replace(/[^\d\.-]/g, "")).toFixed(length) + "";
2502 		    var l = long_data.split(".")[0].split("").reverse(),
2503 		        r = long_data.split(".")[1];
2504 		    t = "";
2505 		    for(i = 0; i < l.length; i ++ )
2506 		    {
2507 		        t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : "");
2508 		    }
2509 		    return t.split("").reverse().join("") + "." + r;
2510 		},
2511 
2512 
2513 		/**
2514 		 * @author Rui.Zhang
2515 		 * @description  文本简介, 即截取字符串前几个字符
2516 		 * @param {String} str_data    待截取文本
2517 		 * @param {Integer} length     待截取长度
2518 		 * @returns {String}, 文本简介
2519 		 **/
2520 		strIntro : function (str_data, length) {
2521 		    if (str_data.length > length) {
2522 		        return str_data.substr(0, length) + "...";
2523 		    } else {
2524 		        return str_data;
2525 		    }
2526 		},
2527 
2528 	}
2529 };
2530 
2531 
2532 
2533 
2534 window.ChainCallManager = Mtils.ChainCallManager = Mtils.utils.ChainCallManager;
2535 window.isDefined = Mtils.isDefined = Mtils.utils.isDefined;
2536 window.isEmpty = Mtils.isEmpty = Mtils.utils.isEmpty;
2537 window.strToJson = Mtils.strToJson = Mtils.extention.strToJson;
2538 
2539 Mtils.copy = Mtils.utils.copy;
2540 Mtils.cache = Mtils.utils.cache;
2541 Mtils.makeMap = Mtils.utils.makeMap;
2542 Mtils.extend = Mtils.extention.extend;
2543 
2544 Mtils.findInArray = Mtils.utils.findInArray;
2545 Mtils.getById = Mtils.utils.getById;
2546 
2547 Mtils.isObject = Mtils.extention.isObject;
2548 Mtils.isArray = Mtils.extention.isArray;
2549 Mtils.isNaN = Mtils.extention.isNaN;
2550 Mtils.isString = Mtils.extention.isString;
2551 Mtils.isDate = Mtils.extention.isDate;
2552 Mtils.isFunction = Mtils.extention.isFunction;
2553 Mtils.isNumber = Mtils.extention.isNumber;
2554 Mtils.isWindow = Mtils.extention.isWindow;
2555 Mtils.isFile = Mtils.extention.isFile;
2556 Mtils.isFormData = Mtils.extention.isFormData;
2557 Mtils.isRegExp = Mtils.extention.isRegExp;
2558 Mtils.unique = Mtils.extention.uniqueArray;
2559 Mtils.includes = Mtils.extention.includes;
2560 Mtils.clearEmpty = Mtils.utils.clearEmpty;
2561 Mtils.uuid = Mtils.security.uuid;
2562 
2563 
2564 if(!Mtils.isEmpty(Math)) Math.accAdd = Mtils.extention.accAdd;
2565 if(!Mtils.isEmpty(Math)) Math.accSub = Mtils.extention.accSub;
2566 if(!Mtils.isEmpty(Math)) Math.accMul = Mtils.extention.accMul;
2567 if(!Mtils.isEmpty(Math)) Math.accDiv = Mtils.extention.accDiv;
2568 
2569 if(Mtils.isEmpty(Date.prototype.formatDate)) Date.prototype.formatDate = Date.prototype.format = Mtils.extention.formatDate;
2570 if(Mtils.isEmpty(Date.prototype.now)) Date.prototype.now = Mtils.now = Mtils.extention.now;
2571 
2572 if(Mtils.isEmpty(String.prototype.rtrim)) String.prototype.rtrim = Mtils.extention.rtrim;
2573 if(Mtils.isEmpty(String.prototype.ltrim)) String.prototype.ltrim = Mtils.extention.ltrim;
2574 if(Mtils.isEmpty(String.prototype.atrim)) String.prototype.atrim = Mtils.extention.atrim;
2575 if(Mtils.isEmpty(String.prototype.replaceAll)) String.prototype.replaceAll = Mtils.extention.replaceAll;
2576 if(Mtils.isEmpty(String.prototype.includes)) String.prototype.includes = Mtils.extention.includes;
2577 
2578 
2579