diff --git a/README.md b/README.md index 3b171518e..424f6a637 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,12 @@

让你瞬间进入沉浸式阅读的扩展,还原阅读的本质,提升你的阅读体验。

为了达到完美的阅读模式这个小目标 ,我适配了 数百种类型 的网站,因此诞生了简悦。

- +

- + @@ -16,63 +16,113 @@ *** -#### 马上使用: -* [Chrome 应用商店](https://chrome.google.com/webstore/detail/%E7%AE%80%E6%82%A6-simpread/ijllcpnolfcooahcekpamkbidhejabll) 或者 [离线下载](http://ksria.com/simpread/crx/1.1.2/simpread.crx) +## 目录 + +* [下载](#马上使用) + +* [入门指南](#入门指南) + +* [主要功能一览](#主要功能一览) + +* [全部功能](#全部功能) + +* [如何使用](#如何使用) + +* [简悦各平台版本之间的差异](#简悦各平台版本之间的差异) + +* [截图](#截图) + +* [提交新站](#提交新站) + +* [投票](#投票) + +* [相关链接](#相关链接) + +* [贡献者](#感谢) + +* [参与开发](#协作开发) + +* [请杯咖啡](#请杯咖啡-) + +* [开源列表](#简悦的诞生离不开它们) + +* [许可](#许可) + +*** + +## 马上使用 +* [Chrome 应用商店](https://chrome.google.com/webstore/detail/%E7%AE%80%E6%82%A6-simpread/ijllcpnolfcooahcekpamkbidhejabll) 或者 [离线下载](http://ksria.com/simpread/crx/1.1.3/simpread.crx) + * [Firefox 扩展中心](https://addons.mozilla.org/zh-CN/firefox/addon/simpread) + * [支持 UserScript 的浏览器](https://greasyfork.org/zh-CN/scripts/39998) 如:Apple Safari · Microsoft Edge · Opera · Dolphin 详细 [请看这里](https://github.com/Kenshin/simpread-little) -* [iOS( iPhone / iPad )版](https://xteko.com/redir?url=http://sr.ksria.cn/jsbox/simpread-1.0.0.box?201805251238&name=%E7%AE%80%E6%82%A6) 详细 [请看这里](http://ksria.com/simpread/docs/#/JSBox) -* 现在就加入 [Telegram 群](https://t.me/simpread),获取简悦的第一手资料。 -* 不同简悦如何使用?想知道简悦的高级功能,请看简悦的 [帮助中心](http://ksria.com/simpread/docs/#) 。 +* [iPhone / iPad 版](https://xteko.com/redir?url=http://sr.ksria.cn/jsbox/simpread-1.0.0.box?201805251238&name=%E7%AE%80%E6%82%A6) 详细 [请看这里](http://ksria.com/simpread/docs/#/JSBox) + +* [Android 版](http://ksria.com/simpread/docs/#/Android) 详细 [请看这里](http://ksria.com/simpread/docs/#/Android) + +## 入门指南 -#### 主要功能一览: -- [聚焦模式](http://ksria.com/simpread/docs/#/聚焦模式): +* 简悦的内容较多,汇总到了一个页面 [新闻页](https://simp.red/news) + +* 喜欢简悦,但不会用,对新手极度舒适的 [新手入门](http://ksria.com/simpread/guide) + +* 参与讨论请加入 [Telegram 群](https://t.me/simpread) + +* 想知道简悦的高级玩法,请看简悦的 [文档中心](http://ksria.com/simpread/docs/#) + +* 更多联系方式请看 [相关链接](#相关链接) + +## 主要功能一览 +- [聚焦模式](http://ksria.com/simpread/docs/#/聚焦模式) 不改变当前页面的结构,仅仅高亮需要阅读的部分,不分散用户的注意力;适合 `临时阅读` 或者 `未适配阅读模式` 的网站 -- [阅读模式](http://ksria.com/simpread/docs/#/阅读模式): +- [阅读模式](http://ksria.com/simpread/docs/#/阅读模式) 简悦 `原创` 功能,逐一适配了 [数百种类型](https://simpread.ksria.cn/sites/) 的网站,自动提取 `标题` `描述` `正文` `媒体资源( 图片/ 视频 )` 等,生成 `符合中文阅读` 的页面 - * 支持 `自动生成目录` - - * 支持 [TXT 阅读器](http://ksria.com/simpread/docs/#/TXT-阅读器) + * 支持 [自动生成目录](http://ksria.com/simpread/docs/#/目录) * 支持 [论坛类页面及分页](http://ksria.com/simpread/docs/#/论坛类页面及分页) 如:知乎 · 百度贴吧等 * ![new纯色.png](https://i.loli.net/2018/09/05/5b8f718046acb.png) 支持 [代码段的高亮](http://ksria.com/simpread/docs/#/代码段的高亮),包含了大部分常见的网站 - * ![new纯色.png](https://i.loli.net/2018/09/05/5b8f718046acb.png) 支持 [LaTeX 解析](http://ksria.com/simpread/docs/#/LaTeX-阅读器) · [Markdown 阅读器](http://ksria.com/simpread/docs/#/Markdown-阅读器) + * 支持 [TXT 阅读器](http://ksria.com/simpread/docs/#/TXT-阅读器) · 支持 [LaTeX 解析](http://ksria.com/simpread/docs/#/LaTeX-阅读器) · [Markdown 阅读器](http://ksria.com/simpread/docs/#/Markdown-阅读器) * 更符合 `中文阅读` 习惯的设置,包括:`字间距` `行间距` 等 以及 `自定义 CSS` ,详细请看 [自定义样式](http://ksria.com/simpread/docs/#/自定义样式) -- 临时阅读模式: - 将 `非适配阅读模式的页面` 生成 `阅读模式` 一样的排版,支持任意页面,详细请看 [临时阅读模式](http://ksria.com/simpread/docs/#/临时阅读模式) 以及 [操作](http://ksria.com/simpread/welcome/version_1.0.5.html#temp-read-mode) - -- 主动适配: +- 主动适配 通过简单的一个步骤,就可以让 `非适配页面` 支持阅读模式,详细请看 [主动适配](http://ksria.com/simpread/docs/#/主动适配阅读模式) 以及 [操作](http://ksria.com/simpread/welcome/version_1.0.5.html#mate-read-mode) -- 智能适配: +- ![new纯色.png](https://i.loli.net/2018/09/05/5b8f718046acb.png) 智能适配 - * ![new纯色.png](https://i.loli.net/2018/09/05/5b8f718046acb.png) 全新的 `词法分析引擎`,更智能、更精准的提取正文,辅以精准适配,任意网页均「不在话下」,不仅能自动识别出 Wordpress · Hexo · Ghost · Discuz 等博客 / 论坛的页面,甚至于只要是结构良好的页面,(无需适配)自动生成阅读模式,详细请看 [词法分析引擎](http://ksria.com/simpread/docs/#/词法分析引擎) + 全新的 `词法分析引擎`,更智能、更精准的提取正文,辅以精准适配,任意网页均「不在话下」,不仅能自动识别出 Wordpress · Hexo · Ghost · Discuz 等博客 / 论坛的页面,甚至于只要是结构良好的页面,(无需适配)自动生成阅读模式,详细请看 [词法分析引擎](http://ksria.com/simpread/docs/#/词法分析引擎) -- 站点适配源: - 包括:`官方(主)适配源` `第三方适配源` `站点集市适配源` `自定义适配源`,详细请看 [站点适配源](http://ksria.com/simpread/docs/#/站点适配源) +- ![new纯色.png](https://i.loli.net/2018/09/05/5b8f718046acb.png) 智能感知 -- 站点编辑器: + 当生成的阅读模式出现问题时,简悦会自动重新获取正文,详细说明请看 [智能感知](http://ksria.com/simpread/docs/#/智能感知) + +- ![new纯色.png](https://i.loli.net/2018/09/05/5b8f718046acb.png) 手动框选适配 + 针对 `未适配` 或 `智能识别` 失败的情况,简悦可以使用手动框选的方式,生成阅读模式,详细请看 [手动框选](http://ksria.com/simpread/docs/#/手动框选) + +- 站点适配源 + 包括:`官方适配源` `第三方适配源` `站点集市适配源` `自定义适配源`,详细请看 [站点适配源](http://ksria.com/simpread/docs/#/站点适配源) + +- 站点编辑器 页面任意元素,均可隐藏,`可编程,定制化`,详细请看 [站点编辑器](http://ksria.com/simpread/docs/#/站点编辑器) -- 站点管理器: +- 站点管理器 可管理全部的适配站点,详细请看 [站点管理器](http://ksria.com/simpread/docs/#/站点管理器) -- ![new纯色.png](https://i.loli.net/2018/09/05/5b8f718046acb.png) 站点集市: +- 站点集市 上传并共享自己的适配站点,一键分享临时阅读模式,适配失败的站一键提交,详细请看 [站点集市](https://simpread.ksria.cn/sites) -- ![new纯色.png](https://i.loli.net/2018/09/05/5b8f718046acb.png) 插件系统: +- 插件系统 现在开始可以使用 JavaScript 编写基于 `简悦` 的插件了,更上线了 [插件中心](https://simpread.ksria.cn/plugins/) ,如何编写插件请看 → [说明文档](http://ksria.com/simpread/docs/#/插件系统) -- 多种主题: +- 多种主题 `白练、白磁、卯之花色、丁子色、娟鼠、月白、百合、紺鼠、黒鸢` 等 -- 丰富的导出功能,包括: +- 丰富的导出功能 - 导出 [Markdown](https://github.com/Kenshin/simpread#感谢) · `HTML` · `PNG` · `PDF` · [epub](http://ksria.com/simpread/docs/#/发送到-Epub) @@ -80,30 +130,40 @@ - 导出到 `Pocket` `Linnk` `Instapaper` 的功能,包括:`当前页面的链接` `稍后读` - - 导出到生产力工具,包括:`Dropbox` `Onenote` `Google Drive` `印象笔记 / Evernote`,详细请看 [授权服务](http://ksria.com/simpread/docs/#/授权服务) + - 导出到生产力工具,包括:`坚果云` `语雀` `Dropbox` `Onenote` `Google Drive` `印象笔记 / Evernote`,详细请看 [导出到生产力](http://ksria.com/simpread/docs/#/导出到生产力工具) - 同步 · 上传/下载 配置 · 同步适配列表 · [快捷键支持](http://ksria.com/simpread/docs/#/快捷键) 等; - 高级定制,包括:`右键菜单` `控制栏可隐藏` `阅读进度可隐藏` `自动进入阅读模式` [白名单](http://ksria.com/simpread/docs/#/FAQ?id=白名单) 以及 [排除列表](http://ksria.com/simpread/docs/#/FAQ?id=排除列表) 等 -- 稍后读; +- 稍后读 + +## 全部功能 -#### 截图: +

