xtzero.me
欢迎访问 xtzero.me !
「从前从前,有个人爱你很久」
最近文章
test
123
发表时间 2024-01-23 14:16:28
发表在 技术学习
阅读数 0
2024-01-23 14:16:28
在 egg.js 中内置一个 vite+vue3项目 并完美支持开发模式和生产部署
给 egg.js 开启模板渲染功能 安装插件 $ npm i egg-view-nunjucks --save 启动插件 // config/plugin.js exports.nunjucks = { enable: true, package: 'egg-view-nunjucks', }; 准备前端代码目录 新建目录app/views,作为前端项目目录。虽然 egg.js 规定了 app/view 是视图目录,但我还是自定义了一个 views 文件夹用来给前端用。 为此需要修改 egg.js 的配置,来让这个目录被 egg.js 识别为视图目录。 // config.default.js config.view = { defaultViewEngine: 'nunjucks', defaultExtension: '.html', root: [ // path.join(appInfo.baseDir, 'app/view'), path.join(appInfo.baseDir, 'app/views'), ].join(','), } 新建 vite + vue3 项目 到另一个目录,使用 $ npm create vue@latest 创建一个新的 vue3 项目,这里我们把 ts、tsx、vue-router、pinia 什么的都选了。 然后把这个项目复制到 app/views/admin 目录下。尝试启动。 $ yarn dev 看到可以正常启动。 让 egg.js 渲染 vue 页面 我们需要在 egg.js 中准备一个路由和一个控制器。 // app/router.js router.get('/admin', controller.home.admin); // app/controller/home.js async admin() { const env = process.env.NODE_ENV if (env == 'development') { await this.ctx.render('admin/index.html', { env }) } else { await this.ctx.render('admin/dist/index.html', { env }) } } 在 egg.js 中,可以通过 process.env.NODE_ENV 来获取当前的运行环境是开发还是生产。我们期望的结果是,生产部署之前将前端构建到 app/views/admin/dist 中,在生产环境下 egg.js 直接去渲染 app/views/admin/dist/index.html。但是在开发环境下,egg.js 只需要渲染 app/views/admin/index.html 即可。 为了达到这个目的,我们还需要修改 app/views/admin/index.html,通过 egg 模板渲染的方式来选择性的引入对应的 js 文件。 <script> window.onload = function() { if (location.href.indexOf('localhost:5173') > -1) { location.href = 'http://127.0.0.1:7001/admin' } } </script> <body> <div id="app"></div> {% if env == 'development' %} <script type="module" src="http://localhost:5173/src/main.ts"></script> {% else %} <script type="module" src="/src/main.ts"></script> {% endif %} </body> 除了需要渲染 index.html,还会有很多构建的产物需要被 egg.js 访问到。这时我们直接修改 egg.js 的静态目录配置。 // config.default.js config.static = { prefix: '/', dir: [ path.join(appInfo.baseDir, 'app/public'), path.join(appInfo.baseDir, 'app/views/admin/dist'), path.join(appInfo.baseDir, 'app/views/admin/public'), path.join(appInfo.baseDir, 'app/views/admin') ], dynamic: true, preload: false, maxAge: 31536000, } 移动 vite.config.ts 将 vite.config.ts 从 app/views/admin 中移动到最外层。修改其中的内容。 export default defineConfig({ plugins: [ vue(), vueJsx(), ], resolve: { // 需要修改 @ 的指向 alias: { '@': fileURLToPath(new URL('./app/views/admin/src', import.meta.url)) } }, // 从这开始是添加的内容 build: { manifest: true }, root: `${process.cwd()}/app/views/admin`, }) 修改包管理配置和启动命令 将 app/views/admin/package.json,中的 devDependencies 和 dependencies 中的包合并到最外层的 package.json 中,然后删掉前者。 删掉 app/views/admin/node_modules。在最外层重新安装依赖。 修改最外层的 package.json,修改启动命令。 "scripts": { "start": "egg-scripts start --daemon --title=egg-server-hikari3", "stop": "egg-scripts stop --title=egg-server-hikari3", "dev:api": "egg-bin dev", "dev:admin": "vite", "preview:admin": "cd app/views/admin && yarn preview", "test": "npm run lint -- --fix && npm run test:local", "test:local": "egg-bin test", "cov": "egg-bin cov", "lint": "eslint .", "ci": "npm run lint && npm run cov" }, 这样在项目最外层也可以启动项目和执行构建了。 修改 tsconfig 全部配置完后我们发现 vscode 有一些报错,可能是因为 vue 的一些类型没有正确导入。我们需要修改 tsconfig.json。 { ... 其它配置 "compilerOptions": { ... 其它配置 "types": ["vite/client", "vue"], "typeRoots": ["./node_modules/@types", "./src/types"] } }
发表时间 2024-01-17 21:14:36
发表在 技术学习
阅读数 0
2024-01-17 21:14:36
Editor.md + 七牛云 实现在文本框粘贴图片上传到七牛云,并实时更新上传进度到文本框
先准备一个 div 给 Editor.md 渲染用: <div id="editormd-container"></div> 渲染逻辑 this.Editor = editormd("editormd-container", { width: "100%", height: 640, syncScrolling: "single", path: "/public/js/editor-md-lib/", }); 由于七牛云部分是使用了客户端上传,参考了官方的js sdk 文档。所以需要提前用后端把七牛云的上传 token 准备好。这里就默认我已经将 token 放到this.qiniuToken中了。 在编辑器加载完毕后,绑定粘贴事件。 this.Editor = editormd("editormd-container", { width: "100%", height: 640, syncScrolling: "single", path: "/public/js/editor-md-lib/", onload: function() { document.addEventListener("paste", function (e) { var items = (e.clipboardData || e.originalEvent.clipboardData).items for (var i = 0; i < items.length; i++) { if (items[i].type.indexOf("image") !== -1){ var blob = items[i].getAsFile(); var reader = new FileReader(); reader.onload = function (event) { const imageData = event.target.result // imageData 就是图片的 base64数据 }; reader.readAsDataURL(blob); } } }); } }); 接下来需要准备两个工具函数 // base64 转 Blob function base64ToBlob(base64, type) { const binaryString = atob(base64); const length = binaryString.length; const bytes = new Uint8Array(length); for (let i = 0; i < length; i++) { bytes[i] = binaryString.charCodeAt(i); } return new Blob([bytes], { type: type }); } // Blob 转 File 对象 function blobToFile(blob, fileName) { return new File([blob], fileName, { type: blob.type }); } 在获取到图片的 base64 数据后,将其转换为 File 对象,就可以直接调用七牛云的 sdk 进行上传了。 我们先将 base64 转为 File 对象: const blob = base64ToBlob(imageData.replaceAll('data:image/png;base64,', ''), "image/png") // rand 是个生成随机数的函数,随便一搜就能搜到 const fileName = `${md5(`${Date.parse(new Date())}`)}${rand(100000, 999999)}` const file = blobToFile(blob, fileName) 紧接着,我们向文本框中粘贴的位置插入一个占位字符串,用来更新图片上传进度和上传完成后直接显示图片。 // 编辑器实例存放在 _this.Editor 中 // 由于是在 onload 事件中,而 onload 事件是用 function 的形式写的 // 所以需要在 onload 外面提前用 `const _this = this` 把当前 Vue 实例存起来 // fileName 是上面一段代码中生成的随机文件名 _this.Editor.insertValue(`![图片上传中 0%](${fileName})`) 后面要实现的逻辑是,当图片上传进度变化时,我们要将进度更新到这个占位串中;当图片上传完毕,我们要将图片的服务器地址更新到这个占位串上。 // 开启一个七牛云的上传任务 const observable = qiniu.upload(file, `childPath/${fileName}`, _this.qiniuToken) // 订阅七牛云的上传事件 const subscription = observable.subscribe((e) => { // 上传中途,更新图片的上传进度 _this.Editor.setMarkdown( addVm.$refs.md.Editor.getMarkdown().replace( new RegExp(`\\!\\[图片上传中 (\\d+(\\.\\d+)?%)\\]\\(${fileName}\\)`, 'g'), `![图片上传中 ${e.total.percent.toFixed(2)}%](${fileName})` ) ) }, (e) => { // 上传失败,删除编辑框里的图片 _this.Editor.setMarkdown( addVm.$refs.md.Editor.getMarkdown().replace(new RegExp(`\\!\\[图片上传中 \\d+%\\]\\(${fileName}\\)`, 'g'), ``)) }, (e) => { // 上传完毕,更新图片显示 _this.Editor.setMarkdown( _this.$refs.md.Editor.getMarkdown().replace( new RegExp(`\\!\\[图片上传中 (\\d+(\\.\\d+)?%)\\]\\(${fileName}\\)`, 'g'), `![${fileName}](http://host.com/${e.key})` ) ) })
发表时间 2023-10-24 17:33:59
发表在 技术学习
阅读数 0
2023-10-24 17:33:59
标签引入Vue的情况下,递归调用自定义组件
组件定义 <script type="text/x-template" id="docSectionItem"> <div class="doc-section-item-container"> @{ row.title } <div class="doc-section-item-children" v-if="row.children && row.children.length > 0"> <doc-section-item style="margin-left: 20px;" v-for="(v, k) in row.children" :key="k" :row="v"> </doc-section-item> </div> </div> </script> <script> Vue.component('doc-section-item', { template: '#docSectionItem', delimiters: ['@{', '}'], props: { row: { type: Object, default: () => ({}) } }, }) </script> 引用 <doc-section-item :row="v"></doc-section-item>
发表时间 2023-10-21 22:28:33
发表在 技术学习
阅读数 0
2023-10-21 22:28:33
使用docker-compose部署一个egg.js应用
计划是使用docker-compose编排三个服务: nginx node mysql nginx 的配置、node 应用的环境变量、mysql 的配置和数据文件均外挂出来。 下面是 docker-compose.yml version: '3' services: nginx: image: nginx:latest env_file: - ./docker/docker.env ports: - "80:80" volumes: - ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - node node: image: node:14 env_file: - ./docker/docker.env working_dir: /www volumes: - .:/www command: "./docker/init.sh" depends_on: - mysql ports: - "7001:7001" mysql: image: mysql:latest env_file: - ./docker/docker.env working_dir: /www ports: - "30001:3306" volumes: - ./docker/mysql/init.sh:/www/init.sh - ./docker/mysql/init.sql:/www/init.sql - ./docker/mysql/my.cnf:/etc/my.cnf - ./docker/mysql/data:/var/lib/mysql 为了让目录结构更像一个应用层项目而不是一个docker配置,我要把项目代码放在根目录,docker 作为一个子目录放在项目目录下。应用目录结构如下。 . ├── app ├── config ├── docker (docker 相关的放在这) │   ├── mysql │   │   └── data │   └── nginx ├── logs ├── public ├── run └── test docker 相关又分为mysql、nginx、应用配置和启动脚本。docker 目录下文件和目录结构如下。 . ├── docker.env ├── docker.env.example ├── init.sh ├── mysql │   ├── data │   │   └── (mysql 数据文件) │   ├── init.sql │   └── my.cnf └── nginx   └── nginx.conf docker.env 中配置环境变量,并在 docker-compose.yml 中引用。 APP_ENV: local APP_DOMAIN=bean-local.xtzero.me APP_RUN_CMD=dev MYSQL_ROOT_PASSWORD: 12345678 MYSQL_DATABASE: bean MYSQL_USER: mysql MYSQL_PASSWORD: 12345678 init.sh 中配置应用的启动脚本,并在 node 容器中执行。 npm install echo copy config/env touch /www/config/env echo ${APP_ENV} > /www/config/env npm run ${APP_RUN_CMD} mysql/init.sql 中存的是 mysql 的启动脚本,可以在第一次启动服务的时候初始化数据库表结构。 nginx/nginx.conf 中存放 nginx 的配置,外挂出来是方便修改。 mysql/data 是 mysql 的数据目录,外挂出来是为了持久化存储。 一切都配置好了之后尝试在本地启动,然后写业务代码。在本地调试好了之后上服务器部署。最坑的事来了。服务器内存满了。突然就体现了个人开发者的窘迫。没办法升级内存,就只能阉割掉 docker-compose 里的 mysql 了。这样就不如让这个项目和其他项目一起用公共的 mysql 了。于是这个项目就变成了,在本地开发用 docker,在生产环境用普通 egg.js 的方式启动。 成品地址
发表时间 2023-08-28 17:08:48
发表在 技术学习
阅读数 0
2023-08-28 17:08:48
使用docker迁移mysql数据库
背景 不知道怎么回事,服务器上的mysql数据库突然挂了,怎么都起不来,重新安装mysql也起不来。mysql挂了还把gogs也带死了。正好最近在学docker,早就准备把服务器上的mysql删掉,改用docker部署,不如趁着这次机会直接把这事搞了。 目标 目前的状态是,systemctl start mysqld 启动失败,看日志什么的看不出结果,也不想继续这个路子弄了。/var/lib/mysql 路径下的数据文件还完好。准备把服务器上的 mysql5.6 直接删掉,使用docker重新部署一个mysql的服务,再把旧的数据文件导进去。这样mysql服务就复活了,还不会影响其它线上服务。 实施 安装docker和docker-compose 略,上网搜的结果。 在服务器上创建目录 /data/www/mysql-docker,创建 docker-compose.yml 文件。 # cd /data/www # mkdir mysql-docker # touch docker-compose.yml 写入 docker-compose 配置 # vim docker-compose.yml i version: '3' services: mysql: image: mysql:5.6 environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: mydb MYSQL_USER: user MYSQL_PASSWORD: password volumes: - /data/www/mysql-docker/data/:/var/lib/mysql ports: - "3306:3306" 创建数据目录 # mkdir data 把原来的 mysql 数据文件复制过来。 实际上是可以直接把原来的数据目录直接挂到 docker 上的,但是我问 chatgpt,chatgpt 说宿主机内的文件会被覆盖。 但是实际操作下来发现并不会,这个不得而知,总之把数据文件复制一份出来总归是稳妥的。 # cd data # cp -r /var/lib/mysql/* ./ 修改数据文件权限 由于之前的数据文件权限是给 mysql 用户的,现在需要 docker 来访问。懒得研究应该怎么改,所以直接 777。 # cd .. # chmod -R 777 ./data mysql,启动! # docker-compose up -d [+] Running 2/2 ✔ Network mysql-docker_default Created 0.0s ✔ Container mysql-docker-mysql-1 Started 查看容器列表,发现已经启动。 # docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fc404dca2897 mysql:5.6 "docker-entrypoint..." 41 minutes ago Up 41 minutes 0.0.0.0:3306->3306/tcp mysql-docker-mysql-1 使用 navicat 连接,连接成功。查看数据表,数据都在。完活。 写起来如此顺畅,实际这一套鼓捣下来,用了昨天一宿加今天半宿。昨天天亮才睡 TAT。有机会的话回头把踩的坑也记下来。
发表时间 2023-08-17 01:40:24
发表在 技术学习
阅读数 0
2023-08-17 01:40:24
centos7 安装 php7.4 提示 No package 'openssl' found
yum install openssl openssl-devel 傻逼csdn
发表时间 2022-09-26 11:49:37
发表在 技术学习
阅读数 0
2022-09-26 11:49:37
搭建一整套服务器
硬件准备 主板:B310m CPU:i5 8400F 内存:2 x 8G 硬盘:240 SSD,3T HDD 电源:额定功率 200w 机箱 服务器规划 由于使用的小米路由器,所以内网下所有设备的ip都是 192.168.31.* 。 主机 内网ip:192.168.31.50 hyper-v SMB 文件服务 虚拟机 1:web 服务 内网ip:192.168.31.51 ssh 端口:2201 nginx php、php-fpm、swoole node.js 虚拟机 2:数据库服务 内网ip:192.168.31.52 ssh 端口:2202 mysql 内网端口:3306 外网端口:3000 用户名和密码: redis 内网端口:6379 外网端口:3001 密码: mongodb 内网端口:27017 外网端口:3002 用户名和密码: nginx 虚拟机 3:运维服务 内网ip:192.168.31.53 ssh 端口:2203 gogs 内网端口:3000 外网端口:3003 外网访问地址:http://gogs.xtzero.me:3003 得建个 git 用户,git 用户密码得记。 jenkins 内网端口:8080 外网端口:3004 外网访问地址:http://jenkins.xtzero.me:3004 git nginx java 1.8 daemonize 虚拟机 4:文档、ddns、日志 内网ip:192.168.31.54 ssh 端口:2204 yapi 内网端口:3001 外网端口:3005 外网访问地址:http://yapi.xtzero.me:3005 ddns nginx nodejs 日志服务(还没看) 虚拟机 5:邮件服务 内网ip:192.168.31.55 ssh 端口:2205 SMTP 邮件服务(还没看) 实施顺序 主机安装 windows server 主机安装 hyper-v 主机安装 SMB服务 主机安装向日葵 ddns gogs jenkins mysql、redis web 服务 剩下的随便装了 具体实施过程 等 12 月服务器到期之前实际安装的时候再记录。
发表时间 2022-08-16 17:24:47
发表在 技术学习
阅读数 0
2022-08-16 17:24:47
将家里的电脑当成服务器放到公网并允许域名访问
起因 最近搬了新家,第一件事就是把原来移动的渣渣宽带退掉,然后携号转网,投靠了联通,顺带办了联通的宽带。租房子的时候一直想在家里搭一个服务器,终于搬进了自己的房子里,就马上开始着手做这件事了。 家里有一个台式机,是之前为了玩游戏自己组的主机,后来又为了装黑苹果换了一套硬件。本来想另外买一套硬件来专门搭服务器的,因为弄房子花光了钱,就只能先用这个台式机先猜猜坑了。尝试着搭一下,看看方案可不可行。如果这次成功了,至少证明这个方案是可行的。等真正需要在家里搭服务器了,再重新来过也可以。 期望 把原来在阿里云上的服务都转移到台式机上来,配置域名解析,让外网可以通过域名访问到台式机的服务上来。 主要还是因为之前买的三年的阿里云服务器要到期了,续期的价格还高了三倍。 方案 先在台式机上装个 CentOS,搭建好服务器环境,把项目都下载下来,代码都跑起来。 配置解析,让域名解析到本地服务器的公网 ip 上。 根据 dnspod 的文档写个定时脚本,让公网 ip 变化后及时上报到 dnspod,修改解析记录。 实现 装系统和搭环境都比较容易,毕竟一直以来做的就是这些东西,这部分略过不写。 配置解析,就需要有当前机器的公网 ip。最开始想要尝试一下 ipv6 的,因为 ipv4 指向的是家里的路由器,ipv6 指向的是具体的设备。 于是使用 IPv6 测试检测了一下,发现家里的网是支持 ipv6 的。 但是友人 Hermit 及时指出了问题所在。 于是转而使用 ipv4 进行配置了。 使用百度获取到家里的 ip,在 dnspod 将域名解析到百度给的 ip 上。 然后在小米路由器的后台配置端口转发,需要将路由器被请求的接口映射到电脑上对应服务的端口上。这步没有图,因为我没在家。想起来再补图。 最蛋疼的一步来了,由于是家用宽带,即使提供了动态的公网 ip,也是不允许 80 端口被外部访问的。也就是说,无论服务器内部如何配置,只要客户端访问的端口是 80,这个请求就不会进到服务器中。 这时候就需要使用 dnspod 提供的隐形URL解析功能了。将另一个二级域名的 80 端口隐形转发到主域名的非 80 端口下,这样就实现了外部能访问 80 端口的效果。整个流程大概是这个样子: 不光这样就够了,在服务器上还需要用 nginx 来处理对应域名来的请求。以上图举例,nginx 需要处理的是 really.hostname.com:8888,而不是fake.hostname.com,因为真正访问到服务器上的域名是前者。 这样就绕了一个大圈子,终于让外网域名和内网的服务连通了。还有最后一件事,就是依照文档 写定时脚本,定期上报本机 ip 即可。 由于是动态 ip,所以无法避免一个问题:用脚本上报 ip 后,解析生效还需要一段时间,大约五六分钟左右。所以每次 ip 变更后都会有五六分钟的宕机时间,这个暂时没想到方案可以避免。由于搭建的服务器就是我个人的博客和一些小的项目,这个影响暂时不是很大。如果是很多人用的在线服务,这个影响就很大了。
发表时间 2022-05-19 16:44:50
发表在 技术学习
阅读数 0
2022-05-19 16:44:50
我们做了一个领养平台
大约是2020年的3月,我找到叶姨,我说想做一个领养平台。 感觉现在送养和领养的市场很大,而且信息不对等。想领养的人找不到靠谱的养猫人,想送猫的人找不到想领养的人,找到了也怕不靠谱。那会我刚好在看boss直聘,发现可以用简历和岗位的方式去做领养和送养。领养的人需要制作一份自己的领养简历,说明自己的养宠物经历。送养的人也可以在平台上积累自己送养的经历,以显示自己在养猫这条路上的经验积累。 科学喂养很重要。这件事是我养了大C之后才明白的。在那之前,我以为养猫养狗就是让它能吃能睡就可以了。把大C领回家之后,我发现需要学习的东西太多了,就连最基本的选粮选猫砂选玩具,都是从头学起。这学习的过程中,叶姨帮了我许多。 大C是我毕业后领养的一只大白猫,名字是室友楠哥起的。楠哥为我以后养宠物都布好了局,养猫叫大C,养狗叫大D,养猪叫大P,以此类推。叶姨是我探索领养过程中认识的资深养猫人,我从叶姨手里领养到了一只三花妹妹,只是三花妹妹胆子太小了,来了家里不吃不喝,就被叶姨领走了。从那之后,养猫的事情事无巨细,我都是问叶姨,从某种角度上来讲,叶姨是我养猫路上的老师。 叶姨是一位资深铲屎官,家里有好多好多猫,都是被救助回来的。叶姨在救助这条路上走了十多年,被救回来的猫数不胜数,这其中故事也三天三夜都讲不完。我想做这样一个平台,可以承载领养和送养之中信息交接的事情,让有爱心的人可以多救助流浪猫,让想领养猫的人也能很快的找到靠谱的送养人。 前些天一个朋友跟我说,“我被一只猫咪捡到了,来告诉你一下”。这是多么幸运的一件事啊,无论对于猫还是对于人,我这样想。做这样的一个平台完全是公益性质的,只是不愿意看见有很多的流浪猫再在街上跑了。有的时候走在街上,看到一只特别可爱的猫咪在捡路边的剩饭,我就想,这本来应该是跟人类抢沙发的猫咪啊。如果这个平台能在“世界上再也没有流浪猫”这件事上产生一点点的推动作用,我就知足了。 “喵爪”是我一直想做的东西,这可能是我学技术以来第一次想为世界做点什么,也可能是一种莫名的使命感。学习的过程就好像在磨一把剑,小有成就后就会觉得自己手里有了一把不算很锋利的利器。有的人手里有刀了之后第一想法是砍向那些本来砍不到的人,而我想用这把刀去保护那些本来保护不了的人和动物。 这个东西很久之前就开始做了,但是没有想到会有一天能有这么多人和我一起做。叶姨在圈子里算是小有名气,还有很多像我一样的追随者随时准备帮忙。于是我们的小团队就这样组建好了。我负责把东西做出来,让这些信息可以在网上流通。伙伴们负责想点子和提供内容。第一批的数据已经跑在数据库里了,最初的梦想也就是让这些小动物都有家可归。 我们提倡科学喂养,希望所有想要养猫的人都能学习正确的喂养知识,让更多可爱的猫咪有一个温暖的家。后期可能会发展一些内容上的功能,分享一些喂养知识,或者是邀请一些资深铲屎官来分享一些养猫途中的故事和经验。叶姨十年来的故事我也很好奇,希望有一天能让这些故事出现在我的平台上。 更长远一点的梦想,可能就不限于流浪猫。等我们足够强大,我们希望可以帮助更多流浪动物找到自己的铲屎官。天下苍生与我们出生在同一个世界上,只是因为人类的进化而走到了食物链的顶端。作为高等动物,更应该去帮助其他动物更好地生存。我们不希望看到有虐猫虐狗的事情出现,正所谓“弱者抽刀向更弱者”,如果一个人只能靠欺凌更弱小的动物来获得快乐,那和野兽还有什么区别。 更远的梦想就不敢提了,毕竟现在连第一步还没有迈出。希望我们的努力会让世界变得哪怕一点点的更好吧,这是我喜欢做的,也是我想做的,也是大C想看到的。 “喵爪”开业大吉。
发表时间 2021-09-18
发表在 技术学习
阅读数 0
2021-09-18
使用自定义指令完成页面间保留状态
业务需求 我们需要在单页面应用中,在页面切换的过程中也保持某些输入框的状态。例如在页面A使用手机号搜索出了一个列表,从B页面切换回A页面时,还要保持手机号的输入和搜索结果。 页面生命周期 对于传统页面,一个页面的生命周期就是从加载网页到关闭或刷新网页,用户的操作全部都是在这个生命周期里,开发的时候考虑单个生命周期的状态及数据流动即可。页面切换会导致url变化,从而重载页面。 对于SPA项目,整个网站是一个页面,也是一个完整的生命周期。每个子页面各自的生命周期只是整体生命周期中事件循环的一部分。SPA项目使用路由来控制子页面切换,路由切换会导致锚点(有的项目则是url参数)变化,而不会重载整个页面。可以理解为SPA项目把页面切换变成了一个网页中的功能,开发者开发一个又一个“页面”则是当前页面下的一个组件。页面切换则是通过diff算法来改变页面上显示的元素来实现的。 方案 <keep-alive> keep-alive是Vue官方提供的页面缓存组件,官方对此的解释是: <keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。 当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。 在 2.2.0 及其更高版本中,activated 和 deactivated 将会在 <keep-alive> 树内的所有嵌套组件中触发。 主要用于保留组件状态或避免重新渲染 但是在实际使用过程中,keep-alive会导致在路由切换时传页面,搞得我的前端同事很痛苦。具体为什么串页面,以及keep-alive的运行原理,我没有仔细研究,这个是未来需要学习的一个点。而且在这个业务需求里,我们也不是想要完全保留页面的状态,而是保留某个组件的值。如果未来有某个需求,只想让页面中的某几个输入框保留状态,keep-alive的优势就一点都没有了,反而成了bug。于是这让我想到,有没有什么办法也能保留页面状态,而且是组件级别的。 v-directive 这就让我想到了Vue的自定义指令Directive。Directive是写在每一个组件上的,可以根据自己写的逻辑,让这个组件的生命周期里实现不同的逻辑。 于是我想,能不能写一个指令,让所有带这个指令的组件在状态被更新的时候,都把当前值保存到store,在这个组件重新被创建时,都从store里取到值,并重新填回组件的绑定对象里。查了一下自定义指令的功能,这么干是可以的。干成功之后发现这玩意确实是可以的。 干 Directive 指令 官方文档 对于Vue的指令我们已经很熟悉了,平时常用的v-if、v-for都属于Vue指令。Vue对于指令的描述是: 在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。 钩子函数 在Vue的文档中,我们直接复制过来钩子函数的内容: bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。 inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。 update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。 componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。 unbind:只调用一次,指令与元素解绑时调用。 在这次的开发中,我们用到了bind和componentUpdated钩子。我们在组件更新状态时将新的值保存到store中,在页面重新被进入,组件在本次进入页面中第一次出现时从store中取值,如果有值则存入组件的状态里。 组件的全局唯一key 既然要全局保存一个组件的状态,我们则需要试图从directive提供的参数里找到能在全局代表一个唯一组件的值。这里就需要提到bind和componentUpdated钩子提供的参数。 bind(el, binding, vnode); componentUpdated(el, binding, vnode, oldVnode); 在一番console.log观察后,我发现vnode.data.model.expression是组件绑定值的表达式。例如有组件<input v-model="search.mobile"></input>,那么这个组件绑定值的表达式就是search.mobile。只要在一个页面中,data中的某一个值只被一个组件绑定,那么vnode.data.model.expression在当前页面就是唯一的。如果一个页面中data中的某个值被多个组件绑定,那也满足我们的需求——这多个组件共用一个状态,我们为这些个组件保留为同一个状态,这也合理。 在另一番console.log观察中,我发现vnode.child.$route.fullPath是这个组件所在的页面的路由值。如果当前页面路由值是全局唯一的,那么${vnode.child.$route.fullPath}_${vnode.data.model.expression}就是这个组件在全局的唯一标识。例如当前页面的路由是/home/page1,组件的v-model是search.mobile,此时唯一标识是/home/page1search.mobile,表示在页面/home/page1中,绑定了search.mobile的组件。如果想更人性化一些,可以使用md5或sha1等的方式,让这个唯一标识更像id一些,但我没有这样做,现在这样就足够了。 不使用v-model的麻烦组件 到这里还有一个问题。对于普通的使用v-model来绑定值的组件来说,vnode.data.model.expression可以直接拿到v-model里的表达式,我们这个方法还好用。如果是element-ui里的pagination这样的组件,绑定值是用:page.sync这样的属性来实现的,我们的表达式就不管用了。所以对于非v-model绑定的组件,我们提供了state-key属性。在这种组件中使用指令的时候,需要额外使用state-key来指定绑定的值。比如: <pagination v-stateful state-key="page.page" :page.sync="page.page" /> 在实际使用过程中,我们发现这类组件不光有state-key的问题,由于不是使用v-model更新的状态,就算是我们用指令把数据塞到page.sync绑定的值里,组件的显示状态也不会变。也就是说会有可能当时页面已经被指令翻到第4页了,但页面上显示的还是1。为了解决这个问题,我们尝试了Vue.$forceUpdate,但是不管用,问题出在组件的:key上。如果使用指令改动了这个组件的绑定值,也需要更新这个组件对应的:key值,这样才会更新这个组件的显示状态。 <pagination v-stateful state-key="page.page" :page.sync="page.page" :key="randnum" /> data() {return { randnum: 1 }}, methods: { switchPage() { // .... randnum ++ } } 这里其实有改进的余地,可以让指令的代码不用污染到具体的业务组件。可以在state中创建一个randnum的对象,每个页面的全局唯一key都是这个对象下的子对象。对于这些“麻烦组件”,让它们的key去绑定这个store里的值,在指令更新了组件的值之后,再去更新对应的randnum就好了。 // $store.state { stateful: { randnum: { "/home/login_mobile": 1, "/home/login_passwd": 1, "/home/dashboard_mobile": 1, "/home/dashboard_gender": 1, } } } componentUpdated(el, binding, vnode, oldVnode) { // ... vnode.context.$store.state.stateful.randnum[vnodeKey] ++ } 上面说的“改进的余地”实际还没有改进,现在的项目中还是在每个页面里为这些麻烦组件在data里单独声明一个随机数变量,有机会一定把这些麻烦分子都干掉。 起个名 既然这个自定义指令让使用它的组件都更富有状态,甚至可以抵抗路由切换,那么我们就叫它stateful吧。那么对应的指令就是v-stateful了。 这个名字在前面的实例代码里也出现过好多次了。 全局绑定 指令开发好了,被我放在了@/directive/stateful里,在main.js里全局声明一下,就能在整个项目的任何地方都使用v-stateful来应用这个命令了。 // @/main.js import stateful from '@/directive/Stateful/stateful.js' Vue.directive('stateful', stateful) // @/views/*.vue <pagination v-stateful state-key="page.page" :page.sync="page.page" :key="randnum" /> NPM 既然是一个独立的功能,能不能不让它出现在我们代码的业务目录里,而是像某一个独立的模块一样,被yarn安装在node_modules里。于是我想,能不能把它发布到npm上。 先去npm的官网注册个账号,然后去github上创建个仓库,把自己的代码组织一下。 / ---- src -------- stateful.js ---- index.js ---- package.json /src/stateful.js就是刚刚写完的完整的业务代码,index.js负责导出。在加上其他乱七八糟的文件(.gitignore、readme),就可以准备发布了。发布过程没什么含金量,我就罗列了。 $ yarn init $ npm login -d # 在这输入在npm官网注册的用户名、密码、邮箱 # 而且邮箱是公开的 $ npm publish 如果输出绿色的话,不出意外你就可以在npm仓库里搜到自己的成果了。 发布成功后,我们把@/src/directive里的代码删掉,使用yarn安装自己的库,从库中引入。 $ yarn add statefulvue import stateful from 'statefulvue' Vue.directive('stateful', stateful) 十分炫酷。 相关地址 npm地址 github源码
发表时间 2021-08-27
发表在 技术学习
阅读数 0
2021-08-27
StatefulVue - 保存状态的自定义指令
statefulvue 保存状态的自定义指令 @xt 在任意需要保存状态的组件上使用 v-stateful,即可在当前Vue生命周期内,路由切换的过程中保留其绑定的值。例如: <el-input v-model="value" v-stateful></el-input> 可以对组件提供 :query-key=“queryKey” 属性,来优先从queryKey的url参数里获取值。例如: <el-input v-model="value" query-key="input_value" v-stateful></el-input> 对于一些不是使用v-model绑定的组件,需要为其指定 state-key,来让stateful指令知道需要绑定到data下的哪个值 这些组件往往不是双向绑定,所以需要将key绑定到 $store.getters.randNum 上,来保证每次都会更新组件状态。例如: <pagination v-stateful state-key="page.page" :page.sync="page.page" :key="$store.getters.randNum" /> 如果一个组件使用了v-stateful,但没有v-model和state-key,则会报错:使用v-stateful,v-model 和 :state-key至少有其一。
发表时间 2021-08-25
发表在 技术学习
阅读数 0
2021-08-25
charles 在线破解
链接
发表时间 2021-04-27
发表在 技术学习
阅读数 0
2021-04-27
小程序中使用组件和插槽
小程序中页面和组件是完全不同的两个东西,这里跟Vue还是有很大的差别的。最近写小程序用到了,就做个记录。 定义组件 创建组件的时候使用小程序开发工具中的“新建Components”,就可以创建组件四件套。 其中,组件的js文件中,构造方法和页面是不一样的。 Component({ /** * 组件的属性列表 */ properties: { }, /** * 组件的初始数据 */ data: { }, /** * 组件的方法列表 */ methods: { } }) 组件属性 和Vue相同的是,组件中data和properties是区分开的。二者的区别是“在使用组件时需要不需要从父组件/页面中传入”。data中存放内部的值,是不需要从父页面传入的;properties中存放组件属性,这里的值是可以从父页面传入的。 本文中我们想要开发一个“设置”页面。在这个页面中,每一行设置项都使用封装的组件。每个组件需要标题、图标、右侧的文字内容或图标。从而我们描述如何在小程序中封装组件和使用插槽,还有父页面和子组件之间通信。 本文中使用page代表页面,使用components代表组件。使用wxml代表页面/组件文件,使用wxss代表样式文件,使用js代表js文件。 <!-- page.wxml --> <list-card title="设置用户信息" icon="flower-o" ></list-card> <!-- component.js --> properties: { title: { type: String, value: "" }, icon: { type: String, value: "" } } 从代码中可见,properties中定义的值可以被父页面中的组件标签传入。在定义properties时,可以指定类型和默认值。 插槽 slot是Vue中的特性,既然提到了组件,那么小程序中就也有插槽的特性。很幸运地,小程序中,插槽和Vue中的插槽用法大致相同。 例如在上面的例子中,我们需要使用插槽来自定义右侧的图标或文字。 <!-- page.wxml --> <list-card title="设置用户信息" icon="flower-o" > <van-icon slot="subtitle" name="arrow" /> </list-card> <!-- components.wxml --> <view class="card"> <slot name="subtitle"></slot> </view> 父页面中给组件绑定事件 也就是在组件中调用父页面中的方法 我们需要在组件中预置点击事件,触发事件时主动调用父组件中的方法。 <!-- components.wxml --> <view class="card" bindtap="onCardClick"></view> 组件中的点击事件这样写,从而触发父页面中,写在组件属性中的事件。 // components.js onCardClick() { this.triggerEvent("click", {}) } 看组件js的代码意思大概是触发当前组件的click事件,在父页面中,我们需要给组件指定一个bindclick属性。 <!-- page.wxml --> <list-card title="关于" icon="warning-o" bindclick="setUserInfo" > 不知道小程序这样设计是为了什么,明明在组件中指定的是click事件,但在父页面中得在这个词前面再加bind。不得不说这样的设计惊为天人。 // page.js setUserInfo() { // 在这写具体的逻辑 } 父页面中调用组件的方法 首页中的tab页我使用组件方式实现,使用tab切换的页面都使用组件实现,首页里套这些组件。 现在需要在列表触底时触发组件的列表翻页事件。只需要在父页面中取到组件的节点,直接调用节点下的方法即可。 // page.js // onReachBottom 是小程序的页面触底事件 onReachBottom() { if (this.data.tabbarActive == 'home') { const homepage = this.selectComponent('#homepageComponent') homepage.onPagePullUp() } } // components.js /** * 当页面上拉加载 * 从父页面index触发 */ onPagePullUp() { // 里边是具体的上拉加载逻辑 const _this = this _this.setData({ ["where.page"]: _this.data.where.page + 1 }) _this.getList() }, 总结 小程序真好玩。
发表时间 2021-04-12
发表在 技术学习
阅读数 0
2021-04-12
在easyswoole里内置文档
YAPI时代 在之前的文章里我给内网搭了个YAPI文档管理站。在那之前,我跟前端的交流基本全靠企业微信。写好了接口在企业微信把参数和路径发过去,前端有问题了再找我。后来有了YAPI,从那之后我跟前端的互动就友好了很多。写完接口我就把接口填到YAPI里,需要特殊标记的事情我就写到备注里。 就这样,我跟我的前端度过了一年的快乐时光。这段时间里我送走了(他们自己离职)三个前端,在又收获了三个前端之后,我决定重新构建接口文档这一体系。 新的想法 公司的后端项目使用EasySwoole搭配FastRoute开发,正赶上最近开了新的项目,我和另一个后端哥哥想要使用PHP Annotation的注解功能来标注参数,从而进行参数验证。查看EasySwoole文档后发现框架已经自带注解功能了,于是想要使用框架自带的注解功能来获取参数,对接到原来的参数验证方法上。 引入相关的EasySwoole\HttpAnnotation\Utility\AnnotationDoc库等进行调试,发现EasySwoole的AnnotationDoc有个很致命的问题,那就是注解获取参数只能在控制器层进行。通常在后端架构上,参数验证功能通常都是在中间件中进行,稍微low一点的(比如我们)也是在BaseController中进行,但他们这东西只能在业务控制器上进行。如果采用这个方案的话,参数验证就不能统一处理了,只能在进入业务层之前验证前端参数。更鬼畜的是,用这种方式接收的前端参数,要么分成多个控制器参数接受,要么再多写一行注解统一堆到一个变量里。类似这个样子: /** * @Param a * @Param b * @Param c */ function example($a, $b, $c) { } 或者是 /** * @Param a * @Param b * @Param c * @Data $data */ function example() { } 无论哪种都不能实现我们的需求,于是我打算自己写一个。 在想用注解之前,我们的规则验证是用抽象类规定,在每个业务控制器里都必须包含一个getRule方法,用来规定每个接口的参数,例如: protected function getRules() { $rules = parent::getRules(); return array_merge($rules, [ 'infoMemo' => [ 'cid' => ['type' => 'int', 'default' => 0, 'desc' => ''], 'uid' => ['type' => 'int', 'default' => 0, 'desc' => ''] ], 'link' => [ 'cid' => ['type' => 'int', 'require' => false, 'default' => 0, 'desc' => '显示的cid'], 'mobile' => ['type' => 'string', 'require' => false, 'default' => '', 'desc' => '输入的手机号'] ] ]); } 这样也不是很人性化,特别是一个控制器里的接口多了之后,getRule方法就会变得特别特别长,代码逐渐变得不可维护。 在我自己的项目中,我都是在业务控制器中调用一个param方法来单独处理参数,这样就把标注参数的任务平摊到了每个业务控制器上,这样可以让代码看起来更加平均,参数维护起来也很省心。 既然这次接触了注解,那我们就重新设计参数验证方案,来从注解中获取参数,并对接到之前的参数验证逻辑中。 注解格式设计 既然要使用新式的注解,又要兼容之前的验证逻辑,那我们新设计的注解就长这个样子: /** * @Apiname 列表 * * @Param type {"type": "int", "desc": "类型"} * @Param order_by {"type": "string", "desc": "排序方式"} * @Param page {"type": "int", "default": "1", "desc": "第几页"} * @Param limit {"type": "int", "default": "20", "desc": "每页几个"} * * @Apidesc 一个列表接口 * */ 使用@Param关键字标注一个参数,接下来是参数名,最后是规则。新的规则表达式跟之前的表达式一样,只不过是转换为了json格式,这样更方便后边解析。 获取注解内容并解析 在EasySwoole中,我们可以使用控制器中的Request对象来获取当前请求的程序路径,例如这样就可以获取到当前程序运行的命名空间、类、方法: $this->request()->getUri()->getPath() 于是我们经过一番操作,就能分别获取到当前的类的路径和方法名。 $path = $this->request()->getUri()->getPath(); $pathArr = explode('/', $path); $pathArrWithoutFunction = $pathArr; $functionName = $pathArrWithoutFunction[count($pathArrWithoutFunction) - 1]; unset($pathArrWithoutFunction[count($pathArrWithoutFunction) - 1]); $controllerName = 'App\\HttpController\\' . implode('\\', $pathArrWithoutFunction); // $controllerName 是控制器类路径 // $functionName 是方法名 然后通过PHP的反射类,获取到对应的注释文本。 $ref = new \ReflectionClass($controllerName); $methodRef = $ref->getMethod($functionName); $doc = $methodRef->getDocComment(); // $doc 是完整的注释字符串 然后我们通过explode函数,使用\n将注释按行分割,逐行解析注释内容,提取到我们在注释中写的参数名和规则。 $_a = strpos($line, '@Param') + 6; $_b = strpos($line, "{"); $_name = trim(substr($line, $_a, $_b - $_a)); $_value = substr($line, $_b); $_rule = array_merge(json_decode($_value, true) ?? [], self::$commonRule); // $_name 是参数名 // $_rule 是规则数组 // self::$commonRule 是控制器里定义的公共参数,类似于appid之类的 这样我们就可以将参数名和规则数组传入原来的参数验证逻辑中处理了。到此为止,新的注解方式的参数标注就已经完全对接到我们原来的参数验证逻辑上了。 本来这个想法应该到此为止,但是我不满足于仅仅一个参数验证,我还希望借助这个注解的方式,可以自动生成接口文档。于是就有了后面的内容。 抛弃YAPI 由于所有的路由都定义在一张路由表Route.php中,所以我们可以从中获取到当前项目全部的接口。这里就出现了另一个恶心的事情,那就是FastRoute没有获取全部路由列表的功能(或者是我找遍了文档都没找到)。只能再次使用解析字符串的老本行了。 使用file_get_contents读取文件内容,再解析字符串。遇到带addGroup的行就分组,遇到post或get就用反射处理注释。 $routeFileContent = file_get_contents(self::$routerFilePath); $routeFileContentArr = []; $currentGroup = "/"; foreach (explode("\n", $routeFileContent) as $line) { if (stripos($line, 'addGroup') !== false) { preg_match_all('/addGroup\((.*), function/', $line, $matchGroup); $currentGroup = str_replace(["\""], "", $matchGroup[1][0]); } if (stripos($line, '$route->get') !== false || stripos($line, '$route->post') !== false) { preg_match_all('/\$route->(post|get)((.*), (.*));/', $line, $matchRoute); $method = $matchRoute[1][0] ?? ''; $url = str_replace(["(", "'", '"'], '', $matchRoute[3][0] ?? ''); $function = str_replace(['"', ")", "'"], '', $matchRoute[4][0] ?? ''); $group = $currentGroup; $params = []; // ... 就这样,我们就得到了一个完整的路由数组。 为了显示页面,我们需要写一个简单的模板变量替换的方法。 /** * 模板变量替换 * @param $templateFilePath * @param $data * @return false|string|string[] */ public static function C($templateFilePath, $data) { if (file_exists($templateFilePath)) { $content = file_get_contents($templateFilePath); foreach ($data as $k => $v) { $content = str_replace('{{'. $k .'}}', $v, $content); } return $content; } else { return ""; } } 然后使用这个简陋的模板渲染方法,将页面一点一点渲染出来。 public static function getDocHtml(Response $response) { if (ENVIRONMENT !== 'development') { self::display($response, ""); } else { $allRoutes = self::getAllRoutes(); $html = self::C(self::$phpdocPath . "/index.html", [ "title" => "接口文档", "baseHost" => Config::getInstance()->getConf('BASE_HOST'), "routes" => implode('', array_map(function($group) { return self::C(self::$phpdocPath . '/routeGroup.html', [ 'groupName' => $group['group'], 'routes' => implode('', array_map(function($route) { return self::C(self::$phpdocPath . '/route.html', [ 'method' => $route['method'], 'route' => $route['url'], 'group' => $route['group'], 'function' => $route['function'], 'apiname' => $route['apiname'] ?: "{$route['group']}{$route['url']}", 'apidesc' => $route['apidesc'], 'params' => implode('', array_map(function($param) { return self::C(self::$phpdocPath . '/param.html', [ "name" => $param['name'], "rule_desc" => $param['rule']['desc'] ?? '', "rule_require" => $param['rule']['require'] == 1 ? "是" : "否", "rule_type" => $param['rule']['type'] ?? '', "rule_enum" => implode(',', $param['rule']['enum'] ?? []), ]); }, $route['params'])), ]); }, $group['routes'] ?? [])) ]); }, $allRoutes ?? [])), "columns" => implode("", array_map(function($route) { return self::C(self::$phpdocPath . '/columnItem.html', [ 'name' => implode(" ", [$route['group'], $route['apiname'] ?: $route['url']]), 'id' => "{$route['group']}{$route['url']}" ]); }, (function () use($allRoutes){ $_allRoutes = []; foreach ($allRoutes as $v) { foreach ($v['routes'] as $vv) { array_push($_allRoutes, $vv); } } return $_allRoutes; })())) ]); self::display($response, $html); } } 如此大费周折,还不是模板变量替换方法太简陋了。为了前后端逻辑分离,在这里浪费了太多精力。 最后我们将得到的html字符串传送到浏览器就可以了。 $response->write($html); $response->withHeader('Content-type', 'text/html; charset=UTF-8'); $response->withStatus(200); 最后的实现结果是 新的计划 写到这里我就有点沾沾自喜了,因为接下来的开发里,我不需要再写完接口去给前端填写YAPI了,省去了一大部分编写文档的时间。 但到了自己调试接口的时候我就发现问题了,没有YAPI的话,我自己没法调试啊!YAPI有发送接口的功能,但我这玩意没有。要是想让我这个东西能发包,我还得开发个chrome插件来实现,或者是把公司前端项目里的参数验证逻辑也搬进来,包括恶心人的参数签名。 然后我发现了YAPI有json导入功能,可以识别YAPI、Postman、Swagger生成的json文件。于是我就有了下一步的计划。 下一步打算将获得的路由数组处理成YAPI能读的格式,然后对外网开放一个获取JSON的接口,这样把接口填到YAPI的后台,就能让YAPI也自动拉取接口文档了。这样就真的全自动了。
发表时间 2021-03-19
发表在 技术学习
阅读数 0
2021-03-19
Effie - 一款简约、冷静、优雅的写作app
(我居然写软文了) Effie - 一款简约、冷静、优雅的写作app 我与markdown 在我很久之前的一篇文章中曾经求过你学习一下markdown,因为大部分对写作有需求的用户都有着这样的需求,那就是需要专注于写作内容,同时也需要一定的格式支持。 于是市面上就出现了两极分化的写作软件:第一种是类似于记事本一类的软件,它们不支持格式,或者一个文档仅支持同样的格式,它们的格式设置就像凑数的一样;另一种是类似word一类的软件,它们对格式支持特别强大,强大到你需要对这一种软件进行专门的学习。 在接触markdown之前,我的世界就像上面说的那样两极分化。有的时候仅仅是想记录下当前所想的内容,却在“打开word-保存文件-起文件名”的过程中就忘了想要写什么了。 从写博客开始 后来自己有了写博客的需求。在那之前,博客对于我来说就是QQ空间的日志,时不时记录一些鸡毛蒜皮的小事。博客的需求对于我来说,定位更加精确一些——我需要一个技术博客,来记录自己技术学习的历程。作为PHPer的我,自然而然地选择了typecho作为第一个博客。决定搭建博客的那个夜晚,我用几个小时的时间,购买了服务器,把typecho部署到了服务器上。当使用公网ip访问到了自己的typecho首页时,决定要经常更新博客,早日成为技术大牛。 typecho自带的markdown支持,让我获得了非常舒爽的写作感受。一个#代表一级标题,两个#代表二级标题,使用小角号框起来代表代码块…只需要记住一些简单的语法,就可以让markdown引擎处理成精美的文档页面。typecho伴随了我写博客的前两年。 后来在工作中使用了npm,与之一起出现在我的世界中的是另一个文档构建工具gitbook。gitbook甚至比typecho还便捷,它不需要数据库支持,也不需要把整个系统都部署到服务器,只需要在本地写好了md文档,上传到服务器上执行构建,就会变成静态的网站页面,连php处理伪静态都省了,人家可是真静态。 这时候就需要在本地使用一个支持markdown的编辑器了,在朋友的推荐下,我开始使用typora编写md文档。写完表示格式的符号之后马上就会显示出对应的样式,丝滑的体验让我爱上了这种写作体验。与之同时我接触到了hexo,我的博客体系正式敲定,这一套工具也伴随我到现在。 markdown 一柄写作利器 写博客的过程中,我发现markdown是可以抽离出来的单独的知识体系,只要会了markdown的语法,在任何支持markdown的地方都可以用它进行书写。不仅如此,不同的工具或网站还会把同样的markdown文档处理成不同样式的页面。比如github的readme页面和我自己的博客页面的展示样式就不一样。这让我很乐在其中。 会了markdown这柄利器后,我开始在其他需要书写的场景也寻找markdown的用武之地,很快地我盯上了最常用的写作场景——笔记。无论是学习中的笔记还是工作中的会议记录,我都可以在markdown的加持下展现更高的效率。 由markdown到笔记 在使用markdown记笔记的过程中,我体验了很多基于markdown的笔记软件,例如很常见的简书、熊掌记、语雀、我来等等。此类软件中的markdown大多是markdown的子集,也就是在markdown基础上削减一些复杂的书写格式,毕竟面向的是不会写代码的普通用户,跟写代码一样的道理,让用户写复杂的markdown也是不合理的。普遍的弥补方式是将复杂的类似表格的功能做成可点击的按钮,这样就可以使用简单的markdown语法配合简单的图形界面操作,在专注于写作的同事,也能写出好看的笔记了。 与Effie相识 这时候就要提到这次的主角Effie了。跟上面提到的其他工具不同,Effie是一款客户端软件,但它不是像typora那样的“文件编辑器”;同时Effie是在线的文档工具,但它不像语雀、简书那样只能在网页上操作。Effie同时具备客户端软件和web工具的优点,它具有网页的在线保存文档等优点,同时具有客户端软件的美观和流畅性。 简约的Effie Effie很简约,简约到它的官网不需要任何使用说明。任何用户注册进入程序后,都会在作品库里默认添加Effie使用入门和Effie快捷键列表。Effie支持markdown中的标题、字体、列表等语法,你可以使用#快速打出一个一级标题,也可以使用+或-创建一个无序列表。 在Effie中,你甚至可以体验到typora一样的所写即所得的体验,在空行输入三个减号---,可以快速创建一个分割线。 对于程序员或专业领域人员,可以使用一对``````来创建代码块,对于需要标注代码、公式或是其他场景都十分好用。 创建列表后,还可以点击左侧的符号来创建思维导图,这是迄今为止我所用过的最快的创建思维导图的方式。手里的mindnode瞬间就不香了。 一切都编写完成后,如果没有特殊需求,你可以将文档保存到云端,这样你只需要在其他位置登录你的Effie账号,就可以实现文档漫游。如果需要将文档导出成文件,Effie还提供了多种格式的文件导出支持。 冷静的Effie Effie很冷静,她不会在自己身上随意做加法,相反地,纵观Effie的界面,连按钮都几乎没有。她不需要更多的操作点来触发很多的功能,她只是在你需要的时候——例如需要写作的时候——给你展现出需要的功能组件——例如一个编辑区,这就足够了。 冷静是功能设计中很难得的点,大多数产品在设计阶段就开始了无尽的加法,产品经理恨不得把毕生所学都堆到一个功能里,这就导致了大部分的产品都很难逃离“臃肿”这一大弊。 其实一个好的产品,对于用户来说,只需要在需要的时候拿出必要的部分就足够了。至于其他没有展现的部分,总有需要它们的地方。如果一个软件的某些部分,在整个软件中根本没有需要展现的位置,那甚至就需要讨论这个部分是不是需要继续留下了。 在Effie中几乎不需要考虑这些问题,在足够的冷静下,任何一个多余的按钮都会打破这美好的意境。 优雅的Effie 在注册app后自带的几篇文档中,开发团队提到: Effie 是思想家专用的写作软件。 并解释说: 即使是优秀的思想,也只有变成文字才能为人所知,这就是思想家的宿命。 Effie 致力于把思想变成文字,最终成为价值。 作为一个开发者,同时也是内容创作者,这句话直接戳中我的心。一款好的写作软件,它不应该专注于提现它有多么多么多的功能点,或者是多么多么的庞大。相反地,庞大则意味着臃肿。一个好的写作软件,应该可以让使用它的人沉迷于写作本身,应该做到“无感”。 对于“思想家”,开发团队做了如下诠释: 思想家是心无旁骛的 —— “不觉已春深,物我两相忘” 思想家是注重逻辑的 —— “桐花诗八韵,思绪一何深” 思想家是敏捷高效的 —— “无穷如天地,不竭如江海” 程序工作者不应该是笨拙且木讷的,相反地,程序工作者应该是世界上最优雅的群体。他们使用内心的禅意,创造着改变他人的产品,用自己的理念来潜移默化地改变着世界,这是多么中二且热血的事。 Effie和Effie的创造者们一样,整个产品整体流露着优雅和禅意。创造者们使用自己的内心浇筑着Effie,使得Effie一样优雅且充满自信。 像Effie的创造者在文档中写的那样,文字工作本就应该有意清秋入衡霍,为君无尽写江天。
发表时间 2021-03-03
发表在 技术学习
阅读数 0
2021-03-03
一个刷访问量的前端脚本
在主流浏览器中按F12打开开发者工具,点击选项卡console。要是没有console的话在右边的>>里找试试。 把下面的代码粘贴进去就可以用了。 复制粘贴后按回车,网页上会出现一个小窗口并不断刷新。 想要停掉的话就刷新网页(F5)或者关掉当前网页(Ctrl+w)就可以了。 下面是代码,两个版本都可以用,加密版本更俏皮,但也更长。 代码原文 (function(){var c=document.createElement("div");c.style.width="200px";c.style.height="22px";c.style.position="fixed";c.style.top="22px";c.style.right="10px";c.innerHTML="刷访问量插件";c.style.fontSize="12px";c.style.textAlign="center";c.style.backgroundColor="black";c.style.color="white";document.body.append(c);var b=document.createElement("div");b.style.width="200px";b.style.height="22px";b.style.position="fixed";b.style.top="144px";b.style.right="10px";var a=1;b.innerHTML="已经访问了"+a+"次";b.style.fontSize="12px";b.style.textAlign="center";b.style.backgroundColor="black";b.style.color="white";document.body.append(b);var d=document.createElement("iframe");d.style.width="200px";d.style.height="100px";d.style.position="fixed";d.style.top="44px";d.style.right="10px";d.src=window.location.href;d.onload=function(){b.innerHTML="加载完成,1s后刷新";setTimeout(function(){d.contentWindow.location.reload(true);a++;b.innerHTML="已经访问了"+a+"次"},1000)};document.body.append(d)})(); 加密版本 ゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚ー゚))+ (゚Д゚) .゚Θ゚ノ+ (゚Д゚) .゚Θ゚ノ+ (゚Д゚) [゚Θ゚]+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) .゚Д゚ノ+ (゚Д゚) .゚Д゚ノ+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚) ['c']+ (゚Д゚) [゚Θ゚]+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚) .゚ー゚ノ+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚ー゚)+ (゚Д゚) .゚Д゚ノ+ (゚Д゚) [゚Θ゚]+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) .゚ー゚ノ+ (゚Д゚) [゚Θ゚]+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚) .゚Д゚ノ+ (゚Д゚) ['c']+ (゚Д゚) [゚Θ゚]+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚ー゚))+ (゚Д゚) .゚Θ゚ノ+ (゚Д゚) .゚Θ゚ノ+ (゚Д゚) [゚Θ゚]+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) .゚Д゚ノ+ (゚Д゚) .゚Д゚ノ+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚ー゚)+ (゚Д゚) .゚Д゚ノ+ ((゚ー゚) + (゚ー゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((o^_^o) +(o^_^o))+ (゚Д゚) .゚Θ゚ノ+ ((o^_^o) - (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (c^_^o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚) .゚ω゚ノ+ (c^_^o)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚ー゚))+ (゚Д゚) [゚Θ゚]+ ((゚ー゚) + (o^_^o))+ (゚Д゚) .゚ー゚ノ+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) .゚Θ゚ノ+ ((゚ー゚) + (゚ー゚))+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚Д゚) [゚Θ゚]+ (゚Д゚) [゚Θ゚]+ (c^_^o)+ (゚Д゚) ['c']+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (c^_^o)+ (゚Д゚) .゚Д゚ノ+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) .゚Θ゚ノ+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) .゚ー゚ノ+ (゚Д゚) [゚Θ゚]+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (o^_^o))+ (゚Д゚) .゚Д゚ノ+ (゚Д゚) ['c']+ (゚Д゚) [゚Θ゚]+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚ー゚))+ (゚Д゚) .゚Θ゚ノ+ (゚Д゚) .゚Θ゚ノ+ (゚Д゚) [゚Θ゚]+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((゚ー゚) + (゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚) .゚Д゚ノ+ (゚Д゚) .゚Д゚ノ+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ (゚ー゚)+ (゚Д゚) .゚Д゚ノ+ ((゚ー゚) + (゚ー゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(o゚ー゚o)+ ((o^_^o) +(o^_^o))+ (゚Д゚) .゚Θ゚ノ+ ((o^_^o) - (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (o^_^o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');
发表时间 2021-03-01
发表在 技术学习
阅读数 0
2021-03-01
vue中监听store中值的变化
才知道watch是可以监听store中的值的。 watch: { "$store.state.userInfo.Name":{ handler:function(newVal,oldVal){ console.log(newVal,oldVal); } } } 如果监听的是对象,需要加上深度 watch: { //此时我监听的是对象,当$store.state.userInfo.Name发生修改时,此时需要深度监听才能监听到数据变化 "$store.state.userInfo":{ deep:true,//深度监听设置为 true handler:function(newVal,oldVal){ console.log("数据发生变化啦"); //修改数据时,能看到输出结果 console.log(newVal,oldVal); } } } 如果用计算属性监听的话,监听对象就不好使了。 computed: { isEdit () { return this.$store.state.userInfo;  //需要监听的数据 }, }, watch: { isEdit(newVal, oldVal) { console.log("数据发生变化啦"); //修改数据时,看不到该输出结果,因为无法监听到数据的变化 console.log(newVal,oldVal); } }, 参考链接
发表时间 2021-02-26
发表在 技术学习
阅读数 0
2021-02-26
整一波ts
安装 npm install -g typescript 运行 tsc index.ts 基础类型 布尔值、数字 let isDone: boolean = false let dec: number = 6 let hex: number = 0xf00d let bin: number = 0b1010 let oct: number = 0o744 console.log(isDone, dec, hex, bin, oct) 字符串 模板字符串 let onename: string = "bob" onename = "smith" let name2: string = `Gene` let age: number = 37 let sentense: string = `my name is ${name2}. I'll be ${age + 1} years old next month` console.log(onename, name2, sentense) 数组 let list: number[] = [1, 2, 3] let list2: Array<number> = [1, 2, 3] console.log(list, list2) 元组 let x: [string, number] x = ['hello', 10] 枚举 enum Color {Red, Green, Blue} let c: Color = Color.Green let colorName: string = Color[2] console.log(c, colorName) any let notSure: any = 4 // console.log(notSure.ifItExist(), notSure.toFixed()) let prettySure: Object = 4 // console.log(prettySure.toFixed()) let list1: any[] = [1, true, "free"] console.log(list1) list1[1] = 100 console.log(list1) void function warnUser(): void { console.log("warning!") } let unusable: void = undefined console.log(warnUser(), unusable) undefined 和 null 没啥用 undefined和null是任何类型的子类型 let u: undefined = undefined let n: null = null console.log(u, n) never never 表示永不存在的值的类型 never 也是任何类型的子类型 function error(message: string): never { throw new Error(message) } console.log(error("error!")) object 表示非原始类型,除了number string boolean symbol null undefined之外的类型 declare function create(o: object | null): void; create({ prop: 0}) create(null) 断言 let someValue: any = "string" let strLen: number = (<string>someValue).length console.log(someValue, strLen) let someValue2: any = "string" let strLen2: number = (someValue2 as string).length console.log(someValue2, strLen2) 变量声明 let是块作用域 多用let少用var 同一个作用域里一个变量只能let一次 const作用域跟let一样,声明完了不能再改 解构 let input: [number, number] = [1, 2] let [first, second] = input console.log(first, second) function f([first, second]: [number, number]) { console.log(first, second) } f(input) let [one, ...rest] = [1, 2, 3, 4] console.log(one, rest) // 1 [2, 3, 4] 太乱了不研究了用上了再说。 接口 interface SquareConfig { color?: string, width?: number } function createSquare( config: SquareConfig ): {color: string; area: number} { let newSquare = {color: "white", area: 100} if (config.color) { newSquare.color = config.color } if (config.width) { newSquare.area = config.width * config.width } return newSquare } let mysquire = createSquare({color: "black"}) console.log(mysquire) 函数类型的接口 interface SearchFunc { ( source: string, subString: string ): boolean } let mySearch: SearchFunc = function( source: string, subStirng: string ) { let result = source.search(subStirng) return result > -1 } console.log(mySearch("abc", 'a')) 可索引的类型 interface StringArray { [index: number]: string } let myarray: StringArray = ["bob", "fred"] let myStr: string = myarray[0] console.log(myarray, myStr)
发表时间 2021-02-25
发表在 技术学习
阅读数 0
2021-02-25
做一个博客系统
年前做的东西,早就想写个博客记录一下,然后就过年了。电脑充满电带回了家,一条电居然撑到了上班。事实证明mbp的电池是可以在开机状态下合盖待机11天的。 今天的课题是用php做一个静态网站生成器,也叫博客系统。 东西已经做完了,官网是 Hikari 官网,文档里边有,文档本身就是示例,所以这一个地址点进去啥都有。 如果你是在公众号阅读的这篇文章,上边的Hikari官网可能不能点击。你需要点击左下角阅读原文进入原文链接,再点链接进入官网。或者直接复制网址http://hikari.website访问。 文档写得挺详细了,这边就记录一些知识点和坑吧。第一次用php写控制台程序,有很多东西都是之前没用过的。 控制台程序 在php程序中,使用$argc获取控制台参数数量,使用$argv获取控制台参数数组。比较难受的是,就算控制台里按照选项和选项值(command -a 1 -b 2)来输入,$argv也不会给出索引数组,而是将选项也当做一个值。如果要将程序设计成需要分析选项的,就需要特别处理才能获取到选项和选项值的索引数组了。 psr4自动加载 使用composer安装类库的话,项目根目录下就会有vendor目录,我们需要在项目启动的时候引入/vendor/autoload.php,来让composer加载类库。 接口 用interface规定程序模板,让实现同一个接口的类都遵循一样的模板。在Hikari中用interface规定了Cmd和Template。 <?php namespace Lib\Base; interface BaseCmd { /** * A command line command must have a `handle` function which is public and static! * @return mixed */ public static function handle($argv); } 一个Cmd类必须有handle方法,这样才能根据控制台输入找到对应的Cmd类,来执行对应类的handle方法。 <?php namespace Lib\Base; interface BaseTemplate { public static function render($data); } 一个Template类必须有一个render方法,这样的设计下,将Template类放在主题的配置数组里,执行构建命令时就可以依次执行每个Template下的render方法来输出静态页了。 markdown解析 直接使用了SegmentFault/HyperDown库,可以输入markdown输出html字符串。然后在模板渲染里写样式。 模板渲染 先写了一个模板渲染方法。 function C($filePath, $replaceData = []) { if (!file_exists($filePath)) { return ""; } $contents = file_get_contents($filePath); if (!empty($replaceData)) { foreach ($replaceData as $k => $v) { $contents = str_replace("{{{$k}}}", $v, $contents); } } return $contents; } 然后准备了一个页面目录pages和组件目录Components,里边存带有模板语法的html片段啥的。比如首页 <body> {{navbar}} <div class="container"> <img class="logo" src="/hikarilogo.png"></img> <h2 id="title"> {{title}} <!-- <span class="version">beta 1</span> --> </h2> <h3 id="subtitle">{{subtitle}}</h3> <div id="menus"> {{menu}} <script> ((function() { var menus = document.getElementsByClassName('menu-action') for (var i = 0; i < menus.length; i ++) { menus[i].addEventListener('click', function() { window.location.href = this.getAttribute('link') }) } })()) </script> </div> </div> {{footer}} </body> footer组件 <style> .footer { display: flex; flex-direction: column; align-items: center; margin-top: 100px; color: #3E4857; font-size: 13px; } </style> <div class="footer"> <div class="footer-author"> 使用 <a href="https://gitee.com/xtzero/hikari">Hikari</a> 构建 </div> <div class="footer-desc">一个简洁、高效、可定制的博客框架。</div> <div class="footer-statistic"> {{busuanzi}} </div> <div class="footer-police">*ICP备*号-*</div> </div> 和不蒜子组件 <!-- 放在页头 --> <script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script> <!-- 显示代码是 --> <span id="busuanzi_container_site_pv">👁 <span id="busuanzi_value_site_pv">加载中...</span></span> 我就可以使用模板渲染方法这样渲染一个主页 $html = C(THEME_BASE_DIR . '/page/index.html', [ 'title' => ENV['title'], 'subtitle' => ENV['subtitle'], 'navbar' => C(THEME_BASE_DIR . '/components/navbar', [ "title" => ENV['title'], "items" => implode("\n", array_map(function($v) { return C(THEME_BASE_DIR . '/components/navbarItem', $v); }, THEME_CONFIG['navbar'])) ]), 'menu' => implode("\n", array_map(function($v) { return C(THEME_BASE_DIR . '/components/indexNav', $v); }, THEME_CONFIG['homepageMenu'])), 'footer' => C(THEME_BASE_DIR . '/components/footer', [ "busuanzi" => C(THEME_BASE_DIR . '/components/busuanzi') ]) ]); 要是模板能支持条件和循环渲染就好了,暂时还没做,只能用implode和array_map来代替了。
发表时间 2021-02-18
发表在 技术学习
阅读数 0
2021-02-18
xtzero.me
从前从前,有个人爱你很久
友情链接
这里是友情链接
虽然我很菜,但是也希望可以和更多人交换友链。
作品站
这里是我的 作品站
虽然菜,但还没放弃创造。
推广内容
或许你需要买便宜的服务器
你有优惠我有返利,何乐而不为呢。

立即查看 >>
也想使用 Hikari 2 ?
Hikari 2 已经被用来建站啦!点击这里来查看都有哪些案例以及我们的联系方式吧。