作者 卢胜
正在显示 35 个修改的文件 包含 50 行增加4761 行删除

要显示太多修改。

为保证性能只显示 35 of 35+ 个文件。

<script>
var wx = require('jweixin-module')
import {authorization,getOpenid } from '@/api/send'
export default {
onLaunch: function() {
onLaunch: function(e) {
const openId = uni.getStorageSync('openId')
if(!openId && !e.query.code){
getApp().authorization()
}else if(e.query.code) {
getApp().getOpenid(e.query.code)
}
console.log(e.query.code);
console.log('App Launch')
},
onShow: function() {
... ... @@ -8,7 +17,38 @@
},
onHide: function() {
console.log('App Hide')
}
},
methods: {
// 拿code
async authorization(){
try {
const res = await authorization(window.location.href)
console.log('authorization', res)
window.location.href = res.url
// 保存数据
} catch (err) {
uni.showToast({ title:err,icon:'none' })
console.log('authorization', err)
}
},
// 获取openid
async getOpenid(code){
try {
const res = await getOpenid(code)
console.log('getOpenid', res)
uni.setStorageSync('openId',res.openid)
// 保存数据
} catch (err) {
setTimeout(()=>{
uni.showToast({ title:err,icon:'none' })
},300)
uni.redirectTo({
url:'/pages/index/index'
})
console.log('getOpenid', err)
}
},
},
}
</script>
... ...
... ... @@ -18,10 +18,13 @@ export const sendProduct = (data) => request({url: 'product/product_publish',met
export const getLastInfo = () => request({url: 'product/last_fabu_data',method: 'post',})
// 缴纳保证金 /api/user/user_cert_withdraw
export const payGuarantee = () => request({url: 'user/user_cert_withdraw',method: 'post',})
export const payGuarantee = (openid) => request({url: 'user/user_cert_withdraw',method: 'post',data:{openid}})
// 获取微信授权登录页面 /api/user/getAuthorizeUrl
export const authorization = (redirect_uri) => request({url: 'user/getAuthorizeUrl',method: 'post',data:{redirect_uri}})
// 获取微信用户openid /api/user/getOpenid
export const getOpenid = (code) => request({url: 'user/getOpenid',method: 'post',data:{code}})
\ No newline at end of file
export const getOpenid = (code) => request({url: 'user/getOpenid',method: 'post',data:{code}})
// 缴纳保证金 /api/user/user_cert_withdraw
export const userCertWithdraw = (openid) => request({url: 'user/user_cert_withdraw',method: 'post',data:{openid}})
\ No newline at end of file
... ...
... ... @@ -33,7 +33,6 @@
};
},
created() {
console.log('������');
},
methods: {
choosebtn() {
... ... @@ -50,7 +49,7 @@
let token = uni.getStorageSync('token')
console.log(token);
if(!token) return this.showLogin = true
uni.redirectTo({
uni.navigateTo({
url: "/pages/index/send"
})
},
... ...
... ... @@ -19,10 +19,10 @@
"#USER",
"/"
],
"_resolved": "https://registry.npmjs.org/jweixin-module/-/jweixin-module-1.6.0.tgz",
"_resolved": "https://registry.npmmirror.com/jweixin-module/-/jweixin-module-1.6.0.tgz",
"_shasum": "4a7ea614083e3c9c3f49e2fdc2bb882cfa58dfcd",
"_spec": "jweixin-module",
"_where": "F:\\minigroup\\Bitcoin",
"_where": "D:\\项目\\元象印届\\Bitcoin",
"author": {
"name": "Shengqiang Guo"
},
... ...
MIT License
Copyright (c) 2020 echo.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
<font color="#5677fc">`开源不易,需要鼓励。给 ThorUI项目点个 star吧`</font> [GitHub](https://github.com/dingyong0214/ThorUI-uniapp)
# ThorUI
ThorUI组件库,uni-app版本,v3编译,支持nvue uni-app编译模式(原weex编译模式),easycom组件模式(无需手动引入,开发工具自带智能感知)
| ![微信小程序](https://thorui.cn/img/applets.jpg) |![H5二维码](https://thorui.cn/img/h5_qrcode.png) |![QQ小程序](https://thorui.cn/img/qq_applets.png) |![Android](https://thorui.cn/img/thorui_apk.png) |![ThorUI示例](https://thorui.cn/img/thorui-extend.jpg) |
| ------------ | ------------ | ------------ | ------------ | ------------ |
| 微信小程序 |H5二维码 | QQ小程序 | Android App |ThorUI示例 |
---
## 网站介绍
[https://www.thorui.cn/](https://www.thorui.cn/)
---
## ThorUI组件文档
[https://thorui.cn/doc/](https://thorui.cn/doc/)
---
## 交流群
<font color="#5677fc">`QQ群1:745733024`</font>
<font color="#5677fc">`QQ群2:881906325`</font>
<font color="#5677fc">`QQ群3:605135318`</font>
<font color="#5677fc">`QQ群4:928308676`</font>
<font color="#5677fc">`会员群:加入会员可进`</font>
---
## 更新日志
### V1.9.0 (2022-05-28)
1.card 卡片组件优化,当header部分内容不传值时可使用默认插槽自定义内容。
2.修复组件使用wxs初始化报错的问题。
3.优化部分组件vue3下兼容问题。
4.商城模板优化,调整vue3下样式出错问题。
5.优化并删除filters使用。
6.tui-countdown 倒计时 组件优化,支持支付宝、百度、QQ、字节小程序。
7.tui-divider 分隔符 组件优化,支持支付宝、百度、QQ、字节小程序。
8.tui-scroll-top 回到顶部 组件优化,支持支付宝、百度、QQ、字节小程序。
9.tui-alert 弹框 组件优化,支持支付宝、百度、QQ、字节小程序。
10.tui-no-data 暂无数据 组件优化,支持支付宝、百度、QQ、字节小程序。
11.tui-toast 提示 组件优化,支持支付宝、百度、QQ、字节小程序。
12.tui-datetime 日期时间选择器 组件优化,支持支付宝、百度、QQ、字节小程序。
13.tui-fab 悬浮按钮 组件优化,支持支付宝、百度、QQ、字节小程序。
14.tui-tabbar 标签栏 组件优化,支持支付宝、百度、QQ、字节小程序。
15.tui-tabs 标签页 组件优化,支持支付宝、百度、QQ、字节小程序。
16.tui-collapse 折叠面板 组件优化,支持支付宝、百度、QQ、字节小程序。
17.tui-upload 图片上传 组件优化,支持支付宝、百度、QQ、字节小程序。
18.tui-skeleton 骨架屏 组件优化,支持支付宝、百度、QQ、字节小程序。
19.tui-calendar 日历 组件优化,支持支付宝、百度、QQ、字节小程序。
20.tui-steps 步骤条 组件优化,支持支付宝、百度、QQ、字节小程序。
21.tui-drawer 抽屉 组件优化,支持支付宝、百度、QQ、字节小程序。
22.tui-swipe-action 滑动菜单 组件优化,支持支付宝、百度、QQ、字节小程序。
23.tui-bottom-navigation 底部导航菜单 组件优化,支持支付宝、百度、QQ、字节小程序。
24.tui-cascade-selection 级联选择 组件优化,支持支付宝、百度、QQ、字节小程序。
25.tui-circular-progress 圆形进度条 组件优化,支持支付宝、百度、QQ、字节小程序。
26.tui-navigation-bar 自定义导航栏 组件优化,支持支付宝、百度、QQ、字节小程序。
27.tui-bubble-popup 气泡弹框 组件优化,支持支付宝、百度、QQ、字节小程序。
28.tui-image-group 图片组合 组件优化,支持支付宝、百度、QQ、字节小程序。
<font color="#5677fc">`扫码体验[ThorUI组件库]小程序`</font>
![ThorUI组件库](https://thorui.cn/img/applets_sm.jpg)
========================
【ThorUI示例V1.4.0】更新:
1.修复组件使用wxs初始化报错的问题。
2.内嵌ucharts图表,当thorui图表无法满足时推荐使用。
3.tui-gallery 图片预览 组件优化,修复索引显示可能出错的问题。
4.优化部分vue3下兼容问题。
5.tui-label 标签 组件优化,支持支付宝、百度、QQ、字节小程序。
6.tui-picker 选择器 组件优化,支持支付宝、百度、QQ、字节小程序。
7.tui-swiper-dot swiper指示点 组件优化,支持支付宝、百度、QQ、字节小程序。
8.tui-progress 进度条 组件优化,支持支付宝、百度、QQ、字节小程序。
9.tui-index-list 索引列表 组件优化,支持支付宝、百度、QQ、字节小程序。
10。tui-gallery 图片预览 组件优化,支持支付宝、百度、QQ、字节小程序。
11.tui-loading 加载动画 组件优化,支持支付宝、百度、QQ、字节小程序。
12.tui-dialog 对话框 组件优化,支持支付宝、百度、QQ、字节小程序。
13.tui-msg 提示页 组件优化,支持支付宝、百度、QQ、字节小程序。
14.tui-searchbar 搜索栏 组件优化,支持支付宝、百度、QQ、字节小程序。
15.tui-copy-text 长按复制 组件优化,支持支付宝、百度、QQ、字节小程序。
16.tui-tab 标签页 组件优化,支持支付宝、百度、QQ、字节小程序。
17.tui-cubic-bezier 贝塞尔曲线 组件优化,支持支付宝、百度、QQ、字节小程序。
18.tui-drag 拖拽排序 组件优化,支持支付宝、百度、QQ小程序、字节小程序。
19.tui-slide-verify 滑动验证码 组件优化,支持支付宝、百度、QQ、字节小程序。
20.tui-digital-keyboard 数字键盘 组件优化,支持支付宝、百度、QQ、字节小程序。
21.tui-digital-roller 数字滚轮 组件优化,支持支付宝、百度、QQ、字节小程序。
22.tui-timer 计时器 组件优化,支持支付宝、百度、QQ、字节小程序。
23.tui-table 表格 组件优化,支持支付宝小程序。
24.tui-grade 评分 组件优化,支持支付宝、百度、QQ、字节小程序。
25.tui-countdown-verify 验证码倒计时 组件优化,支持支付宝、百度、QQ、字节小程序。
26.tui-slider 滑动选择器 组件优化,支持支付宝、百度、QQ、字节小程序。
27.tui-rotate-verify 旋转图片验证 组件优化,支持支付宝、百度、QQ、字节小程序。
28.tui-scale-horizontal 刻度尺滚动选择器 组件优化,支持支付宝、百度、QQ、字节小程序。
29.tui-scale-vertical 刻度尺滚动选择器 组件优化,支持支付宝、百度、QQ、字节小程序。
30.tui-waterfall 瀑布流 组件优化,支持支付宝、百度、QQ、字节小程序。
31.tui-lazyload-img 图片懒加载 组件优化,支持支付宝、百度、QQ、字节小程序。
32.tui-overflow-hidden 内容超出隐藏 组件优化,支持支付宝、百度、QQ、字节小程序。
33.tui-org-tree 组织架构树 组件优化,支持支付宝、百度、QQ、字节小程序。
34.tui-landscape 压屏窗 组件优化,支持支付宝、百度、QQ、字节小程序。
35.tui-tree-view 树型菜单 组件优化,支持支付宝、百度、QQ、字节小程序。
36.tui-charts-column 柱状图表 组件优化,支持支付宝、百度、QQ、字节小程序。
37.tui-charts-bar 横向柱状图表 组件优化,支持支付宝、百度、QQ、字节小程序。
38.tui-charts-line 折线图表 组件优化,支持支付宝、百度、QQ、字节小程序。
39.tui-charts-pie 饼状图表 组件优化,支持支付宝、百度、QQ、字节小程序。
40.tui-charts-area 面积图表 组件优化,支持支付宝、百度、QQ、字节小程序。
41.tui-charts-funnel 漏斗图表 组件优化,支持支付宝、百度、QQ、字节小程序。
42.tui-charts-scatter 散点图表 组件优化,支持支付宝、百度、QQ、字节小程序。
43.tui-charts-radar 雷达图表 组件优化,支持支付宝、百度、QQ、字节小程序。
44.tui-banner-arc Banner底部圆弧效果 组件优化,支持支付宝、百度、QQ、字节小程序。
45.tui-data-checkbox 数据选择器 组件优化,支持支付宝、百度、QQ、字节小程序。
46、tui-poster 绘制海报 组件优化,支持支付宝、百度、QQ、字节小程序。
=====================
<font color="#5677fc">`扫码体验[ThorUI示例]小程序`</font>
![ThorUI示例](https://thorui.cn/img/thorui-extend__sm.jpg)
=====================
其中【ThorUI示例】项目只对会员开放。点此 [开通会员](https://thorui.cn/doc/docs/member.html)
### V1.8.0 (2022-04-19)
1.tui-countdown(倒计时)组件优化,修复已知问题。
2.tui-button(按钮)组件优化,支持支付宝、百度、QQ、字节小程序。
3.tui-tag(标签)组件优化,支持支付宝、百度、QQ、字节小程序。
4.tui-badge(徽章)组件优化,支持支付宝、百度、QQ、字节小程序。
5.tui-list-view(列表)组件优化,支持支付宝、百度、QQ、字节小程序。
6.tui-list-cell(列表Item)组件优化,支持支付宝、百度、QQ、字节小程序。
7.tui-card(卡片)组件优化,支持支付宝、百度、QQ、字节小程序。
8.tui-grid(宫格)组件优化,支持支付宝、百度、QQ、字节小程序。
9.tui-grid-item(宫格Item)组件优化,支持支付宝、百度、QQ、字节小程序。
10.tui-loading(加载中)组件优化,支持支付宝、百度、QQ、字节小程序。
11.tui-loadmore(加载更多)组件优化,支持支付宝、百度、QQ、字节小程序。
12.tui-nomore(没有更多了)组件优化,支持支付宝、百度、QQ、字节小程序。
13.tui-footer(页脚)组件优化,支持支付宝、百度、QQ、字节小程序。
14.tui-tips(消息提示)组件优化,支持支付宝、百度、QQ、字节小程序。
15.tui-sticky(吸顶容器)组件优化,支持支付宝、百度、QQ、字节小程序。
16.tui-keyboard(数字键盘)组件优化,支持支付宝、百度、QQ、字节小程序。
17.tui-keyboard-input(数字键盘输入框)组件优化,支持支付宝、百度、QQ、字节小程序。
18.tui-time-axis(时间轴)组件优化,支持支付宝、百度、QQ、字节小程序。
19.tui-timeaxis-item(时间轴Item)组件优化,支持支付宝、百度、QQ、字节小程序。
20.tui-top-dropdown(顶部弹出层)组件优化,支持支付宝、百度、QQ、字节小程序。
21.tui-bottom-popup(底部弹出层)组件优化,支持支付宝、百度、QQ、字节小程序。
22.tui-dropdown-list(下拉列表)组件优化,支持支付宝、百度、QQ、字节小程序。
23.tui-actionsheet(操作菜单)组件优化,支持支付宝、百度、QQ、字节小程序。
24.tui-numberbox(数字框)组件优化,支持支付宝、百度、QQ、字节小程序。
25.tui-rate(评分)组件优化,支持支付宝、百度、QQ、字节小程序。
26.tui-modal(弹框)组件优化,支持支付宝、百度、QQ、字节小程序。
<font color="#5677fc">`扫码体验[ThorUI组件库]小程序`</font>
![ThorUI组件库](https://thorui.cn/img/applets_sm.jpg)
========================
【ThorUI示例V1.3.0】更新:
1.新增 tui-banner-arc(banner底部圆弧效果)组件。
2.新增 tui-data-checkbox(数据选择器)组件。
3.新增 tui-charts-area(面积图表-css版)组件。
4.新增 tui-charts-funnel(漏斗图表-css版)组件。
5.新增 tui-charts-scatter(散点图表-css版)组件。
6.新增 tui-charts-radar(雷达图表-css版)组件。
7.新增 tui-poster(绘制海报)组件,配置数据绘制海报。
8.小程序端 tui-input(输入框) 组件优化,修复已知问题。
9.tui-tab(标签页)组件优化,修复已知问题。
10.其他已知问题优化。
=====================
<font color="#5677fc">`扫码体验[ThorUI示例]小程序`</font>
![ThorUI示例](https://thorui.cn/img/thorui-extend__sm.jpg)
=====================
其中【ThorUI示例】项目只对会员开放。点此 [开通会员](https://thorui.cn/doc/docs/member.html)
### V1.7.2 (2022-02-25)
1.tui-time-axis(时间轴)组件优化,新增属性来设置节点层级。
2.tui-steps(步骤条)组件优化,字体图标支持设置字体大小。
3.tui-datetime(日期时间选择器)组件优化,新增属性 maskClosable 来设置是否可点击遮罩关闭选择器。
4.tui-datetime(日期时间选择器)组件优化,优化微信小程序端快速滚动点击确定按钮时数据未更新的问题。
5.tui-datetime (日期时间选择器)组件优化,可设置标题。
6.优化tui-numberbox组件,修复数据类型问题。
7.优化tui-tabs(标签页)组件,可控制底部滑块是否显示。
8.微信小程序tui-tabbar(标签栏)组件优化,修复页面路径传值错误的问题。
9.tui-calendar(日历)组件优化,选择日期时显示标题内容可配置。
10.tui-cascade-selection(级联选择器) 默认选中优化,当一次性传入所有数据时默认选项传值可为字符串数组,如:['安徽省','阜阳市','颍上县']
11.tui-skeleton(骨架屏)组件优化,加入背景动画效果。
12.tui-upload(上传组件优化),新增属性控制删除图片时是否弹框确认。
13.已知问题优化。
<font color="#5677fc">`扫码体验[ThorUI组件库]小程序`</font>
![ThorUI组件库](https://thorui.cn/img/applets_sm.jpg)
========================
【ThorUI示例V1.2.2】更新:
1.tui-index-list(索引列表)组件优化,修复App端右侧索引随页面滚动的bug。
2.tui-textarea (多行输入框) 组件优化,修复初始化赋值时计数错误问题。
3.tui-picker(选择器)组件优化,优化微信小程序端快速滚动点击确定按钮时数据未更新的问题。
4.tui-utils.js(工具库)优化,优化日期格式化方法,新增isMs(时间戳精度是否为毫秒)参数。(当 type=2 精度为秒时,参数isMs需要传入false)
5.tui-picker(选择器)组件优化,新增属性 maskClosable 来设置是否可点击遮罩关闭选择器。
6.新增 tui-week-date(周日期选择)组件。
7.新增 tui-vcode(验证码)组件。
8.新增 tui-divide-list(分隔列表组件)。
9.新增 tui-select(选择框)组件。
10.新增 tui-amount-inwords(数字金额转大写)组件。
11.已知问题优化。
=====================
<font color="#5677fc">`扫码体验[ThorUI示例]小程序`</font>
![ThorUI示例](https://thorui.cn/img/thorui-extend__sm.jpg)
=====================
其中【ThorUI示例】项目只对会员开放。点此 [开通会员](https://thorui.cn/doc/docs/member.html)
### V1.7.1 (2021-10-01)
1.微信小程序版wx:key赋值优化,去除警告。
2.tui-icon(图标组件优化),修复同时引入组件和样式文件冲突的问题。
3.tui-calendar(日历)组件优化,选择区间时需选择起始和结束日期才可点击确定按钮。
4.微信小程序版本索引列表(吸顶效果)页面优化,修复索引和吸顶索引不一致的问题。
5.tui-numberbox(数字框)组件优化,当步长step为整数时,value支持传入小数。
<font color="#5677fc">`扫码体验[ThorUI组件库]小程序`</font>
![ThorUI组件库](https://thorui.cn/img/applets_sm.jpg)
========================
【ThorUI示例V1.2.1】更新:
1.tui-searchbar(搜索栏)组件优化,新增属性showLabel、showInput用于控制是否显示占位标签和输入框。
2.tui-rotate-verify (旋转图片验证) 组件优化,新增type类型,当type=2时,返回旋转角度,可传给后端进行验证。
3.tui-input(输入框)、tui-textarea (多行输入框)组件优化,修复v-model赋值Number类型值报错的问题。
4.tui-waterfall(瀑布流)组件优化,修复已知问题。
5.微信小程序版本 tui-table(表格)组件优化,修复数字或英文内容换行显示不正确问题。
6.其他已知问题优化。
=====================
<font color="#5677fc">`扫码体验[ThorUI示例]小程序`</font>
![ThorUI示例](https://thorui.cn/img/thorui-extend__sm.jpg)
=====================
其中【ThorUI示例】项目只对会员开放。点此 [开通会员](https://thorui.cn/doc/docs/member.html)
### V1.7.0(2021-09-17)
1.修复tui-bottom-navigation(底部导航菜单)组件编译到小程序点击二级菜单报错的问题。
2.tui-datetime(日期时间选择器)组件优化,可以自定义设置滚动区域高度。
3.tui-datetime(日期时间选择器)组件优化,新增类型type=8,即选择:时分秒+小时。
4.tui-cascade-selection(级联选择器)组件优化,修复编译到小程序端索引错乱问题。
5.uni-app端所有 commonJS 改为 ES6 模块规范,详见文档升级指南。
6.组件兼容vue3调整优化,支持情况与uni-app同步。
7.tui-icon(字体图标组件优化),删除以前播放(play)图标,新增播放(play)、暂停(suspend)图标;删除以前不可见(unseen)图标,新增可见(seen),不可见(unseen)图标。
8.tui-icon(字体图标组件优化),uni-app版新增支持包含App-Nvue、支付宝/百度/字节/QQ小程序。
9.微信小程序原生版组件属性类型调整,修复高版本调试基础库出现警告提示。
10.tui-swipe-action(滑动菜单)组件优化,修复已知问题。
<font color="#5677fc">`扫码体验[ThorUI组件库]小程序`</font>
![ThorUI组件库](https://thorui.cn/img/applets_sm.jpg)
=====================
【ThorUI示例V1.2.0】更新:
1.tui-picker(选择器)组件新增暗黑模式示例。
2.tui-charts-pie(饼状图表-css版)组件优化,修复部分场景可能导致样式错乱的问题。
3.tui-charts-line(折线图表-css版)组件优化,修复部分Android手机显示空白问题。
4.图表组件(所有)优化,修复其它已知问题。
5.tui-form(表单验证)组件优化,部分平台不支持在props中嵌套传入Function函数,model和rules参数由props传入改为校验方法validate中传入。
6.tui-slider(滑动选择器)组件优化,修复已知问题。
7.tui-timer(计时器)组件优化,修复冒号换成文字时显示错误的问题。
8.uni-app端所有 commonJS 改为 ES6 模块规范,详见文档升级指南。
9.组件兼容vue3调整优化,支持情况与uni-app同步。
10.tui-progress(进度条)组件优化。
11.tui-checkbox(多项选择器)组件优化,修复v-model手动修改值视图不更新的问题。
12.tui-radio(单项选择器)组件优化,修复v-model手动修改值视图不更新的问题。
13.微信小程序原生版组件属性类型调整,修复高版本调试基础库出现警告提示。
14.tui-tab(标签页)组件优化,支持设置左右间距,需传入属性leftGap(距离左侧间隙)值。
15.tui-row/tui-col(栅格布局)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
16.tui-form-button(按钮)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
17.tui-popup(弹层动画)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
18.tui-input(输入框) 组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
19.tui-radio(单项选择器)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
20.tui-checkbox(多项选择器)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
21.tui-switch(开关选择器)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
22.tui-textarea(多行输入框)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
23.tui-alerts(警告提示)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
24.新增 tui-status-bar(状态栏)组件。
25.tui-pagination(分页器)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
26.tui-segmented-control(分段器)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
27.tui-notice-bar(通告栏)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
28.tui-form(表单验证)组件优化,uni-app版新增支持App-Nvue、支付宝/百度/字节/QQ小程序。
29.其他已知问题优化。
=====================
<font color="#5677fc">`扫码体验[ThorUI示例]小程序`</font>
![ThorUI示例](https://thorui.cn/img/thorui-extend__sm.jpg)
=====================
其中【ThorUI示例】项目只对会员开放。点此 [开通会员](https://thorui.cn/doc/docs/member.html)
### V1.6.5(2021-05-24)
1.tui-validation(表单验证)优化,新增validator自定义验证配置项,具体查看文档。
2.tui-round-progress(圆形进度条)组件优化,修复已知问题。
3.tui-cascade-selection(级联选择器)组件优化,修复已知问题。
4.tui-tabs(标签页)组件优化,选项卡可设置数字角标。
<font color="#5677fc">`扫码体验[ThorUI组件库]小程序`</font>
![ThorUI组件库](https://thorui.cn/img/applets_sm.jpg)
=====================
【ThorUI示例V1.1.0】更新:
1.tui-org-tree(组织架构树)组件优化,可控制节点内容排版方式、节点选中状态、展开收起子节点,具体查看文档。
2.新增tui-form(表单)组件,主要用于表单验证。
3.新增tui-input(输入框)组件,原生input组件增强。
4.新增tui-textarea(多行输入框)组件。
5.新增tui-label(标签)组件,用来改进表单组件的可用性。
6.新增tui-radio(单项选择器)组件。
7.新增tui-checkbox(多项选择器)组件。
8.新增tui-switch(开关)组件。
9.新增tui-picker(选择器)组件,支持1~3级数据。
10.新增tui-landscape(压屏窗)组件。
11.新增tui-segmented-control(分段器)组件。
12.新增tui-notice-bar(通告栏)组件。
13.新增tui-alerts(警告框)组件。
14.新增tui-request(数据请求)封装,支持Promise,支持请求拦截和响应拦截,支持请求未结束之前阻止重复请求等。
15.tui-utils(工具类)优化,具体查看文档。
16.新增tui-row组件,配合组件tui-col组件使用(24栅格化布局)。
17.新增tui-tree-view(树型菜单)组件。
18.新增tui-charts-column(柱状图-css版)组件。
19.新增tui-charts-bar(横向柱状图-css版)组件。
20.新增tui-charts-line(折线图表-css版)组件。
21.新增tui-charts-pie(饼状图表-css版)组件。
22.tui-lazyload-img(图片懒加载)组件优化,修复已知问题。
23.新增tui-pagination(分页器)组件。
<font color="#5677fc">`扫码体验[ThorUI示例]小程序`</font>
![ThorUI示例](https://thorui.cn/img/thorui-extend__sm.jpg)
=====================
<font color="#5677fc">`其中【ThorUI示例】项目只对会员开放。`</font>
注:会员专用内容加入会员才可使用,点此 [开通会员](https://thorui.cn/doc/docs/member.html)
### 部分功能截图
| ![](https://thorui.cn/img/V165/t_01.jpg) |![](https://thorui.cn/img/V165/t_02.jpg) |![](https://thorui.cn/img/V165/t_03.jpg) |
| ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/V165/t_04.jpg) |![](https://thorui.cn/img/V165/t_05.jpg) |![](https://thorui.cn/img/V165/t_06.jpg) |
| ![](https://thorui.cn/img/V165/t_07.jpg) |![](https://thorui.cn/img/V165/t_08.jpg) |![](https://thorui.cn/img/V165/t_09.jpg) |
| ![](https://thorui.cn/img/V165/t_10.png) |![](https://thorui.cn/img/V165/t_11.jpg) |![](https://thorui.cn/img/V165/t_12.jpg) |
| ![](https://thorui.cn/img/V165/t_13.jpg) |![](https://thorui.cn/img/V165/t_14.png) |![](https://thorui.cn/img/V165/t_15.jpg) |
| ![](https://thorui.cn/img/V165/t_16.jpg) |![](https://thorui.cn/img/V165/t_17.jpg) |![](https://thorui.cn/img/V165/t_18.jpg) |
| ![](https://thorui.cn/img/V165/t_19.jpg) |![](https://thorui.cn/img/V165/t_20.jpg) |![](https://thorui.cn/img/V165/t_21.jpg) |
| ![](https://thorui.cn/img/V165/t_22.jpg) | | |
### V1.6.2 (2021-03-21)
1.tui-actionsheet(操作菜单)组件优化,点击事件返回参数中新增按钮obj对象数据。
2.tui-upload(图片上传)组件优化,可设置展示图片的宽高。
3.圆形进度条组件优化,修复已知问题。
4.tui-validation.js(表单验证)优化,具体查看文档。
5.tui-numberbox(数字框组件优化),修复已知问题。
6.修复productNvue页,回到顶部在android端失效的问题。
<font color="#5677fc">`扫码体验[ThorUI组件库]小程序`</font>
![ThorUI组件库](https://thorui.cn/img/applets_sm.jpg)
=====================
【ThorUI示例V1.0.2】更新:
1.ThorUI示例个人中心内容对会员开放(个人中心、分享、会员介绍、版本介绍、开源地址、帮助中心等)。
2.tui-timer(计时器)组件优化,可设置初始时间。
3.tui-poster.js(生成海报)优化,修复已知问题,保存图片到本地相册时新增相册权限判断。
4.新增tui-scale(刻度尺滚动选择器)组件。
5.新增tui-waterfall(瀑布流)组件。
6.新增tui-lazyload-img(图片懒加载)组件。
7.新增tui-overflow-hidden(内容超出隐藏)组件。
8.新增tui-org-tree(组织架构树)组件。
<font color="#5677fc">`扫码体验[ThorUI示例]小程序`</font>
![ThorUI示例](https://thorui.cn/img/thorui-extend__sm.jpg)
=====================
<font color="#5677fc">`其中【ThorUI示例】项目只对会员开放。`</font>
注:会员专用内容加入会员才可使用,点此 [开通会员](https://thorui.cn/doc/docs/member.html)
### 部分功能截图
| ![](https://thorui.cn/img/V162/1.png) |![](https://thorui.cn/img/V162/2.png) |![](https://thorui.cn/img/V162/3.png) |
| ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/V162/4.png) |![](https://thorui.cn/img/V162/5.jpg) |![](https://thorui.cn/img/V162/6.png) |
| ![](https://thorui.cn/img/V162/7.jpg) |![](https://thorui.cn/img/V162/8.jpg) |![](https://thorui.cn/img/V162/9.png) |
| ![](https://thorui.cn/img/V162/10.png) |![](https://thorui.cn/img/V162/11.jpg) |![](https://thorui.cn/img/V162/12.jpg) |
### V1.6.1 (2021-01-19)
【ThorUI组件库V1.6.1】更新:
1.商城模板更新:
1)商城模板拆分成单独模板项目。
2)个人中心,新增未登录状态。
3)个人信息页面操作优化。
4)编辑地址页面优化,新增省市区城市选择。
5)新增我的钱包页面。
6)新增充值确认页面。
7)新增我的银行卡页面。
8)新增交易记录页面。
9)商品详情页分享优化,新增生成分享海报。
2.优化滑动菜单组件多个触摸点滑动问题。
3.消息提示组件(tui-tips)优化,支持自定义背景色,字体颜色以及字体大小,参数type废弃。
4.圆形进度条组件优化,修复activeMode=forwards(动画从上次结束点接着播)时且上次进度大于当前进度时进度条不刷新bug。
5.优化日历组件(tui-calendar)滚动穿透问题。
6.优化顶部选项卡示例左右切换过快出现闪动的问题,优化下拉刷新出现动画不关闭的问题。
7.上传图片组件(tui-upload)优化,新增一键上传方法uploadAllImage(当属性serverUrl传空时,父级可调用该方法一次性上传所有图片)。
8.新增富文本渲染示例。
=====================
【ThorUI示例V1.0.1】更新:
1.数字滚轮组件(tui-digital-roller)优化,支持数字中带逗号(,)。
2.拖拽排序组件(tui-drag)优化,修复编译到小程序端不执行change和sortend事件的bug。
3.新增grade评分组件,支持滑动半星。
4.新增图片裁剪组件(tui-cropper),裁剪框可显示为圆形。
5.新增短信验证码倒计时组件。
6.新增滑动选择器组件,支持区间选择。
7.新增旋转图片验证组件。
8.新增付费成品入口。
=====================
<font color="#5677fc">`其中【ThorUI示例】项目组件,以及商城模板只对会员开放。`</font>
注:会员专用内容加入会员才可使用,点此 [开通会员](https://thorui.cn/doc/docs/member.html)
### 部分功能截图
| ![](https://thorui.cn/img/V161/1.png) |![](https://thorui.cn/img/V161/2.png) |![](https://thorui.cn/img/V161/3.png) |
| ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/V161/4.png) |![](https://thorui.cn/img/V161/5.png) |![](https://thorui.cn/img/V161/6.png) |
| ![](https://thorui.cn/img/V161/7.png) |![](https://thorui.cn/img/V161/8.png) |![](https://thorui.cn/img/V161/9.png) |
| ![](https://thorui.cn/img/V161/10.jpg) |![](https://thorui.cn/img/V161/11.png) |![](https://thorui.cn/img/V161/12.jpg) |
| ![](https://thorui.cn/img/V161/13.jpg) |![](https://thorui.cn/img/V161/14.png) |![](https://thorui.cn/img/V161/15.jpg) |
### V1.6.0 (2020-11-15)
【ThorUI组件库V1.6.0】更新:
1.tui-fab悬浮按钮组件优化,默认按钮支持自定内容,替换自带加号。
2.修复裁剪组件在小程序端设置isBase64为true时裁剪出错的问题。
3.tui-drawer抽屉组件优化,支持left,right,bottom,top方向弹出,可自定义背景色。
4.倒计时组件优化,新增毫秒展示。
5.时间选择器优化,支持header,body等部分背景色修改。
6.宫格组件优化,可去掉宫格边框线条。
7.修复地图周边兴趣点在H5端出错的问题。
8.新增[ThorUI示例]入口。
=====================
【ThorUI示例V1.0.0】更新:
1.新增scroll-view常用布局案例。
2.新增swiper指示点组件及使用案例。
3.新增长形进度条组件以及使用案例。
4.新增checkbox常用布局案例。
5.新增input常用布局案例。
6.新增radio常用布局案例。
7.新增地图选点示例。
8.地图周边兴趣点布局调整以及可分页加载数据。
9.新增生成海报示例。
10.新增类似微信联系人索引列表组件以及示例。
11.新增左滑菜单组件 wxs实现。
12.新增图片预览组件。
13.新增loading样式。
14.新增panel布局案例。
15.新增preview布局案例。
16.新增表单常用布局案例。
17.新增dialog组件以及使用案例。
18.新增msg组件以及使用案例。
19.新增搜索searchbar组件。
20.新增表单按钮组件,可自定义背景色。
21.新增长按复制组件,长按弹出菜单。
22.新增贝赛尔曲线组件,加入购物车效果等。
23.新增tab标签页组件,可超出一屏。
24.新增图片裁剪组件(App端使用组件,使用5+ api裁剪)。
25.新增拖拽排序组件以及使用案例。
26.新增滑动验证码组件以及使用案例。
27.新增类似微信数字键盘组件以及使用案例。
28.新增工具库(常用数据处理)。
29.新增popup弹层动画组件。
30.新增计时器组件以及使用案例。
31.新增table表格组件以及使用案例。
32.新增多端适配组件,以及使用案例。
33.新增咖啡点单模板预览入口。
34.新增签到模板预览入口。
35.新增个人中心页面(内部页面,不对外开放),包含分享,会员介绍,版本介绍,开源地址,帮助中心,反馈建议,我要合作,福利专享等页面。
<font color="#5677fc">`扫码体验小程序`</font>
![ThorUI示例](https://thorui.cn/img/thorui-extend__sm.jpg)
=====================
<font color="#5677fc">`【ThorUI示例】项目只对会员开放。`</font>
注:会员专用内容加入会员才可使用(¥150/永久),付费模板会员可享受折扣。
如若需要,请联系QQ:3168647172 或 3039218619。
### 部分功能截图
| ![](https://thorui.cn/img/V160/1.png) |![](https://thorui.cn/img/V160/2.png) |![](https://thorui.cn/img/V160/3.png) |
| ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/V160/4.png) |![](https://thorui.cn/img/V160/5.png) |![](https://thorui.cn/img/V160/6.png) |
| ![](https://thorui.cn/img/V160/7.png) |![](https://thorui.cn/img/V160/8.png) |![](https://thorui.cn/img/V160/9.png) |
| ![](https://thorui.cn/img/V160/10.png) |![](https://thorui.cn/img/V160/11.png) |![](https://thorui.cn/img/V160/12.png) |
| ![](https://thorui.cn/img/V160/13.png) |![](https://thorui.cn/img/V160/14.png) |![](https://thorui.cn/img/V160/15.png) |
| ![](https://thorui.cn/img/V160/16.png) |![](https://thorui.cn/img/V160/17.png) |![](https://thorui.cn/img/V160/18.png) |
| ![](https://thorui.cn/img/V160/19.png) |![](https://thorui.cn/img/V160/20.png) |![](https://thorui.cn/img/V160/21.png) |
| ![](https://thorui.cn/img/V160/22.png) |![](https://thorui.cn/img/V160/23.png) |![](https://thorui.cn/img/V160/24.png) |
| ![](https://thorui.cn/img/V160/25.png) |![](https://thorui.cn/img/V160/26.png) |![](https://thorui.cn/img/V160/27.png) |
| ![](https://thorui.cn/img/V160/28.png) |![](https://thorui.cn/img/V160/29.png) |![](https://thorui.cn/img/V160/30.png) |
| ![](https://thorui.cn/img/V160/31.png) |![](https://thorui.cn/img/V160/32.png) |![](https://thorui.cn/img/V160/33.png) |
| ![](https://thorui.cn/img/V160/34.png) |![](https://thorui.cn/img/V160/35.png) |![](https://thorui.cn/img/V160/36.png) |
| ![](https://thorui.cn/img/V160/37.png) |![](https://thorui.cn/img/V160/38.png) |![](https://thorui.cn/img/V160/39.png) |
| ![](https://thorui.cn/img/V160/40.png) |![](https://thorui.cn/img/V160/41.png) |![](https://thorui.cn/img/V160/42.png) |
| ![](https://thorui.cn/img/V160/43.png) |![](https://thorui.cn/img/V160/44.png) |![](https://thorui.cn/img/V160/45.png) |
| ![](https://thorui.cn/img/V160/46.png) |![](https://thorui.cn/img/V160/47.png) |![](https://thorui.cn/img/V160/48.png) |
| ![](https://thorui.cn/img/V160/49.png) |![](https://thorui.cn/img/V160/50.png) |![](https://thorui.cn/img/V160/51.png) |
| ![](https://thorui.cn/img/V160/52.png) |![](https://thorui.cn/img/V160/53.png) |![](https://thorui.cn/img/V160/54.png) |
---
### V1.5.8(2020-09-01)
1.tui-navigation-bar组件优化,可设置背景透明 【设置该属性,则背景透明,只出现内容,isOpacity和maxOpacity失效】
2.tui-swipe-action组件优化,背景色改为配置。modal弹框、抽屉、tabbar等组件z-index改为配置,具体查看文档。
3.修复小程序端tui-numberbox组件输入比最小值小的数无法自动重置成最小值的问题。
4.优化索引列表在H5端滑动切换索引会引起页面回弹的问题。
5.tui-bottom-popup组件优化,可设置z-index以及显示时垂直方向移动的距离translateY。
6.nvue版thor-icon组件优化,更换字体base64。
7.商城模板更新【会员专用】。
1).首页调整,新增拼团模块
2).拼团列表
3).拼团商品详情
4).正在拼团中列表
5).我的拼团
6).拼团详情
7).退款/售后列表
8).退款详情
9).申请售后
8.新增简单咖啡点单模板,类似weStoreCafe【该模板为付费模板¥100,会员2折】
1).点单
2).账单结算
3).编辑地址
4).地址列表
5).我的订单
6).订单详情
7).微信登录/验证码登录
9.修复部分已知bug。
--------------------------
注:会员专用内容加入会员才可使用(¥150/永久),付费模板会员可享受折扣。
如若需要,请联系QQ:3168647172 或 3039218619。
### 部分功能截图
| ![](https://thorui.cn/img/V158/1.png) |![](https://thorui.cn/img/V158/2.png) |![](https://thorui.cn/img/V158/3.png) |
| ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/V158/4.png) |![](https://thorui.cn/img/V158/5.png) |![](https://thorui.cn/img/V158/6.png) |
| ![](https://thorui.cn/img/V158/7.png) |![](https://thorui.cn/img/V158/8.png) |![](https://thorui.cn/img/V158/9.png) |
| ![](https://thorui.cn/img/V158/10.png) |![](https://thorui.cn/img/V158/11.png) |![](https://thorui.cn/img/V158/12.png) |
| ![](https://thorui.cn/img/V158/13.png) |![](https://thorui.cn/img/V158/14.png) |![](https://thorui.cn/img/V158/15.png) |
| ![](https://thorui.cn/img/V158/16.png) |![](https://thorui.cn/img/V158/17.png) |![](https://thorui.cn/img/V158/18.png) |
| ![](https://thorui.cn/img/V158/19.png) |![](https://thorui.cn/img/V158/20.png) | |
---
### V1.5.6(2020-08-18)
1.修复tui-tabs组件宽度不正确的bug。
2.修复级联选择组件(tui-cascade-selection)默认数据不生效的bug。
3.优化tui-button按钮组件,新增props:preventClick[是否阻止用户重复点击,设为true则200ms内只执行一次点击事件,默认false]
--------------------------
注:加入会员享受更多权益(¥150/永久)。
如若需要,请联系QQ:3168647172 或 3039218619。
### V1.5.5(2020-08-16)
1.自定义导航栏组件优化,新增props:maxOpacity(最大不透明度值),dropDownHide(下拉隐藏NavigationBar,主要针对有回弹效果ios端)。
2.上传组件优化,可限制上传图片类型,单张图片大小,sizeType,sourceType。
3.倒计时组件优化,可每秒返回剩余时间,默认不返回。
4.tui-modal弹框组件优化,修复transform导致元素内字体模糊的问题。
5.tui-button按钮组件优化,新增link样式配置,具体查看文档。
6.tui-tabs标签页组件优化,新增props:width(tabs宽度)设置。
7.tui-image-group图片组合组件优化,横向展示支持多行。
8.裁剪组件优化,修复网络图片在小程序端裁剪出现空白的问题。
9.商城模板更新【会员专用】。
1).首页改版,新增秒杀模块
2).选择优惠券(提交订单)
3).开具发票
4).发票详情
5).查看发票,发送至邮箱
6).商品评论
7).评论详情,评论回复
8).评价晒单
9).店铺
10).店铺详情
11).限时秒杀列表
12).秒杀详情
13).商品详情优化,新增视频播放入口
--------------------------
注:会员专用内容加入会员才可使用(¥150/永久)。
如若需要,请联系QQ:3168647172 或 3039218619。
### 部分功能截图
| ![](https://thorui.cn/img/V155/1.png) |![](https://thorui.cn/img/V155/2.png) |![](https://thorui.cn/img/V155/3.png) |
| ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/V155/4.png) |![](https://thorui.cn/img/V155/5.png) |![](https://thorui.cn/img/V155/6.jpg) |
| ![](https://thorui.cn/img/V155/7.png) |![](https://thorui.cn/img/V155/8.png) |![](https://thorui.cn/img/V155/9.png) |
| ![](https://thorui.cn/img/V155/10.png) |![](https://thorui.cn/img/V155/11.png) |![](https://thorui.cn/img/V155/12.png) |
| ![](https://thorui.cn/img/V155/13.png) |![](https://thorui.cn/img/V155/14.png) |![](https://thorui.cn/img/V155/15.png) |
| ![](https://thorui.cn/img/V155/16.png) |![](https://thorui.cn/img/V155/17.png) |![](https://thorui.cn/img/V155/18.png) |
| ![](https://thorui.cn/img/V155/19.png) |![](https://thorui.cn/img/V155/20.png) |![](https://thorui.cn/img/V155/21.png) |
| ![](https://thorui.cn/img/V155/22.png) |![](https://thorui.cn/img/V155/23.png) |![](https://thorui.cn/img/V155/24.png) |
### V1.5.2(2020-07-20)
1.步骤条组件优化,支持自定义图标,支持设置线条为虚线。
2.修复图片裁剪组件(wxs版)初始化裁剪不正确的问题。
3.按钮(tui-button)组件支持表单提交,详见文档。
4.图片上传组件(tui-upload)新增props:header,formData,修复初始化图片不显示的bug。
5.tabbar组件与自定义导航栏组件(NavBar)背景支持设置高斯模糊(ios端)。
6.uni-app版本骨架屏修复编译到小程序端无法获取到组件节点的bug。
7.日历组件单个日期选择和区间选择支持设置默认选中。
8.新增多语言模板。源码地址 :[ThorUI-utag](https://github.com/dingyong0214/ThorUI-utag)
9.新增拖拽排序组件,wxs实现,详细查看多语言模板示例。
10.新增签到模板(点star获取源码)。获取步骤如下:
1)去GitHub给ThorUI项目点star,项目地址分别为:[ThorUI](https://github.com/dingyong0214/ThorUI)[ThorUI-uniapp](https://github.com/dingyong0214/ThorUI-uniapp)
2)加QQ3039218619,截图发送到该QQ即可获取源码。
--------------------------
注:自1.4.2版本之后,ThorUI只对uni-app版本进行开源,小程序原生版付费会员才可使用(¥150/永久),1.4.2版本之前不受影响。
如若需要,请联系QQ:3168647172。
### 部分功能截图
| ![](https://thorui.cn/img/V152/1.png) |![](https://thorui.cn/img/V152/2.png) |![](https://thorui.cn/img/V152/3.png) |
| ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/V152/4.png) |![](https://thorui.cn/img/V152/5.png) |![](https://thorui.cn/img/V152/6.png) |
| ![](https://thorui.cn/img/V152/7.png) |![](https://thorui.cn/img/V152/8.png) |![](https://thorui.cn/img/V152/9.png) |
| ![](https://thorui.cn/img/V152/10.png) |![](https://thorui.cn/img/V152/11.png) |![](https://thorui.cn/img/V152/12.png) |
| ![](https://thorui.cn/img/V152/13.png) |![](https://thorui.cn/img/V152/14.png) |![](https://thorui.cn/img/V152/17.png) |
[![Watch the video](https://thorui.cn/img/V152/6.png)](https://thorui.cn/img/V152/0720.MP4)
### V1.5.1(2020-06-06)
1.日历组件支持农历(古历)。
2.sticky吸顶组件新增wxs实现(tui-sticky-wxs)。
3.新增圆形进度条组件renderjs实现(App、H5端)与canvas 2d实现(小程序端)以及nuve版本。
4.图片裁剪组件优化,手势事件改为wxs实现。
5.级联选择器组件优化,支持设置默认选中。
6.新增图片颜色分析器组件,传入图片分析图片色彩。
7.新增中文转拼音组件,可处理多音字。
8.新增update页面(App端资源更新页面)。
9.解决H5端异步请求数据后复制文本(clipboard)报错bug。
解决方案:
①.新增参数event,调用方法时传入此参数;
②.异步请求转同步。
10.修复其它已知bug。
注:自1.4.2版本之后,ThorUI只对uni-app版本进行开源,小程序原生版付费会员才可使用(¥150/永久),1.4.2版本之前不受影响。
如若需要,请联系QQ:3168647172。
### 部分功能截图
| ![](https://thorui.cn/img/v151/1.png) |![](https://thorui.cn/img/v151/2.png) |![](https://thorui.cn/img/v151/3.png) |
| ------------ | ------------ | ------------ |
### V1.5.0 (2020-05-12)
1.新增日历组件 。
2.新增图片裁剪组件。
3.新增头像、图片组合组件。
4.新增顶部NavationBar导航组件。
5.新增圆形进度条组件。
6.新增底部导航组件。
7.新增级联选择组件cascade-selection。
8.新增步骤条组件。
9.新增气泡框组件。
10.countdown倒计时组件优化,可只显示秒数倒计时。
11.回到顶部组件优化,新增回首页,分享按钮,可自定义控制显示。
12.日期时间选择组件优化,新增秒数选择,单位可置顶展示。
13.新增垂直分类菜单左右联动联动案例。
14.地图支持H5。
15.表单验证优化:非必填情况下,如果值为空,则不进行校验,不为空则进行校验。
16.发布H5、QQ小程序以及Android App。H5地址:https://www.thorui.cn/h5/#/ ,QQ小程序搜索ThorUI,apk前往https://www.thorui.cn/ 下载。
17.针对支付宝小程序做了部分优化调整。
18.nvue支持uni-app编译模式。
19.新增自定义tabbar使用模板,小程序参考:https://github.com/dingyong0214/AfterSale ,uni-app参考:https://github.com/dingyong0214/tabbar-uniapp。
20.引入优化uParse。
21.搜索页面新增关键词高亮显示。
22.新增navbar上拉加载下拉刷新案例。
23.v3编译支持。
24.支持easycom组件模式,直接在页面中使用组件,无需引入注册。
25.优化sticky组件,新增普通案例和异步加载案例。
26.整体优化调整,项目重构,部分模板完善。
### 部分功能截图
| ![](https://thorui.cn/img/v150/v1501.png) |![](https://thorui.cn/img/v150/v1502.png) |![](https://thorui.cn/img/v150/v1503.png) |
| ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/v150/v1504.png) |![](https://thorui.cn/img/v150/v1505.png) |![](https://thorui.cn/img/v150/v1506.png) |
| ![](https://thorui.cn/img/v150/v1507.png) |![](https://thorui.cn/img/v150/v1508.png) |![](https://thorui.cn/img/v150/v1509.jpg) |
### V1.4.2
1.modal组件优化,宽高以及padding值可设置
2.rate评分组件支持小数,如4星半,4.6星等
3.tabs组件优化
4.商城模板新增优惠券页面
5.商城模板新增订单详情页面
6.分包,解决小程序预览时包体积超出限制的问题
### 功能截图
| ![](https://thorui.cn/img/v142/1.jpg) |![](https://thorui.cn/img/v142/2.jpg) |![](https://thorui.cn/img/v142/3.jpg) |
| ------------ | ------------ | ------------ |
### V1.4.1
1.新增文档相关链接信息。
2.新增骨架屏组件(extend=>骨架屏)。
3.新增网络请求示例。
4.调整sticky组件,支持索引列表吸顶效果。
5.新增吸顶&索引列表,非scroll-view实现(code[首页]=>索引列表=>索引&吸顶效果)。
6.已知问题修复以及优化。
### 功能截图
| ![](https://thorui.cn/img/V141/1.png) |![](https://thorui.cn/img/V141/2.jpg) |
| ------------ | ------------ |
| ![](https://thorui.cn/img/V141/3.jpg) |![](https://thorui.cn/img/V141/4.png) |
### V1.4.0
1.新增日期时间选择器组件。
2.H5新增复制文本功能。
3.新增悬浮按钮组件。
4.新增Tabbar组件。
5.新增tabs标签页组件。
6.新增折叠面板组件。
7.新增图片上传组件。
8.NumberBox组件优化调整。
9.Modal组件优化调整。
10.sticky组件优化调整。
11.countdown组件优化调整。
12.商城模板新增购物车、我的、提交订单、支付成功、我的订单、地址列表、新增地址、设置、用户信息等页面。
13.修改已知bug。
### 功能截图
| ![](https://thorui.cn/img/V140/1.png) |![](https://thorui.cn/img/V140/2.png) | ![](https://thorui.cn/img/V140/3.png) |
| ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/V140/4.png) |![](https://thorui.cn/img/V140/5.png) | ![](https://thorui.cn/img/V140/6.png) |
| ![](https://thorui.cn/img/V140/7.png) |![](https://thorui.cn/img/V140/8.png) | ![](https://thorui.cn/img/V140/9.png) |
| ![](https://thorui.cn/img/V140/10.png) |![](https://thorui.cn/img/V140/11.png) | ![](https://thorui.cn/img/V140/12.png) |
| ![](https://thorui.cn/img/V140/13.png) |![](https://thorui.cn/img/V140/14.png) | ![](https://thorui.cn/img/V140/15.png) |
### V1.3.2
1.修复H5端发行报错的问题。
2.扩展基础组件(保留了之前版本):alert、tips、button、toast。
3.新增表单验证功能,只需配置相应验证即可。
4.新增返回顶部组件,nvue返回顶部看首页[nvue商品列表]
5.优化部分页面,修复已知bug。
### 功能截图
| ![](https://thorui.cn/img/V132/4.jpg) |![](https://thorui.cn/img/V132/2.jpg) | ![](https://thorui.cn/img/V132/3.jpg) |
| ------------ | ------------ | ------------ |
| | | |
### V1.3.0
1.新增倒计时组件:时分秒倒计时,支持设置大小,颜色等。
2.新增分隔符组件:Divider分隔符,可设置占据高度,线条宽度,颜色等。
3.新增卡片轮播:包含顶部轮播,秒杀商品轮播等。
4.nvue下拉刷新优化。
5.修复已知bug。
### V1.2.2
1.新增组件Modal弹框:可设置按钮数,按钮样式,提示文字样式等,还可自定义弹框内容。
2.修复部分已知bug。
### V1.2.1
1.修复部分兼容性问题。
2.修复部分已知bug。
### V1.2.0
1.新增组件NumberBox数字框:可设置步长,支持浮点数,支持调整样式(可单独设置)。
2.新增组件Rate评分:可设置星星数,可设置大小颜色。
3.新增聊天模板,包含:消息列表,好友列表,聊天界面等。
4.新增商城模板,包含:商城首页,商城列表,商城详情等。
5.优化部分体验。
### V1.1.0
1.将基础组件移出扩展,单独出来。
2.扩展改为单独tab bar选项extend。
3.新增滚动消息(extend=>滚动消息):包括顶部通告栏,滚动新闻,以及搜索框中出现的热搜产品。
4.新增弹层下拉选择(extend=>弹层下拉选择):包含顶部下拉选择列表、输入框下拉选择以及底部分享弹层。
5.新增ActionSheet操作菜单(extend=>ActionSheet):可加入提示信息,可单独设置字体样式。
6.新增新闻模板(extend=>新闻模板):包含新闻列表,新闻详情,评论等。
7.部分功能优化,修复已知bug。
### V1.0.0
1.【地图】新增拖拽定位功能
2.【扩展】新增基础组件,包括:字体图标,按钮,Grid宫格,List列表,Card卡片...
3.【扩展】新增数字键盘
4.【扩展】新增时间轴
5.完善thor(个人中心)功能,包括:关于Thor UI,模拟登录,GitHub地址复制,赞赏,反馈,更新日志等
6.已知bug修复,以及部分功能优化
### 商城模板部分截图
| ![商城首页](https://thorui.cn/img/mall/1.png) | ![](https://thorui.cn/img/mall/2.png) | ![](https://thorui.cn/img/mall/3.png) | ![](https://thorui.cn/img/mall/4.png) |
| ------------ | ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/mall/5.png) | ![](https://thorui.cn/img/mall/6.png) | ![](https://thorui.cn/img/mall/7.png)| ![](https://thorui.cn/img/mall/8.png) |
| ![](https://thorui.cn/img/mall/9.png)| ![](https://thorui.cn/img/mall/10.png) | | |
### 新闻模板部分截图
| ![](https://thorui.cn/img/news/1.png) | ![](https://thorui.cn/img/news/2.png)| ![](https://thorui.cn/img/news/3.png) |
| ------------ | ------------ | ------------ |
| ![](https://thorui.cn/img/news/4.png) | ![](https://thorui.cn/img/news/5.png) | ![](https://thorui.cn/img/news/6.png) |
### 聊天模板截图
| ![](https://thorui.cn/img/chat/1.png) | ![](https://thorui.cn/img/chat/2.png) | ![](https://thorui.cn/img/chat/3.png) |
| ------------ | ------------ | ------------ |
| | | |
### 组件功能部分截图
| ![消息提示](https://thorui.cn/img/function/1.jpg)| ![吸顶容器](https://thorui.cn/img/function/2.jpg) | ![数字键盘](https://thorui.cn/img/function/3.jpg) | ![锁频键盘](https://thorui.cn/img/function/4.jpg) | ![时间轴](https://thorui.cn/img/function/5.jpg) |
| ------------ | ------------ | ------------ | ------------ | ------------ |
| ![消息滚动](https://thorui.cn/img/function/6.jpg) | ![弹层,下拉选择](https://thorui.cn/img/function/7.jpg) | ![抽奖转盘](https://thorui.cn/img/function/8.jpg) | ![抽屉](https://thorui.cn/img/function/9.jpg) | ![滑动菜单](https://thorui.cn/img/function/10.png) |
| ![二维码生成](https://thorui.cn/img/function/11.png) | ![地图-拖拽定位](https://thorui.cn/img/function/12.png) |![地图-周边地点](https://thorui.cn/img/function/13.png) | ![基础组件](https://thorui.cn/img/function/14.png) | ![索引列表-城市选择](https://thorui.cn/img/function/15.png) |
| ![索引列表](https://thorui.cn/img/function/16.png) | ![顶部选项卡](https://thorui.cn/img/function/17.png) | ![rate评分](https://thorui.cn/img/function/18.png) |![数字输入框](https://thorui.cn/img/function/19.png) | |
## 赞赏
![image](https://thorui.cn/img/reward_small.jpg)
\ No newline at end of file
// #ifdef H5
/**
* clipboard.min.js Add support for ES6 module import
* @author echo.
* https://www.thorui.cn/doc
**/
function select(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var i=t.hasAttribute("readonly");i||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),i||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var n=window.getSelection(),r=document.createRange();r.selectNodeContents(t),n.removeAllRanges(),n.addRange(r),e=n.toString()}return e}class ClipboardAction{constructor(t){this.resolveOptions(t),this.initSelection()}resolveOptions(t={}){this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}initSelection(){this.text?this.selectFake():this.target&&this.selectTarget()}selectFake(){const t="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=(()=>this.removeFake()),this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[t?"right":"left"]="-9999px";let e=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=`${e}px`,this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=select(this.fakeElem),this.copyText()}removeFake(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}selectTarget(){this.selectedText=select(this.target),this.copyText()}copyText(){let t;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}handleResult(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}clearSelection(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}set action(t="copy"){if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')}get action(){return this._action}set target(t){if(void 0!==t){if(!t||"object"!=typeof t||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}}get target(){return this._target}destroy(){this.removeFake()}}function Emitter(){}Emitter.prototype={on:function(t,e,i){var n=this.e||(this.e={});return(n[t]||(n[t]=[])).push({fn:e,ctx:i}),this},once:function(t,e,i){var n=this;function r(){n.off(t,r),e.apply(i,arguments)}return r._=e,this.on(t,r,i)},emit:function(t){for(var e=[].slice.call(arguments,1),i=((this.e||(this.e={}))[t]||[]).slice(),n=0,r=i.length;n<r;n++)i[n].fn.apply(i[n].ctx,e);return this},off:function(t,e){var i=this.e||(this.e={}),n=i[t],r=[];if(n&&e)for(var o=0,s=n.length;o<s;o++)n[o].fn!==e&&n[o].fn._!==e&&r.push(n[o]);return r.length?i[t]=r:delete i[t],this}};let is={node:function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},nodeList:function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||exports.node(t[0]))},string:function(t){return"string"==typeof t||t instanceof String},fn:function(t){return"[object Function]"===Object.prototype.toString.call(t)}};var DOCUMENT_NODE_TYPE=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var proto=Element.prototype;proto.matches=proto.matchesSelector||proto.mozMatchesSelector||proto.msMatchesSelector||proto.oMatchesSelector||proto.webkitMatchesSelector}function closest(t,e){for(;t&&t.nodeType!==DOCUMENT_NODE_TYPE;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}function _delegate(t,e,i,n,r){var o=listener.apply(this,arguments);return t.addEventListener(i,o,r),{destroy:function(){t.removeEventListener(i,o,r)}}}function delegate(t,e,i,n,r){return"function"==typeof t.addEventListener?_delegate.apply(null,arguments):"function"==typeof i?_delegate.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return _delegate(t,e,i,n,r)}))}function listener(t,e,i,n){return function(i){i.delegateTarget=closest(i.target,e),i.delegateTarget&&n.call(t,i)}}function listen(t,e,i){if(!t&&!e&&!i)throw new Error("Missing required arguments");if(!is.string(e))throw new TypeError("Second argument must be a String");if(!is.fn(i))throw new TypeError("Third argument must be a Function");if(is.node(t))return listenNode(t,e,i);if(is.nodeList(t))return listenNodeList(t,e,i);if(is.string(t))return listenSelector(t,e,i);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function listenNode(t,e,i){return t.addEventListener(e,i),{destroy:function(){t.removeEventListener(e,i)}}}function listenNodeList(t,e,i){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,i)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,i)})}}}function listenSelector(t,e,i){return delegate(document.body,t,e,i)}class Clipboard extends Emitter{constructor(t,e){super(),this.resolveOptions(e),this.listenClick(t)}resolveOptions(t={}){this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"==typeof t.container?t.container:document.body}listenClick(t){this.listener=listen(t,"click",t=>this.onClick(t))}onClick(t){const e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new ClipboardAction({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}defaultAction(t){return getAttributeValue("action",t)}defaultTarget(t){const e=getAttributeValue("target",t);if(e)return document.querySelector(e)}static isSupported(t=["copy","cut"]){const e="string"==typeof t?[t]:t;let i=!!document.queryCommandSupported;return e.forEach(t=>{i=i&&!!document.queryCommandSupported(t)}),i}defaultText(t){return getAttributeValue("text",t)}destroy(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}function getAttributeValue(t,e){const i=`data-clipboard-${t}`;if(e.hasAttribute(i))return e.getAttribute(i)}export default Clipboard;
// #endif
\ No newline at end of file
/**
* 复制文本 兼容H5
* 来自 ThorUI www.thorui.cn | 文档地址: www.donarui.com
* @author echo.
* @version 1.0.0
**/
// #ifdef H5
import ClipboardJS from "./clipboard.min.js"
// #endif
const thorui = {
/**
* data 需要复制的数据
* callback 回调
* e 当用户点击后需要先请求接口再进行复制时,需要传入此参数,或者将异步请求转为同步 (H5端)
* **/
getClipboardData: function(data,callback,e) {
// #ifdef APP-PLUS || MP
uni.setClipboardData({
data: data,
success(res) {
("function" == typeof callback) && callback(true)
},
fail(res) {
("function" == typeof callback) && callback(false)
}
})
// #endif
// #ifdef H5
let event = window.event || e || {}
let clipboard = new ClipboardJS("", {
text: () => data
})
clipboard.on('success', (e) => {
("function" == typeof callback) && callback(true)
clipboard.off('success')
clipboard.off('error')
clipboard.destroy()
});
clipboard.on('error', (e) => {
("function" == typeof callback) && callback(false)
clipboard.off('success')
clipboard.off('error')
clipboard.destroy()
});
clipboard.onClick(event)
// #endif
}
};
export default {
getClipboardData: thorui.getClipboardData
};
var _createClass=function(){function a(a,b){for(var c,d=0;d<b.length;d++)c=b[d],c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(a,c.key,c)}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}();function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}if(!pv)var pv={map:function(a,b){var c={};return b?a.map(function(a,d){return c.index=d,b.call(c,a)}):a.slice()},naturalOrder:function(c,a){return c<a?-1:c>a?1:0},sum:function(a,b){var c={};return a.reduce(b?function(a,e,d){return c.index=d,a+b.call(c,e)}:function(a,b){return a+b},0)},max:function(a,b){return Math.max.apply(null,b?pv.map(a,b):a)}};var MMCQ=function(){function a(a,c,d){return(a<<10)+(c<<5)+d}function b(a){function b(){c.sort(a),d=!0}var c=[],d=!1;return{push:function(a){c.push(a),d=!1},peek:function(a){return d||b(),void 0===a&&(a=c.length-1),c[a]},pop:function(){return d||b(),c.pop()},size:function(){return c.length},map:function(a){return c.map(a)},debug:function(){return d||b(),c}}}function c(a,b,c,d,e,f,g){var h=this;h.r1=a,h.r2=b,h.g1=c,h.g2=d,h.b1=e,h.b2=f,h.histo=g}function d(){this.vboxes=new b(function(c,a){return pv.naturalOrder(c.vbox.count()*c.vbox.volume(),a.vbox.count()*a.vbox.volume())})}function e(b){var c,d,e,f,g=Array(32768);return b.forEach(function(b){d=b[0]>>3,e=b[1]>>3,f=b[2]>>3,c=a(d,e,f),g[c]=(g[c]||0)+1}),g}function f(a,b){var d,e,f,g=1e6,h=0,i=1e6,j=0,k=1e6,l=0;return a.forEach(function(a){d=a[0]>>3,e=a[1]>>3,f=a[2]>>3,d<g?g=d:d>h&&(h=d),e<i?i=e:e>j&&(j=e),f<k?k=f:f>l&&(l=f)}),new c(g,h,i,j,k,l,b)}function g(b,c){function d(a){var b,d,e,f,g,h=a+"1",i=a+"2",j=0;for(l=c[h];l<=c[i];l++)if(r[l]>q/2){for(e=c.copy(),f=c.copy(),b=l-c[h],d=c[i]-l,g=b<=d?Math.min(c[i]-1,~~(l+d/2)):Math.max(c[h],~~(l-1-b/2));!r[g];)g++;for(j=s[g];!j&&r[g-1];)j=s[--g];return e[i]=g,f[h]=e[i]+1,[e,f]}}if(c.count()){var e=c.r2-c.r1+1,f=c.g2-c.g1+1,g=c.b2-c.b1+1,h=pv.max([e,f,g]);if(1==c.count())return[c.copy()];var l,m,n,o,p,q=0,r=[],s=[];if(h==e)for(l=c.r1;l<=c.r2;l++){for(o=0,m=c.g1;m<=c.g2;m++)for(n=c.b1;n<=c.b2;n++)p=a(l,m,n),o+=b[p]||0;q+=o,r[l]=q}else if(h==f)for(l=c.g1;l<=c.g2;l++){for(o=0,m=c.r1;m<=c.r2;m++)for(n=c.b1;n<=c.b2;n++)p=a(m,l,n),o+=b[p]||0;q+=o,r[l]=q}else for(l=c.b1;l<=c.b2;l++){for(o=0,m=c.r1;m<=c.r2;m++)for(n=c.g1;n<=c.g2;n++)p=a(m,n,l),o+=b[p]||0;q+=o,r[l]=q}return r.forEach(function(a,b){s[b]=q-a}),h==e?d("r"):h==f?d("g"):d("b")}}return c.prototype={volume:function(a){var b=this;return(!b._volume||a)&&(b._volume=(b.r2-b.r1+1)*(b.g2-b.g1+1)*(b.b2-b.b1+1)),b._volume},count:function(b){var c=this,d=c.histo;if(!c._count_set||b){var e,f,g,h,l=0;for(f=c.r1;f<=c.r2;f++)for(g=c.g1;g<=c.g2;g++)for(h=c.b1;h<=c.b2;h++)e=a(f,g,h),l+=d[e]||0;c._count=l,c._count_set=!0}return c._count},copy:function(){var a=this;return new c(a.r1,a.r2,a.g1,a.g2,a.b1,a.b2,a.histo)},avg:function(b){var c=this,d=c.histo;if(!c._avg||b){var e,f,g,h,l,m=0,n=0,o=0,p=0;for(f=c.r1;f<=c.r2;f++)for(g=c.g1;g<=c.g2;g++)for(h=c.b1;h<=c.b2;h++)l=a(f,g,h),e=d[l]||0,m+=e,n+=8*(e*(f+.5)),o+=8*(e*(g+.5)),p+=8*(e*(h+.5));c._avg=m?[~~(n/m),~~(o/m),~~(p/m)]:[~~(8*(c.r1+c.r2+1)/2),~~(8*(c.g1+c.g2+1)/2),~~(8*(c.b1+c.b2+1)/2)]}return c._avg},contains:function(a){var b=this,c=a[0]>>3;return gval=a[1]>>3,bval=a[2]>>3,c>=b.r1&&c<=b.r2&&gval>=b.g1&&gval<=b.g2&&bval>=b.b1&&bval<=b.b2}},d.prototype={push:function(a){this.vboxes.push({vbox:a,color:a.avg()})},palette:function(){return this.vboxes.map(function(a){return a.color})},size:function(){return this.vboxes.size()},map:function(a){for(var b=this.vboxes,c=0;c<b.size();c++)if(b.peek(c).vbox.contains(a))return b.peek(c).color;return this.nearest(a)},nearest:function(a){for(var b,c,d,e=Math.pow,f=this.vboxes,g=0;g<f.size();g++)c=Math.sqrt(e(a[0]-f.peek(g).color[0],2)+e(a[1]-f.peek(g).color[1],2)+e(a[2]-f.peek(g).color[2],2)),(c<b||void 0===b)&&(b=c,d=f.peek(g).color);return d},forcebw:function(){var a=this.vboxes;a.sort(function(c,a){return pv.naturalOrder(pv.sum(c.color),pv.sum(a.color))});var b=a[0].color;5>b[0]&&5>b[1]&&5>b[2]&&(a[0].color=[0,0,0]);var c=a.length-1,d=a[c].color;251<d[0]&&251<d[1]&&251<d[2]&&(a[c].color=[255,255,255])}},{quantize:function(a,c){function h(a,b){for(var c,d=1,e=0;1000>e;){if(c=a.pop(),!c.count()){a.push(c),e++;continue}var f=g(i,c),h=f[0],j=f[1];if(!h)return;if(a.push(h),j&&(a.push(j),d++),d>=b)return;if(1000<e++)return}}if(!a.length||2>c||256<c)return!1;var i=e(a),j=0;i.forEach(function(){j++}),j<=c;var k=f(a,i),l=new b(function(c,a){return pv.naturalOrder(c.count(),a.count())});l.push(k),h(l,.75*c);for(var m=new b(function(c,a){return pv.naturalOrder(c.count()*c.volume(),a.count()*a.volume())});l.size();)m.push(l.pop());h(m,c-m.size());for(var n=new d;m.size();)n.push(m.pop());return n}}}(),ColorAnalysis=function(){function a(b){_classCallCheck(this,a),this.canvasId=b}return _createClass(a,[{key:"getPalette",value:function(a,c){var b=this,d=a.width,e=a.height,f=a.imgPath,h=a.maxColors,j=a.step;("undefined"==typeof h||2>h)&&(h=2),256<h&&(h=10),("undefined"==typeof j||1>j)&&(j=10);var g=uni.createCanvasContext(this.canvasId);g.drawImage(f,0,0,d,e),g.draw(!1,function(){uni.canvasGetImageData({canvasId:b.canvasId,x:0,y:0,width:d,height:e,success:function(f){for(var k,l,m,n,o,p=f.data,q=[],s=0;s<d*e;s+=j)k=4*s,l=p[k+0],m=p[k+1],n=p[k+2],o=p[k+3],125<=o&&!(250<l&&250<m&&250<n)&&q.push([l,m,n]);var t=MMCQ.quantize(q,h),u=t?t.palette():null;c&&c(u)}})})}}]),a}();export default ColorAnalysis;
\ No newline at end of file
/**
* 表单验证
* @author echo.
* @version 1.6.5
**/
const form = {
//非必填情况下,如果值为空,则不进行校验
//当出现错误时返回错误消息,否则返回空即为验证通过
/*
formData:Object 表单对象。{key:value,key:value},key==rules.name
rules: Array [{name:name,rule:[],msg:[],validator:[],{name:name,rule:[],msg:[],validator:[]}]
name:name 属性=> 元素的名称
rule:字符串数组 ["required","isMobile","isEmail","isCarNo","isIdCard","isAmount","isNum","isChinese","isNotChinese","isEnglish",isEnAndNo","isSpecial","isEmoji",""isDate","isUrl","isSame:key","range:[1,9]","minLength:9","maxLength:Number","isKeyword:key1,key2,key3..."]
msg:数组 []。 与数组 rule 长度相同,对应的错误提示信息
validator:[{msg:'错误消息',method:Function}],自定义验证方法组,函数约定:(value)=>{ return true or false}
*/
validation: function(formData, rules) {
for (let item of rules) {
let key = item.name;
let rule = item.rule;
let validator = item.validator;
let msgArr = item.msg;
if (!key || !rule || rule.length === 0 || !msgArr || msgArr.length === 0 || (!~rule.indexOf(
"required") && formData[key].toString()
.length === 0)) {
continue;
}
for (let i = 0, length = rule.length; i < length; i++) {
let ruleItem = rule[i];
let msg = msgArr[i];
if (!msg || !ruleItem) continue;
//数据处理
let value = null;
if (~ruleItem.indexOf(":")) {
let temp = ruleItem.split(":");
ruleItem = temp[0];
value = temp[1];
}
let isError = false;
switch (ruleItem) {
case "required":
isError = form._isNullOrEmpty(formData[key]);
break;
case "isMobile":
isError = !form._isMobile(formData[key]);
break;
case "isEmail":
isError = !form._isEmail(formData[key]);
break;
case "isCarNo":
isError = !form._isCarNo(formData[key]);
break;
case "isIdCard":
isError = !form._isIdCard(formData[key]);
break;
case "isAmount":
isError = !form._isAmount(formData[key]);
break;
case "isNum":
isError = !form._isNum(formData[key]);
break;
case "isChinese":
isError = !form._isChinese(formData[key]);
break;
case "isNotChinese":
isError = !form._isNotChinese(formData[key]);
break;
case "isEnglish":
isError = !form._isEnglish(formData[key]);
break;
case "isEnAndNo":
isError = !form._isEnAndNo(formData[key]);
break;
case "isEnOrNo":
isError = !form._isEnOrNo(formData[key]);
break;
case "isSpecial":
isError = form._isSpecial(formData[key]);
break;
case "isEmoji":
isError = form._isEmoji(formData[key]);
break;
case "isDate":
isError = !form._isDate(formData[key]);
break;
case "isUrl":
isError = !form._isUrl(formData[key]);
break;
case "isSame":
isError = !form._isSame(formData[key], formData[value]);
break;
case "range":
let range = null;
try {
range = JSON.parse(value);
if (range.length <= 1) {
throw new Error("range值传入有误!")
}
} catch (e) {
return "range值传入有误!"
}
isError = !form._isRange(formData[key], range[0], range[1])
break;
case "minLength":
isError = !form._minLength(formData[key], value)
break;
case "maxLength":
isError = !form._maxLength(formData[key], value)
break;
case "isKeyword":
isError = !form._isKeyword(formData[key], value)
break;
default:
break;
}
if (isError) {
return msg;
}
}
if (validator && validator.length > 0) {
for (let model of validator) {
let func = model.method;
if (func && !func(formData[key])) {
return model.msg;
}
}
}
}
return "";
},
//允许填写字符串null或者undefined
_isNullOrEmpty: function(value) {
return (value === null || value === '' || value === undefined) ? true : false;
},
_isMobile: function(value) {
return /^(?:13\d|14\d|15\d|16\d|17\d|18\d|19\d)\d{5}(\d{3}|\*{3})$/.test(value);
},
_isEmail: function(value) {
return /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(value);
},
_isCarNo: function(value) {
// 新能源车牌
const xreg =
/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
// 旧车牌
const creg =
/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
if (value.length === 7) {
return creg.test(value);
} else if (value.length === 8) {
return xreg.test(value);
} else {
return false;
}
},
_isIdCard: function(value) {
let idCard = value;
if (idCard.length == 15) {
return this.__isValidityBrithBy15IdCard;
} else if (idCard.length == 18) {
let arrIdCard = idCard.split("");
if (this.__isValidityBrithBy18IdCard(idCard) && this.__isTrueValidateCodeBy18IdCard(arrIdCard)) {
return true;
} else {
return false;
}
} else {
return false;
}
},
__isTrueValidateCodeBy18IdCard: function(arrIdCard) {
let sum = 0;
let Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];
let ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];
if (arrIdCard[17].toLowerCase() == 'x') {
arrIdCard[17] = 10;
}
for (let i = 0; i < 17; i++) {
sum += Wi[i] * arrIdCard[i];
}
let valCodePosition = sum % 11;
if (arrIdCard[17] == ValideCode[valCodePosition]) {
return true;
} else {
return false;
}
},
__isValidityBrithBy18IdCard: function(idCard18) {
let year = idCard18.substring(6, 10);
let month = idCard18.substring(10, 12);
let day = idCard18.substring(12, 14);
let temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
if (temp_date.getFullYear() != parseFloat(year) || temp_date.getMonth() != parseFloat(month) - 1 ||
temp_date.getDate() !=
parseFloat(day)) {
return false;
} else {
return true;
}
},
__isValidityBrithBy15IdCard: function(idCard15) {
let year = idCard15.substring(6, 8);
let month = idCard15.substring(8, 10);
let day = idCard15.substring(10, 12);
let temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
if (temp_date.getYear() != parseFloat(year) || temp_date.getMonth() != parseFloat(month) - 1 ||
temp_date.getDate() !=
parseFloat(day)) {
return false;
} else {
return true;
}
},
_isAmount: function(value) {
//金额,只允许保留两位小数
return /^([0-9]*[.]?[0-9])[0-9]{0,1}$/.test(value);
},
_isNum: function(value) {
//只能为数字
return /^[0-9]+$/.test(value);
},
//是否全部为中文
_isChinese: function(value) {
let reg = /^[\u4e00-\u9fa5]+$/;
return value !== "" && reg.test(value) && !form._isSpecial(value) && !form._isEmoji(value)
},
//是否不包含中文,可以有特殊字符
_isNotChinese: function(value) {
let reg = /.*[\u4e00-\u9fa5]+.*$/;
let result = true;
if (reg.test(value)) {
result = false
}
return result
},
_isEnglish: function(value) {
return /^[a-zA-Z]*$/.test(value)
},
_isEnAndNo: function(value) {
//8~20位数字和字母组合
return /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$/.test(value);
},
_isEnOrNo: function(value) {
//英文或者数字
let reg = /.*[\u4e00-\u9fa5]+.*$/;
let result = true;
if (reg.test(value) || form._isSpecial(value) || form._isEmoji(value)) {
result = false
}
return result
},
_isSpecial: function(value) {
//是否包含特殊字符
let regEn = /[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im,
regCn = /[·!#¥(——):;“”‘、,|《。》?、【】[\]]/im;
if (regEn.test(value) || regCn.test(value)) {
return true;
}
return false;
},
_isEmoji: function(value) {
//是否包含表情
return /\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g.test(value);
},
_isDate: function(value) {
//2019-10-12
const reg =
/^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/;
return reg.test(value);
},
_isUrl: function(value) {
return /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})(:[0-9]{1,5})?((\/?)|(\/[\\\w_!~*\\'()\\\.;?:@&=+$,%#-]+)+\/?)$/.test(value);
},
_isSame: function(value1, value2) {
return value1 === value2
},
_isRange: function(value, range1, range2) {
if ((!range1 && range1 != 0) && (!range2 && range2 != 0)) {
return true;
} else if (!range1 && range1 != 0) {
return value <= range2
} else if (!range2 && range2 != 0) {
return value >= range1
} else {
return value >= range1 && value <= range2
}
},
_minLength: function(value, min) {
return value.length >= Number(min)
},
_maxLength: function(value, max) {
return value.length <= Number(max)
},
_isKeyword: function(value, keywords) {
//是否包含关键词,敏感词,多个以英文逗号分隔,包含则为false,弹出提示语!
let result = true;
if (!keywords) return result;
let key = keywords.split(',');
for (let i = 0, len = key.length; i < len; i++) {
if (~value.indexOf(key[i])) {
result = false;
break;
}
}
return result;
}
};
export default {
validation: form.validation
};
const form={validation:function(a,b){for(let c of b){let b=c.name,d=c.rule,e=c.msg;if(b&&d&&0!==d.length&&e&&0!==e.length)for(let c=0,f=d.length;c<f;c++){let f=d[c],g=e[c];if(!f||!g||!~d.indexOf("required")&&0===a[b].toString().length)continue;let h=null;if(~f.indexOf(":")){let a=f.split(":");f=a[0],h=a[1]}let i=!1;switch(f){case"required":i=form._isNullOrEmpty(a[b]);break;case"isMobile":i=!form._isMobile(a[b]);break;case"isEmail":i=!form._isEmail(a[b]);break;case"isCarNo":i=!form._isCarNo(a[b]);break;case"isIdCard":i=!form._isIdCard(a[b]);break;case"isAmount":i=!form._isAmount(a[b]);break;case"isNum":i=!form._isNum(a[b]);break;case"isChinese":i=!form._isChinese(a[b]);break;case"isEnglish":i=!form._isEnglish(a[b]);break;case"isEnAndNo":i=!form._isEnAndNo(a[b]);break;case"isEnOrNo":i=!form._isEnOrNo(a[b]);break;case"isSpecial":i=form._isSpecial(a[b]);break;case"isEmoji":i=form._isEmoji(a[b]);break;case"isDate":i=!form._isDate(a[b]);break;case"isUrl":i=!form._isUrl(a[b]);break;case"isSame":i=!form._isSame(a[b],a[h]);break;case"range":let c=null;try{if(c=JSON.parse(h),1>=c.length)throw new Error("range\u503C\u4F20\u5165\u6709\u8BEF\uFF01")}catch(a){return"range\u503C\u4F20\u5165\u6709\u8BEF\uFF01"}i=!form._isRange(a[b],c[0],c[1]);break;case"minLength":i=!form._minLength(a[b],h);break;case"maxLength":i=!form._maxLength(a[b],h);break;default:}if(i)return g}}return""},_isNullOrEmpty:function(a){return!(null!==a&&""!==a&&a!==void 0)},_isMobile:function(a){return /^(?:13\d|14\d|15\d|16\d|17\d|18\d|19\d)\d{5}(\d{3}|\*{3})$/.test(a)},_isEmail:function(a){return /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(a)},_isCarNo:function(a){const b=/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/,c=/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;return 7===a.length?c.test(a):8===a.length&&b.test(a)},_isIdCard:function(a){let b=a;if(15==b.length)return this.__isValidityBrithBy15IdCard;if(18==b.length){let a=b.split("");return!!(this.__isValidityBrithBy18IdCard(b)&&this.__isTrueValidateCodeBy18IdCard(a))}return!1},__isTrueValidateCodeBy18IdCard:function(a){let b=0,c=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1];"x"==a[17].toLowerCase()&&(a[17]=10);for(let d=0;17>d;d++)b+=c[d]*a[d];let d=b%11;return!(a[17]!=[1,0,10,9,8,7,6,5,4,3,2][d])},__isValidityBrithBy18IdCard:function(a){let b=a.substring(6,10),c=a.substring(10,12),d=a.substring(12,14),e=new Date(b,parseFloat(c)-1,parseFloat(d));return e.getFullYear()==parseFloat(b)&&e.getMonth()==parseFloat(c)-1&&e.getDate()==parseFloat(d)},__isValidityBrithBy15IdCard:function(a){let b=a.substring(6,8),c=a.substring(8,10),d=a.substring(10,12),e=new Date(b,parseFloat(c)-1,parseFloat(d));return e.getYear()==parseFloat(b)&&e.getMonth()==parseFloat(c)-1&&e.getDate()==parseFloat(d)},_isAmount:function(a){return /^([0-9]*[.]?[0-9])[0-9]{0,1}$/.test(a)},_isNum:function(a){return /^[0-9]+$/.test(a)},_isChinese:function(a){let b=/.*[\u4e00-\u9fa5]+.*$/;return""!==a&&b.test(a)&&!form._isSpecial(a)&&!form._isEmoji(a)},_isEnglish:function(a){return /^[a-zA-Z]*$/.test(a)},_isEnAndNo:function(a){return /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$/.test(a)},_isEnOrNo:function(a){let b=/.*[\u4e00-\u9fa5]+.*$/,c=!0;return(b.test(a)||form._isSpecial(a)||form._isEmoji(a))&&(c=!1),c},_isSpecial:function(a){let b=/[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im,c=/[·!#¥(——):;“”‘、,|《。》?、【】[\]]/im;return!!(b.test(a)||c.test(a))},_isEmoji:function(a){return /\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g.test(a)},_isDate:function(a){const b=/^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/;return b.test(a)},_isUrl:function(a){return /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/.test(a)},_isSame:function(a,b){return a===b},_isRange:function(a,b,c){return!(b||0==b||c||0==c)||(b||0==b?c||0==c?a>=b&&a<=c:a>=b:a<=c)},_minLength:function(a,b){return a.length>=+b},_maxLength:function(a,b){return a.length<=+b}};module.exports={validation:form.validation};
\ No newline at end of file
var _createClass=function(){function L(Y,Z){for(var e=0;e<Z.length;e++){var L=Z[e];L.enumerable=L.enumerable||false;L.configurable=true;if("value"in L)L.writable=true;Object.defineProperty(Y,L.key,L)}}return function(Y,Z,e){if(Z)L(Y.prototype,Z);if(e)L(Y,e);return Y}}();var _polyphone;function _classCallCheck(Y,Z){if(!(Y instanceof Z)){throw new TypeError("Cannot call a class as a function")}}function _defineProperty(Y,Z,e){if(Z in Y){Object.defineProperty(Y,Z,{value:e,enumerable:true,configurable:true,writable:true})}else{Y[Z]=e}return Y}var _private={charsDict:"YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJHHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPCBZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZXYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXPJBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCSKDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCSHZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNCLLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTMRNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZFMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXKLQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZMLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJGBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJXXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXPXJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWGYJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEGZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSCYAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZSZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMCHKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCKZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHPYYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGGTGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWFZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGAFFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJRYGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDCZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZSYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZBYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZEMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNYNPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYXYWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZYJZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYSXQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXGCQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDXJSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWXLYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAWHZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZSZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZQJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSBDSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQCFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLSZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQWSRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTCZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHXNWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHHCJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKTLXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSLFYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQQPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZKKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQLPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQNYDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJLJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNNWZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAXYWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZKSSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJXLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLLHYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXMSZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLSJEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCWDABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYSPMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCTZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJSWLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLHPFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYGBDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZSKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJMMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSSTKXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZMMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNYXHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZLYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXYGYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLBDJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJMQPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZPXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZFZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPWQLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYHDHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYKQSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQQQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYFJHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJSXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZWPZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZLLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLTYXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJCFPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXNSQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXLYYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDPBCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZGMYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYMCCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHNLXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYXBEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXDRMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZDJGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZBLZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSDCHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYMDJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLLMQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZCHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSYMPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMHNLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPMLKJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNPPLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYDWQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXLDDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQHZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHTXSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYSSUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBBYBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJQJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRFKZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXPZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDLXBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHLXZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZKJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZXZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZQWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZNBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJHZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJKRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFXGFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLYZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXDYLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDUTJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDFBBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXTPCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXGLBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCYSCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZMYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCYXZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBXGLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQDSPDJZZGKGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQJFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYKPPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXMBDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLYXWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXXLYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHLJKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHGZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZWFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMXCZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJYSXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZYPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYDTZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJDSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGYGMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCYZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZXHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBHZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYNXELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYDMPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPGNYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXMJSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQQJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMTJQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDBCCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKSTQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZFYBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCPZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSSTPHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZAZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJXGNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMSLPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXTQCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYTXNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMYFLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZTLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZJYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQMSTPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCLXXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKNXJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQGBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZNCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJADJLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXXHCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBBFJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPSSYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDDWRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSHCKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHHJTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZYENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSDHRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNSDJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQPQJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQCZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJQQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBRFERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXCYZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZSQYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWPSLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFBHBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYFLZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJTJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHYYXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYLBLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJLJXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQDCYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHWWKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJXY",fullDict:{a:"啊阿锕",ai:"埃挨哎唉哀皑癌蔼矮艾碍爱隘诶捱嗳嗌嫒瑷暧砹锿霭",an:"鞍氨安俺按暗岸胺案谙埯揞犴庵桉铵鹌顸黯",ang:"肮昂盎",ao:"凹敖熬翱袄傲奥懊澳坳拗嗷噢岙廒遨媪骜聱螯鏊鳌鏖",ba:"芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸茇菝萆捭岜灞杷钯粑鲅魃",bai:"白柏百摆佰败拜稗薜掰鞴",ban:"斑班搬扳般颁板版扮拌伴瓣半办绊阪坂豳钣瘢癍舨",bang:"邦帮梆榜膀绑棒磅蚌镑傍谤蒡螃",bao:"苞胞包褒雹保堡饱宝抱报暴豹鲍爆勹葆宀孢煲鸨褓趵龅",bo:"剥薄玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳亳蕃啵饽檗擘礴钹鹁簸跛",bei:"杯碑悲卑北辈背贝钡倍狈备惫焙被孛陂邶埤蓓呗怫悖碚鹎褙鐾",ben:"奔苯本笨畚坌锛",beng:"崩绷甭泵蹦迸唪嘣甏",bi:"逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛匕仳俾芘荜荸吡哔狴庳愎滗濞弼妣婢嬖璧贲畀铋秕裨筚箅篦舭襞跸髀",bian:"鞭边编贬扁便变卞辨辩辫遍匾弁苄忭汴缏煸砭碥稹窆蝙笾鳊",biao:"标彪膘表婊骠飑飙飚灬镖镳瘭裱鳔",bie:"鳖憋别瘪蹩鳘",bin:"彬斌濒滨宾摈傧浜缤玢殡膑镔髌鬓",bing:"兵冰柄丙秉饼炳病并禀邴摒绠枋槟燹",bu:"捕卜哺补埠不布步簿部怖拊卟逋瓿晡钚醭",ca:"擦嚓礤",cai:"猜裁材才财睬踩采彩菜蔡",can:"餐参蚕残惭惨灿骖璨粲黪",cang:"苍舱仓沧藏伧",cao:"操糙槽曹草艹嘈漕螬艚",ce:"厕策侧册测刂帻恻",ceng:"层蹭噌",cha:"插叉茬茶查碴搽察岔差诧猹馇汊姹杈楂槎檫钗锸镲衩",chai:"拆柴豺侪茈瘥虿龇",chan:"搀掺蝉馋谗缠铲产阐颤冁谄谶蒇廛忏潺澶孱羼婵嬗骣觇禅镡裣蟾躔",chang:"昌猖场尝常长偿肠厂敞畅唱倡伥鬯苌菖徜怅惝阊娼嫦昶氅鲳",chao:"超抄钞朝嘲潮巢吵炒怊绉晁耖",che:"车扯撤掣彻澈坼屮砗",chen:"郴臣辰尘晨忱沉陈趁衬称谌抻嗔宸琛榇肜胂碜龀",cheng:"撑城橙成呈乘程惩澄诚承逞骋秤埕嵊徵浈枨柽樘晟塍瞠铖裎蛏酲",chi:"吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽傺墀芪茌搋叱哧啻嗤彳饬沲媸敕胝眙眵鸱瘛褫蚩螭笞篪豉踅踟魑",chong:"充冲虫崇宠茺忡憧铳艟",chou:"抽酬畴踌稠愁筹仇绸瞅丑俦圳帱惆溴妯瘳雠鲋",chu:"臭初出橱厨躇锄雏滁除楚础储矗搐触处亍刍憷绌杵楮樗蜍蹰黜",chuan:"揣川穿椽传船喘串掾舛惴遄巛氚钏镩舡",chuang:"疮窗幢床闯创怆",chui:"吹炊捶锤垂陲棰槌",chun:"春椿醇唇淳纯蠢促莼沌肫朐鹑蝽",chuo:"戳绰蔟辶辍镞踔龊",ci:"疵茨磁雌辞慈瓷词此刺赐次荠呲嵯鹚螅糍趑",cong:"聪葱囱匆从丛偬苁淙骢琮璁枞",cu:"凑粗醋簇猝殂蹙",cuan:"蹿篡窜汆撺昕爨",cui:"摧崔催脆瘁粹淬翠萃悴璀榱隹",cun:"村存寸磋忖皴",cuo:"撮搓措挫错厝脞锉矬痤鹾蹉躜",da:"搭达答瘩打大耷哒嗒怛妲疸褡笪靼鞑",dai:"呆歹傣戴带殆代贷袋待逮怠埭甙呔岱迨逯骀绐玳黛",dan:"耽担丹单郸掸胆旦氮但惮淡诞弹蛋亻儋卩萏啖澹檐殚赕眈瘅聃箪",dang:"当挡党荡档谠凼菪宕砀铛裆",dao:"刀捣蹈倒岛祷导到稻悼道盗叨啁忉洮氘焘忑纛",de:"德得的锝",deng:"蹬灯登等瞪凳邓噔嶝戥磴镫簦",di:"堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔氐籴诋谛邸坻莜荻嘀娣柢棣觌砥碲睇镝羝骶",dian:"颠掂滇碘点典靛垫电佃甸店惦奠淀殿丶阽坫埝巅玷癜癫簟踮",diao:"碉叼雕凋刁掉吊钓调轺铞蜩粜貂",die:"跌爹碟蝶迭谍叠佚垤堞揲喋渫轶牒瓞褶耋蹀鲽鳎",ding:"丁盯叮钉顶鼎锭定订丢仃啶玎腚碇町铤疔耵酊",dong:"东冬董懂动栋侗恫冻洞垌咚岽峒夂氡胨胴硐鸫",dou:"兜抖斗陡豆逗痘蔸钭窦窬蚪篼酡",du:"都督毒犊独读堵睹赌杜镀肚度渡妒芏嘟渎椟橐牍蠹笃髑黩",duan:"端短锻段断缎彖椴煅簖",dui:"堆兑队对怼憝碓",dun:"墩吨蹲敦顿囤钝盾遁炖砘礅盹镦趸",duo:"掇哆多夺垛躲朵跺舵剁惰堕咄哚缍柁铎裰踱",e:"蛾峨鹅俄额讹娥恶厄扼遏鄂饿噩谔垩垭苊莪萼呃愕屙婀轭曷腭硪锇锷鹗颚鳄",en:"恩蒽摁唔嗯",er:"而儿耳尔饵洱二贰迩珥铒鸸鲕",fa:"发罚筏伐乏阀法珐垡砝",fan:"藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛蘩幡犭梵攵燔畈蹯",fang:"坊芳方肪房防妨仿访纺放匚邡彷钫舫鲂",fei:"菲非啡飞肥匪诽吠肺废沸费芾狒悱淝妃绋绯榧腓斐扉祓砩镄痱蜚篚翡霏鲱",fen:"芬酚吩氛分纷坟焚汾粉奋份忿愤粪偾瀵棼愍鲼鼢",feng:"丰封枫蜂峰锋风疯烽逢冯缝讽奉凤俸酆葑沣砜",fu:"佛否夫敷肤孵扶拂辐幅氟符伏俘服浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐匐凫郛芙苻茯莩菔呋幞滏艴孚驸绂桴赙黻黼罘稃馥虍蚨蜉蝠蝮麸趺跗鳆",ga:"噶嘎蛤尬呷尕尜旮钆",gai:"该改概钙盖溉丐陔垓戤赅胲",gan:"干甘杆柑竿肝赶感秆敢赣坩苷尴擀泔淦澉绀橄旰矸疳酐",gang:"冈刚钢缸肛纲岗港戆罡颃筻",gong:"杠工攻功恭龚供躬公宫弓巩汞拱贡共蕻廾咣珙肱蚣蛩觥",gao:"篙皋高膏羔糕搞镐稿告睾诰郜蒿藁缟槔槁杲锆",ge:"哥歌搁戈鸽胳疙割革葛格阁隔铬个各鬲仡哿塥嗝纥搿膈硌铪镉袼颌虼舸骼髂",gei:"给",gen:"根跟亘茛哏艮",geng:"耕更庚羹埂耿梗哽赓鲠",gou:"钩勾沟苟狗垢构购够佝诟岣遘媾缑觏彀鸲笱篝鞲",gu:"辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇嘏诂菰哌崮汩梏轱牯牿胍臌毂瞽罟钴锢瓠鸪鹄痼蛄酤觚鲴骰鹘",gua:"刮瓜剐寡挂褂卦诖呱栝鸹",guai:"乖拐怪哙",guan:"棺关官冠观管馆罐惯灌贯倌莞掼涫盥鹳鳏",guang:"光广逛犷桄胱疒",gui:"瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽匦刿庋宄妫桧炅晷皈簋鲑鳜",gun:"辊滚棍丨衮绲磙鲧",guo:"锅郭国果裹过馘蠃埚掴呙囗帼崞猓椁虢锞聒蜮蜾蝈",ha:"哈",hai:"骸孩海氦亥害骇咴嗨颏醢",han:"酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉邗菡撖阚瀚晗焓颔蚶鼾",hen:"夯痕很狠恨",hang:"杭航沆绗珩桁",hao:"壕嚎豪毫郝好耗号浩薅嗥嚆濠灏昊皓颢蚝",he:"呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺诃劾壑藿嗑嗬阖盍蚵翮",hei:"嘿黑",heng:"哼亨横衡恒訇蘅",hong:"轰哄烘虹鸿洪宏弘红黉讧荭薨闳泓",hou:"喉侯猴吼厚候后堠後逅瘊篌糇鲎骺",hu:"呼乎忽瑚壶葫胡蝴狐糊湖弧虎唬护互沪户冱唿囫岵猢怙惚浒滹琥槲轷觳烀煳戽扈祜鹕鹱笏醐斛",hua:"花哗华猾滑画划化话劐浍骅桦铧稞",huai:"槐徊怀淮坏还踝",huan:"欢环桓缓换患唤痪豢焕涣宦幻郇奂垸擐圜洹浣漶寰逭缳锾鲩鬟",huang:"荒慌黄磺蝗簧皇凰惶煌晃幌恍谎隍徨湟潢遑璜肓癀蟥篁鳇",hui:"灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘诙茴荟蕙哕喙隳洄彗缋珲晖恚虺蟪麾",hun:"荤昏婚魂浑混诨馄阍溷缗",huo:"豁活伙火获或惑霍货祸攉嚯夥钬锪镬耠蠖",ji:"击圾基机畸稽积箕肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪居丌乩剞佶佴脔墼芨芰萁蒺蕺掎叽咭哜唧岌嵴洎彐屐骥畿玑楫殛戟戢赍觊犄齑矶羁嵇稷瘠瘵虮笈笄暨跻跽霁鲚鲫髻麂",jia:"嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁伽郏拮岬浃迦珈戛胛恝铗镓痂蛱笳袈跏",jian:"歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件健舰剑饯渐溅涧建僭谏谫菅蒹搛囝湔蹇謇缣枧柙楗戋戬牮犍毽腱睑锏鹣裥笕箴翦趼踺鲣鞯",jiang:"僵姜将浆江疆蒋桨奖讲匠酱降茳洚绛缰犟礓耩糨豇",jiao:"蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫佼僬茭挢噍峤徼姣纟敫皎鹪蛟醮跤鲛",jie:"窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届偈讦诘喈嗟獬婕孑桀獒碣锴疖袷颉蚧羯鲒骱髫",jin:"巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸尽卺荩堇噤馑廑妗缙瑾槿赆觐钅锓衿矜",jing:"劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净刭儆阱菁獍憬泾迳弪婧肼胫腈旌",jiong:"炯窘冂迥扃",jiu:"揪究纠玖韭久灸九酒厩救旧臼舅咎就疚僦啾阄柩桕鹫赳鬏",ju:"鞠拘狙疽驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧倨讵苣苴莒掬遽屦琚枸椐榘榉橘犋飓钜锔窭裾趄醵踽龃雎鞫",juan:"捐鹃娟倦眷卷绢鄄狷涓桊蠲锩镌隽",jue:"撅攫抉掘倔爵觉决诀绝厥劂谲矍蕨噘崛獗孓珏桷橛爝镢蹶觖",jun:"均菌钧军君峻俊竣浚郡骏捃狻皲筠麇",ka:"喀咖卡佧咔胩",ke:"咯坷苛柯棵磕颗科壳咳可渴克刻客课岢恪溘骒缂珂轲氪瞌钶疴窠蝌髁",kai:"开揩楷凯慨剀垲蒈忾恺铠锎",kan:"刊堪勘坎砍看侃凵莰莶戡龛瞰",kang:"康慷糠扛抗亢炕坑伉闶钪",kao:"考拷烤靠尻栲犒铐",ken:"肯啃垦恳垠裉颀",keng:"吭忐铿",kong:"空恐孔控倥崆箜",kou:"抠口扣寇芤蔻叩眍筘",ku:"枯哭窟苦酷库裤刳堀喾绔骷",kua:"夸垮挎跨胯侉",kuai:"块筷侩快蒯郐蒉狯脍",kuan:"宽款髋",kuang:"匡筐狂框矿眶旷况诓诳邝圹夼哐纩贶",kui:"亏盔岿窥葵奎魁傀馈愧溃馗匮夔隗揆喹喟悝愦阕逵暌睽聩蝰篑臾跬",kun:"坤昆捆困悃阃琨锟醌鲲髡",kuo:"括扩廓阔蛞",la:"垃拉喇蜡腊辣啦剌摺邋旯砬瘌",lai:"莱来赖崃徕涞濑赉睐铼癞籁",lan:"蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥啉岚懔漤榄斓罱镧褴",lang:"琅榔狼廊郎朗浪莨蒗啷阆锒稂螂",lao:"捞劳牢老佬姥酪烙涝唠崂栳铑铹痨醪",le:"勒乐肋仂叻嘞泐鳓",lei:"雷镭蕾磊累儡垒擂类泪羸诔荽咧漯嫘缧檑耒酹",ling:"棱冷拎玲菱零龄铃伶羚凌灵陵岭领另令酃塄苓呤囹泠绫柃棂瓴聆蛉翎鲮",leng:"楞愣",li:"厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐痢立粒沥隶力璃哩俪俚郦坜苈莅蓠藜捩呖唳喱猁溧澧逦娌嫠骊缡珞枥栎轹戾砺詈罹锂鹂疠疬蛎蜊蠡笠篥粝醴跞雳鲡鳢黧",lian:"俩联莲连镰廉怜涟帘敛脸链恋炼练挛蔹奁潋濂娈琏楝殓臁膦裢蠊鲢",liang:"粮凉梁粱良两辆量晾亮谅墚椋踉靓魉",liao:"撩聊僚疗燎寥辽潦了撂镣廖料蓼尥嘹獠寮缭钌鹩耢",lie:"列裂烈劣猎冽埒洌趔躐鬣",lin:"琳林磷霖临邻鳞淋凛赁吝蔺嶙廪遴檩辚瞵粼躏麟",liu:"溜琉榴硫馏留刘瘤流柳六抡偻蒌泖浏遛骝绺旒熘锍镏鹨鎏",long:"龙聋咙笼窿隆垄拢陇弄垅茏泷珑栊胧砻癃",lou:"楼娄搂篓漏陋喽嵝镂瘘耧蝼髅",lu:"芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮垆摅撸噜泸渌漉璐栌橹轳辂辘氇胪镥鸬鹭簏舻鲈",lv:"驴吕铝侣旅履屡缕虑氯律率滤绿捋闾榈膂稆褛",luan:"峦孪滦卵乱栾鸾銮",lue:"掠略锊",lun:"轮伦仑沦纶论囵",luo:"萝螺罗逻锣箩骡裸落洛骆络倮荦摞猡泺椤脶镙瘰雒",ma:"妈麻玛码蚂马骂嘛吗唛犸嬷杩麽",mai:"埋买麦卖迈脉劢荬咪霾",man:"瞒馒蛮满蔓曼慢漫谩墁幔缦熳镘颟螨鳗鞔",mang:"芒茫盲忙莽邙漭朦硭蟒",meng:"氓萌蒙檬盟锰猛梦孟勐甍瞢懵礞虻蜢蠓艋艨黾",miao:"猫苗描瞄藐秒渺庙妙喵邈缈缪杪淼眇鹋蜱",mao:"茅锚毛矛铆卯茂冒帽貌贸侔袤勖茆峁瑁昴牦耄旄懋瞀蛑蝥蟊髦",me:"么",mei:"玫枚梅酶霉煤没眉媒镁每美昧寐妹媚坶莓嵋猸浼湄楣镅鹛袂魅",men:"门闷们扪玟焖懑钔",mi:"眯醚靡糜迷谜弥米秘觅泌蜜密幂芈冖谧蘼嘧猕獯汨宓弭脒敉糸縻麋",mian:"棉眠绵冕免勉娩缅面沔湎腼眄",mie:"蔑灭咩蠛篾",min:"民抿皿敏悯闽苠岷闵泯珉",ming:"明螟鸣铭名命冥茗溟暝瞑酩",miu:"谬",mo:"摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谟茉蓦馍嫫镆秣瘼耱蟆貊貘",mou:"谋牟某厶哞婺眸鍪",mu:"拇牡亩姆母墓暮幕募慕木目睦牧穆仫苜呒沐毪钼",na:"拿哪呐钠那娜纳内捺肭镎衲箬",nai:"氖乃奶耐奈鼐艿萘柰",nan:"南男难囊喃囡楠腩蝻赧",nao:"挠脑恼闹孬垴猱瑙硇铙蛲",ne:"淖呢讷",nei:"馁",nen:"嫩能枘恁",ni:"妮霓倪泥尼拟你匿腻逆溺伲坭猊怩滠昵旎祢慝睨铌鲵",nian:"蔫拈年碾撵捻念廿辇黏鲇鲶",niang:"娘酿",niao:"鸟尿茑嬲脲袅",nie:"捏聂孽啮镊镍涅乜陧蘖嗫肀颞臬蹑",nin:"您柠",ning:"狞凝宁拧泞佞蓥咛甯聍",niu:"牛扭钮纽狃忸妞蚴",nong:"脓浓农侬",nu:"奴努怒呶帑弩胬孥驽",nv:"女恧钕衄",nuan:"暖",nuenue:"虐",nue:"疟谑",nuo:"挪懦糯诺傩搦喏锘",ou:"哦欧鸥殴藕呕偶沤怄瓯耦",pa:"啪趴爬帕怕琶葩筢",pai:"拍排牌徘湃派俳蒎",pan:"攀潘盘磐盼畔判叛爿泮袢襻蟠蹒",pang:"乓庞旁耪胖滂逄",pao:"抛咆刨炮袍跑泡匏狍庖脬疱",pei:"呸胚培裴赔陪配佩沛掊辔帔淠旆锫醅霈",pen:"喷盆湓",peng:"砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯堋嘭怦蟛",pi:"砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬丕陴邳郫圮鼙擗噼庀媲纰枇甓睥罴铍痦癖疋蚍貔",pian:"篇偏片骗谝骈犏胼褊翩蹁",piao:"飘漂瓢票剽嘌嫖缥殍瞟螵",pie:"撇瞥丿苤氕",pin:"拼频贫品聘拚姘嫔榀牝颦",ping:"乒坪苹萍平凭瓶评屏俜娉枰鲆",po:"坡泼颇婆破魄迫粕叵鄱溥珀钋钷皤笸",pou:"剖裒踣",pu:"扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑匍噗濮璞氆镤镨蹼",qi:"期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫亟亓圻芑萋葺嘁屺岐汔淇骐绮琪琦杞桤槭欹祺憩碛蛴蜞綦綮趿蹊鳍麒",qia:"掐恰洽葜",qian:"牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉佥阡芊芡荨掮岍悭慊骞搴褰缱椠肷愆钤虔箝",qiang:"枪呛腔羌墙蔷强抢嫱樯戗炝锖锵镪襁蜣羟跫跄",qiao:"橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍劁诮谯荞愀憔缲樵毳硗跷鞒",qie:"切茄且怯窃郄唼惬妾挈锲箧",qin:"钦侵亲秦琴勤芹擒禽寝沁芩蓁蕲揿吣嗪噙溱檎螓衾",qing:"青轻氢倾卿清擎晴氰情顷请庆倩苘圊檠磬蜻罄箐謦鲭黥",qiong:"琼穷邛茕穹筇銎",qiu:"秋丘邱球求囚酋泅俅氽巯艽犰湫逑遒楸赇鸠虬蚯蝤裘糗鳅鼽",qu:"趋区蛆曲躯屈驱渠取娶龋趣去诎劬蕖蘧岖衢阒璩觑氍祛磲癯蛐蠼麴瞿黢",quan:"圈颧权醛泉全痊拳犬券劝诠荃獾悛绻辁畎铨蜷筌鬈",que:"缺炔瘸却鹊榷确雀阙悫",qun:"裙群逡",ran:"然燃冉染苒髯",rang:"瓤壤攘嚷让禳穰",rao:"饶扰绕荛娆桡",ruo:"惹若弱",re:"热偌",ren:"壬仁人忍韧任认刃妊纫仞荏葚饪轫稔衽",reng:"扔仍",ri:"日",rong:"戎茸蓉荣融熔溶容绒冗嵘狨缛榕蝾",rou:"揉柔肉糅蹂鞣",ru:"茹蠕儒孺如辱乳汝入褥蓐薷嚅洳溽濡铷襦颥",ruan:"软阮朊",rui:"蕊瑞锐芮蕤睿蚋",run:"闰润",sa:"撒洒萨卅仨挲飒",sai:"腮鳃塞赛噻",san:"三叁伞散彡馓氵毵糁霰",sang:"桑嗓丧搡磉颡",sao:"搔骚扫嫂埽臊瘙鳋",se:"瑟色涩啬铩铯穑",sen:"森",seng:"僧",sha:"莎砂杀刹沙纱傻啥煞脎歃痧裟霎鲨",shai:"筛晒酾",shan:"珊苫杉山删煽衫闪陕擅赡膳善汕扇缮剡讪鄯埏芟潸姗骟膻钐疝蟮舢跚鳝",shang:"墒伤商赏晌上尚裳垧绱殇熵觞",shao:"梢捎稍烧芍勺韶少哨邵绍劭苕潲蛸笤筲艄",she:"奢赊蛇舌舍赦摄射慑涉社设厍佘猞畲麝",shen:"砷申呻伸身深娠绅神沈审婶甚肾慎渗诜谂吲哂渖椹矧蜃",sheng:"声生甥牲升绳省盛剩胜圣丞渑媵眚笙",shi:"师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试谥埘莳蓍弑唑饣轼耆贳炻礻铈铊螫舐筮豕鲥鲺",shou:"收手首守寿授售受瘦兽扌狩绶艏",shu:"蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱恕倏塾菽忄沭涑澍姝纾毹腧殳镯秫鹬",shua:"刷耍唰涮",shuai:"摔衰甩帅蟀",shuan:"栓拴闩",shuang:"霜双爽孀",shui:"谁水睡税",shun:"吮瞬顺舜恂",shuo:"说硕朔烁蒴搠嗍濯妁槊铄",si:"斯撕嘶思私司丝死肆寺嗣四伺似饲巳厮俟兕菥咝汜泗澌姒驷缌祀祠锶鸶耜蛳笥",song:"松耸怂颂送宋讼诵凇菘崧嵩忪悚淞竦",sou:"搜艘擞嗽叟嗖嗾馊溲飕瞍锼螋",su:"苏酥俗素速粟僳塑溯宿诉肃夙谡蔌嗉愫簌觫稣",suan:"酸蒜算",sui:"虽隋随绥髓碎岁穗遂隧祟蓑冫谇濉邃燧眭睢",sun:"孙损笋荪狲飧榫跣隼",suo:"梭唆缩琐索锁所唢嗦娑桫睃羧",ta:"塌他它她塔獭挞蹋踏闼溻遢榻沓",tai:"胎苔抬台泰酞太态汰邰薹肽炱钛跆鲐",tan:"坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭郯蕈昙钽锬覃",tang:"汤塘搪堂棠膛唐糖傥饧溏瑭铴镗耥螗螳羰醣",thang:"倘躺淌",theng:"趟烫",tao:"掏涛滔绦萄桃逃淘陶讨套挑鼗啕韬饕",te:"特",teng:"藤腾疼誊滕",ti:"梯剔踢锑提题蹄啼体替嚏惕涕剃屉荑悌逖绨缇鹈裼醍",tian:"天添填田甜恬舔腆掭忝阗殄畋钿蚺",tiao:"条迢眺跳佻祧铫窕龆鲦",tie:"贴铁帖萜餮",ting:"厅听烃汀廷停亭庭挺艇莛葶婷梃蜓霆",tong:"通桐酮瞳同铜彤童桶捅筒统痛佟僮仝茼嗵恸潼砼",tou:"偷投头透亠",tu:"凸秃突图徒途涂屠土吐兔堍荼菟钍酴",tuan:"湍团疃",tui:"推颓腿蜕褪退忒煺",tun:"吞屯臀饨暾豚窀",tuo:"拖托脱鸵陀驮驼椭妥拓唾乇佗坨庹沱柝砣箨舄跎鼍",wa:"挖哇蛙洼娃瓦袜佤娲腽",wai:"歪外",wan:"豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕剜芄苋菀纨绾琬脘畹蜿箢",wang:"汪王亡枉网往旺望忘妄罔尢惘辋魍",wei:"威巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫倭偎诿隈葳薇帏帷崴嵬猥猬闱沩洧涠逶娓玮韪軎炜煨熨痿艉鲔",wen:"瘟温蚊文闻纹吻稳紊问刎愠阌汶璺韫殁雯",weng:"嗡翁瓮蓊蕹",wo:"挝蜗涡窝我斡卧握沃莴幄渥杌肟龌",wu:"巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误兀仵阢邬圬芴庑怃忤浯寤迕妩骛牾焐鹉鹜蜈鋈鼯",xi:"昔熙析西硒矽晰嘻吸锡牺稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细僖兮隰郗茜葸蓰奚唏徙饩阋浠淅屣嬉玺樨曦觋欷熹禊禧钸皙穸蜥蟋舾羲粞翕醯鼷",xia:"瞎虾匣霞辖暇峡侠狭下厦夏吓掀葭嗄狎遐瑕硖瘕罅黠",xian:"锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线冼藓岘猃暹娴氙祆鹇痫蚬筅籼酰跹",xiang:"相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象芗葙饷庠骧缃蟓鲞飨",xiao:"萧硝霄削哮嚣销消宵淆晓小孝校肖啸笑效哓咻崤潇逍骁绡枭枵筱箫魈",xie:"楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑偕亵勰燮薤撷廨瀣邂绁缬榭榍歙躞",xin:"薪芯锌欣辛新忻心信衅囟馨莘歆铽鑫",xing:"星腥猩惺兴刑型形邢行醒幸杏性姓陉荇荥擤悻硎",xiong:"兄凶胸匈汹雄熊芎",xiu:"休修羞朽嗅锈秀袖绣莠岫馐庥鸺貅髹",xu:"墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续讴诩圩蓿怵洫溆顼栩煦砉盱胥糈醑",xuan:"轩喧宣悬旋玄选癣眩绚儇谖萱揎馔泫洵渲漩璇楦暄炫煊碹铉镟痃",xue:"靴薛学穴雪血噱泶鳕",xun:"勋熏循旬询寻驯巡殉汛训讯逊迅巽埙荀薰峋徇浔曛窨醺鲟",ya:"压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶伢揠吖岈迓娅琊桠氩砑睚痖",yan:"焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验厣靥赝俨偃兖讠谳郾鄢芫菸崦恹闫阏洇湮滟妍嫣琰晏胭腌焱罨筵酽魇餍鼹",yang:"殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾徉怏泱炀烊恙蛘鞅",yao:"邀腰妖瑶摇尧遥窑谣姚咬舀药要耀夭爻吆崾徭瀹幺珧杳曜肴鹞窈繇鳐",ye:"椰噎耶爷野冶也页掖业叶曳腋夜液谒邺揶馀晔烨铘",yi:"一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎刈劓佾诒圪圯埸懿苡薏弈奕挹弋呓咦咿噫峄嶷猗饴怿怡悒漪迤驿缢殪贻旖熠钇镒镱痍瘗癔翊衤蜴舣羿翳酏黟",yin:"茵荫因殷音阴姻吟银淫寅饮尹引隐印胤鄞堙茚喑狺夤氤铟瘾蚓霪龈",ying:"英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映嬴郢茔莺萦撄嘤膺滢潆瀛瑛璎楹鹦瘿颍罂",yo:"哟唷",yong:"拥佣臃痈庸雍踊蛹咏泳涌永恿勇用俑壅墉慵邕镛甬鳙饔",you:"幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼卣攸侑莸呦囿宥柚猷牖铕疣蝣鱿黝鼬",yu:"迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉浴寓裕预豫驭禺毓伛俣谀谕萸蓣揄喁圄圉嵛狳饫庾阈妪妤纡瑜昱觎腴欤於煜燠聿钰鹆瘐瘀窳蝓竽舁雩龉",yuan:"鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院塬沅媛瑗橼爰眢鸢螈鼋",yue:"曰约越跃钥岳粤月悦阅龠樾刖钺",yun:"耘云郧匀陨允运蕴酝晕韵孕郓芸狁恽纭殒昀氲",za:"匝砸杂拶咂",zai:"栽哉灾宰载再在咱崽甾",zan:"攒暂赞瓒昝簪糌趱錾",zang:"赃脏葬奘戕臧",zao:"遭糟凿藻枣早澡蚤躁噪造皂灶燥唣缫",ze:"责择则泽仄赜啧迮昃笮箦舴",zei:"贼",zen:"怎谮",zeng:"增憎曾赠缯甑罾锃",zha:"扎喳渣札轧铡闸眨栅榨咋乍炸诈揸吒咤哳怍砟痄蚱齄",zhai:"摘斋宅窄债寨砦",zhan:"瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽谵搌旃",zhang:"樟章彰漳张掌涨杖丈帐账仗胀瘴障仉鄣幛嶂獐嫜璋蟑",zhao:"招昭找沼赵照罩兆肇召爪诏棹钊笊",zhe:"遮折哲蛰辙者锗蔗这浙谪陬柘辄磔鹧褚蜇赭",zhen:"珍斟真甄砧臻贞针侦枕疹诊震振镇阵缜桢榛轸赈胗朕祯畛鸩",zheng:"蒸挣睁征狰争怔整拯正政帧症郑证诤峥钲铮筝",zhi:"芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒卮陟郅埴芷摭帙忮彘咫骘栉枳栀桎轵轾攴贽膣祉祗黹雉鸷痣蛭絷酯跖踬踯豸觯",zhong:"中盅忠钟衷终种肿重仲众冢锺螽舂舯踵",zhou:"舟周州洲诌粥轴肘帚咒皱宙昼骤啄着倜诹荮鬻纣胄碡籀舳酎鲷",zhu:"珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑住注祝驻伫侏邾苎茱洙渚潴驺杼槠橥炷铢疰瘃蚰竺箸翥躅麈",zhua:"抓",zhuai:"拽",zhuan:"专砖转撰赚篆抟啭颛",zhuang:"桩庄装妆撞壮状丬",zhui:"椎锥追赘坠缀萑骓缒",zhun:"谆准",zhuo:"捉拙卓桌琢茁酌灼浊倬诼廴蕞擢啜浞涿杓焯禚斫",zi:"兹咨资姿滋淄孜紫仔籽滓子自渍字谘嵫姊孳缁梓辎赀恣眦锱秭耔笫粢觜訾鲻髭",zong:"鬃棕踪宗综总纵腙粽",zou:"邹走奏揍鄹鲰",zu:"租足卒族祖诅阻组俎菹啐徂驵蹴",zuan:"钻纂攥缵",zui:"嘴醉最罪",zun:"尊遵撙樽鳟",zuo:"昨左佐柞做作坐座阝阼胙祚酢",cou:"薮楱辏腠",nang:"攮哝囔馕曩",o:"喔",dia:"嗲",chuai:"嘬膪踹",cen:"岑涔",diu:"铥",nou:"耨",fou:"缶",bia:"髟"},polyphone:(_polyphone={19969:"DZ",19975:"WM",19988:"QJ",20048:"YL",20056:"SC",20060:"NM",20094:"QG",20127:"QJ",20167:"QC",20193:"YG",20250:"KH",20256:"ZC",20282:"SC",20285:"QJG",20291:"TD",20314:"YD",20340:"NE",20375:"TD",20389:"YJ",20391:"CZ",20415:"PB",20446:"YS",20447:"SQ",20504:"TC",20608:"KG",20854:"QJ",20857:"ZC",20911:"PF"},_defineProperty(_polyphone,"20504","TC"),_defineProperty(_polyphone,"20608","KG"),_defineProperty(_polyphone,"20854","QJ"),_defineProperty(_polyphone,"20857","ZC"),_defineProperty(_polyphone,"20911","PF"),_defineProperty(_polyphone,"20985","AW"),_defineProperty(_polyphone,"21032","PB"),_defineProperty(_polyphone,"21048","XQ"),_defineProperty(_polyphone,"21049","SC"),_defineProperty(_polyphone,"21089","YS"),_defineProperty(_polyphone,"21119","JC"),_defineProperty(_polyphone,"21242","SB"),_defineProperty(_polyphone,"21273","SC"),_defineProperty(_polyphone,"21305","YP"),_defineProperty(_polyphone,"21306","QO"),_defineProperty(_polyphone,"21330","ZC"),_defineProperty(_polyphone,"21333","SDC"),_defineProperty(_polyphone,"21345","QK"),_defineProperty(_polyphone,"21378","CA"),_defineProperty(_polyphone,"21397","SC"),_defineProperty(_polyphone,"21414","XS"),_defineProperty(_polyphone,"21442","SC"),_defineProperty(_polyphone,"21477","JG"),_defineProperty(_polyphone,"21480","TD"),_defineProperty(_polyphone,"21484","ZS"),_defineProperty(_polyphone,"21494","YX"),_defineProperty(_polyphone,"21505","YX"),_defineProperty(_polyphone,"21512","HG"),_defineProperty(_polyphone,"21523","XH"),_defineProperty(_polyphone,"21537","PB"),_defineProperty(_polyphone,"21542","PF"),_defineProperty(_polyphone,"21549","KH"),_defineProperty(_polyphone,"21571","E"),_defineProperty(_polyphone,"21574","DA"),_defineProperty(_polyphone,"21588","TD"),_defineProperty(_polyphone,"21589","O"),_defineProperty(_polyphone,"21618","ZC"),_defineProperty(_polyphone,"21621","KHA"),_defineProperty(_polyphone,"21632","ZJ"),_defineProperty(_polyphone,"21654","KG"),_defineProperty(_polyphone,"21679","LKG"),_defineProperty(_polyphone,"21683","KH"),_defineProperty(_polyphone,"21710","A"),_defineProperty(_polyphone,"21719","YH"),_defineProperty(_polyphone,"21734","WOE"),_defineProperty(_polyphone,"21769","A"),_defineProperty(_polyphone,"21780","WN"),_defineProperty(_polyphone,"21804","XH"),_defineProperty(_polyphone,"21834","A"),_defineProperty(_polyphone,"21899","ZD"),_defineProperty(_polyphone,"21903","RN"),_defineProperty(_polyphone,"21908","WO"),_defineProperty(_polyphone,"21939","ZC"),_defineProperty(_polyphone,"21956","SA"),_defineProperty(_polyphone,"21964","YA"),_defineProperty(_polyphone,"21970","TD"),_defineProperty(_polyphone,"22003","A"),_defineProperty(_polyphone,"22031","JG"),_defineProperty(_polyphone,"22040","XS"),_defineProperty(_polyphone,"22060","ZC"),_defineProperty(_polyphone,"22066","ZC"),_defineProperty(_polyphone,"22079","MH"),_defineProperty(_polyphone,"22129","XJ"),_defineProperty(_polyphone,"22179","XA"),_defineProperty(_polyphone,"22237","NJ"),_defineProperty(_polyphone,"22244","TD"),_defineProperty(_polyphone,"22280","JQ"),_defineProperty(_polyphone,"22300","YH"),_defineProperty(_polyphone,"22313","XW"),_defineProperty(_polyphone,"22331","YQ"),_defineProperty(_polyphone,"22343","YJ"),_defineProperty(_polyphone,"22351","PH"),_defineProperty(_polyphone,"22395","DC"),_defineProperty(_polyphone,"22412","TD"),_defineProperty(_polyphone,"22484","PB"),_defineProperty(_polyphone,"22500","PB"),_defineProperty(_polyphone,"22534","ZD"),_defineProperty(_polyphone,"22549","DH"),_defineProperty(_polyphone,"22561","PB"),_defineProperty(_polyphone,"22612","TD"),_defineProperty(_polyphone,"22771","KQ"),_defineProperty(_polyphone,"22831","HB"),_defineProperty(_polyphone,"22841","JG"),_defineProperty(_polyphone,"22855","QJ"),_defineProperty(_polyphone,"22865","XQ"),_defineProperty(_polyphone,"23013","ML"),_defineProperty(_polyphone,"23081","WM"),_defineProperty(_polyphone,"23487","SX"),_defineProperty(_polyphone,"23558","QJ"),_defineProperty(_polyphone,"23561","YW"),_defineProperty(_polyphone,"23586","YW"),_defineProperty(_polyphone,"23614","YW"),_defineProperty(_polyphone,"23615","SN"),_defineProperty(_polyphone,"23631","PB"),_defineProperty(_polyphone,"23646","ZS"),_defineProperty(_polyphone,"23663","ZT"),_defineProperty(_polyphone,"23673","YG"),_defineProperty(_polyphone,"23762","TD"),_defineProperty(_polyphone,"23769","ZS"),_defineProperty(_polyphone,"23780","QJ"),_defineProperty(_polyphone,"23884","QK"),_defineProperty(_polyphone,"24055","XH"),_defineProperty(_polyphone,"24113","DC"),_defineProperty(_polyphone,"24162","ZC"),_defineProperty(_polyphone,"24191","GA"),_defineProperty(_polyphone,"24273","QJ"),_defineProperty(_polyphone,"24324","NL"),_defineProperty(_polyphone,"24377","TD"),_defineProperty(_polyphone,"24378","QJ"),_defineProperty(_polyphone,"24439","PF"),_defineProperty(_polyphone,"24554","ZS"),_defineProperty(_polyphone,"24683","TD"),_defineProperty(_polyphone,"24694","WE"),_defineProperty(_polyphone,"24733","LK"),_defineProperty(_polyphone,"24925","TN"),_defineProperty(_polyphone,"25094","ZG"),_defineProperty(_polyphone,"25100","XQ"),_defineProperty(_polyphone,"25103","XH"),_defineProperty(_polyphone,"25153","PB"),_defineProperty(_polyphone,"25170","PB"),_defineProperty(_polyphone,"25179","KG"),_defineProperty(_polyphone,"25203","PB"),_defineProperty(_polyphone,"25240","ZS"),_defineProperty(_polyphone,"25282","FB"),_defineProperty(_polyphone,"25303","NA"),_defineProperty(_polyphone,"25324","KG"),_defineProperty(_polyphone,"25341","ZY"),_defineProperty(_polyphone,"25373","WZ"),_defineProperty(_polyphone,"25375","XJ"),_defineProperty(_polyphone,"25384","A"),_defineProperty(_polyphone,"25457","A"),_defineProperty(_polyphone,"25528","SD"),_defineProperty(_polyphone,"25530","SC"),_defineProperty(_polyphone,"25552","TD"),_defineProperty(_polyphone,"25774","ZC"),_defineProperty(_polyphone,"25874","ZC"),_defineProperty(_polyphone,"26044","YW"),_defineProperty(_polyphone,"26080","WM"),_defineProperty(_polyphone,"26292","PB"),_defineProperty(_polyphone,"26333","PB"),_defineProperty(_polyphone,"26355","ZY"),_defineProperty(_polyphone,"26366","CZ"),_defineProperty(_polyphone,"26397","ZC"),_defineProperty(_polyphone,"26399","QJ"),_defineProperty(_polyphone,"26415","ZS"),_defineProperty(_polyphone,"26451","SB"),_defineProperty(_polyphone,"26526","ZC"),_defineProperty(_polyphone,"26552","JG"),_defineProperty(_polyphone,"26561","TD"),_defineProperty(_polyphone,"26588","JG"),_defineProperty(_polyphone,"26597","CZ"),_defineProperty(_polyphone,"26629","ZS"),_defineProperty(_polyphone,"26638","YL"),_defineProperty(_polyphone,"26646","XQ"),_defineProperty(_polyphone,"26653","KG"),_defineProperty(_polyphone,"26657","XJ"),_defineProperty(_polyphone,"26727","HG"),_defineProperty(_polyphone,"26894","ZC"),_defineProperty(_polyphone,"26937","ZS"),_defineProperty(_polyphone,"26946","ZC"),_defineProperty(_polyphone,"26999","KJ"),_defineProperty(_polyphone,"27099","KJ"),_defineProperty(_polyphone,"27449","YQ"),_defineProperty(_polyphone,"27481","XS"),_defineProperty(_polyphone,"27542","ZS"),_defineProperty(_polyphone,"27663","ZS"),_defineProperty(_polyphone,"27748","TS"),_defineProperty(_polyphone,"27784","SC"),_defineProperty(_polyphone,"27788","ZD"),_defineProperty(_polyphone,"27795","TD"),_defineProperty(_polyphone,"27812","O"),_defineProperty(_polyphone,"27850","PB"),_defineProperty(_polyphone,"27852","MB"),_defineProperty(_polyphone,"27895","SL"),_defineProperty(_polyphone,"27898","PL"),_defineProperty(_polyphone,"27973","QJ"),_defineProperty(_polyphone,"27981","KH"),_defineProperty(_polyphone,"27986","HX"),_defineProperty(_polyphone,"27994","XJ"),_defineProperty(_polyphone,"28044","YC"),_defineProperty(_polyphone,"28065","WG"),_defineProperty(_polyphone,"28177","SM"),_defineProperty(_polyphone,"28267","QJ"),_defineProperty(_polyphone,"28291","KH"),_defineProperty(_polyphone,"28337","ZQ"),_defineProperty(_polyphone,"28463","TL"),_defineProperty(_polyphone,"28548","DC"),_defineProperty(_polyphone,"28601","TD"),_defineProperty(_polyphone,"28689","PB"),_defineProperty(_polyphone,"28805","JG"),_defineProperty(_polyphone,"28820","QG"),_defineProperty(_polyphone,"28846","PB"),_defineProperty(_polyphone,"28952","TD"),_defineProperty(_polyphone,"28975","ZC"),_defineProperty(_polyphone,"29100","A"),_defineProperty(_polyphone,"29325","QJ"),_defineProperty(_polyphone,"29575","SL"),_defineProperty(_polyphone,"29602","FB"),_defineProperty(_polyphone,"30010","TD"),_defineProperty(_polyphone,"30044","CX"),_defineProperty(_polyphone,"30058","PF"),_defineProperty(_polyphone,"30091","YSP"),_defineProperty(_polyphone,"30111","YN"),_defineProperty(_polyphone,"30229","XJ"),_defineProperty(_polyphone,"30427","SC"),_defineProperty(_polyphone,"30465","SX"),_defineProperty(_polyphone,"30631","YQ"),_defineProperty(_polyphone,"30655","QJ"),_defineProperty(_polyphone,"30684","QJG"),_defineProperty(_polyphone,"30707","SD"),_defineProperty(_polyphone,"30729","XH"),_defineProperty(_polyphone,"30796","LG"),_defineProperty(_polyphone,"30917","PB"),_defineProperty(_polyphone,"31074","NM"),_defineProperty(_polyphone,"31085","JZ"),_defineProperty(_polyphone,"31109","SC"),_defineProperty(_polyphone,"31181","ZC"),_defineProperty(_polyphone,"31192","MLB"),_defineProperty(_polyphone,"31293","JQ"),_defineProperty(_polyphone,"31400","YX"),_defineProperty(_polyphone,"31584","YJ"),_defineProperty(_polyphone,"31896","ZN"),_defineProperty(_polyphone,"31909","ZY"),_defineProperty(_polyphone,"31995","XJ"),_defineProperty(_polyphone,"32321","PF"),_defineProperty(_polyphone,"32327","ZY"),_defineProperty(_polyphone,"32418","HG"),_defineProperty(_polyphone,"32420","XQ"),_defineProperty(_polyphone,"32421","HG"),_defineProperty(_polyphone,"32438","LG"),_defineProperty(_polyphone,"32473","GJ"),_defineProperty(_polyphone,"32488","TD"),_defineProperty(_polyphone,"32521","QJ"),_defineProperty(_polyphone,"32527","PB"),_defineProperty(_polyphone,"32562","ZSQ"),_defineProperty(_polyphone,"32564","JZ"),_defineProperty(_polyphone,"32735","ZD"),_defineProperty(_polyphone,"32793","PB"),_defineProperty(_polyphone,"33071","PF"),_defineProperty(_polyphone,"33098","XL"),_defineProperty(_polyphone,"33100","YA"),_defineProperty(_polyphone,"33152","PB"),_defineProperty(_polyphone,"33261","CX"),_defineProperty(_polyphone,"33324","BP"),_defineProperty(_polyphone,"33333","TD"),_defineProperty(_polyphone,"33406","YA"),_defineProperty(_polyphone,"33426","WM"),_defineProperty(_polyphone,"33432","PB"),_defineProperty(_polyphone,"33445","JG"),_defineProperty(_polyphone,"33486","ZN"),_defineProperty(_polyphone,"33493","TS"),_defineProperty(_polyphone,"33507","QJ"),_defineProperty(_polyphone,"33540","QJ"),_defineProperty(_polyphone,"33544","ZC"),_defineProperty(_polyphone,"33564","XQ"),_defineProperty(_polyphone,"33617","YT"),_defineProperty(_polyphone,"33632","QJ"),_defineProperty(_polyphone,"33636","XH"),_defineProperty(_polyphone,"33637","YX"),_defineProperty(_polyphone,"33694","WG"),_defineProperty(_polyphone,"33705","PF"),_defineProperty(_polyphone,"33728","YW"),_defineProperty(_polyphone,"33882","SR"),_defineProperty(_polyphone,"34067","WM"),_defineProperty(_polyphone,"34074","YW"),_defineProperty(_polyphone,"34121","QJ"),_defineProperty(_polyphone,"34255","ZC"),_defineProperty(_polyphone,"34259","XL"),_defineProperty(_polyphone,"34425","JH"),_defineProperty(_polyphone,"34430","XH"),_defineProperty(_polyphone,"34485","KH"),_defineProperty(_polyphone,"34503","YS"),_defineProperty(_polyphone,"34532","HG"),_defineProperty(_polyphone,"34552","XS"),_defineProperty(_polyphone,"34558","YE"),_defineProperty(_polyphone,"34593","ZL"),_defineProperty(_polyphone,"34660","YQ"),_defineProperty(_polyphone,"34892","XH"),_defineProperty(_polyphone,"34928","SC"),_defineProperty(_polyphone,"34999","QJ"),_defineProperty(_polyphone,"35048","PB"),_defineProperty(_polyphone,"35059","SC"),_defineProperty(_polyphone,"35098","ZC"),_defineProperty(_polyphone,"35203","TQ"),_defineProperty(_polyphone,"35265","JX"),_defineProperty(_polyphone,"35299","JX"),_defineProperty(_polyphone,"35782","SZ"),_defineProperty(_polyphone,"35828","YS"),_defineProperty(_polyphone,"35830","E"),_defineProperty(_polyphone,"35843","TD"),_defineProperty(_polyphone,"35895","YG"),_defineProperty(_polyphone,"35977","MH"),_defineProperty(_polyphone,"36158","JG"),_defineProperty(_polyphone,"36228","QJ"),_defineProperty(_polyphone,"36426","XQ"),_defineProperty(_polyphone,"36466","DC"),_defineProperty(_polyphone,"36710","JC"),_defineProperty(_polyphone,"36711","ZYG"),_defineProperty(_polyphone,"36767","PB"),_defineProperty(_polyphone,"36866","SK"),_defineProperty(_polyphone,"36951","YW"),_defineProperty(_polyphone,"37034","YX"),_defineProperty(_polyphone,"37063","XH"),_defineProperty(_polyphone,"37218","ZC"),_defineProperty(_polyphone,"37325","ZC"),_defineProperty(_polyphone,"38063","PB"),_defineProperty(_polyphone,"38079","TD"),_defineProperty(_polyphone,"38085","QY"),_defineProperty(_polyphone,"38107","DC"),_defineProperty(_polyphone,"38116","TD"),_defineProperty(_polyphone,"38123","YD"),_defineProperty(_polyphone,"38224","HG"),_defineProperty(_polyphone,"38241","XTC"),_defineProperty(_polyphone,"38271","ZC"),_defineProperty(_polyphone,"38415","YE"),_defineProperty(_polyphone,"38426","KH"),_defineProperty(_polyphone,"38461","YD"),_defineProperty(_polyphone,"38463","AE"),_defineProperty(_polyphone,"38466","PB"),_defineProperty(_polyphone,"38477","XJ"),_defineProperty(_polyphone,"38518","YT"),_defineProperty(_polyphone,"38551","WK"),_defineProperty(_polyphone,"38585","ZC"),_defineProperty(_polyphone,"38704","XS"),_defineProperty(_polyphone,"38739","LJ"),_defineProperty(_polyphone,"38761","GJ"),_defineProperty(_polyphone,"38808","SQ"),_defineProperty(_polyphone,"39048","JG"),_defineProperty(_polyphone,"39049","XJ"),_defineProperty(_polyphone,"39052","HG"),_defineProperty(_polyphone,"39076","CZ"),_defineProperty(_polyphone,"39271","XT"),_defineProperty(_polyphone,"39534","TD"),_defineProperty(_polyphone,"39552","TD"),_defineProperty(_polyphone,"39584","PB"),_defineProperty(_polyphone,"39647","SB"),_defineProperty(_polyphone,"39730","LG"),_defineProperty(_polyphone,"39748","TPB"),_defineProperty(_polyphone,"40109","ZQ"),_defineProperty(_polyphone,"40479","ND"),_defineProperty(_polyphone,"40516","HG"),_defineProperty(_polyphone,"40536","HG"),_defineProperty(_polyphone,"40583","QJ"),_defineProperty(_polyphone,"40765","YQ"),_defineProperty(_polyphone,"40784","QJ"),_defineProperty(_polyphone,"40840","YK"),_defineProperty(_polyphone,"40863","QJG"),_polyphone),getPinYin:function Y(Z,e){for(var L in this.fullDict){if(-1!==this.fullDict[L].indexOf(Z)){return e?this.capitalize(L):L;break}}return false},capitalize:function Y(Z){if(Z.length>0){var e=Z.substr(0,1).toUpperCase();var L=Z.substr(1,Z.length);return e+L}},getChar:function Y(Z){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var L=Z.charCodeAt(0);if(L>40869||L<19968)return Z;if(!e)return this.charsDict.charAt(L-19968);return this.polyphone[L]?this.polyphone[L]:this.charsDict.charAt(L-19968)},getResult:function Y(Z){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;if(!e)return Z.join("");var L=[""];for(var X=0,J=Z.length;X<J;X++){var S=Z[X],o=S.length;if(o==1){for(var C=0;C<L.length;C++){L[k]+=S}}else{var Q=L.slice(0);L=[];for(var P=0;P<o;P++){var p=Q.slice(0);for(var H=0;H<p.length;H++){p[H]+=S.charAt(P)}L=L.concat(p)}}}return L}};var ZhToPinYin=function(){function Z(){var Y=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;_classCallCheck(this,Z);this.titleCase=Y}_createClass(Z,[{key:"getPinYin",value:function Y(Z){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var L="",X=void 0;var J=new RegExp("[a-zA-Z0-9- ]");for(var S=0,o=Z.length;S<o;S++){var C=Z.substr(S,1),Q=C.charCodeAt(0);if(Q>40869||Q<19968){L+=e?" "+C:C}else{X=_private.getPinYin(C,this.titleCase);if(X!==false){L+=e?" "+X:X}}}return L}},{key:"getInitials",value:function Y(Z){var e=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;if(typeof Z!=="string")throw new Error(-1,"函数getInitials需要字符串类型参数!");var L=[];for(var X=0,J=Z.length;X<J;X++){var S=Z.charAt(X);L.push(_private.getChar(S,e))}return _private.getResult(L,e)}},{key:"surnamePolyphone",value:function Y(Z){var e=["区","黑","盖","查","曾","缪","单","乐","员","仇","尉","万","晟","重","秘","解","翟"];var L=["Ou","He","Ge","Zha","Zeng","Miao","Shan","Yue","Yun","Qiu","Yu","Mo","Cheng","Chong","Bi","Xie","Zhai"];var X=e.indexOf(Z);if(X!=-1){var J=L[X];return this.titleCase?J:J.toLowerCase()}return null}}]);return Z}();export default ZhToPinYin;
\ No newline at end of file
const isWeex = typeof WXEnvironment !== 'undefined';
const isWeexIOS = isWeex && /ios/i.test(WXEnvironment.platform);
const isWeexAndroid = isWeex && !isWeexIOS;
import GLmethod from '../context-webgl/GLmethod';
const GCanvasModule =
(typeof weex !== 'undefined' && weex.requireModule) ? (weex.requireModule('gcanvas')) :
(typeof __weex_require__ !== 'undefined') ? (__weex_require__('@weex-module/gcanvas')) : {};
let isDebugging = false;
let isComboDisabled = false;
const logCommand = (function () {
const methodQuery = [];
Object.keys(GLmethod).forEach(key => {
methodQuery[GLmethod[key]] = key;
})
const queryMethod = (id) => {
return methodQuery[parseInt(id)] || 'NotFoundMethod';
}
const logCommand = (id, cmds) => {
const mId = cmds.split(',')[0];
const mName = queryMethod(mId);
console.log(`=== callNative - componentId:${id}; method: ${mName}; cmds: ${cmds}`);
}
return logCommand;
})();
function joinArray(arr, sep) {
let res = '';
for (let i = 0; i < arr.length; i++) {
if (i !== 0) {
res += sep;
}
res += arr[i];
}
return res;
}
const commandsCache = {}
const GBridge = {
callEnable: (ref, configArray) => {
commandsCache[ref] = [];
return GCanvasModule.enable({
componentId: ref,
config: configArray
});
},
callEnableDebug: () => {
isDebugging = true;
},
callEnableDisableCombo: () => {
isComboDisabled = true;
},
callSetContextType: function (componentId, context_type) {
GCanvasModule.setContextType(context_type, componentId);
},
callReset: function(id){
GCanvasModule.resetComponent && canvasModule.resetComponent(componentId);
},
render: isWeexIOS ? function (componentId) {
return GCanvasModule.extendCallNative({
contextId: componentId,
type: 0x60000001
});
} : function (componentId) {
return callGCanvasLinkNative(componentId, 0x60000001, 'render');
},
render2d: isWeexIOS ? function (componentId, commands, callback) {
if (isDebugging) {
console.log('>>> >>> render2d ===');
console.log('>>> commands: ' + commands);
}
GCanvasModule.render([commands, callback?true:false], componentId, callback);
} : function (componentId, commands,callback) {
if (isDebugging) {
console.log('>>> >>> render2d ===');
console.log('>>> commands: ' + commands);
}
callGCanvasLinkNative(componentId, 0x20000001, commands);
if(callback){
callback();
}
},
callExtendCallNative: isWeexIOS ? function (componentId, cmdArgs) {
throw 'should not be here anymore ' + cmdArgs;
} : function (componentId, cmdArgs) {
throw 'should not be here anymore ' + cmdArgs;
},
flushNative: isWeexIOS ? function (componentId) {
const cmdArgs = joinArray(commandsCache[componentId], ';');
commandsCache[componentId] = [];
if (isDebugging) {
console.log('>>> >>> flush native ===');
console.log('>>> commands: ' + cmdArgs);
}
const result = GCanvasModule.extendCallNative({
"contextId": componentId,
"type": 0x60000000,
"args": cmdArgs
});
const res = result && result.result;
if (isDebugging) {
console.log('>>> result: ' + res);
}
return res;
} : function (componentId) {
const cmdArgs = joinArray(commandsCache[componentId], ';');
commandsCache[componentId] = [];
if (isDebugging) {
console.log('>>> >>> flush native ===');
console.log('>>> commands: ' + cmdArgs);
}
const result = callGCanvasLinkNative(componentId, 0x60000000, cmdArgs);
if (isDebugging) {
console.log('>>> result: ' + result);
}
return result;
},
callNative: function (componentId, cmdArgs, cache) {
if (isDebugging) {
logCommand(componentId, cmdArgs);
}
commandsCache[componentId].push(cmdArgs);
if (!cache || isComboDisabled) {
return GBridge.flushNative(componentId);
} else {
return undefined;
}
},
texImage2D(componentId, ...args) {
if (isWeexIOS) {
if (args.length === 6) {
const [target, level, internalformat, format, type, image] = args;
GBridge.callNative(
componentId,
GLmethod.texImage2D + ',' + 6 + ',' + target + ',' + level + ',' + internalformat + ',' + format + ',' + type + ',' + image.src
)
} else if (args.length === 9) {
const [target, level, internalformat, width, height, border, format, type, image] = args;
GBridge.callNative(
componentId,
GLmethod.texImage2D + ',' + 9 + ',' + target + ',' + level + ',' + internalformat + ',' + width + ',' + height + ',' + border + ',' +
+ format + ',' + type + ',' + (image ? image.src : 0)
)
}
} else if (isWeexAndroid) {
if (args.length === 6) {
const [target, level, internalformat, format, type, image] = args;
GCanvasModule.texImage2D(componentId, target, level, internalformat, format, type, image.src);
} else if (args.length === 9) {
const [target, level, internalformat, width, height, border, format, type, image] = args;
GCanvasModule.texImage2D(componentId, target, level, internalformat, width, height, border, format, type, (image ? image.src : 0));
}
}
},
texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image) {
if (isWeexIOS) {
if (arguments.length === 8) {
GBridge.callNative(
componentId,
GLmethod.texSubImage2D + ',' + 6 + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset, + ',' + format + ',' + type + ',' + image.src
)
}
} else if (isWeexAndroid) {
GCanvasModule.texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image.src);
}
},
bindImageTexture(componentId, src, imageId) {
GCanvasModule.bindImageTexture([src, imageId], componentId);
},
perloadImage([url, id], callback) {
GCanvasModule.preLoadImage([url, id], function (image) {
image.url = url;
image.id = id;
callback(image);
});
},
measureText(text, fontStyle, componentId) {
return GCanvasModule.measureText([text, fontStyle], componentId);
},
getImageData (componentId, x, y, w, h, callback) {
GCanvasModule.getImageData([x, y,w,h],componentId,callback);
},
putImageData (componentId, data, x, y, w, h, callback) {
GCanvasModule.putImageData([x, y,w,h,data],componentId,callback);
},
toTempFilePath(componentId, x, y, width, height, destWidth, destHeight, fileType, quality, callback){
GCanvasModule.toTempFilePath([x, y, width,height, destWidth, destHeight, fileType, quality], componentId, callback);
}
}
export default GBridge;
\ No newline at end of file
class FillStyleLinearGradient {
constructor(x0, y0, x1, y1) {
this._start_pos = { _x: x0, _y: y0 };
this._end_pos = { _x: x1, _y: y1 };
this._stop_count = 0;
this._stops = [0, 0, 0, 0, 0];
}
addColorStop = function (pos, color) {
if (this._stop_count < 5 && 0.0 <= pos && pos <= 1.0) {
this._stops[this._stop_count] = { _pos: pos, _color: color };
this._stop_count++;
}
}
}
export default FillStyleLinearGradient;
\ No newline at end of file
class FillStylePattern {
constructor(img, pattern) {
this._style = pattern;
this._img = img;
}
}
export default FillStylePattern;
\ No newline at end of file
class FillStyleRadialGradient {
constructor(x0, y0, r0, x1, y1, r1) {
this._start_pos = { _x: x0, _y: y0, _r: r0 };
this._end_pos = { _x: x1, _y: y1, _r: r1 };
this._stop_count = 0;
this._stops = [0, 0, 0, 0, 0];
}
addColorStop(pos, color) {
if (this._stop_count < 5 && 0.0 <= pos && pos <= 1.0) {
this._stops[this._stop_count] = { _pos: pos, _color: color };
this._stop_count++;
}
}
}
export default FillStyleRadialGradient;
\ No newline at end of file
import FillStylePattern from './FillStylePattern';
import FillStyleLinearGradient from './FillStyleLinearGradient';
import FillStyleRadialGradient from './FillStyleRadialGradient';
import GImage from '../env/image.js';
import {
ArrayBufferToBase64,
Base64ToUint8ClampedArray
} from '../env/tool.js';
export default class CanvasRenderingContext2D {
_drawCommands = '';
_globalAlpha = 1.0;
_fillStyle = 'rgb(0,0,0)';
_strokeStyle = 'rgb(0,0,0)';
_lineWidth = 1;
_lineCap = 'butt';
_lineJoin = 'miter';
_miterLimit = 10;
_globalCompositeOperation = 'source-over';
_textAlign = 'start';
_textBaseline = 'alphabetic';
_font = '10px sans-serif';
_savedGlobalAlpha = [];
timer = null;
componentId = null;
_notCommitDrawImageCache = [];
_needRedrawImageCache = [];
_redrawCommands = '';
_autoSaveContext = true;
// _imageMap = new GHashMap();
// _textureMap = new GHashMap();
constructor() {
this.className = 'CanvasRenderingContext2D';
//this.save()
}
setFillStyle(value) {
this.fillStyle = value;
}
set fillStyle(value) {
this._fillStyle = value;
if (typeof(value) == 'string') {
this._drawCommands = this._drawCommands.concat("F" + value + ";");
} else if (value instanceof FillStylePattern) {
const image = value._img;
if (!image.complete) {
image.onload = () => {
var index = this._needRedrawImageCache.indexOf(image);
if (index > -1) {
this._needRedrawImageCache.splice(index, 1);
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
this._redrawflush(true);
}
}
this._notCommitDrawImageCache.push(image);
} else {
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
}
//CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
this._drawCommands = this._drawCommands.concat("G" + image._id + "," + value._style + ";");
} else if (value instanceof FillStyleLinearGradient) {
var command = "D" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," +
value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," +
value._stop_count;
for (var i = 0; i < value._stop_count; ++i) {
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
}
this._drawCommands = this._drawCommands.concat(command + ";");
} else if (value instanceof FillStyleRadialGradient) {
var command = "H" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + value._start_pos._r
.toFixed(2) + "," +
value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," + value._end_pos._r.toFixed(2) + "," +
value._stop_count;
for (var i = 0; i < value._stop_count; ++i) {
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
}
this._drawCommands = this._drawCommands.concat(command + ";");
}
}
get fillStyle() {
return this._fillStyle;
}
get globalAlpha() {
return this._globalAlpha;
}
setGlobalAlpha(value) {
this.globalAlpha = value;
}
set globalAlpha(value) {
this._globalAlpha = value;
this._drawCommands = this._drawCommands.concat("a" + value.toFixed(2) + ";");
}
get strokeStyle() {
return this._strokeStyle;
}
setStrokeStyle(value) {
this.strokeStyle = value;
}
set strokeStyle(value) {
this._strokeStyle = value;
if (typeof(value) == 'string') {
this._drawCommands = this._drawCommands.concat("S" + value + ";");
} else if (value instanceof FillStylePattern) {
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
this._drawCommands = this._drawCommands.concat("G" + image._id + "," + value._style + ";");
} else if (value instanceof FillStyleLinearGradient) {
var command = "D" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," +
value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," +
value._stop_count;
for (var i = 0; i < value._stop_count; ++i) {
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
}
this._drawCommands = this._drawCommands.concat(command + ";");
} else if (value instanceof FillStyleRadialGradient) {
var command = "H" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + value._start_pos._r
.toFixed(2) + "," +
value._end_pos._x.toFixed(2) + "," + value._end_pos._y + ",".toFixed(2) + value._end_pos._r.toFixed(2) + "," +
value._stop_count;
for (var i = 0; i < value._stop_count; ++i) {
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
}
this._drawCommands = this._drawCommands.concat(command + ";");
}
}
get lineWidth() {
return this._lineWidth;
}
setLineWidth(value) {
this.lineWidth = value;
}
set lineWidth(value) {
this._lineWidth = value;
this._drawCommands = this._drawCommands.concat("W" + value + ";");
}
get lineCap() {
return this._lineCap;
}
setLineCap(value) {
this.lineCap = value;
}
set lineCap(value) {
this._lineCap = value;
this._drawCommands = this._drawCommands.concat("C" + value + ";");
}
get lineJoin() {
return this._lineJoin;
}
setLineJoin(value) {
this.lineJoin = value
}
set lineJoin(value) {
this._lineJoin = value;
this._drawCommands = this._drawCommands.concat("J" + value + ";");
}
get miterLimit() {
return this._miterLimit;
}
setMiterLimit(value) {
this.miterLimit = value
}
set miterLimit(value) {
this._miterLimit = value;
this._drawCommands = this._drawCommands.concat("M" + value + ";");
}
get globalCompositeOperation() {
return this._globalCompositeOperation;
}
set globalCompositeOperation(value) {
this._globalCompositeOperation = value;
let mode = 0;
switch (value) {
case "source-over":
mode = 0;
break;
case "source-atop":
mode = 5;
break;
case "source-in":
mode = 0;
break;
case "source-out":
mode = 2;
break;
case "destination-over":
mode = 4;
break;
case "destination-atop":
mode = 4;
break;
case "destination-in":
mode = 4;
break;
case "destination-out":
mode = 3;
break;
case "lighter":
mode = 1;
break;
case "copy":
mode = 2;
break;
case "xor":
mode = 6;
break;
default:
mode = 0;
}
this._drawCommands = this._drawCommands.concat("B" + mode + ";");
}
get textAlign() {
return this._textAlign;
}
setTextAlign(value) {
this.textAlign = value
}
set textAlign(value) {
this._textAlign = value;
let Align = 0;
switch (value) {
case "start":
Align = 0;
break;
case "end":
Align = 1;
break;
case "left":
Align = 2;
break;
case "center":
Align = 3;
break;
case "right":
Align = 4;
break;
default:
Align = 0;
}
this._drawCommands = this._drawCommands.concat("A" + Align + ";");
}
get textBaseline() {
return this._textBaseline;
}
setTextBaseline(value) {
this.textBaseline = value
}
set textBaseline(value) {
this._textBaseline = value;
let baseline = 0;
switch (value) {
case "alphabetic":
baseline = 0;
break;
case "middle":
baseline = 1;
break;
case "top":
baseline = 2;
break;
case "hanging":
baseline = 3;
break;
case "bottom":
baseline = 4;
break;
case "ideographic":
baseline = 5;
break;
default:
baseline = 0;
break;
}
this._drawCommands = this._drawCommands.concat("E" + baseline + ";");
}
get font() {
return this._font;
}
setFontSize(size) {
var str = this._font;
var strs = str.trim().split(/\s+/);
for (var i = 0; i < strs.length; i++) {
var values = ["normal", "italic", "oblique", "normal", "small-caps", "normal", "bold",
"bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900",
"normal", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed",
"semi-expanded", "expanded", "extra-expanded", "ultra-expanded"
];
if (-1 == values.indexOf(strs[i].trim())) {
if (typeof size === 'string') {
strs[i] = size;
} else if (typeof size === 'number') {
strs[i] = String(size) + 'px';
}
break;
}
}
this.font = strs.join(" ");
}
set font(value) {
this._font = value;
this._drawCommands = this._drawCommands.concat("j" + value + ";");
}
setTransform(a, b, c, d, tx, ty) {
this._drawCommands = this._drawCommands.concat("t" +
(a === 1 ? "1" : a.toFixed(2)) + "," +
(b === 0 ? "0" : b.toFixed(2)) + "," +
(c === 0 ? "0" : c.toFixed(2)) + "," +
(d === 1 ? "1" : d.toFixed(2)) + "," + tx.toFixed(2) + "," + ty.toFixed(2) + ";");
}
transform(a, b, c, d, tx, ty) {
this._drawCommands = this._drawCommands.concat("f" +
(a === 1 ? "1" : a.toFixed(2)) + "," +
(b === 0 ? "0" : b.toFixed(2)) + "," +
(c === 0 ? "0" : c.toFixed(2)) + "," +
(d === 1 ? "1" : d.toFixed(2)) + "," + tx + "," + ty + ";");
}
resetTransform() {
this._drawCommands = this._drawCommands.concat("m;");
}
scale(a, d) {
this._drawCommands = this._drawCommands.concat("k" + a.toFixed(2) + "," +
d.toFixed(2) + ";");
}
rotate(angle) {
this._drawCommands = this._drawCommands
.concat("r" + angle.toFixed(6) + ";");
}
translate(tx, ty) {
this._drawCommands = this._drawCommands.concat("l" + tx.toFixed(2) + "," + ty.toFixed(2) + ";");
}
save() {
this._savedGlobalAlpha.push(this._globalAlpha);
this._drawCommands = this._drawCommands.concat("v;");
}
restore() {
this._drawCommands = this._drawCommands.concat("e;");
this._globalAlpha = this._savedGlobalAlpha.pop();
}
createPattern(img, pattern) {
if (typeof img === 'string') {
var imgObj = new GImage();
imgObj.src = img;
img = imgObj;
}
return new FillStylePattern(img, pattern);
}
createLinearGradient(x0, y0, x1, y1) {
return new FillStyleLinearGradient(x0, y0, x1, y1);
}
createRadialGradient = function(x0, y0, r0, x1, y1, r1) {
return new FillStyleRadialGradient(x0, y0, r0, x1, y1, r1);
};
createCircularGradient = function(x0, y0, r0) {
return new FillStyleRadialGradient(x0, y0, 0, x0, y0, r0);
};
strokeRect(x, y, w, h) {
this._drawCommands = this._drawCommands.concat("s" + x + "," + y + "," + w + "," + h + ";");
}
clearRect(x, y, w, h) {
this._drawCommands = this._drawCommands.concat("c" + x + "," + y + "," + w +
"," + h + ";");
}
clip() {
this._drawCommands = this._drawCommands.concat("p;");
}
resetClip() {
this._drawCommands = this._drawCommands.concat("q;");
}
closePath() {
this._drawCommands = this._drawCommands.concat("o;");
}
moveTo(x, y) {
this._drawCommands = this._drawCommands.concat("g" + x.toFixed(2) + "," + y.toFixed(2) + ";");
}
lineTo(x, y) {
this._drawCommands = this._drawCommands.concat("i" + x.toFixed(2) + "," + y.toFixed(2) + ";");
}
quadraticCurveTo = function(cpx, cpy, x, y) {
this._drawCommands = this._drawCommands.concat("u" + cpx + "," + cpy + "," + x + "," + y + ";");
}
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, ) {
this._drawCommands = this._drawCommands.concat(
"z" + cp1x.toFixed(2) + "," + cp1y.toFixed(2) + "," + cp2x.toFixed(2) + "," + cp2y.toFixed(2) + "," +
x.toFixed(2) + "," + y.toFixed(2) + ";");
}
arcTo(x1, y1, x2, y2, radius) {
this._drawCommands = this._drawCommands.concat("h" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + radius + ";");
}
beginPath() {
this._drawCommands = this._drawCommands.concat("b;");
}
fillRect(x, y, w, h) {
this._drawCommands = this._drawCommands.concat("n" + x + "," + y + "," + w +
"," + h + ";");
}
rect(x, y, w, h) {
this._drawCommands = this._drawCommands.concat("w" + x + "," + y + "," + w + "," + h + ";");
}
fill() {
this._drawCommands = this._drawCommands.concat("L;");
}
stroke(path) {
this._drawCommands = this._drawCommands.concat("x;");
}
arc(x, y, radius, startAngle, endAngle, anticlockwise) {
let ianticlockwise = 0;
if (anticlockwise) {
ianticlockwise = 1;
}
this._drawCommands = this._drawCommands.concat(
"y" + x.toFixed(2) + "," + y.toFixed(2) + "," +
radius.toFixed(2) + "," + startAngle + "," + endAngle + "," + ianticlockwise +
";"
);
}
fillText(text, x, y) {
let tmptext = text.replace(/!/g, "!!");
tmptext = tmptext.replace(/,/g, "!,");
tmptext = tmptext.replace(/;/g, "!;");
this._drawCommands = this._drawCommands.concat("T" + tmptext + "," + x + "," + y + ",0.0;");
}
strokeText = function(text, x, y) {
let tmptext = text.replace(/!/g, "!!");
tmptext = tmptext.replace(/,/g, "!,");
tmptext = tmptext.replace(/;/g, "!;");
this._drawCommands = this._drawCommands.concat("U" + tmptext + "," + x + "," + y + ",0.0;");
}
measureText(text) {
return CanvasRenderingContext2D.GBridge.measureText(text, this.font, this.componentId);
}
isPointInPath = function(x, y) {
throw new Error('GCanvas not supported yet');
}
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {
if (typeof image === 'string') {
var imgObj = new GImage();
imgObj.src = image;
image = imgObj;
}
if (image instanceof GImage) {
if (!image.complete) {
imgObj.onload = () => {
var index = this._needRedrawImageCache.indexOf(image);
if (index > -1) {
this._needRedrawImageCache.splice(index, 1);
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
this._redrawflush(true);
}
}
this._notCommitDrawImageCache.push(image);
} else {
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
}
var srcArgs = [image, sx, sy, sw, sh, dx, dy, dw, dh];
var args = [];
for (var arg in srcArgs) {
if (typeof(srcArgs[arg]) != 'undefined') {
args.push(srcArgs[arg]);
}
}
this.__drawImage.apply(this, args);
//this.__drawImage(image,sx, sy, sw, sh, dx, dy, dw, dh);
}
}
__drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {
const numArgs = arguments.length;
function drawImageCommands() {
if (numArgs === 3) {
const x = parseFloat(sx) || 0.0;
const y = parseFloat(sy) || 0.0;
return ("d" + image._id + ",0,0," +
image.width + "," + image.height + "," +
x + "," + y + "," + image.width + "," + image.height + ";");
} else if (numArgs === 5) {
const x = parseFloat(sx) || 0.0;
const y = parseFloat(sy) || 0.0;
const width = parseInt(sw) || image.width;
const height = parseInt(sh) || image.height;
return ("d" + image._id + ",0,0," +
image.width + "," + image.height + "," +
x + "," + y + "," + width + "," + height + ";");
} else if (numArgs === 9) {
sx = parseFloat(sx) || 0.0;
sy = parseFloat(sy) || 0.0;
sw = parseInt(sw) || image.width;
sh = parseInt(sh) || image.height;
dx = parseFloat(dx) || 0.0;
dy = parseFloat(dy) || 0.0;
dw = parseInt(dw) || image.width;
dh = parseInt(dh) || image.height;
return ("d" + image._id + "," +
sx + "," + sy + "," + sw + "," + sh + "," +
dx + "," + dy + "," + dw + "," + dh + ";");
}
}
this._drawCommands += drawImageCommands();
}
_flush(reserve, callback) {
const commands = this._drawCommands;
this._drawCommands = '';
CanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback);
this._needRender = false;
}
_redrawflush(reserve, callback) {
const commands = this._redrawCommands;
CanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback);
if (this._needRedrawImageCache.length == 0) {
this._redrawCommands = '';
}
}
draw(reserve, callback) {
if (!reserve) {
this._globalAlpha = this._savedGlobalAlpha.pop();
this._savedGlobalAlpha.push(this._globalAlpha);
this._redrawCommands = this._drawCommands;
this._needRedrawImageCache = this._notCommitDrawImageCache;
if (this._autoSaveContext) {
this._drawCommands = ("v;" + this._drawCommands);
this._autoSaveContext = false;
} else {
this._drawCommands = ("e;X;v;" + this._drawCommands);
}
} else {
this._needRedrawImageCache = this._needRedrawImageCache.concat(this._notCommitDrawImageCache);
this._redrawCommands += this._drawCommands;
if (this._autoSaveContext) {
this._drawCommands = ("v;" + this._drawCommands);
this._autoSaveContext = false;
}
}
this._notCommitDrawImageCache = [];
if (this._flush) {
this._flush(reserve, callback);
}
}
getImageData(x, y, w, h, callback) {
CanvasRenderingContext2D.GBridge.getImageData(this.componentId, x, y, w, h, function(res) {
res.data = Base64ToUint8ClampedArray(res.data);
if (typeof(callback) == 'function') {
callback(res);
}
});
}
putImageData(data, x, y, w, h, callback) {
if (data instanceof Uint8ClampedArray) {
data = ArrayBufferToBase64(data);
CanvasRenderingContext2D.GBridge.putImageData(this.componentId, data, x, y, w, h, function(res) {
if (typeof(callback) == 'function') {
callback(res);
}
});
}
}
toTempFilePath(x, y, width, height, destWidth, destHeight, fileType, quality, callback) {
CanvasRenderingContext2D.GBridge.toTempFilePath(this.componentId, x, y, width, height, destWidth, destHeight,
fileType, quality,
function(res) {
if (typeof(callback) == 'function') {
callback(res);
}
});
}
}
export default class WebGLActiveInfo {
className = 'WebGLActiveInfo';
constructor({
type, name, size
}) {
this.type = type;
this.name = name;
this.size = size;
}
}
\ No newline at end of file
import {getTransferedObjectUUID} from './classUtils';
const name = 'WebGLBuffer';
function uuid(id) {
return getTransferedObjectUUID(name, id);
}
export default class WebGLBuffer {
className = name;
constructor(id) {
this.id = id;
}
static uuid = uuid;
uuid() {
return uuid(this.id);
}
}
\ No newline at end of file
import {getTransferedObjectUUID} from './classUtils';
const name = 'WebGLFrameBuffer';
function uuid(id) {
return getTransferedObjectUUID(name, id);
}
export default class WebGLFramebuffer {
className = name;
constructor(id) {
this.id = id;
}
static uuid = uuid;
uuid() {
return uuid(this.id);
}
}
\ No newline at end of file
export default {
"DEPTH_BUFFER_BIT": 256,
"STENCIL_BUFFER_BIT": 1024,
"COLOR_BUFFER_BIT": 16384,
"POINTS": 0,
"LINES": 1,
"LINE_LOOP": 2,
"LINE_STRIP": 3,
"TRIANGLES": 4,
"TRIANGLE_STRIP": 5,
"TRIANGLE_FAN": 6,
"ZERO": 0,
"ONE": 1,
"SRC_COLOR": 768,
"ONE_MINUS_SRC_COLOR": 769,
"SRC_ALPHA": 770,
"ONE_MINUS_SRC_ALPHA": 771,
"DST_ALPHA": 772,
"ONE_MINUS_DST_ALPHA": 773,
"DST_COLOR": 774,
"ONE_MINUS_DST_COLOR": 775,
"SRC_ALPHA_SATURATE": 776,
"FUNC_ADD": 32774,
"BLEND_EQUATION": 32777,
"BLEND_EQUATION_RGB": 32777,
"BLEND_EQUATION_ALPHA": 34877,
"FUNC_SUBTRACT": 32778,
"FUNC_REVERSE_SUBTRACT": 32779,
"BLEND_DST_RGB": 32968,
"BLEND_SRC_RGB": 32969,
"BLEND_DST_ALPHA": 32970,
"BLEND_SRC_ALPHA": 32971,
"CONSTANT_COLOR": 32769,
"ONE_MINUS_CONSTANT_COLOR": 32770,
"CONSTANT_ALPHA": 32771,
"ONE_MINUS_CONSTANT_ALPHA": 32772,
"BLEND_COLOR": 32773,
"ARRAY_BUFFER": 34962,
"ELEMENT_ARRAY_BUFFER": 34963,
"ARRAY_BUFFER_BINDING": 34964,
"ELEMENT_ARRAY_BUFFER_BINDING": 34965,
"STREAM_DRAW": 35040,
"STATIC_DRAW": 35044,
"DYNAMIC_DRAW": 35048,
"BUFFER_SIZE": 34660,
"BUFFER_USAGE": 34661,
"CURRENT_VERTEX_ATTRIB": 34342,
"FRONT": 1028,
"BACK": 1029,
"FRONT_AND_BACK": 1032,
"TEXTURE_2D": 3553,
"CULL_FACE": 2884,
"BLEND": 3042,
"DITHER": 3024,
"STENCIL_TEST": 2960,
"DEPTH_TEST": 2929,
"SCISSOR_TEST": 3089,
"POLYGON_OFFSET_FILL": 32823,
"SAMPLE_ALPHA_TO_COVERAGE": 32926,
"SAMPLE_COVERAGE": 32928,
"NO_ERROR": 0,
"INVALID_ENUM": 1280,
"INVALID_VALUE": 1281,
"INVALID_OPERATION": 1282,
"OUT_OF_MEMORY": 1285,
"CW": 2304,
"CCW": 2305,
"LINE_WIDTH": 2849,
"ALIASED_POINT_SIZE_RANGE": 33901,
"ALIASED_LINE_WIDTH_RANGE": 33902,
"CULL_FACE_MODE": 2885,
"FRONT_FACE": 2886,
"DEPTH_RANGE": 2928,
"DEPTH_WRITEMASK": 2930,
"DEPTH_CLEAR_VALUE": 2931,
"DEPTH_FUNC": 2932,
"STENCIL_CLEAR_VALUE": 2961,
"STENCIL_FUNC": 2962,
"STENCIL_FAIL": 2964,
"STENCIL_PASS_DEPTH_FAIL": 2965,
"STENCIL_PASS_DEPTH_PASS": 2966,
"STENCIL_REF": 2967,
"STENCIL_VALUE_MASK": 2963,
"STENCIL_WRITEMASK": 2968,
"STENCIL_BACK_FUNC": 34816,
"STENCIL_BACK_FAIL": 34817,
"STENCIL_BACK_PASS_DEPTH_FAIL": 34818,
"STENCIL_BACK_PASS_DEPTH_PASS": 34819,
"STENCIL_BACK_REF": 36003,
"STENCIL_BACK_VALUE_MASK": 36004,
"STENCIL_BACK_WRITEMASK": 36005,
"VIEWPORT": 2978,
"SCISSOR_BOX": 3088,
"COLOR_CLEAR_VALUE": 3106,
"COLOR_WRITEMASK": 3107,
"UNPACK_ALIGNMENT": 3317,
"PACK_ALIGNMENT": 3333,
"MAX_TEXTURE_SIZE": 3379,
"MAX_VIEWPORT_DIMS": 3386,
"SUBPIXEL_BITS": 3408,
"RED_BITS": 3410,
"GREEN_BITS": 3411,
"BLUE_BITS": 3412,
"ALPHA_BITS": 3413,
"DEPTH_BITS": 3414,
"STENCIL_BITS": 3415,
"POLYGON_OFFSET_UNITS": 10752,
"POLYGON_OFFSET_FACTOR": 32824,
"TEXTURE_BINDING_2D": 32873,
"SAMPLE_BUFFERS": 32936,
"SAMPLES": 32937,
"SAMPLE_COVERAGE_VALUE": 32938,
"SAMPLE_COVERAGE_INVERT": 32939,
"COMPRESSED_TEXTURE_FORMATS": 34467,
"DONT_CARE": 4352,
"FASTEST": 4353,
"NICEST": 4354,
"GENERATE_MIPMAP_HINT": 33170,
"BYTE": 5120,
"UNSIGNED_BYTE": 5121,
"SHORT": 5122,
"UNSIGNED_SHORT": 5123,
"INT": 5124,
"UNSIGNED_INT": 5125,
"FLOAT": 5126,
"DEPTH_COMPONENT": 6402,
"ALPHA": 6406,
"RGB": 6407,
"RGBA": 6408,
"LUMINANCE": 6409,
"LUMINANCE_ALPHA": 6410,
"UNSIGNED_SHORT_4_4_4_4": 32819,
"UNSIGNED_SHORT_5_5_5_1": 32820,
"UNSIGNED_SHORT_5_6_5": 33635,
"FRAGMENT_SHADER": 35632,
"VERTEX_SHADER": 35633,
"MAX_VERTEX_ATTRIBS": 34921,
"MAX_VERTEX_UNIFORM_VECTORS": 36347,
"MAX_VARYING_VECTORS": 36348,
"MAX_COMBINED_TEXTURE_IMAGE_UNITS": 35661,
"MAX_VERTEX_TEXTURE_IMAGE_UNITS": 35660,
"MAX_TEXTURE_IMAGE_UNITS": 34930,
"MAX_FRAGMENT_UNIFORM_VECTORS": 36349,
"SHADER_TYPE": 35663,
"DELETE_STATUS": 35712,
"LINK_STATUS": 35714,
"VALIDATE_STATUS": 35715,
"ATTACHED_SHADERS": 35717,
"ACTIVE_UNIFORMS": 35718,
"ACTIVE_ATTRIBUTES": 35721,
"SHADING_LANGUAGE_VERSION": 35724,
"CURRENT_PROGRAM": 35725,
"NEVER": 512,
"LESS": 513,
"EQUAL": 514,
"LEQUAL": 515,
"GREATER": 516,
"NOTEQUAL": 517,
"GEQUAL": 518,
"ALWAYS": 519,
"KEEP": 7680,
"REPLACE": 7681,
"INCR": 7682,
"DECR": 7683,
"INVERT": 5386,
"INCR_WRAP": 34055,
"DECR_WRAP": 34056,
"VENDOR": 7936,
"RENDERER": 7937,
"VERSION": 7938,
"NEAREST": 9728,
"LINEAR": 9729,
"NEAREST_MIPMAP_NEAREST": 9984,
"LINEAR_MIPMAP_NEAREST": 9985,
"NEAREST_MIPMAP_LINEAR": 9986,
"LINEAR_MIPMAP_LINEAR": 9987,
"TEXTURE_MAG_FILTER": 10240,
"TEXTURE_MIN_FILTER": 10241,
"TEXTURE_WRAP_S": 10242,
"TEXTURE_WRAP_T": 10243,
"TEXTURE": 5890,
"TEXTURE_CUBE_MAP": 34067,
"TEXTURE_BINDING_CUBE_MAP": 34068,
"TEXTURE_CUBE_MAP_POSITIVE_X": 34069,
"TEXTURE_CUBE_MAP_NEGATIVE_X": 34070,
"TEXTURE_CUBE_MAP_POSITIVE_Y": 34071,
"TEXTURE_CUBE_MAP_NEGATIVE_Y": 34072,
"TEXTURE_CUBE_MAP_POSITIVE_Z": 34073,
"TEXTURE_CUBE_MAP_NEGATIVE_Z": 34074,
"MAX_CUBE_MAP_TEXTURE_SIZE": 34076,
"TEXTURE0": 33984,
"TEXTURE1": 33985,
"TEXTURE2": 33986,
"TEXTURE3": 33987,
"TEXTURE4": 33988,
"TEXTURE5": 33989,
"TEXTURE6": 33990,
"TEXTURE7": 33991,
"TEXTURE8": 33992,
"TEXTURE9": 33993,
"TEXTURE10": 33994,
"TEXTURE11": 33995,
"TEXTURE12": 33996,
"TEXTURE13": 33997,
"TEXTURE14": 33998,
"TEXTURE15": 33999,
"TEXTURE16": 34000,
"TEXTURE17": 34001,
"TEXTURE18": 34002,
"TEXTURE19": 34003,
"TEXTURE20": 34004,
"TEXTURE21": 34005,
"TEXTURE22": 34006,
"TEXTURE23": 34007,
"TEXTURE24": 34008,
"TEXTURE25": 34009,
"TEXTURE26": 34010,
"TEXTURE27": 34011,
"TEXTURE28": 34012,
"TEXTURE29": 34013,
"TEXTURE30": 34014,
"TEXTURE31": 34015,
"ACTIVE_TEXTURE": 34016,
"REPEAT": 10497,
"CLAMP_TO_EDGE": 33071,
"MIRRORED_REPEAT": 33648,
"FLOAT_VEC2": 35664,
"FLOAT_VEC3": 35665,
"FLOAT_VEC4": 35666,
"INT_VEC2": 35667,
"INT_VEC3": 35668,
"INT_VEC4": 35669,
"BOOL": 35670,
"BOOL_VEC2": 35671,
"BOOL_VEC3": 35672,
"BOOL_VEC4": 35673,
"FLOAT_MAT2": 35674,
"FLOAT_MAT3": 35675,
"FLOAT_MAT4": 35676,
"SAMPLER_2D": 35678,
"SAMPLER_CUBE": 35680,
"VERTEX_ATTRIB_ARRAY_ENABLED": 34338,
"VERTEX_ATTRIB_ARRAY_SIZE": 34339,
"VERTEX_ATTRIB_ARRAY_STRIDE": 34340,
"VERTEX_ATTRIB_ARRAY_TYPE": 34341,
"VERTEX_ATTRIB_ARRAY_NORMALIZED": 34922,
"VERTEX_ATTRIB_ARRAY_POINTER": 34373,
"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING": 34975,
"IMPLEMENTATION_COLOR_READ_TYPE": 35738,
"IMPLEMENTATION_COLOR_READ_FORMAT": 35739,
"COMPILE_STATUS": 35713,
"LOW_FLOAT": 36336,
"MEDIUM_FLOAT": 36337,
"HIGH_FLOAT": 36338,
"LOW_INT": 36339,
"MEDIUM_INT": 36340,
"HIGH_INT": 36341,
"FRAMEBUFFER": 36160,
"RENDERBUFFER": 36161,
"RGBA4": 32854,
"RGB5_A1": 32855,
"RGB565": 36194,
"DEPTH_COMPONENT16": 33189,
"STENCIL_INDEX8": 36168,
"DEPTH_STENCIL": 34041,
"RENDERBUFFER_WIDTH": 36162,
"RENDERBUFFER_HEIGHT": 36163,
"RENDERBUFFER_INTERNAL_FORMAT": 36164,
"RENDERBUFFER_RED_SIZE": 36176,
"RENDERBUFFER_GREEN_SIZE": 36177,
"RENDERBUFFER_BLUE_SIZE": 36178,
"RENDERBUFFER_ALPHA_SIZE": 36179,
"RENDERBUFFER_DEPTH_SIZE": 36180,
"RENDERBUFFER_STENCIL_SIZE": 36181,
"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE": 36048,
"FRAMEBUFFER_ATTACHMENT_OBJECT_NAME": 36049,
"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL": 36050,
"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE": 36051,
"COLOR_ATTACHMENT0": 36064,
"DEPTH_ATTACHMENT": 36096,
"STENCIL_ATTACHMENT": 36128,
"DEPTH_STENCIL_ATTACHMENT": 33306,
"NONE": 0,
"FRAMEBUFFER_COMPLETE": 36053,
"FRAMEBUFFER_INCOMPLETE_ATTACHMENT": 36054,
"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT": 36055,
"FRAMEBUFFER_INCOMPLETE_DIMENSIONS": 36057,
"FRAMEBUFFER_UNSUPPORTED": 36061,
"FRAMEBUFFER_BINDING": 36006,
"RENDERBUFFER_BINDING": 36007,
"MAX_RENDERBUFFER_SIZE": 34024,
"INVALID_FRAMEBUFFER_OPERATION": 1286,
"UNPACK_FLIP_Y_WEBGL": 37440,
"UNPACK_PREMULTIPLY_ALPHA_WEBGL": 37441,
"CONTEXT_LOST_WEBGL": 37442,
"UNPACK_COLORSPACE_CONVERSION_WEBGL": 37443,
"BROWSER_DEFAULT_WEBGL": 37444
};
\ No newline at end of file
let i = 1;
const GLmethod = {};
GLmethod.activeTexture = i++; //1
GLmethod.attachShader = i++;
GLmethod.bindAttribLocation = i++;
GLmethod.bindBuffer = i++;
GLmethod.bindFramebuffer = i++;
GLmethod.bindRenderbuffer = i++;
GLmethod.bindTexture = i++;
GLmethod.blendColor = i++;
GLmethod.blendEquation = i++;
GLmethod.blendEquationSeparate = i++; //10
GLmethod.blendFunc = i++;
GLmethod.blendFuncSeparate = i++;
GLmethod.bufferData = i++;
GLmethod.bufferSubData = i++;
GLmethod.checkFramebufferStatus = i++;
GLmethod.clear = i++;
GLmethod.clearColor = i++;
GLmethod.clearDepth = i++;
GLmethod.clearStencil = i++;
GLmethod.colorMask = i++; //20
GLmethod.compileShader = i++;
GLmethod.compressedTexImage2D = i++;
GLmethod.compressedTexSubImage2D = i++;
GLmethod.copyTexImage2D = i++;
GLmethod.copyTexSubImage2D = i++;
GLmethod.createBuffer = i++;
GLmethod.createFramebuffer = i++;
GLmethod.createProgram = i++;
GLmethod.createRenderbuffer = i++;
GLmethod.createShader = i++; //30
GLmethod.createTexture = i++;
GLmethod.cullFace = i++;
GLmethod.deleteBuffer = i++;
GLmethod.deleteFramebuffer = i++;
GLmethod.deleteProgram = i++;
GLmethod.deleteRenderbuffer = i++;
GLmethod.deleteShader = i++;
GLmethod.deleteTexture = i++;
GLmethod.depthFunc = i++;
GLmethod.depthMask = i++; //40
GLmethod.depthRange = i++;
GLmethod.detachShader = i++;
GLmethod.disable = i++;
GLmethod.disableVertexAttribArray = i++;
GLmethod.drawArrays = i++;
GLmethod.drawArraysInstancedANGLE = i++;
GLmethod.drawElements = i++;
GLmethod.drawElementsInstancedANGLE = i++;
GLmethod.enable = i++;
GLmethod.enableVertexAttribArray = i++; //50
GLmethod.flush = i++;
GLmethod.framebufferRenderbuffer = i++;
GLmethod.framebufferTexture2D = i++;
GLmethod.frontFace = i++;
GLmethod.generateMipmap = i++;
GLmethod.getActiveAttrib = i++;
GLmethod.getActiveUniform = i++;
GLmethod.getAttachedShaders = i++;
GLmethod.getAttribLocation = i++;
GLmethod.getBufferParameter = i++; //60
GLmethod.getContextAttributes = i++;
GLmethod.getError = i++;
GLmethod.getExtension = i++;
GLmethod.getFramebufferAttachmentParameter = i++;
GLmethod.getParameter = i++;
GLmethod.getProgramInfoLog = i++;
GLmethod.getProgramParameter = i++;
GLmethod.getRenderbufferParameter = i++;
GLmethod.getShaderInfoLog = i++;
GLmethod.getShaderParameter = i++; //70
GLmethod.getShaderPrecisionFormat = i++;
GLmethod.getShaderSource = i++;
GLmethod.getSupportedExtensions = i++;
GLmethod.getTexParameter = i++;
GLmethod.getUniform = i++;
GLmethod.getUniformLocation = i++;
GLmethod.getVertexAttrib = i++;
GLmethod.getVertexAttribOffset = i++;
GLmethod.isBuffer = i++;
GLmethod.isContextLost = i++; //80
GLmethod.isEnabled = i++;
GLmethod.isFramebuffer = i++;
GLmethod.isProgram = i++;
GLmethod.isRenderbuffer = i++;
GLmethod.isShader = i++;
GLmethod.isTexture = i++;
GLmethod.lineWidth = i++;
GLmethod.linkProgram = i++;
GLmethod.pixelStorei = i++;
GLmethod.polygonOffset = i++; //90
GLmethod.readPixels = i++;
GLmethod.renderbufferStorage = i++;
GLmethod.sampleCoverage = i++;
GLmethod.scissor = i++;
GLmethod.shaderSource = i++;
GLmethod.stencilFunc = i++;
GLmethod.stencilFuncSeparate = i++;
GLmethod.stencilMask = i++;
GLmethod.stencilMaskSeparate = i++;
GLmethod.stencilOp = i++; //100
GLmethod.stencilOpSeparate = i++;
GLmethod.texImage2D = i++;
GLmethod.texParameterf = i++;
GLmethod.texParameteri = i++;
GLmethod.texSubImage2D = i++;
GLmethod.uniform1f = i++;
GLmethod.uniform1fv = i++;
GLmethod.uniform1i = i++;
GLmethod.uniform1iv = i++;
GLmethod.uniform2f = i++; //110
GLmethod.uniform2fv = i++;
GLmethod.uniform2i = i++;
GLmethod.uniform2iv = i++;
GLmethod.uniform3f = i++;
GLmethod.uniform3fv = i++;
GLmethod.uniform3i = i++;
GLmethod.uniform3iv = i++;
GLmethod.uniform4f = i++;
GLmethod.uniform4fv = i++;
GLmethod.uniform4i = i++; //120
GLmethod.uniform4iv = i++;
GLmethod.uniformMatrix2fv = i++;
GLmethod.uniformMatrix3fv = i++;
GLmethod.uniformMatrix4fv = i++;
GLmethod.useProgram = i++;
GLmethod.validateProgram = i++;
GLmethod.vertexAttrib1f = i++; //new
GLmethod.vertexAttrib2f = i++; //new
GLmethod.vertexAttrib3f = i++; //new
GLmethod.vertexAttrib4f = i++; //new //130
GLmethod.vertexAttrib1fv = i++; //new
GLmethod.vertexAttrib2fv = i++; //new
GLmethod.vertexAttrib3fv = i++; //new
GLmethod.vertexAttrib4fv = i++; //new
GLmethod.vertexAttribPointer = i++;
GLmethod.viewport = i++;
export default GLmethod;
\ No newline at end of file
const GLtype = {};
[
"GLbitfield",
"GLboolean",
"GLbyte",
"GLclampf",
"GLenum",
"GLfloat",
"GLint",
"GLintptr",
"GLsizei",
"GLsizeiptr",
"GLshort",
"GLubyte",
"GLuint",
"GLushort"
].sort().map((typeName, i) => GLtype[typeName] = 1 >> (i + 1));
export default GLtype;
import {getTransferedObjectUUID} from './classUtils';
const name = 'WebGLProgram';
function uuid(id) {
return getTransferedObjectUUID(name, id);
}
export default class WebGLProgram {
className = name;
constructor(id) {
this.id = id;
}
static uuid = uuid;
uuid() {
return uuid(this.id);
}
}
\ No newline at end of file
import {getTransferedObjectUUID} from './classUtils';
const name = 'WebGLRenderBuffer';
function uuid(id) {
return getTransferedObjectUUID(name, id);
}
export default class WebGLRenderbuffer {
className = name;
constructor(id) {
this.id = id;
}
static uuid = uuid;
uuid() {
return uuid(this.id);
}
}
\ No newline at end of file
import GLenum from './GLenum';
import ActiveInfo from './ActiveInfo';
import Buffer from './Buffer';
import Framebuffer from './Framebuffer';
import Renderbuffer from './Renderbuffer';
import Texture from './Texture';
import Program from './Program';
import Shader from './Shader';
import ShaderPrecisionFormat from './ShaderPrecisionFormat';
import UniformLocation from './UniformLocation';
import GLmethod from './GLmethod';
const processArray = (array, checkArrayType = false) => {
function joinArray(arr, sep) {
let res = '';
for (let i = 0; i < arr.length; i++) {
if (i !== 0) {
res += sep;
}
res += arr[i];
}
return res;
}
let type = 'Float32Array';
if (checkArrayType) {
if (array instanceof Uint8Array) {
type = 'Uint8Array'
} else if (array instanceof Uint16Array) {
type = 'Uint16Array';
} else if (array instanceof Uint32Array) {
type = 'Uint32Array';
} else if (array instanceof Float32Array) {
type = 'Float32Array';
} else {
throw new Error('Check array type failed. Array type is ' + typeof array);
}
}
const ArrayTypes = {
Uint8Array: 1,
Uint16Array: 2,
Uint32Array: 4,
Float32Array: 14
};
return ArrayTypes[type] + ',' + btoa(joinArray(array, ','))
}
export default class WebGLRenderingContext {
// static GBridge = null;
className = 'WebGLRenderingContext';
constructor(canvas, type, attrs) {
this._canvas = canvas;
this._type = type;
this._version = 'WebGL 1.0';
this._attrs = attrs;
this._map = new Map();
Object.keys(GLenum)
.forEach(name => Object.defineProperty(this, name, {
value: GLenum[name]
}));
}
get canvas() {
return this._canvas;
}
activeTexture = function (textureUnit) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.activeTexture + ',' + textureUnit,
true
);
}
attachShader = function (progarm, shader) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.attachShader + ',' + progarm.id + ',' + shader.id,
true
);
}
bindAttribLocation = function (program, index, name) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.bindAttribLocation + ',' + program.id + ',' + index + ',' + name,
true
)
}
bindBuffer = function (target, buffer) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.bindBuffer + ',' + target + ',' + (buffer ? buffer.id : 0),
true
);
}
bindFramebuffer = function (target, framebuffer) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.bindFramebuffer + ',' + target + ',' + (framebuffer ? framebuffer.id : 0),
true
)
}
bindRenderbuffer = function (target, renderBuffer) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.bindRenderbuffer + ',' + target + ',' + (renderBuffer ? renderBuffer.id : 0),
true
)
}
bindTexture = function (target, texture) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.bindTexture + ',' + target + ',' + (texture ? texture.id : 0),
true
)
}
blendColor = function (r, g, b, a) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.blendColor + ',' + target + ',' + r + ',' + g + ',' + b + ',' + a,
true
)
}
blendEquation = function (mode) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.blendEquation + ',' + mode,
true
)
}
blendEquationSeparate = function (modeRGB, modeAlpha) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.blendEquationSeparate + ',' + modeRGB + ',' + modeAlpha,
true
)
}
blendFunc = function (sfactor, dfactor) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.blendFunc + ',' + sfactor + ',' + dfactor,
true
);
}
blendFuncSeparate = function (srcRGB, dstRGB, srcAlpha, dstAlpha) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.blendFuncSeparate + ',' + srcRGB + ',' + dstRGB + ',' + srcAlpha + ',' + dstAlpha,
true
);
}
bufferData = function (target, data, usage) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.bufferData + ',' + target + ',' + processArray(data, true) + ',' + usage,
true
)
}
bufferSubData = function (target, offset, data) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.bufferSubData + ',' + target + ',' + offset + ',' + processArray(data, true),
true
)
}
checkFramebufferStatus = function (target) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.checkFramebufferStatus + ',' + target
);
return Number(result);
}
clear = function (mask) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.clear + ',' + mask
);
this._canvas._needRender = true;
}
clearColor = function (r, g, b, a) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.clearColor + ',' + r + ',' + g + ',' + b,
true
)
}
clearDepth = function (depth) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.clearDepth + ',' + depth,
true
)
}
clearStencil = function (s) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.clearStencil + ',' + s
);
}
colorMask = function (r, g, b, a) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.colorMask + ',' + r + ',' + g + ',' + b + ',' + a
)
}
compileShader = function (shader) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.compileShader + ',' + shader.id,
true
)
}
compressedTexImage2D = function (target, level, internalformat, width, height, border, pixels) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.compressedTexImage2D + ',' + target + ',' + level + ',' + internalformat + ',' +
width + ',' + height + ',' + border + ',' + processArray(pixels),
true
)
}
compressedTexSubImage2D = function (target, level, xoffset, yoffset, width, height, format, pixels) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.compressedTexSubImage2D + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset + ',' +
width + ',' + height + ',' + format + ',' + processArray(pixels),
true
)
}
copyTexImage2D = function (target, level, internalformat, x, y, width, height, border) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.copyTexImage2D + ',' + target + ',' + level + ',' + internalformat + ',' + x + ',' + y + ',' +
width + ',' + height + ',' + border,
true
);
}
copyTexSubImage2D = function (target, level, xoffset, yoffset, x, y, width, height) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.copyTexSubImage2D + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset + ',' + x + ',' + y + ',' +
width + ',' + height
);
}
createBuffer = function () {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.createBuffer + ''
);
const buffer = new Buffer(result);
this._map.set(buffer.uuid(), buffer);
return buffer;
}
createFramebuffer = function () {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.createFramebuffer + ''
);
const framebuffer = new Framebuffer(result);
this._map.set(framebuffer.uuid(), framebuffer);
return framebuffer;
}
createProgram = function () {
const id = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.createProgram + ''
);
const program = new Program(id);
this._map.set(program.uuid(), program);
return program;
}
createRenderbuffer = function () {
const id = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.createRenderbuffer + ''
)
const renderBuffer = new Renderbuffer(id);
this._map.set(renderBuffer.uuid(), renderBuffer);
return renderBuffer;
}
createShader = function (type) {
const id = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.createShader + ',' + type
)
const shader = new Shader(id, type);
this._map.set(shader.uuid(), shader);
return shader;
}
createTexture = function () {
const id = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.createTexture + ''
);
const texture = new Texture(id);
this._map.set(texture.uuid(), texture);
return texture;
}
cullFace = function (mode) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.cullFace + ',' + mode,
true
)
}
deleteBuffer = function (buffer) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.deleteBuffer + ',' + buffer.id,
true
)
}
deleteFramebuffer = function (framebuffer) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.deleteFramebuffer + ',' + framebuffer.id,
true
)
}
deleteProgram = function (program) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.deleteProgram + ',' + program.id,
true
)
}
deleteRenderbuffer = function (renderbuffer) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.deleteRenderbuffer + ',' + renderbuffer.id,
true
)
}
deleteShader = function (shader) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.deleteShader + ',' + shader.id,
true
)
}
deleteTexture = function (texture) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.deleteTexture + ',' + texture.id,
true
)
}
depthFunc = function (func) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.depthFunc + ',' + func
)
}
depthMask = function (flag) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.depthMask + ',' + Number(flag),
true
)
}
depthRange = function (zNear, zFar) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.depthRange + ',' + zNear + ',' + zFar,
true
)
}
detachShader = function (program, shader) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.detachShader + ',' + program.id + ',' + shader.id,
true
)
}
disable = function (cap) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.disable + ',' + cap,
true
)
}
disableVertexAttribArray = function (index) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.disableVertexAttribArray + ',' + index,
true
);
}
drawArrays = function (mode, first, count) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.drawArrays + ',' + mode + ',' + first + ',' + count
)
this._canvas._needRender = true;
}
drawElements = function (mode, count, type, offset) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.drawElements + ',' + mode + ',' + count + ',' + type + ',' + offset + ';'
);
this._canvas._needRender = true;
}
enable = function (cap) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.enable + ',' + cap,
true
);
}
enableVertexAttribArray = function (index) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.enableVertexAttribArray + ',' + index,
true
)
}
flush = function () {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.flush + ''
)
}
framebufferRenderbuffer = function (target, attachment, textarget, texture, level) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.framebufferRenderbuffer + ',' + target + ',' + attachment + ',' + textarget + ',' + (texture ? texture.id : 0) + ',' + level,
true
)
}
framebufferTexture2D = function (target, attachment, textarget, texture, level) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.framebufferTexture2D + ',' + target + ',' + attachment + ',' + textarget + ',' + (texture ? texture.id : 0) + ',' + level,
true
)
}
frontFace = function (mode) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.frontFace + ',' + mode,
true
)
}
generateMipmap = function (target) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.generateMipmap + ',' + target,
true
)
}
getActiveAttrib = function (progarm, index) {
const resultString = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getActiveAttrib + ',' + progarm.id + ',' + index
)
const [type, size, name] = resultString.split(',');
return new ActiveInfo({
type: Number(type),
size: Number(size),
name
});
}
getActiveUniform = function (progarm, index) {
const resultString = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getActiveUniform + ',' + progarm.id + ',' + index
);
const [type, size, name] = resultString.split(',');
return new ActiveInfo({
type: Number(type),
size: Number(size),
name
})
}
getAttachedShaders = function (progarm) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getAttachedShaders + ',' + progarm.id
);
const [type, ...ids] = result;
return ids.map(id => this._map.get(Shader.uuid(id)));
}
getAttribLocation = function (progarm, name) {
return WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getAttribLocation + ',' + progarm.id + ',' + name
)
}
getBufferParameter = function (target, pname) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getBufferParameter + ',' + target + ',' + pname
);
const [type, res] = getBufferParameter;
return res;
}
getError = function () {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getError + ''
)
return result;
}
getExtension = function (name) {
return null;
}
getFramebufferAttachmentParameter = function (target, attachment, pname) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getFramebufferAttachmentParameter + ',' + target + ',' + attachment + ',' + pname
)
switch (pname) {
case GLenum.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
return this._map.get(Renderbuffer.uuid(result)) || this._map.get(Texture.uuid(result)) || null;
default:
return result;
}
}
getParameter = function (pname) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getParameter + ',' + pname
)
switch (pname) {
case GLenum.VERSION:
return this._version;
case GLenum.ARRAY_BUFFER_BINDING: // buffer
case GLenum.ELEMENT_ARRAY_BUFFER_BINDING: // buffer
return this._map.get(Buffer.uuid(result)) || null;
case GLenum.CURRENT_PROGRAM: // program
return this._map.get(Program.uuid(result)) || null;
case GLenum.FRAMEBUFFER_BINDING: // framebuffer
return this._map.get(Framebuffer.uuid(result)) || null;
case GLenum.RENDERBUFFER_BINDING: // renderbuffer
return this._map.get(Renderbuffer.uuid(result)) || null;
case GLenum.TEXTURE_BINDING_2D: // texture
case GLenum.TEXTURE_BINDING_CUBE_MAP: // texture
return this._map.get(Texture.uuid(result)) || null;
case GLenum.ALIASED_LINE_WIDTH_RANGE: // Float32Array
case GLenum.ALIASED_POINT_SIZE_RANGE: // Float32Array
case GLenum.BLEND_COLOR: // Float32Array
case GLenum.COLOR_CLEAR_VALUE: // Float32Array
case GLenum.DEPTH_RANGE: // Float32Array
case GLenum.MAX_VIEWPORT_DIMS: // Int32Array
case GLenum.SCISSOR_BOX: // Int32Array
case GLenum.VIEWPORT: // Int32Array
case GLenum.COMPRESSED_TEXTURE_FORMATS: // Uint32Array
default:
const [type, ...res] = result.split(',');
if (res.length === 1) {
return Number(res[0]);
} else {
return res.map(Number);
}
}
}
getProgramInfoLog = function (progarm) {
return WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getProgramInfoLog + ',' + progarm.id
)
}
getProgramParameter = function (program, pname) {
const res = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getProgramParameter + ',' + program.id + ',' + pname
);
const [type, result] = res.split(',').map(i => parseInt(i));
if (type === 1) {
return Boolean(result);
} else if (type === 2) {
return result;
} else {
throw new Error('Unrecongized program paramater ' + res + ', type: ' + typeof res);
}
}
getRenderbufferParameter = function (target, pname) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getRenderbufferParameter + ',' + target + ',' + pname
)
return result;
}
getShaderInfoLog = function (shader) {
return WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getShaderInfoLog + ',' + shader.id
);
}
getShaderParameter = function (shader, pname) {
return WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getShaderParameter + ',' + shader.id + ',' + pname
)
}
getShaderPrecisionFormat = function (shaderType, precisionType) {
const [rangeMin, rangeMax, precision] = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getShaderPrecisionFormat + ',' + shaderType + ',' + precisionType
);
const shaderPrecisionFormat = new ShaderPrecisionFormat({
rangeMin: Number(rangeMin),
rangeMax: Number(rangeMax),
precision: Number(precision)
});
return shaderPrecisionFormat;
}
getShaderSource = function (shader) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getShaderSource + ',' + shader.id
);
return result;
}
getSupportedExtensions = function () {
return Object.keys({});
}
getTexParameter = function (target, pname) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getTexParameter + ',' + target + ',' + pname
)
return result;
}
getUniformLocation = function (program, name) {
const id = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getUniformLocation + ',' + program.id + ',' + name
);
if (id === -1) {
return null;
} else {
return new UniformLocation(Number(id));
}
}
getVertexAttrib = function (index, pname) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getVertexAttrib + ',' + index + ',' + pname
);
switch (pname) {
case GLenum.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
return this._map.get(Buffer.uuid(result)) || null;
case GLenum.CURRENT_VERTEX_ATTRIB: // Float32Array
default:
return result;
}
}
getVertexAttribOffset = function (index, pname) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.getVertexAttribOffset + ',' + index + ',' + pname
)
return Number(result);
}
isBuffer = function (buffer) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.isBuffer + ',' + buffer.id
)
return Boolean(result);
}
isContextLost = function () {
return false;
}
isEnabled = function (cap) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.isEnabled + ',' + cap
)
return Boolean(result);
}
isFramebuffer = function (framebuffer) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.isFramebuffer + ',' + framebuffer.id
)
return Boolean(result);
}
isProgram = function (program) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.isProgram + ',' + program.id
)
return Boolean(result);
}
isRenderbuffer = function (renderBuffer) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.isRenderbuffer + ',' + renderbuffer.id
)
return Boolean(result);
}
isShader = function (shader) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.isShader + ',' + shader.id
)
return Boolean(result);
}
isTexture = function (texture) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.isTexture + ',' + texture.id
);
return Boolean(result);
}
lineWidth = function (width) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.lineWidth + ',' + width,
true
)
}
linkProgram = function (program) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.linkProgram + ',' + program.id,
true
);
}
pixelStorei = function (pname, param) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.pixelStorei + ',' + pname + ',' + Number(param)
)
}
polygonOffset = function (factor, units) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.polygonOffset + ',' + factor + ',' + units
)
}
readPixels = function (x, y, width, height, format, type, pixels) {
const result = WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.readPixels + ',' + x + ',' + y + ',' + width + ',' + height + ',' + format + ',' + type
)
return result;
}
renderbufferStorage = function (target, internalFormat, width, height) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.renderbufferStorage + ',' + target + ',' + internalFormat + ',' + width + ',' + height,
true
)
}
sampleCoverage = function (value, invert) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.sampleCoverage + ',' + value + ',' + Number(invert),
true
)
}
scissor = function (x, y, width, height) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.scissor + ',' + x + ',' + y + ',' + width + ',' + height,
true
)
}
shaderSource = function (shader, source) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.shaderSource + ',' + shader.id + ',' + source
)
}
stencilFunc = function (func, ref, mask) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.stencilFunc + ',' + func + ',' + ref + ',' + mask,
true
)
}
stencilFuncSeparate = function (face, func, ref, mask) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.stencilFuncSeparate + ',' + face + ',' + func + ',' + ref + ',' + mask,
true
)
}
stencilMask = function (mask) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.stencilMask + ',' + mask,
true
)
}
stencilMaskSeparate = function (face, mask) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.stencilMaskSeparate + ',' + face + ',' + mask,
true
)
}
stencilOp = function (fail, zfail, zpass) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.stencilOp + ',' + fail + ',' + zfail + ',' + zpass
)
}
stencilOpSeparate = function (face, fail, zfail, zpass) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.stencilOp + ',' + face + ',' + fail + ',' + zfail + ',' + zpass,
true
)
}
texImage2D = function (...args) {
WebGLRenderingContext.GBridge.texImage2D(this._canvas.id, ...args);
}
texParameterf = function (target, pname, param) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.texParameterf + ',' + target + ',' + pname + ',' + param,
true
)
}
texParameteri = function (target, pname, param) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.texParameteri + ',' + target + ',' + pname + ',' + param
)
}
texSubImage2D = function (...args) {
WebGLRenderingContext.GBridge.texSubImage2D(this._canvas.id, ...args);
}
uniform1f = function (location, v0) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform1f + ',' + location.id + ',' + v0
)
}
uniform1fv = function (location, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform1fv + ',' + location.id + ',' + processArray(value),
true
)
}
uniform1i = function (location, v0) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform1i + ',' + location.id + ',' + v0,
// true
)
}
uniform1iv = function (location, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform1iv + ',' + location.id + ',' + processArray(value),
true
)
}
uniform2f = function (location, v0, v1) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform2f + ',' + location.id + ',' + v0 + ',' + v1,
true
)
}
uniform2fv = function (location, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform2fv + ',' + location.id + ',' + processArray(value),
true
)
}
uniform2i = function (location, v0, v1) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform2i + ',' + location.id + ',' + v0 + ',' + v1,
true
)
}
uniform2iv = function (location, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform2iv + ',' + location.id + ',' + processArray(value),
true
)
}
uniform3f = function (location, v0, v1, v2) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform3f + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2,
true
)
}
uniform3fv = function (location, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform3fv + ',' + location.id + ',' + processArray(value),
true
)
}
uniform3i = function (location, v0, v1, v2) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform3i + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2,
true
)
}
uniform3iv = function (location, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform3iv + ',' + location.id + ',' + processArray(value),
true
)
}
uniform4f = function (location, v0, v1, v2, v3) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform4f + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3,
true
)
}
uniform4fv = function (location, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform4fv + ',' + location.id + ',' + processArray(value),
true
)
}
uniform4i = function (location, v0, v1, v2, v3) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform4i + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3,
true
)
}
uniform4iv = function (location, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniform4iv + ',' + location.id + ',' + processArray(value, true),
true
)
}
uniformMatrix2fv = function (location, transpose, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniformMatrix2fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value),
true
)
}
uniformMatrix3fv = function (location, transpose, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniformMatrix3fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value),
true
)
}
uniformMatrix4fv = function (location, transpose, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.uniformMatrix4fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value),
true
);
}
useProgram = function (progarm) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.useProgram + ',' + progarm.id + '',
true
)
}
validateProgram = function (program) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.validateProgram + ',' + program.id,
true
)
}
vertexAttrib1f = function (index, v0) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.vertexAttrib1f + ',' + index + ',' + v0,
true
)
}
vertexAttrib2f = function (index, v0, v1) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.vertexAttrib2f + ',' + index + ',' + v0 + ',' + v1,
true
)
}
vertexAttrib3f = function (index, v0, v1, v2) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.vertexAttrib3f + ',' + index + ',' + v0 + ',' + v1 + ',' + v2,
true
)
}
vertexAttrib4f = function (index, v0, v1, v2, v3) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.vertexAttrib4f + ',' + index + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3,
true
)
}
vertexAttrib1fv = function (index, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.vertexAttrib1fv + ',' + index + ',' + processArray(value),
true
)
}
vertexAttrib2fv = function (index, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.vertexAttrib2fv + ',' + index + ',' + processArray(value),
true
)
}
vertexAttrib3fv = function (index, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.vertexAttrib3fv + ',' + index + ',' + processArray(value),
true
)
}
vertexAttrib4fv = function (index, value) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.vertexAttrib4fv + ',' + index + ',' + processArray(value),
true
)
}
vertexAttribPointer = function (index, size, type, normalized, stride, offset) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.vertexAttribPointer + ',' + index + ',' + size + ',' + type + ',' + Number(normalized) + ',' + stride + ',' + offset,
true
)
}
viewport = function (x, y, width, height) {
WebGLRenderingContext.GBridge.callNative(
this._canvas.id,
GLmethod.viewport + ',' + x + ',' + y + ',' + width + ',' + height,
true
)
}
}
\ No newline at end of file
import {getTransferedObjectUUID} from './classUtils';
const name = 'WebGLShader';
function uuid(id) {
return getTransferedObjectUUID(name, id);
}
export default class WebGLShader {
className = name;
constructor(id, type) {
this.id = id;
this.type = type;
}
static uuid = uuid;
uuid() {
return uuid(this.id);
}
}
\ No newline at end of file
export default class WebGLShaderPrecisionFormat {
className = 'WebGLShaderPrecisionFormat';
constructor({
rangeMin, rangeMax, precision
}) {
this.rangeMin = rangeMin;
this.rangeMax = rangeMax;
this.precision = precision;
}
}
\ No newline at end of file
import {getTransferedObjectUUID} from './classUtils';
const name = 'WebGLTexture';
function uuid(id) {
return getTransferedObjectUUID(name, id);
}
export default class WebGLTexture {
className = name;
constructor(id, type) {
this.id = id;
this.type = type;
}
static uuid = uuid;
uuid() {
return uuid(this.id);
}
}
\ No newline at end of file
import {getTransferedObjectUUID} from './classUtils';
const name = 'WebGLUniformLocation';
function uuid(id) {
return getTransferedObjectUUID(name, id);
}
export default class WebGLUniformLocation {
className = name;
constructor(id, type) {
this.id = id;
this.type = type;
}
static uuid = uuid;
uuid() {
return uuid(this.id);
}
}
\ No newline at end of file
export function getTransferedObjectUUID(name, id) {
return `${name.toLowerCase()}-${id}`;
}
\ No newline at end of file
import GContext2D from '../context-2d/RenderingContext';
import GContextWebGL from '../context-webgl/RenderingContext';
export default class GCanvas {
// static GBridge = null;
id = null;
_needRender = true;
constructor(id, { disableAutoSwap }) {
this.id = id;
this._disableAutoSwap = disableAutoSwap;
if (disableAutoSwap) {
this._swapBuffers = () => {
GCanvas.GBridge.render(this.id);
}
}
}
getContext(type) {
let context = null;
if (type.match(/webgl/i)) {
context = new GContextWebGL(this);
context.componentId = this.id;
if (!this._disableAutoSwap) {
const render = () => {
if (this._needRender) {
GCanvas.GBridge.render(this.id);
this._needRender = false;
}
}
setInterval(render, 16);
}
GCanvas.GBridge.callSetContextType(this.id, 1); // 0 for 2d; 1 for webgl
} else if (type.match(/2d/i)) {
context = new GContext2D(this);
context.componentId = this.id;
// const render = ( callback ) => {
//
// const commands = context._drawCommands;
// context._drawCommands = '';
//
// GCanvas.GBridge.render2d(this.id, commands, callback);
// this._needRender = false;
// }
// //draw方法触发
// context._flush = render;
// //setInterval(render, 16);
GCanvas.GBridge.callSetContextType(this.id, 0);
} else {
throw new Error('not supported context ' + type);
}
return context;
}
reset() {
GCanvas.GBridge.callReset(this.id);
}
}
\ No newline at end of file
let incId = 1;
const noop = function () { };
class GImage {
static GBridge = null;
constructor() {
this._id = incId++;
this._width = 0;
this._height = 0;
this._src = undefined;
this._onload = noop;
this._onerror = noop;
this.complete = false;
}
get width() {
return this._width;
}
set width(v) {
this._width = v;
}
get height() {
return this._height;
}
set height(v) {
this._height = v;
}
get src() {
return this._src;
}
set src(v) {
if (v.startsWith('//')) {
v = 'http:' + v;
}
this._src = v;
GImage.GBridge.perloadImage([this._src, this._id], (data) => {
if (typeof data === 'string') {
data = JSON.parse(data);
}
if (data.error) {
var evt = { type: 'error', target: this };
this.onerror(evt);
} else {
this.complete = true;
this.width = typeof data.width === 'number' ? data.width : 0;
this.height = typeof data.height === 'number' ? data.height : 0;
var evt = { type: 'load', target: this };
this.onload(evt);
}
});
}
addEventListener(name, listener) {
if (name === 'load') {
this.onload = listener;
} else if (name === 'error') {
this.onerror = listener;
}
}
removeEventListener(name, listener) {
if (name === 'load') {
this.onload = noop;
} else if (name === 'error') {
this.onerror = noop;
}
}
get onload() {
return this._onload;
}
set onload(v) {
this._onload = v;
}
get onerror() {
return this._onerror;
}
set onerror(v) {
this._onerror = v;
}
}
export default GImage;
\ No newline at end of file
export function ArrayBufferToBase64 (buffer) {
var binary = '';
var bytes = new Uint8ClampedArray(buffer);
for (var len = bytes.byteLength, i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
export function Base64ToUint8ClampedArray(base64String) {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/_/g, '/');
const rawData = atob(base64);
const outputArray = new Uint8ClampedArray(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
\ No newline at end of file
import GCanvas from './env/canvas';
import GImage from './env/image';
import GWebGLRenderingContext from './context-webgl/RenderingContext';
import GContext2D from './context-2d/RenderingContext';
import GBridgeWeex from './bridge/bridge-weex';
export let Image = GImage;
export let WeexBridge = GBridgeWeex;
export function enable(el, {
bridge,
debug,
disableAutoSwap,
disableComboCommands
} = {}) {
const GBridge = GImage.GBridge = GCanvas.GBridge = GWebGLRenderingContext.GBridge = GContext2D.GBridge = bridge;
GBridge.callEnable(el.ref, [
0, // renderMode: 0--RENDERMODE_WHEN_DIRTY, 1--RENDERMODE_CONTINUOUSLY
-1, // hybridLayerType: 0--LAYER_TYPE_NONE 1--LAYER_TYPE_SOFTWARE 2--LAYER_TYPE_HARDWARE
false, // supportScroll
false, // newCanvasMode
1, // compatible
'white', // clearColor
false // sameLevel: newCanvasMode = true && true => GCanvasView and Webview is same level
]);
if (debug === true) {
GBridge.callEnableDebug();
}
if (disableComboCommands) {
GBridge.callEnableDisableCombo();
}
var canvas = new GCanvas(el.ref, {
disableAutoSwap
});
let pixelRatio = uni.getSystemInfoSync().pixelRatio;
canvas.width = el.style.width * pixelRatio;
canvas.height = el.style.height * pixelRatio;
return canvas;
};