+ +
+ +## 截图 ![简单阅读,愉悦心情!](http://sr.ksria.cn/welcome-readme-1.png) -![多种导出方式](http://sr.ksria.cn/welcome-readme-3.png) -![定制化,可编程](http://sr.ksria.cn/welcome-readme-4.png) -#### 照片集: -> 包含了 `稍后读` `阅读模式 · 设置界面` `导出到生产力工具` `发送到 Kindle` `自定义样式` `同步配置` `论坛类页面 · 分页` 等功能的截图(动图) +
更多截图 + + + + + + + +
-* +## 如何使用 -#### 全部功能: -![功能一览](http://sr.ksria.cn/feature%201.1.2.png) +> 简悦虽然拥有众多功能,但它支持 **开箱即用**,新手(不想折腾党)来说,只需要看懂下面两种操作即可。 -#### 如何使用(阅读模式): +### 阅读模式 -`简悦`会自动检测当前页面是否已经适配,如适配则在浏览器右上角显示 ![Imgur](http://i.imgur.com/dyROEBi.png) ,使用以下三种方式启动: +> `简悦`会自动检测当前页面是否已经适配,如适配则在浏览器右上角显示 ![Imgur](http://i.imgur.com/dyROEBi.png) ,使用以下三种方式启动: - 点击浏览器右上角 `红色icon`; @@ -111,15 +171,21 @@ - 快捷键;(默认为 双击 A ) +- 简悦支持自动进入阅读模式,详细请看 [自动进入阅读模式](http://ksria.com/simpread/docs/#/自动进入阅读模式) + +### 聚焦模式 -#### 如何使用(聚焦模式): -`聚焦模式` 会自动获取当前鼠标所在的段落并高亮,适合任意页面。 +> `聚焦模式` 会自动获取当前鼠标所在的段落并高亮,适合任意页面。 - 在需要高亮的区域,右键选择 `简悦 - SimpRead` → `聚焦模式`; - 快捷键;(默认为 A S ) -#### 提交新站: +## 简悦各平台版本之间的差异 + +> 包括:Chrome / Firefox / 轻阅版(UserScript)/ JSBox ,请访问 [简悦 · 新闻页](https://www.notion.so/9c109ec145134297ab461f5b52dbadc7?v=ce94e37d8a794cfbbd39bf9dfaf9017a) + +## 提交新站 * 方式1:通过 **提交到 站点集市** 的方式,详细请看 [站点管理器 · 上传](http://ksria.com/simpread/docs/#/站点管理器?id=上传) @@ -128,37 +194,52 @@ * 方式3:通过 **新增站点编辑器** 的方式(适合逐一添加单个新站),详细说明 [请看这里](http://ksria.com/simpread/docs/#/站点编辑器?id=如何新增修改); -* 方式4:通过 **提交适配源** 的方式(适合同时添加多个新站),详细说明请看 [使用自定义适配源](http://ksria.com/simpread/docs/#/站点适配源?id=如何提交到简悦的官方(次)适配源) +* 方式4:通过 **提交适配源** 的方式(适合同时添加多个新站),详细说明请看 [使用自定义适配源](http://ksria.com/simpread/docs/#/如何提交第三方适配源); * 更多说明请看 [站点编辑器](http://ksria.com/simpread/docs/#/站点编辑器) [站点管理](http://ksria.com/simpread/docs/#/站点管理器) [站点适配源](http://ksria.com/simpread/docs/#/站点适配源); -#### Chrome / Firefox / 轻阅版(UserScript)功能差别: -![Chrome / Firefox / 轻阅版(UserScript)功能差别](https://i.imgur.com/z4WI7uK.png) - -#### 投票: +## 投票 简悦是一个免费并开源的项目。如果觉得不错,请给我 [投票](https://chrome.google.com/webstore/detail/%E7%AE%80%E6%82%A6-simpread/ijllcpnolfcooahcekpamkbidhejabll/reviews) 。这样让更多人了解并受用与 `简悦` 带来的便利,你的认可是对我最大的鼓励。 -#### 相关链接: +## 相关链接 * [更新日志](http://ksria.com/simpread/changelog.html) + * [帮助中心](http://ksria.com/simpread/docs/#) -* [新手入门](http://ksria.com/simpread/docs/#/入门指南(-操作指引-)) + +* [新手入门](http://ksria.com/simpread/guide) + * [常见问题](http://ksria.com/simpread/docs/#/FAQ) + * [反馈](https://github.com/kenshin/simpread/issues) + * [联系](http://kenshin.wang) · [邮件](kenshin@ksria.com) · [微博](http://weibo.com/23784148) · [Telegram 群](https://t.me/simpread) -* 想了解简悦背后的故事? [猛击这里](https://sspai.com/post/39491) -#### 感谢: -- [ksky521](https://github.com/ksky521) 提供 `minimatch` 和 `markdown转换功能` ,解决了 [Fix 11](https://github.com/kenshin/simpread/issues/11),详细请看 Pull requests [#16](https://github.com/kenshin/simpread/pull/16); -- [airycanon](https://github.com/airycanon) Pull requests 详细请看 [#23](https://github.com/kenshin/simpread/pull/23) [#44](https://github.com/kenshin/simpread/pull/44) [#124](https://github.com/kenshin/simpread/pull/124); -- [mikelei8291](https://github.com/mikelei8291) 详细请看 Pull requests [#114](https://github.com/kenshin/simpread/pull/114); +## 感谢 -#### 简悦的诞生离不开它们: +[ksky521](https://github.com/ksky521) · [airycanon](https://github.com/airycanon) · [mikelei8291](https://github.com/mikelei8291) · [chenhbc](https://github.com/chenhbc) · [Nihility](https://github.com/NihilityT) · [WangLeto](https://github.com/WangLeto) · [SevenSteven](https://github.com/Seven-Steven) · [Leo](https://github.com/clinyong) · [Jonas · Gao](https://github.com/JonasGao) · [Cologler](https://github.com/Cologler) · [bgh](https://github.com/bldght) · [Ronglong Pu](https://github.com/PuRonglong) + +## 协作开发 + +> Pull requests 方式: + +* 请务必从 **develop** 分支开始;( **注意:非 develop 分支的 pr 将不会被合并** ) + +* Pull requests + +* 如果需要合并的话,合并后我会通知你;(在下个版本发布时一起发布) + +## 请杯咖啡 ☕ +如果简悦可以解决你在阅读上痛点,提升 Web 端的阅读体验,可以请我喝杯咖啡,想必也是非常愉悦的事情。 :smile: +_如发现下图显示不全,请直接访问 http://sr.ksria.cn/zhifu_m2.png_ +![支付](http://sr.ksria.cn/zhifu_m2.png) + +## 简悦的诞生离不开它们 - [Node.js](https://nodejs.org/) · [NPM](https://www.npmjs.com) - [Webpack](https://webpack.github.io/) - [React](https://facebook.github.io/react) - [ES6](http://es6-features.org/) · [Babel](https://babeljs.io) - [PostCSS](http://postcss.org/) · [cssnext](http://cssnext.io/) -- [jQuery](https://jquery.com/) · [Mousetrap](https://craig.is/killing/mice) · [pangu.js](https://github.com/vinta/pangu.js) · [ProgressBar.js](https://kimmobrunfeldt.github.io/progressbar.js/) · [timego.js](http://timeago.org/) · [Velocity.js](http://velocityjs.org/) · [minimatch](https://github.com/isaacs/minimatch) · [to-markdown](https://github.com/domchristie/to-markdown) · [FileSaver.js](https://github.com/eligrey/FileSaver.js) · [dom-to-image](https://github.com/tsayen/dom-to-image) +- [jQuery](https://jquery.com/) · [Mousetrap](https://craig.is/killing/mice) · [pangu.js](https://github.com/vinta/pangu.js) · [ProgressBar.js](https://kimmobrunfeldt.github.io/progressbar.js/) · [timego.js](http://timeago.org/) · [Velocity.js](http://velocityjs.org/) · [minimatch](https://github.com/isaacs/minimatch) · [to-markdown](https://github.com/domchristie/to-markdown) · [FileSaver.js](https://github.com/eligrey/FileSaver.js) · [dom-to-image](https://github.com/tsayen/dom-to-image) · [WebDAV]( https://github.com/aslakhellesoy/webdavjs) - [Visual Studio Code](https://code.visualstudio.com/) - [Sketch](https://www.sketchapp.com/) · [Pixelmator](http://www.pixelmator.com/) - Icon from @@ -168,37 +249,17 @@ - Mind Maps - 咖啡 · 网易音乐 · Google Chrome · rMBP -#### 协作开发: -- Pull requests 方式: - * 请从 `develop` 分支开始;( 注意:非 develop 分支的 pr 将不会合并;) - * Pull requests - * 如果需要合并的话,合并后我会通知你;(在下个版本发布时一起发布) - -- 源代码编译: - * git clone https://github.com/Kenshin/simpread.git - * cd simpread - * npm install - * npm run develop ( for Mac ) 用于开发 - * npm run publish ( for Mac ) 用于发布 - * npmw run develop ( for Win ) 用于开发 - * npmw run publish ( for Win ) 用于发布 - -#### 请杯咖啡: -如果简悦可以解决你在阅读上痛点,提升 Web 端的阅读体验,可以请我喝杯咖啡,想必也是非常愉悦的事情。 :smile: -_如发现下图显示不全,请直接访问 http://sr.ksria.cn/zhifu_m2.png_ -![支付](http://sr.ksria.cn/zhifu_m2.png) - -#### 许可: +## 许可 [![license-badge]][license-link] [www-badge]: https://img.shields.io/badge/website-_simpread.ksria.com-1DBA90.svg [www-link]: http://ksria.com/simpread -[version-badge]: https://img.shields.io/badge/lastest_version-1.1.2-blue.svg +[version-badge]: https://img.shields.io/badge/lastest_version-1.1.3-blue.svg [version-link]: https://github.com/kenshin/simpread/releases [chrome-badge]: https://img.shields.io/badge/download-_chrome_webstore-brightgreen.svg [chrome-link]: https://chrome.google.com/webstore/detail/%E7%AE%80%E6%82%A6-simpread/ijllcpnolfcooahcekpamkbidhejabll [offline-badge]: https://img.shields.io/badge/download-_crx-brightgreen.svg -[offline-link]: http://ksria.com/simpread/crx/1.1.2/simpread.crx +[offline-link]: http://ksria.com/simpread/crx/1.1.3/simpread.crx [license-badge]: https://img.shields.io/github/license/mashape/apistatus.svg [license-link]: https://opensource.org/licenses/MIT diff --git a/package.json b/package.json index 7e0fda073..d83cd6f28 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "node": ">= 0.10.0" }, "scripts": { - "develop": "cross-env NODE_ENV=development webpack --devtool=source-map --progress --colors --watch", + "develop": "cross-env NODE_ENV=development webpack --devtool=eval-source-map --progress --colors --watch", "publish": "cross-env NODE_ENV=production webpack -p --progress --colors", "ext_dev": "cross-env NODE_ENV=development webpack --devtool=source-map --progress --colors --watch --config webpack.config.ext.js", "ext_pub": "cross-env NODE_ENV=production webpack -p --progress --color --config webpack.config.ext.js", diff --git a/src/assets/css/options_notice.css b/src/assets/css/options_notice.css new file mode 100644 index 000000000..e5f8ac421 --- /dev/null +++ b/src/assets/css/options_notice.css @@ -0,0 +1,196 @@ +.header { + background-color: #16666f; + opacity: 1; + visibility: visible; +} + +.notice { + margin-top: 65px; + width: 100%; +} + +.notice notice { + display: flex; + flex-direction: row; + + width: 100%; +} + +notice .loading, +notice .failed { + position: fixed; + + top: 0; + left: 0; + + display: flex; + justify-content: center; + align-items: center; + + width: 100%; + height: 100%; + + background-color: #fff; +} + +notice .loading svg { + transform: scale(.8); +} + +notice .failed { + flex-direction: column; +} + +notice .failed span { + color: #9b9b9b; + font-size: 2.5rem; +} + +notice .list { + margin: 20px 20px 0; + width: 300px; + min-height: 589px; +} + +notice .list.controlbar { + min-height: initial; +} + +notice .detail { + display: flex; + justify-content: center; + + margin: 20px 20px 0 0; + padding: 39px 24px 0px; + + width: 100%; + background-color: #fff; + border-radius: 2px; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); +} + +notice .detail img { + width: 60%; +} + +notice .detail .empty { + display: flex; + justify-content: center; + flex-direction: column; + align-items: center; + + padding-bottom: 39px; + min-height: 550px; + + color: #9b9b9b; + font-size: 2.6rem; + font-weight: 400; +} + +notice .detail .empty .icon { + width: 80px; + height: 80px; + background-position: center; + background-repeat: no-repeat; + background-image: url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAHdElNRQfhBA0LLBOn/NkLAAABtklEQVRYw+2YPyxDURTGf5WOGCwiETH7s4kaDJo2FokYMBglZ66lOtGEqWIQm9zdoJouGERIEwNlE4NE4i0iBoO0CxIMvW1f26evvJY86Tfdc3LP99137vvuTa6HqlAwzxI9X064ISrxagweE5mfOXp18CHjoCDJFHbYlBCAOiywGWzLSYmAauUIn6koI+2g/Bzb0gMMyDWoZ9pNuTQByUKLbkSyhD6PyZroYcwiN0xSoQUYJGhZ+FKjwKtlNsggeAEIFJIbnJqm7BKpSeAIgHkdjbKgRwGucgIdOrEuYXOdXKo1Fm3pF+QOQBI6Tqg3wnleb8nUVHmtRNQBQueX5AZbclmRTVFYqBcbSKpS9jtocVLcFGgK/I6AhQ/UEPHCsf09GMyU287KaBc/Xm4vF+YbBv5oDzYd8FXUWrRIQoQa+wV1hfsFmj6whTt9IPvFRv3L39Q51AR7AKzKctMHtnCnD2wE6oAbpgF4bJCA3HKbH7vcaCsSdf9ZVCrQVyfW/uIwtwdZHcXUEzuSccKt2pglpoOsfkpQPs4a0p8ROc+1KI3RAHqDdPExpIv78nPQId7plgf4BCjPbVayklPeAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA0LTEzVDExOjQ0OjE5KzA4OjAwPYuVdQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wNC0xM1QxMTo0NDoxOSswODowMEzWLckAAAAASUVORK5CYII= ); +} + +notice .detail .preview { + width: 100%; +} + +notice .detail .preview .title { + margin-bottom: 20px; + + font-family: PingFang SC,Hiragino Sans GB,Microsoft Yahei,WenQuanYi Micro Hei,sans-serif; + font-size: 3.4rem; + font-weight: 400; + line-height: 1.2; + + overflow: hidden; + text-overflow: ellipsis; + text-rendering: optimizelegibility; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; +} + +notice .detail .preview .desc { + margin-bottom: 20px; + padding-bottom: 20px; + + border-bottom: 1px solid #E0E0E0; +} + +notice .list { + background-color: #fff; + border-radius: 2px; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); +} + +notice list { + display: flex!important; + flex-direction: column; + + padding: 16px; + min-height: 72px; + + border-bottom: 1px solid #E0E0E0; + transition : all 1s cubic-bezier(0.23, 1, 0.32, 1) 0ms; +} + +notice list:hover { + background-color: #f5f5f5; + transition : all 1s cubic-bezier(0.23, 1, 0.32, 1) 0ms; +} + +notice list:hover .meta { + opacity: 1; +} + +notice list.active { + opacity: .5; +} + +notice list.selected { + background-color: #e1f5fe; + border-left: 4px solid #29b6f6; +} + +notice list.active .title { + text-decoration: line-through; +} + +notice list .title { + margin-bottom: 4px; + padding-right: 25px; + + font-size: 1.5rem; + font-weight: 500; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +notice list .category, +notice .detail .preview .category { + margin-right: 4px; + padding: 2px 7px; + padding: 2px 4px; + + color: #fff; + + font-weight: 400; + font-size: 0.8rem; + border-radius: 2px; +} + +notice list .meta { + position: absolute; + right: 0; + opacity: 0; + transition : all 1s cubic-bezier(0.23, 1, 0.32, 1) 0ms; +} + +notice .date { + color: #9e9e9e; +} \ No newline at end of file diff --git a/src/assets/css/options_page.css b/src/assets/css/options_page.css index 8fca02ce9..fc6e68198 100644 --- a/src/assets/css/options_page.css +++ b/src/assets/css/options_page.css @@ -1,3 +1,6 @@ +/** + * Options page style + */ :root { --text-color: #333; @@ -217,7 +220,6 @@ a { /*line-height: 37px;*/ user-select: none; - cursor: pointer; } #labs .more .desc { @@ -239,6 +241,10 @@ a { background-repeat: no-repeat; } +/** + * Plugins & sites Card + */ + cards { display: flex; flex-flow: row wrap; @@ -364,6 +370,9 @@ card-empty a { font-weight: 500; } +/** + * Account + */ .avatar { margin: 10px; padding: 5px; @@ -382,3 +391,273 @@ card-empty a { border: 5px solid #fff; box-shadow: 0 10px 20px 0 rgba(168,182,191,0.6); } + +/** + * Notice bubbles + */ + .bubbles { + position: fixed; + bottom: 20px; + + display: flex; + justify-content: center; + align-content: center; + + padding: 10px; + + width: 55px; + height: 56px; + + border-radius: 50%; + + box-shadow: 0 2px 6px 0 rgba(0,0,0,.4); + + cursor: pointer; + transition: all 500ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; +} + +.bubbles.notice { + right: 94px; + background-color: #16666f; +} + +.bubbles.notice:hover { + background-color: rgba(22, 102, 111, .8); +} + +.bubbles i { + display: flex; + justify-content: center; + align-items: center; +} + +.bubbles em { + position: absolute; + top: 6px; + right: 11px; + + width: 18px; + height: 18px; + line-height: 18px; + + color: #fff; + background-color: #e54545; + + font-weight: bold; + text-align: center; + font-style: initial; + border-radius: 50%; +} + +.bubbles em.init { + line-height: 9px; +} + +.bubbles.effect { + animation-name: popup; + animation-duration: 1s; +} + +/** + * Help bubbles + */ +.bubbles.help { + right: 24px; + background-color: #607D8B; +} + +.help:hover { + background-color: rgba(96, 125, 139, .8); +} + +@keyframes popup { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + transform: translateY(20px) + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0) + } +} + +@keyframes popdown { + 0% { + opacity: 0; + transform: translateY(-20px) + } + + 100% { + opacity: 1; + transform: translateY(0) + } +} + +@keyframes popclose { + 0% { + opacity: 1; + transform: translateY(0px) + } + + 100% { + opacity: 0; + transform: translateY(20px) + } +} + +/** + * Guide + */ +.guide-bg { + position: fixed; + right: 10px; + bottom: 90px; + + animation-name: popup; + animation-duration: 1s; + + z-index: 2147483647; +} + +.guide { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-content: center; + + width: 350px; + height: 400px; + + background-color: #F5F6F6; + + border-radius: 2px; + box-shadow: 0 0 2px rgba(0, 0, 0, .12), 0 2px 2px rgba(0, 0, 0, .26); + + overflow-x: hidden; + overflow-y: auto; +} + +.guide .title, +.guide .subtitle { + height: 48px; + line-height: 48px; + + color: #fff; + background-color: #26d07c; + + font-size: 17px; + text-align: center; + + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +.guide .title { + position: absolute; + + left: 0; + right: 15px; + + display: flex; + justify-content: center; + font-weight: bold; + + z-index: 2; +} + +.guide .title span { + animation: .1s reverse fadein,235ms cubic-bezier(.4,0,.2,1) popdown; +} + +.guide .subtitle { + display: flex; + justify-content: center; + align-items: flex-start; + + margin-top: 48px; + + min-height: 55px; + line-height: initial; + + font-size: 15px; +} + +.guide .loading { + display: flex; + justify-content: center; + align-items: center; + + margin-bottom: 20px; + + font-weight: 500; + font-size: 13px; + + transition : opacity 1s cubic-bezier(0.23, 1, 0.32, 1) 0ms; +} + +.guide .loading span { + padding: 5px; +} + +.guide .group { + margin-top: -30px; + padding: 10px; +} + +guid-card { + display: flex; + + margin-bottom: 10px; + padding: 20px; + + width: 100%; + + background-color: #ffffff; + + border-radius: 4px; + box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(193, 203, 212, 0.7) 0px 0px 0px 1px inset, rgb(193, 203, 212) 0px -1px 0px 0px inset; + transition: all 550ms cubic-bezier(0.23, 1, 0.32, 1) 0s; + + cursor: pointer; +} + +guid-card:hover { + box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(193, 203, 212, 0.7) 0px 0px 0px 1px inset, rgb(193, 203, 212) 0px -1px 0px 0px inset; + transform: translate(0px, -2px); +} + +guid-card-tips span { + margin-left: 5px; + font-size: 14px; + color: #0B242F; +} + +.guide hr { + margin: 0; + border: 0; + + text-align: center; + overflow: visible; +} + +.guide hr:before { + content: '...'; + + position: relative; + top: -10px; + + display: inline-block; + + margin-left: .6em; + + color: rgba(0,0,0,.68); + + font-family: medium-content-slab-serif-font,Georgia,Cambria,"Times New Roman",Times,serif; + font-weight: 400; + font-style: italic; + font-size: 30px; + letter-spacing: .6em; +} diff --git a/src/assets/css/option.css b/src/assets/css/setting.css similarity index 50% rename from src/assets/css/option.css rename to src/assets/css/setting.css index ff47ba824..56f28c610 100644 --- a/src/assets/css/option.css +++ b/src/assets/css/setting.css @@ -1,14 +1,14 @@ /** - * Option: Focus/Read mode - */ + * Setting: Focus/Read setting dailog +*/ + sr-opt-focus, sr-opt-read { display: -webkit-flex; flex-direction:column; width: 100%; - /*height: 100%;*/ } sr-opt-gp { @@ -81,73 +81,3 @@ sr-opt-theme:not(:first-child) { sr-opt-theme[sr-type="active"] { box-shadow: 0 3px 3px 0 rgba(0,0,0,0.14),0 2px 20px 0 rgba(0,0,0,0.12),0 3px 1px -2px rgba(0,0,0,0.7); } - -/* -opacity { - margin: 8px 0 0 0; - - width: 100%; - height: 37px; -} - -opacity input[type=range] { - width: 100%; - - margin: 6px 0; - padding: 0; - - border: none; - background-color: transparent; - -webkit-appearance: none; -} - -opacity input[type=range]:focus { - outline: none; -} - -opacity input[type=range]::-webkit-slider-runnable-track { - width: 100%; - height: 1px; - - background: #9e9e9e; - - box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.5), 0px 0px 0px rgba(13, 13, 13, 0.5); - border-radius: 1.3px; - - transition: all 0.3s; - cursor: pointer; -} - -opacity input[type=range]::-webkit-slider-runnable-track:hover { - background: #00897B; -} - -opacity input[type=range]::-webkit-slider-thumb { - height: 20px; - width: 20px; - - margin-top: -9px; - - background: rgba(0, 137, 123, 1); - - box-shadow: 1px 1px 1px rgba(0, 0, 0, 0), 0px 0px 1px rgba(13, 13, 13, 0); - border: 1px solid rgba(0, 0, 0, 0); - border-radius: 50px; - - cursor: pointer; - -webkit-appearance: none; - transition: all .5s ease-in-out .1s; -} - -opacity input[type=range]:focus::-webkit-slider-thumb { - background: #00897B; -} - -opacity input[type=range]:focus::-webkit-slider-thumb:hover { - background: #00695C; -} - -opacity input[type=range]:focus::-webkit-slider-runnable-track { - background: #00897B; -} -*/ \ No newline at end of file diff --git a/src/assets/css/simpread.css b/src/assets/css/simpread.css index b620305d2..4a0cfa213 100644 --- a/src/assets/css/simpread.css +++ b/src/assets/css/simpread.css @@ -1,5 +1,5 @@ /** - * Golbal style + * SimpRead */ .simpread-font { @@ -189,7 +189,8 @@ sr-rd-footer-copywrite .sr-icon:hover { } sr-rd-footer-copywrite a, -sr-rd-footer-copywrite a:link { +sr-rd-footer-copywrite a:link, +sr-rd-footer-copywrite a:visited { margin: 0; padding: 0; @@ -262,11 +263,59 @@ sr-rd-crlbar.controlbar:hover { * Highlight */ .simpread-highlight-selector { - background-color: #fafafa; - outline: 3px dashed #1976d2; - opacity: .8; + background-color: #fafafa !important; + outline: 3px dashed #1976d2 !important; + opacity: .8 !important; + cursor: pointer !important; + transition: opacity .5s ease !important; +} + +.simpread-highlight-controlbar { + position: relative !important; + background-color: #fafafa !important; + outline: 3px dashed #1976d2 !important; + opacity: .8 !important; + transition: opacity .5s ease !important; +} + + +simpread-highlight { + position: fixed; + + top: 0; + left: 0; + right: 0; + + display: flex; + justify-content: center; + align-items: center; + + padding: 15px; + + height: 50px; + + background-color: rgba(50, 50, 50, .9); + box-shadow: 0 2px 5px rgba(0, 0, 0, .26); + + z-index: 2147483640; +} + +sr-highlight-ctl { + display: flex; + justify-content: center; + align-items: center; + + margin: 0 5px; + + width: 50px; + height: 20px; + + color: #fff; + background-color: #1976d2; + + border-radius: 4px; + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0,0,0,.12); cursor: pointer; - transition: opacity .5s ease; } /** @@ -276,8 +325,8 @@ toc-bg { position: fixed; left: 0; top: 0; - width: 200px; - height: 500px; + width: 50px; + height: 200px; font-size: initial; } @@ -296,6 +345,10 @@ toc-bg:hover { z-index: 3; } +.toc-bg-hidden:hover toc { + width: 180px; +} + toc * { all: unset; } @@ -311,15 +364,31 @@ toc { padding: 10px; + width: 0; max-width: 200px; max-height: 500px; overflow-x: hidden; + overflow-y: hidden; cursor: pointer; border: 1px solid rgba(158, 158, 158, 0.22); - transition: width 1.5s; + transition: width .5s; +} + +toc:hover { + overflow-y: auto; +} + +toc::-webkit-scrollbar { + width: 3px; +} + +toc::-webkit-scrollbar-thumb { + border-radius: 10px; + background-color: rgba(139,137,134,0.5); } + toc outline { position: relative; display: -webkit-box; @@ -328,7 +397,7 @@ toc outline { overflow: hidden; text-overflow: ellipsis; - margin: 2px 0; + padding: 2px 0; min-height: 21px; line-height: 21px; @@ -340,14 +409,21 @@ toc outline a:active, toc outline a:visited, toc outline a:focus { + display: block; + + width: 100%; + color: inherit; font-size: 11px; text-decoration: none!important; + + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } toc outline a:hover { font-weight: bold!important; - text-decoration: underline!important; } toc outline a.toc-outline-theme-dark, @@ -355,8 +431,11 @@ toc outline a.toc-outline-theme-night { color: #fff!important; } +.toc-level-h1 { + padding-left: 5px; +} .toc-level-h2 { - padding-left: 10px; + padding-left: 15px; } .toc-level-h3 { padding-left: 25px; @@ -366,17 +445,20 @@ toc outline a.toc-outline-theme-night { } .toc-outline-active { - background-color: rgb(244, 67, 54); + border-left: 2px solid rgb(244, 67, 54); } toc outline active { position: absolute; - right: 0; + left: 0; top: 0; bottom: 0; padding: 0 0 0 3px; + + border-left: 2px solid #e8e8e8; + } /** @@ -415,7 +497,7 @@ kbd-mapping { flex-flow: row; width: 500px; - height: 550px; + height: 590px; background-color: #fff; diff --git a/src/assets/css/theme_common.css b/src/assets/css/theme_common.css index 430be3b97..0d8601f43 100644 --- a/src/assets/css/theme_common.css +++ b/src/assets/css/theme_common.css @@ -4,7 +4,7 @@ * sr-rd-title, sr-rd-desc, sr-rd-content, p, div, a, img, pre, code, sr-blockquote, ul ol */ - .simpread-theme-root { +.simpread-theme-root { font-size: 62.5%!important; } @@ -264,12 +264,11 @@ sr-rd-mult { padding: 16px 0 24px; width: 100%; - min-width: 840.72px; - background-color: #fafafa; + background-color: #fff; - border-radius: 2px; - box-shadow: 0 1px 5px rgba(0, 0, 0, 0.16); + border-radius: 4px; + box-shadow: 0px 1px 2px 0px rgba(60,64,67,0.3), 0px 2px 6px 2px rgba(60,64,67,0.15); } sr-rd-mult:hover { diff --git a/src/assets/css/theme_dark.css b/src/assets/css/theme_dark.css index f1cda3347..0b059d2ec 100644 --- a/src/assets/css/theme_dark.css +++ b/src/assets/css/theme_dark.css @@ -23,7 +23,7 @@ sr-rd-content sr-blockquote { * Custom style, include: background; title; desc; sr-rd-content; p,div; a; pre */ -.simpread-theme-root { +.simpread-theme-root, .simpread-multi-root { color: rgb(235, 235, 235); background: rgb(34, 34, 34); } diff --git a/src/assets/css/theme_engwrite.css b/src/assets/css/theme_engwrite.css index f921b5bd8..fe31e4c06 100644 --- a/src/assets/css/theme_engwrite.css +++ b/src/assets/css/theme_engwrite.css @@ -31,7 +31,7 @@ sr-blockquote >:last-child { * Custom style, include: background; title; desc; sr-rd-content; p,div; a; pre */ -.simpread-theme-root { +.simpread-theme-root, .simpread-multi-root { background-color: rgb(252, 245, 237); color: rgb(51, 51, 51); } diff --git a/src/assets/css/theme_github.css b/src/assets/css/theme_github.css index 2368be8e0..86367ccda 100644 --- a/src/assets/css/theme_github.css +++ b/src/assets/css/theme_github.css @@ -89,4 +89,12 @@ sr-rd-content li code, sr-rd-content p code { background-color: rgba(0,0,0,0.04); border-radius: 3px; +} + +/** + * Multiple page + */ + +.simpread-multi-root { + background: #F8F9FA; } \ No newline at end of file diff --git a/src/assets/css/theme_gothic.css b/src/assets/css/theme_gothic.css index c76584835..e220e3005 100644 --- a/src/assets/css/theme_gothic.css +++ b/src/assets/css/theme_gothic.css @@ -26,7 +26,7 @@ sr-rd-content sr-blockquote p { * Custom style, include: background; title; desc; sr-rd-content; p,div; a; pre */ -.simpread-theme-root { +.simpread-theme-root, .simpread-multi-root { background: rgb(252, 252, 252); color: #333; } diff --git a/src/assets/css/theme_monospace.css b/src/assets/css/theme_monospace.css index b3dbe0dcb..5655cccfb 100644 --- a/src/assets/css/theme_monospace.css +++ b/src/assets/css/theme_monospace.css @@ -84,4 +84,12 @@ sr-rd-content li code, sr-rd-content p code { color: #949415; background-color: transparent; +} + +/** + * Multiple page + */ + +.simpread-multi-root { + background: #F8F9FA; } \ No newline at end of file diff --git a/src/assets/css/theme_newsprint.css b/src/assets/css/theme_newsprint.css index 974f7f407..96ccfc9a5 100644 --- a/src/assets/css/theme_newsprint.css +++ b/src/assets/css/theme_newsprint.css @@ -28,7 +28,7 @@ sr-rd-content sr-blockquote:before { * Custom style, include: background; title; desc; sr-rd-content; p,div; a; pre */ -.simpread-theme-root { +.simpread-theme-root, .simpread-multi-root { background-color: #f3f2ee; color: #2C3E50; } diff --git a/src/assets/css/theme_night.css b/src/assets/css/theme_night.css index eeaa0b2b3..90a969ba2 100644 --- a/src/assets/css/theme_night.css +++ b/src/assets/css/theme_night.css @@ -23,7 +23,7 @@ sr-rd-content sr-blockquote { * Custom style, include: background; title; desc; sr-rd-content; p,div; a; pre */ -.simpread-theme-root { +.simpread-theme-root, .simpread-multi-root { background: rgb(54, 59, 64); color: #b8bfc6; } diff --git a/src/assets/css/theme_octopress.css b/src/assets/css/theme_octopress.css index c9133adfc..eebcf2ece 100644 --- a/src/assets/css/theme_octopress.css +++ b/src/assets/css/theme_octopress.css @@ -23,7 +23,7 @@ sr-rd-content sr-blockquote { * Custom style, include: background; title; desc; sr-rd-content; p,div; a; pre */ -.simpread-theme-root { +.simpread-theme-root, .simpread-multi-root { background: #f8f8f8 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC') top left; color: #333; } diff --git a/src/assets/css/theme_pixyii.css b/src/assets/css/theme_pixyii.css index f7cd2c7d3..551b3ff6f 100644 --- a/src/assets/css/theme_pixyii.css +++ b/src/assets/css/theme_pixyii.css @@ -92,4 +92,12 @@ sr-rd-content li code, sr-rd-content p code { color: rgb(122, 122, 122); background-color: transparent; +} + +/** + * Multiple page + */ + + .simpread-multi-root { + background: #F8F9FA; } \ No newline at end of file diff --git a/src/assets/images/sync_icon.png b/src/assets/images/dropbox_icon.png similarity index 100% rename from src/assets/images/sync_icon.png rename to src/assets/images/dropbox_icon.png diff --git a/src/assets/images/jianguo_icon.png b/src/assets/images/jianguo_icon.png new file mode 100644 index 000000000..497993df6 Binary files /dev/null and b/src/assets/images/jianguo_icon.png differ diff --git a/src/assets/images/plugin_icon.png b/src/assets/images/plugin_icon.png new file mode 100644 index 000000000..8b0e18a0e Binary files /dev/null and b/src/assets/images/plugin_icon.png differ diff --git a/src/assets/images/read_icon.png b/src/assets/images/read_icon.png new file mode 100644 index 000000000..ea27184ae Binary files /dev/null and b/src/assets/images/read_icon.png differ diff --git a/src/assets/images/webdav_icon.png b/src/assets/images/webdav_icon.png new file mode 100644 index 000000000..f533f7988 Binary files /dev/null and b/src/assets/images/webdav_icon.png differ diff --git a/src/assets/images/yuque_icon.png b/src/assets/images/yuque_icon.png new file mode 100644 index 000000000..696ac1f3b Binary files /dev/null and b/src/assets/images/yuque_icon.png differ diff --git a/src/background.js b/src/background.js index 269cc1926..1f2c315fb 100644 --- a/src/background.js +++ b/src/background.js @@ -7,6 +7,7 @@ import {browser} from 'browser'; import * as ver from 'version'; import * as menu from 'menu'; import * as watch from 'watch'; +import * as WebDAV from 'webdav'; import PureRead from 'puread'; @@ -47,6 +48,7 @@ storage.Read( () => { }, ver.FixSubver( ver.patch, storage.simpread )); } menu.CreateAll(); + setTimeout( ()=>uninstall(), 100 ); }); /** @@ -83,18 +85,63 @@ menu.OnClicked( ( info, tab ) => { * Listen runtime message, include: `corb` */ browser.runtime.onMessage.addListener( function( request, sender, sendResponse ) { - if ( request.type == msg.MESSAGE_ACTION.CORB ) { - $.ajax( request.value.settings ) - .done( result => { - sendResponse({ done: result }); - }) - .fail( ( jqXHR, textStatus, errorThrown ) => { - sendResponse({ fail: { jqXHR, textStatus, errorThrown }}); + if ( request.type == msg.MESSAGE_ACTION.CORB ) { + $.ajax( request.value.settings ) + .done( result => { + sendResponse({ done: result }); + }) + .fail( ( jqXHR, textStatus, errorThrown ) => { + sendResponse({ fail: { jqXHR, textStatus, errorThrown }}); + }); + } + return true; +}); + +/** + * Listen runtime message, include: `jianguo` + */ +browser.runtime.onMessage.addListener( function( request, sender, sendResponse ) { + if ( request.type == msg.MESSAGE_ACTION.jianguo ) { + const { url, user, password, method } = request.value; + const dav = new WebDAV.Fs( url, user, password ); + if ( method.type == "folder" ) { + dav.dir( method.root ).mkdir( result => { + dav.dir( method.root + "/" + method.folder ).mkdir( result => { + sendResponse({ done: result, status: result.status }); }); + }) + } else if ( method.type == "file" ) { + dav.file( method.path ).write( method.content, result => { + sendResponse({ done: result, status: result.status }); + }); + } else if ( method.type == "read" ) { + dav.file( method.path ).read( result => { + sendResponse({ done: result.response, status: result.status }); + }); + } + } + //return true; +}); + +/** + * Listen runtime message, include: `webdav` + */ +browser.runtime.onMessage.addListener( function( request, sender, sendResponse ) { + if ( request.type == msg.MESSAGE_ACTION.WebDAV ) { + const { url, user, password, method } = request.value; + const dav = new WebDAV.Fs( url, user, password ); + if ( method.type == "folder" ) { + dav.dir( method.root ).mkdir( result => { + sendResponse({ done: result, status: result.status }); + }) + } else if ( method.type == "file" ) { + dav.file( method.root + "/" + method.name ).write( method.content, result => { + sendResponse({ done: result, status: result.status }); + }); } - return true; } -); + //return true; +}); /** * Listen runtime message, include: `shortcuts` `browser_action` @@ -307,4 +354,11 @@ function analytics() { })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-405976-12', 'auto'); ga('send', 'pageview'); +} + +/** + * Uninstall + */ +function uninstall() { + browser.runtime.setUninstallURL( storage.option.uninstall ? storage.service + "/uninstall" : "" ); } \ No newline at end of file diff --git a/src/contentscripts.js b/src/contentscripts.js index 47d8ee619..278cc7420 100644 --- a/src/contentscripts.js +++ b/src/contentscripts.js @@ -1,26 +1,27 @@ console.log( "=== simpread contentscripts load ===" ) import './assets/css/simpread.css'; -import './assets/css/option.css'; +import './assets/css/setting.css'; import 'notify_css'; import 'mintooltip'; -import Velocity from 'velocity'; -import Notify from 'notify'; +import Velocity from 'velocity'; +import Notify from 'notify'; -import {focus} from 'focus'; -import * as read from 'read'; -import * as modals from 'modals'; -import * as kbd from 'keyboard'; +import {focus} from 'focus'; +import * as read from 'read'; +import * as setting from 'setting'; +import * as kbd from 'keyboard'; +import * as highlight from 'highlight'; -import * as util from 'util'; +import * as util from 'util'; import { storage, STORAGE_MODE as mode } from 'storage'; -import * as msg from 'message'; -import {browser} from 'browser'; -import * as watch from 'watch'; +import * as msg from 'message'; +import {browser} from 'browser'; +import * as watch from 'watch'; -import PureRead from 'puread'; -import * as puplugin from 'puplugin'; +import PureRead from 'puread'; +import * as puplugin from 'puplugin'; let pr, // pure read object is_blacklist = false, @@ -45,7 +46,7 @@ storage.Read( () => { }); } else { bindShortcuts(); - autoOpen(); + preload() && autoOpen(); } }); @@ -72,6 +73,34 @@ function blacklist() { return is_blacklist; } +/** + * Preload verify + * + * @return {boolen} + */ + +function preload() { + let is_proload = true; + if ( storage.option.preload == false ) { + is_proload = false; + } else if ( storage.option.preload ) { + for ( const item of storage.option.lazyload ) { + if ( item.trim() != "" && !item.startsWith( "http" ) ) { + if ( location.hostname.includes( item ) ) { + is_proload = false; + break; + } + } else { + if ( location.href == item ) { + is_proload = false; + break; + } + } + } + } + return is_proload; +} + /** * Listen runtime message, include: `focus` `read` `shortcuts` `tab_selected` */ @@ -87,7 +116,9 @@ browser.runtime.onMessage.addListener( function( request, sender, sendResponse ) bindShortcuts(); break; case msg.MESSAGE_ACTION.tab_selected: - browserAction( request.value.is_update ); + if ( preload() == false ) { + browser.runtime.sendMessage( msg.Add( msg.MESSAGE_ACTION.browser_action, { code: 0 , url: window.location.href } )); + } else browserAction( request.value.is_update ); break; case msg.MESSAGE_ACTION.read_mode: case msg.MESSAGE_ACTION.browser_click: @@ -97,19 +128,18 @@ browser.runtime.onMessage.addListener( function( request, sender, sendResponse ) new Notify().Render( "配置文件已更新,刷新当前页面后才能生效。", "刷新", ()=>window.location.reload() ); } else { if ( storage.option.br_exit ) { - modals.Exist() && modals.Exit(); - !modals.Exist() && read.Exist( false ) ? read.Exit() : readMode(); + setting.Exist() && setting.Exit(); + !setting.Exist() && read.Exist( false ) ? read.Exit() : readMode(); } else readMode(); } }); break; case msg.MESSAGE_ACTION.pending_site: - new Notify().Render({ content: "是否提交,以便更好的适配此页面?", action: "是的", cancel: "取消", callback: type => { + new Notify().Render({ content: "是否提交,以便更好地适配此页面?", action: "是的", cancel: "取消", callback: type => { if ( type == "cancel" ) return; browser.runtime.sendMessage( msg.Add( msg.MESSAGE_ACTION.save_site, { url: location.href, site: storage.pr.current.site, uid: storage.user.uid, type: "failed" })); }}); - localStorage.removeItem( "sr-update-site" ); break; case msg.MESSAGE_ACTION.menu_whitelist: case msg.MESSAGE_ACTION.menu_exclusion: @@ -145,9 +175,9 @@ function bindShortcuts() { kbd.Bind( [ storage.read.shortcuts.toLowerCase() ], readMode ); kbd.ListenESC( combo => { if ( combo == "esc" && storage.option.esc ) { - modals.Exist() && modals.Exit(); - !modals.Exist() && focus.Exist() && focus.Exit(); - !modals.Exist() && read.Exist() && read.Exit(); + setting.Exist() && setting.Exit(); + !setting.Exist() && focus.Exist() && focus.Exit(); + !setting.Exist() && read.Exist() && read.Exit(); } }); } @@ -203,10 +233,16 @@ function readMode() { } else if ( pr.state == "temp" && pr.dom ) { read.Render(); } else { - new Notify().Render( "当前并未适配阅读模式,请移动鼠标手动生成 临时阅读模式。" ); + new Notify().Render( "智能感知 正文失败,请移动鼠标,并通过 手动框选 的方式生成正文。" ); read.Highlight().done( dom => { - pr.TempMode( mode.read, dom ); - read.Render(); + const rerender = element => { + pr.TempMode( mode.read, dom ); + read.Render(); + }; + storage.current.highlight ? + highlight.Control( dom ).done( newDom => { + rerender( newDom ); + }) : rerender( dom ); }); } } diff --git a/src/focus/controlbar.jsx b/src/focus/controlbar.jsx index a147f5965..a6cdf1dd4 100644 --- a/src/focus/controlbar.jsx +++ b/src/focus/controlbar.jsx @@ -1,18 +1,19 @@ console.log( "=== simpread focus controlbar load ===" ) -import * as modals from 'modals'; -import * as se from 'siteeditor'; -import * as conf from 'config'; -import { storage } from 'storage'; -import * as output from 'output'; -import * as watch from 'watch'; -import {browser,br}from 'browser'; -import * as msg from 'message'; +import * as setting from 'setting'; +import * as se from 'siteeditor'; + +import * as conf from 'config'; +import { storage } from 'storage'; +import * as output from 'output'; +import * as watch from 'watch'; +import {browser,br} from 'browser'; +import * as msg from 'message'; import * as highlight from 'highlight'; import Fab from 'fab'; -let timer, $root, selector, callback; +let focusItems, $root, selector, callback; const tooltip_options = { target : "name", @@ -44,7 +45,7 @@ class FControl extends React.Component { $( "html, body" ).animate({ scrollTop: 0 }, "normal" ); break; case "setting": - modals.Render( ()=>setTimeout( ()=>se.Render(), 500 )); + setting.Render( ()=>setTimeout( ()=>se.Render(), 500 )); break; case "siteeditor": se.Render(); @@ -80,8 +81,9 @@ class FControl extends React.Component { } componentWillMount() { + focusItems = $.extend( true, {}, conf.focusItems ); if ( storage.current.site.name.startsWith( "metaread::" ) || storage.current.site.name.startsWith( "txtread::" ) ) { - delete conf.focusItems.option; + delete focusItems.option; } } @@ -93,7 +95,7 @@ class FControl extends React.Component { render() { return ( - this.onAction(event, type ) } /> + this.onAction(event, type ) } /> ) } diff --git a/src/help_tips.json b/src/help_tips.json new file mode 100644 index 000000000..7e07d1fba --- /dev/null +++ b/src/help_tips.json @@ -0,0 +1,64 @@ +{ + "tips": [ + { + "idx": 0, + "name": "文档中心", + "icon": "", + "url": "http://ksria.com/simpread/docs" + }, + { + "idx": 1, + "name": "新手入门可以看这篇文章", + "icon": "", + "url": "http://ksria.com/simpread/guide/" + }, + { + "idx": 2, + "name": "查看当前版本新增功能", + "icon": "", + "url": "#" + }, + { + "idx": 3, + "name": "查看当前页的功能描述", + "icon": "", + "url": "#" + }, + { + "idx": 4, + "name": "简悦的汇总(新闻页)", + "icon": "", + "url": "https://simp.red/news" + }, + { + "idx": 5, + "name": "请通过 Github issues 提问", + "icon": "", + "url": "https://github.com/Kenshin/simpread/issues/new" + }, + { + "idx": 6, + "name": "如果简悦暂时未支持你使用的导出服务", + "icon": "", + "url": "https://github.com/Kenshin/simpread/issues/473" + }, + { + "idx": 7, + "name": "YouTube 加载出错的朋友请看这里", + "icon": "", + "url": "https://github.com/Kenshin/simpread/issues/487" + }, + { + "idx": 8, + "name": "当使用简悦疑似页面变慢的处理方式", + "icon": "", + "url": "@performance" + }, + { + "idx": 9, + "name": "当阅读模式并未符合你的期望时,如何进一步优化?", + "icon": "", + "url": "https://github.com/Kenshin/simpread/issues/522" + } + ] +} \ No newline at end of file diff --git a/src/manifest.json b/src/manifest.json index 76d124af2..8e4501556 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,7 +1,7 @@ { "name" : "__MSG_extension_name__", "default_locale" : "en", - "version" : "1.1.2.5005", + "version" : "1.1.3", "short_name" : "SimpRead", "description" : "__MSG_extension_desc__", "homepage_url" : "http://ksria.com/simpread", @@ -44,6 +44,6 @@ ], "offline_enabled" : true, "update_url" : "https://clients2.google.com/service/update2/crx", - "content_security_policy" : "script-src 'self' https://www.google-analytics.com; object-src 'self'", + "content_security_policy" : "script-src 'self' 'unsafe-eval' https://www.google-analytics.com; object-src 'self'", "manifest_version": 2 } \ No newline at end of file diff --git a/src/module/about.jsx b/src/module/about.jsx index 228559ae4..6007968f1 100644 --- a/src/module/about.jsx +++ b/src/module/about.jsx @@ -58,7 +58,7 @@ urls = { }, badges: { - version: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAUCAMAAAA6JNosAAACiFBMVEUrqgBVVVU/uBJOxyE9txBNTU1PT09PySJfX19RyiNfX18/uhJNyCBdXV1PT089tw9NTU0ugw4uhA4wiA4wiA8wiQ8wig8xjQ8yjw83jxY3nBE5OTk5kBk7mRc8PDw8mRg8qhI9PT09tw8+Pj4+phg+shM+uBA/Pz8/uRFAuhJBQUFBrxdBuxNCQkJCvBRDtBhDvRVDvRZEREREvhZFRUVFuxlFvhdFvxdGvRlGwBhHR0dHwBpHwRlIwRpIwRtIwhpJSUlJwxtKSkpKxBxLS0tLxR1MTExMxh5NTU1NnS9Nxx9OTk5OyCBPT09PySFQUFBQyiJRUVFSUlJTU1NUVFRVVVVWVlZWxCxXV1dXxS5XyCxYWFhZWVlaWlpbW1tcXFxdXV1dyjReXl5fX19iYmJjY2NkZGRlZWVlyT9mZmZnZ2dpwkhqw0hruU5rxElsbGxsxEpsxUttxkxubm5vb29ycnJy0U51dXV30FV4vl55eXl5umB9fX19zl5+fn5/f3+BgYGCgoKDg4OEhISFhYWGhoaIiIiJiYmKioqLi4uOjo6VxoKYmJiampqcnJydnZ2jo6OlpaWpqamr1Jut5Jmvr6+v45uw5J2x5J2y5J+zs7O1tbW2tra5ubm9vb2/3rTC4bfExMTE6rXFxcXGxsbG7LfIyMjJycnJ7bvKysrLy8vL6cDMzMzQ0NDR0dHU1NTV1dXW1tbX6s/Z8s/a2trc3Nzd3d3e3t7e8dff39/g4ODh4eHi4uLj4+Pj797j79/j8N/l5eXm5ubn5+fo6Ojo9+Po+OPq6urr+Obs+eft7e3t9uru7u7v7+/v+Ozw8PDx8fHy8vL39/f6+vr7+/v9/vz+/v7///8QYwojAAAAEXRSTlMGBo2Njo6Ojo7j4+jo6Ons7CIlfBEAAAABYktHRNeQslo/AAACPUlEQVQ4y5XK91fTUBTA8YcT96wLRSvOqLUqDhRFRBGttea9JD5t02JxgXvgXjhAcW/FBeJe1IFIsRUnxVkbNf+OyUs8p6dVT97nh5dv7r0gIbF1HqV5BrRqCUCil9pcQ5qCdrnU5hjSFnjozTYGuOnNNAaI9GYYA1z/J3njZ1nEmQ/ypthaeLOx8c4irbOA8x/c2qfgL6tMYtWsV+tja/723j1PX9c6E2Di1CWMl3734h2Pa6qLMJbP3jpxo672HsaSBxfX1lVtVGYnK54fIscZxMix9etia8KwSZO3PtE6AwhE3meXcPwyv9jPMbjBLcglo/dUMoxdECQxP5zLlD4TBLkoVWwgx+m6+rXxlT7l/mG9AE/AByV8dSFf/MXnqwqs4WXEL3l3pVTkecl18DbL5/zw8jLLw4hTPU7TBVfHV9rFawP0ApzmQGXhazu37xHDMCkOTkYcO3FX2Vs3Jzn33+U4QfKoMy7iVG/H64Ir4+t8ed9xegKkYb9dPYaQK7wXoW0IyQgtE6dP/ZiPJOwJb0BHfFCdoQhWb8fogiuUZ8uC6LpQ3mfUnzWAGrbslwdCR4Ev8KYCQhnC3X7/y6N2KAmOzTWBhyKZwYig3lqJc6GfX99brS92RtVy+VMo9FTbWwGrG5FkU97slORkhmWTWHaa2WxOVcqhVPJgG5mpfwoL0cvUuUs3i6V7v6ga2KmrydRD21uAg95wY4Cd3lBjQHsbtSGGtAEtcqgNMqQJSGjeMZtSfwM6NAO/AS+YQbktyUjWAAAAAElFTkSuQmCC", + version: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAUEAYAAABdavZdAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABaAAAAWgBwI7h9AAAAB3RJTUUH4wYaASkrBdiNSwAACFdJREFUaN7tWmlMW1cW/p5XwGYz2GxhqaGmFaqK3VKGEorEDD8iBgmQWkpale1HhVhqFIrcEdGECmirIkBB0B+0wkGI8YwERaMWj5BSKmAYiUUomlC2ghqKVDtlqYEAXt/8YK5uxoQkJklNOv4kfPXe8/vuued+95xzL2YuxF2IuxAnFEqvS69Lr3/8MRPFRDFRBQUoQhGKQkLggVtgMpWXj42524qzC/ZP4OJ3BgNrwWX8VaezFm20rdo1Gh4RMi7jMi6r1SxYsO621gOwLMuynok4GY2w4V+hoQzwZ0Sp1XxtsFq+BvBYI2tkjQUF8Cj5TMEjaBeRhn86Fi9e5LFX2avsVU9pcdbgEbSL+CP7D/xeJuN5HHc24ZmX08Ej6DMKz7ycDhziuP+3VqvVarVagMfj8Xg899vzqG1JSXR0XR3wxRcvvTQxAXz11auvrq0B8fFisVLpfj7SXrny/PPXrgHXrr388uQkbT/99IUXBgYAudzHJyHh9PxPfYTmcrlcLhew2+12u/3h36usrKysrAQsFovFYnH3KI7D1Xn55pu5ua+/BrTa9fXOTqCzMy9vcBCwWu/ccTjcz0fQ1KTXX7oErK8bjT/+SO/n5alU77wDqNUqVUsLUFFx40Zmpuv8Lgs6Ly8vLy8PEIvFYrEY6Onp6enpoc99fX19fX2BlpaWliPDKioqKgCz2Ww2mwGFQqFQKICCgoKCggLAy8vLy8sLcDgcDocD6Ovr6+vrA+bm5ubm5iivTqfT6XTA4ODg4OAgEBYWFhYWBiwvLy8vLwOxsbGxsbFAREREREQE5dvY2NjY2ACam5ubm5spX3t7e3t7O1BSUlJSUgJYrVar1QoolUqlUgnk5+fn5+cDHA6Hw+EAu7u7u7u7QFdXV1dXF2AwGAwGw3H7iP3R0dHR0dHUzoGBgYGBAWB6enp6evrBfnZ1XhYWrNbJSYDDiYpiGAA4+nSOYO7iI9jbk8kMBiAoKDJSIKD3hUKRiMcD7Haz+VEWjMuCHhoaGhoaAlpbW1tbW4He3t7e3l4aIVNSUlJSUoDx8fHx8XHg4ODg4OCACr20tLS0tBSoqampqakBNjc3Nzc3AZlMJpPJqNCqq6urq6up0AiWlpaWlpaAjo6Ojo4OIC0tLS0tDZDL5XK5HCgqKioqKqLf9/Pz8/PzA4RCoVAoPD4eInx/f39/f3+grKysrKyMLsT19fX19XUgOzs7OzsbKC8vLy8vB+rq6urq6o7zraysrKys0JJGKpVKpVKgra2tra0NmJqampqaerCfXZ0XHs/X90hy92JyPx8Bh3MkY43muec++wxQKgMCzp8HLBabzWwGqqq+/PLNNwGWPXfuVxE0iVSrq6urq6tAYmJiYmIijTzp6enp6elAZ2dnZ2cnfY9EZiKc+vr6+vr6/3UTy9JIHhgYGBgYCBiNRqPRSL83OTk5OTlJn6+tra2trdEIrdFoNBoNjfDELueF4dxvXFxcXFwcsLCwsLCwAOzt7e3t7QHBwcHBwcHAyMjIyMgILVVIZiELlmB2dnZ2dhYICAgICAgADg8PDw8P6YImEf9BJdKjl4JEeOTvbPFpNIODJSWAzWYysSzw+utKZWkpUF2dmXnlClBX9913Fy+6zuuyoMmEDA8PDw8PUwET4Xl7e3t7e9NIxefz+Xw+YLPZbDYbFaBarVar1cf5yURLJBKJREI3bfdyL8sCW1tbW1tbQGFhYWFhIZCcnJycnAwkJSUlJSXR0oZkBLJgnHmI4BmGYRiG1ubkORkXuSaR3dl/xD/kPrk+yf77yedx7G0etUR4Uny+vs8+e/e86vW3b/f2Au+/L5V+8gng58fjBQYCJpPVurX18LynPuUgqTMhISEhIQHIysrKysoC9Hq9Xq8/fnpAImZMTExMTAyQkZGRkZFBhUva1NTU1NTU44I6ybEkggYFBQUFBQEzMzMzMzM0QwgEAoFAAIhEIpFIdJyPXM/Pz8/PzwPx8fHx8fFAeHh4eHg4fU7sJTX7/v7+/v7+g+07qb8n3d7d3/36VakCA197DZBIBIKQkCfHJxJxuX5+QHS0j49CcTfv0WdOzosvvv028PPPu7sGA7C9vb+/uemGU46xsbGxsTEq6O7u7u7u7uOOIKm5tra2trYWqKqqqqqqojUvETApZRYXFxcXF08WCgERXnFxcXFx8V0r9b+Rsb+/v7+/n2YQ0o8zHykxGhoaGhoaaAYhGYbU+o2NjY2NjSfb87CR93FH6IoKhaKpCTh/XirNyjoSlEwGNDW98kpvL2A2s+zBAfDWWxMTKhV97913n3nmww+B7u6VlY8+AiYmDg/1+sfPx+c7HEIhcOmSQtHWBshkPj7nzgEOB8va7cCtW7/88v33wHvvDQy88QYAREYSP7miRyY3Nzc3N/f0kjaZTCaTiQqWbIKchUNAUvvOzs7Ozg5N3QREQKQGJSCnCqGhoaGhofQ+KSFIbe8MUuuSUxlnvpCQkJCQEFpqOPMRYZHxkD2A8/hOsu9B/Z3sV9d+bXfnzg8/2O2A2by56XAADofVelTykMTO4TAMIJGoVHw+fW97+8YNqxUQiSIjuVxAIJBIOJzHz+dwWCwsC+zsLC7abIDDQQq/Iy9wud7eDAOIRDExXC7A4/n43M8/J4HJycnJycl5mk+if5vw/Hz0dHjq/7HyW4VnXk4HHlvIFrKFBgO00EJ7r2TpgTvgEbSLUDF/wPWffuJBBhlkOt2RA+91kOaBO+ARtGtg/oK/c1J0Oq58VD4qH/32W2aUGWVGxWLcxE3cjInBbdzG7bu3UR78mjg8TEq6dcvdVpxdsENIR43BwGYyzcy/P/9c/DdH7vb2Bx/8B9inWYA0JLhbAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE5LTA2LTI1VDIxOjQxOjQzLTA0OjAwaNE+dAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOS0wNi0yNVQyMTo0MTo0My0wNDowMBmMhsgAAAAwdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL3RtcC9tYWdpY2stNTcwMVhvSFVsUnY5TnZKWrP6tCkAAAAASUVORK5CYII=", website: "data:image/png;base64,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", githubstar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEwAAAAUCAMAAAAQlCuDAAACplBMVEVVVVXVVSvmcjP0gEFNTU1PT09fX1/kbzD2gUJfX1/3g0VdXV3nczT1gkJPT09NTU3kcDE5OTk7Ozs8PDw9PT0+Pj5BQUFCQkJDQ0NERERFRUVISEhJSUlMTExNTU1OTk5PT09QUFBRUVFSUlJTU1NUVFRVVVVWVlZXV1dYWFhZWVlaWlpbW1tcXFxdXV1eXl5fX19gYGBiYmJlZWVnZ2dra2t4eHh8fHx/f3+CgoKGhoaIiIiJiYmKioqLi4uMjIyQkJCTk5OZmZmampqenp6fn5+jUiajo6OkpKSmpqanp6eqqqqrq6usrKyuVyivWCivWCmwsLCxYDSzXCy0XC21Wyq1XCy3XCq4Xi65YTG6Zzq7Xiu9YS/BajvCwsLDYi3Dw8PEZjTEb0DExMTFxcXGxsbHZC7Hx8fIZjLKjGzPz8/QazTSqJDTqJHVbDPVk2/V1dXWazLWcjzW1tbZczzb29vcnXrcrJLc3NzdgE7d3d3e3t7f39/g4ODht6DicjXkcDHkdDfk5OTlcTLlczXlxrXl5eXmcjPmdTfml2znczTodDXoe0DpdTbpdzjpfULp6enqdjfq6urrdzjreTrrejzrhk/rmWzrzr/r1srseDnsez3sgkjs1MfteTrtfUHthU3twant1cjt7e3uejvvezzvfkDv0sLv7+/wfD3wfkDwgEPwhEnwlGHwzLjw8PDxfT7xfkDxoXXxrorx8fHyfj/y8vLzf0Dzpnz0gEH1gUL1so71v6L149n2gkP3g0T3wKL3waP37Ob37+v39/f4vZ34yK74z7n46eD4+Pj50Lr52Mf58/D60r361MD61sL61sP65tv6+vr73s/739D739H75tr759z76N376uD85dj85tr859z87OT9/f3+/fz+/f3///9Ftc+TAAAAEXRSTlMGBo2Njo6Ojo7j4+jo6Ons7CIlfBEAAAABYktHROFfCM+mAAACOUlEQVQYGZXBT0iTYQDH8e/7vs82l6ibYgYWMrE0QaE/VEKXBJMIBKVDHSLoUhSdO3axbqVEERFENwnqVpMIIoIoioIuSRCUFSFWrkzd9u7Z++udUgnhXJ+PQ9Rrp1IjrGx/kDfRzYhKiZXdoc9EROUs5awxraJyopxbRvyHgLKM+A8BZblabswohZTWcmn9UfgrYQv/MGKZoz4XBwIQy4nf8vzRPOnxlyNCrhY1HR5M3ZWumw6vvz9Cy4FjjYqfl9ybEm1Dh9ZqkQ25bdu2ttt1Tnenm9qybZNn7a6mjUlbYkSo5viZTBeC4FlxrFhH/uqGI5eDQAjB/LXG4eE5QgJiz+878f6x02e1e3xWbX1TkP5c10PIiFA8bRMfEaiauiJMJmZ2XhFCCD4lsumqn4R84Mm+7tkJfwe9HoMpZ2raB9uLT8iIUDHiqgqBhASuTAGL8BDEcp4biJAFqkY3bB14VMCPNDSesw09FtZbFhkRmut79X0dAul1/CcgUC5T+6MBQdP75J7HIpQHWqo/PGzNFr/Fsm+/dlc3Z/IQybPIiNDs6ND8y9cCaWTQv40Acan3yzQC72D0wrxLKACyfVHncn39jVPF63avHW8JIGCJ00qJZp2OjgdkEk4u79R8T0Im4fh5x8slycR9xaOUnAQ+vUNN7byZcrdPWGMWdnGvnyVOipLOLi/zMMtqTlCWESUvnsqNe6xGlGVmkoRiMUCspkg5Z002QeUs5SyYwufqWipVZGWjWf0CDsxBCuuBMAQAAAAASUVORK5CYII=", changelog: "data:image/png;base64,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", @@ -74,7 +74,7 @@ export default class About extends React.Component {
简悦 SimpRead
-
让你瞬间进入沉浸式阅读的扩展
+
为你提供「如杂志般沉浸式阅读体验」的扩展
@@ -91,7 +91,7 @@ export default class About extends React.Component {
帮助
-
+
简悦是一个免费且开源的项目 @@ -111,20 +111,20 @@ export default class About extends React.Component {
其它平台的简悦
-
+
包括但不限于:Chrome · Firefox · Safari · Apple Safari · Microsoft Edge · Opera · iPhone · iPad @@ -145,8 +145,8 @@ export default class About extends React.Component {
-
- 可以在 Twitter新浪微博 上关注我 +
+ 可以在 Twitter新浪微博 上关注我
diff --git a/src/module/account.jsx b/src/module/account.jsx index 65318de0e..edf389fab 100644 --- a/src/module/account.jsx +++ b/src/module/account.jsx @@ -121,7 +121,7 @@ export default class AccountOpt extends React.Component { this.onChangeEmail(e) } disable={false} /> diff --git a/src/module/actionbar.jsx b/src/module/actionbar.jsx index 3aad9143b..f0abdfc46 100644 --- a/src/module/actionbar.jsx +++ b/src/module/actionbar.jsx @@ -32,7 +32,7 @@ export default class Actionbar extends React.Component { const obj = this.props.items[key].items[item]; return (
} + +
+ this.onChange( "yuque", s ) } /> +
+ +
+
WebDAV
+
简悦支持任意 WebDAV 的服务,包括:Box · TeraCLOUD 等
+ this.webdavOnChange(e) } + /> +
+
; } diff --git a/src/module/common.jsx b/src/module/common.jsx index 7c290d1c3..32f7aff27 100644 --- a/src/module/common.jsx +++ b/src/module/common.jsx @@ -10,6 +10,7 @@ import * as menu from 'menu'; import * as watch from 'watch'; import * as exp from 'export'; import {br} from 'browser'; +import * as msg from 'message'; export default class CommonOpt extends React.Component { @@ -23,20 +24,43 @@ export default class CommonOpt extends React.Component { sync() { let notify; - const dbx = exp.dropbox, - read = () => { + const dbx = exp.dropbox, + jianguo = exp.jianguo, + write = () => { + storage.option.sync = Now(); + storage.Write( () => { + writeConfig(); + }); + }, + readDropbox = () => { notify = new Notify().Render({ content: "数据同步中,请稍等...", state: "loading" }); dbx.Exist( dbx.config_name, ( result, error ) => { if ( result == -1 ) { - storage.option.sync = Now(); - storage.Write( () => { - dbx.Write( dbx.config_name, storage.Export(), callback ); - }); + write(); } else { dbx.Read( dbx.config_name, callback ); } }); }, + readJianguo = ( obj ) => { + notify = new Notify().Render({ content: "数据同步中,请稍等...", state: "loading" }); + jianguo.Read( obj.username, obj.password, jianguo.config_name, result => { + if ( result && result.status == 404 ) { + write(); + } else if ( result && result.status == 200 ) { + callback( "read", result.done ); + } + }); + }, + writeConfig = () => { + if ( storage.option.save_at == "dropbox" ) { + dbx.Write( dbx.config_name, storage.Export(), callback ); + } else { + jianguo.Add( storage.secret.jianguo.username, storage.secret.jianguo.password, jianguo.root + "/" + jianguo.config_name, storage.Export(), result => { + callback( "write", undefined, result && [ 201, 204 ].includes( result.status ) ? undefined : "error" ); + }); + } + }, callback = ( type, result, error ) => { notify.complete(); switch ( type ) { @@ -50,11 +74,8 @@ export default class CommonOpt extends React.Component { remote = new Date( json.option.update.replace( /年|月/ig, "-" ).replace( "日", "" )); if ( ver.Compare( json.version ) == 1 ) { new Notify().Render( "本地版本与远程版本不一致,且本地版本较新,是否覆盖远程版本?", "覆盖", () => { - storage.option.sync = Now(); - storage.Write( () => { - watch.SendMessage( "import", true ); - dbx.Write( dbx.config_name, storage.Export(), callback ); - }, storage.simpread ); + watch.SendMessage( "import", true ); + write(); }); } else if ( local < remote ) { @@ -69,11 +90,8 @@ export default class CommonOpt extends React.Component { }); } else if ( local > remote ) { new Notify().Render( "本地配置文件较新,是否覆盖远程备份文件?", "覆盖", () => { - storage.option.sync = Now(); - storage.Write( () => { - watch.SendMessage( "import", true ); - dbx.Write( dbx.config_name, storage.Export(), callback ); - }, storage.simpread ); + watch.SendMessage( "import", true ); + write(); }); } else { new Notify().Render( "本地与远程数据相同,无需重复同步。" ); @@ -83,26 +101,31 @@ export default class CommonOpt extends React.Component { }; storage.Safe( ()=> { - const sec_dbx = storage.secret.dropbox; - !sec_dbx.access_token ? - new Notify().Render( `未对 ${ dbx.name } 授权,请先进行授权操作。`, "授权", () => { - dbx.New().Auth(); - dbx.dtd - .done( () => { - sec_dbx.access_token = dbx.access_token; - storage.Safe( () => { - new Notify().Render( "授权成功!" ); - read(); - }, storage.secret ); - }) - .fail( error => { - console.error( error ) - new Notify().Render( 2, `获取 ${ dbx.name } 授权失败,请重新获取。` ); - }); - }) : ( () => { - dbx.access_token = sec_dbx.access_token; - read(); - })(); + if ( storage.option.save_at == "dropbox" ) { + const sec_dbx = storage.secret.dropbox; + !sec_dbx.access_token ? + new Notify().Render( `未对 ${ dbx.name } 授权,请先进行授权操作。`, "授权", () => { + dbx.New().Auth(); + dbx.dtd + .done( () => { + sec_dbx.access_token = dbx.access_token; + storage.Safe( () => { + new Notify().Render( "授权成功!" ); + readDropbox(); + }, storage.secret ); + }) + .fail( error => { + console.error( error ) + new Notify().Render( 2, `获取 ${ dbx.name } 授权失败,请重新获取。` ); + }); + }) : ( () => { + dbx.access_token = sec_dbx.access_token; + readDropbox(); + })(); + } else { + const jianguo = storage.secret.jianguo; + !jianguo.access_token ? new Notify().Render( 2, `坚果云 授权 后才能使用此功能,如何授权 请看这里。` ) : readJianguo( storage.secret.jianguo ); + } }); } @@ -128,13 +151,14 @@ export default class CommonOpt extends React.Component { storage.version != json.version && storage.Fix( json.read.sites, json.version, storage.version, json.focus.sites ); json = ver.Verify( json.version, json ); - new Notify().Render( "上传版本太低,已自动转换为最新版本。" ); + new Notify().Render({ type: 2, content: `上传版本太低,已自动转换为最新版本。`, state: "holdon" }); } menu.Refresh( json.option.menu ); + ver.Incompatible( json.version, json ); json.option.origins && json.option.origins.length > 0 && - new Notify().Render( "导入的配置文件包含了第三方源,请通过手动导入。" ); + new Notify().Render({ content: `导入的配置文件包含了第三方源,刷新后请重新 手动导入。`, state: "holdon" }); json.option.plugins && json.option.plugins.length > 0 && - new Notify().Render( "导入的配置文件包含了插件,请通过手动导入。" ); + new Notify().Render({ content: `导入的配置文件包含了插件,刷新后请重新 手动导入。`, state: "holdon" }); this.importsecret( json.option.secret, { ...json.secret }, () => { delete json.secret; storage.Write( ()=> { @@ -170,6 +194,14 @@ export default class CommonOpt extends React.Component { } } + oldnewsites() { + new Notify().Render( "此功能转移到 站点管理 选项卡里面,3 秒钟后自动切换到此选项卡。" ); + setTimeout( ()=> { + location.href = location.origin + "/options/options.html#labs"; + window.dispatchEvent( new CustomEvent( msg.MESSAGE_ACTION.turn_tab, { detail: { page: 3 }})); + }, 3000 ); + } + newsites() { const notify = new Notify().Render({ content: "数据同步中,请稍等...", state: "loading" }); storage.GetRemote( "remote", ( result, error ) => { @@ -223,12 +255,15 @@ export default class CommonOpt extends React.Component { render() { return(
-
+
-
+
+
+
+ this.onClick( e, id ) } /> + { this.state.page < this.state.total && +
+
+ } +
+
+
+ + 当前未查看任何内容 +
+
+ ; + } + return ( +
{ dom }
+ ) + } +} + +class List extends React.Component { + + static defaultProps = { + list: [], + onClick: undefined, + }; + + static propTypes = { + list : React.PropTypes.array, + onClick: React.PropTypes.func, + } + + onClick( event, id ) { + $( "list" ).removeClass( "selected" ); + $( `list[id="${id}"]` ).addClass( "selected" ); + this.props.onClick( event, id ); + } + + onActive( event, id ) { + $( `list[id="${id}"]` ).addClass( "active" ); + storage.notice.read.push( id ); + write( () => new Notify().Render( "已设置为已读。" ) ); + } + + render() { + const list = this.props.list.map( item => { + const active = storage.notice.read.findIndex( value=>value==item.id ) != -1 ? " active" : ""; + return ( + this.onClick( e, item.id ) }> +
{ item.title }
+ + { item.category.name } + { item.date } + + { active == "" && +
+
+ } +
+ ) + }); + return ( +
+ { list } +
+ ) + } +} \ No newline at end of file diff --git a/src/module/plugins.jsx b/src/module/plugins.jsx index ee59dc7b5..60c0ef46f 100644 --- a/src/module/plugins.jsx +++ b/src/module/plugins.jsx @@ -1,4 +1,4 @@ -console.log( "===== simpread option labs load =====" ) +console.log( "===== simpread option plugins load =====" ) import {storage} from 'storage'; import * as run from 'runtime'; @@ -180,14 +180,13 @@ export default class PluginsOpt extends React.Component { storage.option.plugins.forEach( id => { run.Install( id, undefined, result => { if ( !result ) { - new Notify().Render( 2, id + "获取失败,请稍后再试。" ); - return; + new Notify().Render( 2, id + " 获取失败,请稍后再试。" ); } count++; - if ( storage.plugins[id].version != result.version ) { - storage.plugins[result.id] = result; - is_update = true; - } + if ( storage.plugins[id].version != result.version ) { + storage.plugins[result.id] = result; + is_update = true; + } count == storage.option.plugins.length && complete(); }); }); @@ -204,6 +203,7 @@ export default class PluginsOpt extends React.Component { } import() { + let newPlugins = {}; if ( storage.option.plugins.length == 0 ) { new Notify().Render( "当前配置文件没有任何插件。" ); return; @@ -214,23 +214,20 @@ export default class PluginsOpt extends React.Component { storage.option.plugins.forEach( id => { run.Install( id, undefined, result => { if ( !result ) { - new Notify().Render( 2, id + "获取失败,请稍后再试。" ); - return; - } + new Notify().Render( 2, id + " 获取失败,请稍后再试。" ); + } else newPlugins[result.id] = result; count++; - storage.plugins[result.id] = result; count == storage.option.plugins.length && complete(); }); }); }}); const complete = () => { storage.Plugins( result => { - storage.option.plugins = Object.keys( storage.plugins ); storage.Write( () => { new Notify().Render( "已从配置文件导入完毕。" ); this.setState({ plugins: Object.values( storage.plugins ) }); }); - }, storage.plugins ); + }, newPlugins ); } } @@ -259,36 +256,49 @@ export default class PluginsOpt extends React.Component {
管理
+
+
+
+
-
已安装
+
+ { this.state.plugins.length == 0 ? "" : "已安装 " + this.state.plugins.length + " 个插件 " } + { this.state.plugins.length > 5 && 过多的插件会使进入阅读模式变慢,建议不要超过 6 个 } +
+
this.onChange(t) } />
+
) diff --git a/src/module/modals.jsx b/src/module/setting.jsx similarity index 92% rename from src/module/modals.jsx rename to src/module/setting.jsx index 62d16a735..6e91dde02 100644 --- a/src/module/modals.jsx +++ b/src/module/setting.jsx @@ -1,4 +1,4 @@ -console.log( "=== simpread option modals ===" ) +console.log( "=== simpread option setting ===" ) import FocusOpt from 'focusopt'; import ReadOpt from 'readopt'; @@ -25,14 +25,14 @@ let callback; */ class Modals extends React.Component { - // close modals + // close setting close( restore = rollback() ) { dia.Close(); } - // save modals focus option + // save setting focus option save() { - console.log( "modals click submit button.", storage.current ) + console.log( "setting click submit button.", storage.current ) watch.Verify( ( state, result ) => { if ( state ) { console.log( "watch.Lock()", result ); diff --git a/src/module/siteeditor.jsx b/src/module/siteeditor.jsx index 49ba6320d..c95caf630 100644 --- a/src/module/siteeditor.jsx +++ b/src/module/siteeditor.jsx @@ -1,4 +1,4 @@ -console.log( "=== simpread option siteeditor ===" ) +console.log( "=== simpread option siteeditor load ===" ) import { storage } from 'storage'; import * as watch from 'watch'; @@ -39,14 +39,7 @@ class SiteEditor extends React.Component { delete() { console.log( "siteeditor click delete button.", storage.current.site ) - /* - if ( site.target != "local" ) { - new Notify().Render( 2, `只能删除 本地站点 ,如需要请使用 站点管理器 删除。` ); - return; - } - */ new Notify().Render( "是否删除当前适配站点?", "删除", () => { - //site.target != "local" ? new Notify().Render( 3, `无法删除 当前站点,如不想显示请加入黑名单。` ) : site.name.startsWith( "tempread::" ) ? new Notify().Render( 2, `当前站点为自动识别,无误删除。` ) : storage.pr.Deletesite( storage.current.site.target, site.url, result => { if ( result == -1 ) new Notify().Render( 2, `此站已被删除,请勿重复操作。` ); @@ -80,7 +73,8 @@ class SiteEditor extends React.Component { } else if ( site.include.trim() == "" ) { new Notify().Render( 2, "高亮区域不能为空。" ); } else { - storage.pr.Updatesite( storage.current.site.target, storage.current.url, [ site.url, storage.pr.Cleansite(site) ]); + // changed storage.current.site.target to 'local' + storage.pr.Updatesite( 'local', storage.current.url, [ site.url, storage.pr.Cleansite(site) ]); storage.Writesite( storage.pr.sites, () => { new Notify().Render( 0, "更新成功,页面刷新后生效!" ); watch.SendMessage( "site", true ); @@ -101,8 +95,12 @@ class SiteEditor extends React.Component { render() { site = { ...storage.pr.current.site }; - if ( storage.pr.state == "temp" ) { - storage.pr.dom && ( site.include = storage.pr.dom.outerHTML.replace( storage.pr.dom.innerHTML, "" ).replace( /<\/\S+>$/i, "" )); + if ( storage.pr.state == "temp" && storage.pr.dom ) { + site.name = site.name.replace( "tempread::", "" ); + let include = storage.pr.Utils().dom2Xpath( storage.pr.dom ); + if ( include != "" ) { + site.include = `[[\`${include}\`]]`; + } else site.include = storage.pr.dom.outerHTML.replace( storage.pr.dom.innerHTML, "" ).replace( /<\/\S+>$/i, "" ) } return ( diff --git a/src/module/sites.jsx b/src/module/sites.jsx index ca31c9696..bea1fd7dd 100644 --- a/src/module/sites.jsx +++ b/src/module/sites.jsx @@ -1,13 +1,13 @@ console.log( "===== simpread option sites load =====" ) -import {storage} from 'storage'; -import {browser} from 'browser'; -import * as msg from 'message'; +import {storage} from 'storage'; +import {browser} from 'browser'; +import * as msg from 'message'; import * as watch from 'watch'; -import * as ss from 'stylesheet'; +import * as ss from 'stylesheet'; -import TextField from 'textfield'; -import Button from 'button'; +import TextField from 'textfield'; +import Button from 'button'; class Card extends React.Component { @@ -103,6 +103,23 @@ class Cards extends React.Component { export default class SitesOpts extends React.Component { + newsites() { + const notify = new Notify().Render({ content: "数据同步中,请稍等...", state: "loading" }); + storage.GetRemote( "remote", ( result, error ) => { + notify.complete(); + if ( !error ) { + const count = storage.pr.Addsites( result ); + storage.Writesite( storage.pr.sites, () => { + watch.SendMessage( "site", true ); + count == 0 ? new Notify().Render( "适配列表已同步至最新版本。" ) : new Notify().Render( 0, `适配列表已同步成功,本次新增 ${ count } 个站点,2 秒后自动自动刷新。` ); + count > 0 && setTimeout( ()=>location.reload(), 2000 ); + }); + } else { + new Notify().Render( 3, `同步时发生了一些问题,并不会影响本地配置文件,请稍后再试!` ); + } + }); + } + onClick( state ) { state == "sitemgr" && ( location.href = location.origin + "/options/sitemgr.html" ); } @@ -114,6 +131,7 @@ export default class SitesOpts extends React.Component { } origins( type ) { + /* if ( type == "origins" ) { storage.GetRemote( "origins", ( result, error ) => { if ( error ) new Notify().Render( 2, "获取失败,请稍后重新加载。" ); @@ -124,7 +142,9 @@ export default class SitesOpts extends React.Component { new Notify().Render( "官方源加载成功。" ); } }); - } else if ( type == "import" ) { + } else + */ + if ( type == "import" ) { new Notify().Render( "snackbar", "导入后会覆盖掉原来的第三方适配列表,请问是否覆盖?", "确认", () => { const urls = this.props.option.origins.filter( item => { return item.trim() != "" && item.trim().startsWith( "http" ) && item.trim().endsWith( ".json" ) @@ -305,17 +325,29 @@ export default class SitesOpts extends React.Component { render() { return (
+
+ +
+
+
+
第三方适配源
+
this.changeOrigins() } />
-
this.onClick('sitemgr') }> -
-
站点管理器
- 可以编辑全部的适配站点,包括:官方适配源、站点集市适配源、第三方适配源、自定义适配源。 - -
-
管理
+
+
+ +
+ this.onChange(t) } /> +
+
-
已安装
-
- this.onChange(t) } /> +
+
站点管理器
+
this.onClick('sitemgr') }> +
+
可以管理全部的适配站点
+ 包括:官方适配源、第三方适配源、站点集市适配源、自定义适配源。 + +
+
) diff --git a/src/module/unrdist.jsx b/src/module/unrdist.jsx index a780e8a59..ebfd426f3 100644 --- a/src/module/unrdist.jsx +++ b/src/module/unrdist.jsx @@ -104,17 +104,21 @@ export default class Unrdist extends React.Component { items = this.state.items.slice( 0, this.state.page * this.props.step ), content = this.state.items && this.state.items.length > 0 ?
+
this.onAction(e,i,t,d) } /> +
+
:
diff --git a/src/module/welcome.jsx b/src/module/welcome.jsx index fc3677066..269557a73 100644 --- a/src/module/welcome.jsx +++ b/src/module/welcome.jsx @@ -3,10 +3,11 @@ console.log( "===== simpread option welcome page load =====" ) import 'carous_css'; import 'carousel'; -import Button from 'button'; +import Button from 'button'; -import * as ss from 'stylesheet'; -import {br} from 'browser'; +import * as ss from 'stylesheet'; +import {br} from 'browser'; +import * as msg from 'message'; const welcbgcls = "welcome", welcbgclsjq = `.${welcbgcls}`, @@ -110,12 +111,11 @@ class Welcome extends React.Component { nextClick() { if ( curidx != max ) { $( '.carousel.carousel-slider' ).carousel( "next" ); - } else { - exit(); - } + } else this.closeClick(); } closeClick() { + window.dispatchEvent( new CustomEvent( msg.MESSAGE_ACTION.welcome_close, { detail: { first: this.props.first, version: this.props.version }})); exit(); } @@ -167,9 +167,9 @@ class Welcome extends React.Component {

{ this.props.first ? "欢迎使用 简悦": "简悦 已升至最新版" }

- { br.isFirefox() ? "Chrome 好评率超过 99% 的阅读模式现已来到 Firefox。" : "让你瞬间进入沉浸式阅读的 Chrome 扩展,类似 Safari 的阅读模式。" }
- 去掉干扰元素,提升阅读体验,「简」单阅读,愉「悦」心情。
- 为了达到 「完美」 的阅读模式,简悦适配了 数百种类型 的网站。 + { br.isFirefox() ? "Chrome 好评率超过 99% 的阅读模式现已来到 Firefox" : "让你瞬间进入沉浸式阅读的 Chrome 扩展,类似 Safari 的阅读模式" }
+ 去掉干扰元素,提升阅读体验,「简」单阅读,愉「悦」心情
+ 为了达到 「完美」 的阅读模式,简悦适配了 数百种类型 的网站
@@ -180,10 +180,10 @@ class Welcome extends React.Component {

阅读模式 与 聚焦模式

- 阅读模式 → 独有功能,自动提取适配页面的标题、描述、正文、媒体等资源。
- 支持 临时阅读模式 · 主动适配模式 · 智能适配模式 - · 论坛类页面 / 分页
- 聚焦模式 → 高亮鼠标所在的文章段落,不改变当前页面的结构。
+ 阅读模式 → 独有功能,自动提取适配页面的标题、描述、正文、媒体等资源
+ 支持 手动框选 · 主动适配模式 · 智能适配模式 + · 论坛类页面 / 分页
+ 聚焦模式 → 高亮鼠标所在的文章段落,不改变当前页面的结构
} @@ -196,7 +196,7 @@ class Welcome extends React.Component {
全新的 词法分析引擎2.0,简悦可以识别出 TXT · Markdown · LaTeX · 代码段
Wordpress · Hexo · Ghost · Discuz 等博客 / 论坛的页面了!
- 甚至,只要是结构良好的页面,(无需适配)自动生成阅读模式,详细 请看这里 。 + 甚至,只要是结构良好的页面,(无需适配)自动生成阅读模式,详细 请看这里
} @@ -207,9 +207,9 @@ class Welcome extends React.Component {

连接你的生产力工具

- 支持下载 HTML · PDF · Markdown · PNG · Epub 到本地 以及 发送到 Kindle
- 支持输出到 Dropbox · 印象笔记 · Evernote · Onenote · Google 云端硬盘。
- 发送页面链接到 Pocket · Instapaper · Linnk,详细 请看这里 。 + 支持下载 HTML · PDF · Markdown · PNG · Epub 到本地 以及 发送到 Kindle
+ 支持输出到 坚果云 · 语雀 · Dropbox · 印象笔记 · Evernote · Onenote · Google 云端硬盘
+ 发送页面链接到 稍后读 · Pocket · Instapaper · Linnk,详细 请看这里
} @@ -220,9 +220,9 @@ class Welcome extends React.Component {

站点编辑器 · 站点适配源 · 站点管理器

- 页面上任意元素均可隐藏,更支持编程,详细请看 站点编辑器
- 更灵活、社区化的多种 站点适配源
- 内置了 站点管理器,方便管理全部的适配站点。 + 页面上任意元素均可隐藏,更支持编程,详细请看 站点编辑器
+ 更灵活、社区化的多种 站点适配源
+ 内置了 站点管理器,方便管理全部的适配站点
} @@ -234,7 +234,7 @@ class Welcome extends React.Component {

全新的控制栏面板

「告别」传统、单一的控制栏,全部功能「一览无余」
- 主题、字体样式、大小、版面布局更改一键完成。
+ 主题、字体样式、大小、版面布局更改一键完成
} @@ -245,9 +245,9 @@ class Welcome extends React.Component {

插件系统

- 字数统计 · 点击查看大图(Lightbox) · 划词翻译 一个不能少。
- 可以使用 JavaScript 编写基于「简悦」的插件了,详细说明请看 说明文档
- 现在就安装适合你的插件吧 → 插件中心 。 + 字数统计 · 代码段增强 · 点击查看大图(Lightbox) · 划词翻译 一个不能少
+ 使用 JavaScript 编写基于简悦的插件,详细说明请看 说明文档
+ 现在就安装适合你的插件吧 → 插件中心
} @@ -260,12 +260,12 @@ class Welcome extends React.Component {
方便提交,让你的站点为数以万计的简悦用户使用
官方主适配源、第三方适配源、站点集市适配源、自定义适配源一站式浏览
- 现在就访问 站点集市 吧,看看有什么增加的新适配站点。 + 现在就访问 站点集市 吧,看看有什么增加的新适配站点
} - { !first && + { !first &&
@@ -278,6 +278,32 @@ class Welcome extends React.Component {
} + { !first && version == "1.1.3" && +
+
+ +

导出服务又添新成员,更支持 WebDAV

+
+ 期待已久的 语雀坚果云 现已加入 导出服务 豪华大礼包
+ 配置文件的同步也可使用 坚果云
+ 不仅如此,只要是支持 WebDAV 的服务均可使用简悦的导出功能 +
+
+
} + + { (( !first && version == "1.1.3" ) || version == "all" ) && +
+
+ +

消息中心 · 帮助中心 · 新手入门

+
+ 消息中心 让沟通更加便利
+ 内置常用的文档说明、常见问题、及选项页全部功能说明的 帮助中心
+ 功能太多,无从下手?新手入门 不再让新手望而却步 +
+
+
} +
@@ -286,6 +312,10 @@ class Welcome extends React.Component { 分享卡,右键菜单添加 「白名单 / 排除列表 / 黑名单」等
详细说明请看 更新日志
} + { !first && version == "1.1.3" &&
+ 预加载 延迟加载 智能感知更便捷的手动框选 等诸多新功能
+ 详细说明请看 更新日志 +
} @@ -316,10 +346,10 @@ class Welcome extends React.Component { } /** - * Exit() + * Exit */ function exit() { - $( welcbgclsjq ).velocity({ opacity: 0 }, { complete: ()=>{ + $( welcbgclsjq ).velocity({ opacity: 0 }, { complete: () => { ReactDOM.unmountComponentAtNode( $(welcbgclsjq)[0] ); }}); } diff --git a/src/options/custom.html b/src/options/custom.html index 1362d4909..319afafa2 100644 --- a/src/options/custom.html +++ b/src/options/custom.html @@ -11,7 +11,7 @@
Property
- 简悦 - 让你瞬间进入沉浸式阅读的扩展 + 简悦 SimpRead - 为你提供「如杂志般沉浸式阅读体验」的扩展 为了达到完美的阅读模式这个小目标 ,我适配了 数百种类型 的网站,因此诞生了简悦。 @@ -82,7 +82,7 @@

表格样式:

- 简悦(SimpRead)- 让你瞬间进入沉浸式阅读的扩展。  © 2017 ksria.com by Kenshin Wang + 简悦 SimpRead - 为你提供「如杂志般沉浸式阅读体验」的扩展  © 2017 - 2019 ksria.com by Kenshin Wang
diff --git a/src/options/custom.js b/src/options/custom.js index 9080327e9..b7b7879b3 100644 --- a/src/options/custom.js +++ b/src/options/custom.js @@ -123,7 +123,7 @@ function propertyRender() {

帮助

-

如何自定义样式,详细 请看这里
+

如何自定义样式,详细 请看这里
独乐乐不如众乐乐! 分享你的主题

diff --git a/src/options/notice.html b/src/options/notice.html new file mode 100644 index 000000000..7700873ec --- /dev/null +++ b/src/options/notice.html @@ -0,0 +1,18 @@ + + + + + + 消息中心 - 简悦 · 选项页 + + +
消息中心
+
+
+ 简悦 SimpRead - 为你提供「如杂志般沉浸式阅读体验」的扩展  © 2017 - 2019 ksria.com by Kenshin Wang +
+ + + + + \ No newline at end of file diff --git a/src/options/notice.js b/src/options/notice.js new file mode 100644 index 000000000..c78dae839 --- /dev/null +++ b/src/options/notice.js @@ -0,0 +1,50 @@ +console.log( "==== simpread options page: notice load ====" ) + +import '../assets/css/simpread.css'; +import '../assets/css/options_page.css'; +import '../assets/css/options_notice.css'; +import 'notify_css'; + +import Velocity from 'velocity'; +import Button from 'button'; +import * as waves from 'waves'; +import * as tt from 'tooltip'; + +import Notice from 'notice'; + +import {storage} from 'storage'; +import * as ss from 'stylesheet'; + +/** + * Entry + */ +storage.Read( () => { + console.log( "simpread storage get success!", storage ); + navRender(); + noticeRender(); + tt.Render( "body" ); + waves.Render({ root: "body" }); + $( "body" ).velocity({ opacity: 1 }, { duration: 1000, complete: ()=> { + $( "body" ).removeAttr( "style" ); + }}); +}); + +/** + * navigation Render + */ +function navRender() { + const navClick = () => { + location.href = location.origin + "/options/options.html"; + }; + const button =