From 26c50ae495204956c180e67ac4f343c1ab100df6 Mon Sep 17 00:00:00 2001 From: YoungJay001 <1445723014@qq.com> Date: Wed, 21 Aug 2024 20:53:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E7=8E=AF=E5=A2=83=EF=BC=8C?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E6=A3=80=E6=B5=8B=EF=BC=8Ccaliper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...document_environment_monitoring_caliper.md | 350 ++++++++++++++++++ .../3sTDZ8LWUrhJe2P.png | Bin 0 -> 246860 bytes .../4jDlaZkYNGAfBbc.png | Bin 0 -> 37479 bytes .../8X7tVqpGmNiKsPD.png | Bin 0 -> 45508 bytes .../8eOvBsqKVZQdST1.png | Bin 0 -> 100678 bytes .../Ag7buKmrvNpfe3s.png | Bin 0 -> 41087 bytes .../AnuQMlVstqJbXKg.png | Bin 0 -> 139391 bytes .../BUktKTnmlRrzhFA.png | Bin 0 -> 78209 bytes .../Cjv7AIMYe8EOXqN.png | Bin 0 -> 33106 bytes .../EwkYoLiANftHsZn.png | Bin 0 -> 31694 bytes .../H4NBSFbUrstfV1J.png | Bin 0 -> 139312 bytes .../HsJL7IO6Vo5U4uj.png | Bin 0 -> 468137 bytes .../MQSHDV7EmWTY2FU.png | Bin 0 -> 19738 bytes .../OsKj7Tcf5SZelt6.png | Bin 0 -> 84664 bytes .../PgVt4AdoGUkFuCW.png | Bin 0 -> 17588 bytes .../THNEjIS6bl7zrZR.png | Bin 0 -> 89920 bytes .../ZUoIz8Ed5My9gBJ.png | Bin 0 -> 41146 bytes .../ae5ef726c77c476b9722497dbdec8407.png | Bin 0 -> 88864 bytes .../fUQ234kHMLcbJPy.png | Bin 0 -> 69832 bytes .../jKwJ5WO8T2HaegY.png | Bin 0 -> 311367 bytes .../sobYdq6GTZgXfN9.png | Bin 0 -> 113458 bytes .../vDVjMWUq4pPtsLi.png | Bin 0 -> 346560 bytes .../viwoj9uOWVd67Eg.png | Bin 0 -> 99078 bytes .../xQZmTnPsd3BI1AM.png | Bin 0 -> 67355 bytes 24 files changed, 350 insertions(+) create mode 100644 3.x/zh_CN/docs/articles/7_practice/document_environment_monitoring_caliper.md create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/3sTDZ8LWUrhJe2P.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/4jDlaZkYNGAfBbc.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/8X7tVqpGmNiKsPD.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/8eOvBsqKVZQdST1.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/Ag7buKmrvNpfe3s.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/AnuQMlVstqJbXKg.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/BUktKTnmlRrzhFA.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/Cjv7AIMYe8EOXqN.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/EwkYoLiANftHsZn.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/H4NBSFbUrstfV1J.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/HsJL7IO6Vo5U4uj.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/MQSHDV7EmWTY2FU.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/OsKj7Tcf5SZelt6.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/PgVt4AdoGUkFuCW.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/THNEjIS6bl7zrZR.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/ZUoIz8Ed5My9gBJ.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/ae5ef726c77c476b9722497dbdec8407.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/fUQ234kHMLcbJPy.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/jKwJ5WO8T2HaegY.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/sobYdq6GTZgXfN9.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/vDVjMWUq4pPtsLi.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/viwoj9uOWVd67Eg.png create mode 100644 3.x/zh_CN/images/articles/document_environment_monitoring_caliper/xQZmTnPsd3BI1AM.png diff --git a/3.x/zh_CN/docs/articles/7_practice/document_environment_monitoring_caliper.md b/3.x/zh_CN/docs/articles/7_practice/document_environment_monitoring_caliper.md new file mode 100644 index 000000000..3ed3fb414 --- /dev/null +++ b/3.x/zh_CN/docs/articles/7_practice/document_environment_monitoring_caliper.md @@ -0,0 +1,350 @@ +> ### + + + +### FISCO BCOS学习(一)基本环境部署 + + + + b站:发呆Jay + +> 从零进行环境搭建,拜托环境报错烦恼,为您极大的节省学习成本。 + +前提:使用命令解决电脑内复制虚拟机不能粘贴问题 + +``` + +//安装工具open-vm-tools + +sudo apt-get install open-vm-tools +//安装工具open-vm-tools-desktop + +sudo apt-get install open-vm-tools-desktop + +//重启:reboot + + + +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + + + +### 1.安装ubuntu依赖(以后操作都是基于Ubuntu操作) + +``` +sudo apt install -y openssl curl +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +### 2.创建操作目录,下载安装脚本 + +``` +cd ~ && mkdir -p fisco && cd fisco + + curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v2.9.1/build_chain.sh && chmod u+x build_chain.sh +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +### 3.准备依赖安装java (推荐使用java 14) + +``` +sudo apt install -y default-jdk + +配置环境 +sudo vim /etc/profile + +export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 +export PATH=$PATH:$JAVA_HOME/bin + +source /etc/profile ###更新一下配置文件 +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +### 4.获取控制台 + +控制台相关命令[CSDN](https://mp.csdn.net/mp_blog/creation/editor/134451641) + +``` +cd ~/fisco && curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master-2.0/tools/download_console.sh && bash download_console.sh +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +![](./../../../images/articles/document_environment_monitoring_caliper\8X7tVqpGmNiKsPD.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +### 5.webase-front下载安装包(建议在fisco文件下面) + +``` +wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.5/webase-front.zip +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +![](./../../../images/articles/document_environment_monitoring_caliper\viwoj9uOWVd67Eg.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +### 6.一键部署环境配置 + +``` +mysql配置 + +sudo apt-get install mysql-server -y #mysql 服务端 + +sudo apt install mysql-client -y #mysql 客户端 + +python3配置 + +// 添加仓库,回车继续 +sudo add-apt-repository ppa:deadsnakes/ppa +// 安装python 3.6 +sudo apt-get install -y python3.6 +sudo apt-get install -y python3-pip +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + + 查询出以下结果说明安装成功。 + +![](./../../../images/articles/document_environment_monitoring_caliper\MQSHDV7EmWTY2FU.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + + 安装webase-deploy + +``` +wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v1.5.5/webase-deploy.zip +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +> 一键部署启动时还需要对mysql进行初始化操作,具体参考[FISCO BCOS入门(十三)Webase一键部署及其使用-CSDN博客](https://blog.csdn.net/2302_77339802/article/details/134366096) + +### 7.获取黑白名单时用到的脚本。 + +获取证书生成脚本(在nodes/127.0.0.1下进行) + + + +``` +curl -#LO https://gitee.com/FISCO-BCOS/FISCO-BCOS/raw/master-2.0/tools/gen_node_cert.sh +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + + 一定要等到它出现100% + +![](./../../../images/articles/document_environment_monitoring_caliper\OsKj7Tcf5SZelt6.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +### 8.安装VIM编辑器 + +``` +sudo apt install npm + +sudo apt install vim +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +![](./../../../images/articles/document_environment_monitoring_caliper\HsJL7IO6Vo5U4uj.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +> 结束~希望本篇博客能帮到您,更多服务私信。 + +### FISCO BCOS学习(二)利用脚本进行区块链系统监控 + +> 要利用脚本进行区块链系统监控,你可以使用各种编程语言编写脚本,如Python、Shell等 +> +> 利用脚本进行区块链系统监控可以提高系统的稳定性、可靠性,并帮助及时发现和解决潜在问题,从而确保区块链网络的正常运行。本文可以利用脚本来解决两个问题 +> +> 1.编写脚本 1,每隔 1 秒检查一次 fisco 进程数量,若为 4 则打印正常信 息,否则打印错误信息 +> +> \2. 编写脚本 2,每隔 3 秒检查一次 fisco 进程占用的端口数量,若为 12 则打印正常信息,否则打印错误信息 + + 我首先搭建默认的单机四节点链并启动 + +bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 + +![](./../../../images/articles/document_environment_monitoring_caliper\AnuQMlVstqJbXKg.png)编辑 + +bash nodes/127.0.0.1/start_all.sh + + +![img](../../../../images/articles/document_environment_monitoring_caliper\Ag7buKmrvNpfe3s.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + + 建立脚本jb1.sh和jb2.sh文件并编写相对应的脚本 + +![](./../../../images/articles/document_environment_monitoring_caliper\ZUoIz8Ed5My9gBJ.png)![点击并拖拽以移动](E:\fiscodoc\FISCO-BCOS-DOC\3.x\zh_CN\images\articles\document_environment_monitoring_caliper\点击并拖拽以移动.gif)编辑 + +![](./../../../images/articles/document_environment_monitoring_caliper\4jDlaZkYNGAfBbc.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +测试每隔 1 秒检查一次 fisco 进程数量,若为 4 则打印正常信 息,否则打印错误信息 + +![](./../../../images/articles/document_environment_monitoring_caliper\Cjv7AIMYe8EOXqN.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +测试脚本 2,每隔 3 秒检查一次 fisco 进程占用的端口数量,若为 12 则打印正常信息,否则打印错误信息 + +![](./../../../images/articles/document_environment_monitoring_caliper\8eOvBsqKVZQdST1.png) + + + +### FISCO BCOS学习(三)使用Caliper进行压力测试 + + + +> Caliper是一个用于区块链性能测试和基准测试的工具,使用Caliper进行基准测试可以提供关于区块链系统性能的重要指标,本文章Caliper 测试工具通过调用 Helloorld 合约来进行区块链系统进行压力测试并设置交易数量txNumber=10,交易速率tps=1。 + +## 前提: + +#### 配置基本环境,安装nodejs,安装Docker,安装Docker Compose + +参考:[使用Caliper进行压力测试环境部署(ubuntu)_发呆...的博客-CSDN博客](https://blog.csdn.net/2302_77339802/article/details/133793761) + +## 加入Docker用户组 + +``` +sudo groupadd docker + +//USER为主机名 +sudo gpasswd -a ${USER} docker +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +``` + +# 重启Docker服务 +sudo service docker restart +# 验证Docker是否已经启动 +sudo systemctl status docker +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + + + + + + + +## + +## Caliper部署 + +1.新建一个工作目录以及对NPM项目初始化 + +``` + +mkdir benchmarks && cd benchmarks +npm init +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +``` + +``` + + 这一步主要是为在工作目录下创建package.json文件以方便后续依赖项的安装 + +2.安装caliper-cli + +``` +npm install --only=prod @hyperledger/caliper-cli@0.2.0 +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +![](./../../../images/articles/document_environment_monitoring_caliper\jKwJ5WO8T2HaegY.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +验证 + +``` +npx caliper --version +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +![](./../../../images/articles/document_environment_monitoring_caliper\PgVt4AdoGUkFuCW.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +## 绑定 + +``` +npx caliper bind --caliper-bind-sut fisco-bcos --caliper-bind-sdk latest +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +> **–caliper-bind-sut** :用于指定需要测试的区块链平台 +> +> **–caliper-bind-sdk**:用于指定适配器版本; + + ![](./../../../images/articles/document_environment_monitoring_caliper\H4NBSFbUrstfV1J.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + + + + + +## **执行HelloWorld合约测试** + +``` +npx caliper benchmark run --caliper-workspace caliper-benchmarks --caliper-benchconfig benchmarks/samples/fisco-bcos/helloworld/config.yaml --caliper-networkconfig networks/fisco-bcos/4nodes1group/fisco-bcos.json +``` + +![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) + +> npx caliper benchmark run: 使用Caliper的benchmark插件执行基准测试。 +> +> --caliper-workspace caliper-benchmarks: 指定Caliper项目的工作目录,也就是基准测试配置文件和网络配置文件所在的路径。 +> +> --caliper-benchconfig benchmarks/samples/fisco-bcos/helloworld/config.yaml: 指定基准测试配置文件的路径和文件名。该配置文件定义了要运行的基准测试场景、合约、参与者等相关信息。 +> +> --caliper-networkconfig networks/fisco-bcos/4nodes1group/fisco-bcos.json: 指定网络配置文件的路径和文件名。该配置文件定义了FISCO-BCOS区块链网络的连接信息,如节点地址、密钥等。 + +#### 现要求:并设置交易数量txNumber=10,交易速率tps=1 + +更改helloworld目录下的config.yaml文件 + +![](./../../../images/articles/document_environment_monitoring_caliper\EwkYoLiANftHsZn.png)编辑 + +![](./../../../images/articles/document_environment_monitoring_caliper\fUQ234kHMLcbJPy.png)编辑 + + + +再次执行**HelloWorld合约测试(在benchmarks目录下)** + +改之前 + +![](./../../../images/articles/document_environment_monitoring_caliper\BUktKTnmlRrzhFA.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + + 改之后 + +![](./../../../images/articles/document_environment_monitoring_caliper\3sTDZ8LWUrhJe2P.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + + + +### 压力测试核心代码 + +1.fisco-bcos.json文件下 + +![](./../../../images/articles/document_environment_monitoring_caliper\sobYdq6GTZgXfN9.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +在config.yaml文件 + +![](./../../../images/articles/document_environment_monitoring_caliper\THNEjIS6bl7zrZR.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +在get.js文件 + +![](./../../../images/articles/document_environment_monitoring_caliper\xQZmTnPsd3BI1AM.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +在set.js + +![](./../../../images/articles/document_environment_monitoring_caliper\ae5ef726c77c476b9722497dbdec8407.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + +#### 报错1 绑定时遇到报错Error: Failed to execute "npm" with return code 1. at ChildProcess.proc.on (/home/song/fisco/benchmarks/node_modules/@hyperledger/caliper-cli/lib/utils/cmdutils.js:56:35) at emitTwo (events.js:126:13) at ChildProcess.emit (events.js:214:7) + +> npm --registry https://registry.npm.taobao.org install express +> + + ![](./../../../images/articles/document_environment_monitoring_caliper\vDVjMWUq4pPtsLi.png)![点击并拖拽以移动](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)编辑 + diff --git a/3.x/zh_CN/images/articles/document_environment_monitoring_caliper/3sTDZ8LWUrhJe2P.png b/3.x/zh_CN/images/articles/document_environment_monitoring_caliper/3sTDZ8LWUrhJe2P.png new file mode 100644 index 0000000000000000000000000000000000000000..264b6a5c6c9d80938810aabb53951169f427f7a6 GIT binary patch literal 246860 zcmeFYV|ZrUvNqg7$LOeI+qP|Vl8$ZLwr$%T+vzyz*m`2y)|<6)&OYnxUhjL(_xJnt zJlC96HSSSW1GC1sL*-;dVWBXfK7INGD=sD^|LGH``lnC8(hy)DPtM-m>OXzL`y?*J zujm4F(haU79o+Nt@}2#D4JP!2zZ@?&A!Od
uE&~RvxR3$)lDo!m$9=|is;omh>h^8L^)uuv2X_SofY<+PW#4X|e5oQu
zqD0|8ep)4w<^Ib9d2R}Ve|i5QRwgPU^iT1>Yuyfol>Dm^`BEHog#WbphtM1$;on-C
zdnf1)8x)l>zI$*od1Ng#4VnP7MBLSg^8Lf)ZMMLN_16_7Zb_4BvhXJ!Fi@PRMniO(
z89S5O9f~ttqZzy$i1a5YZywl+J!}G*Y>9TBM3+}$nQ~7!MjYzy$L|7R3ZV POhyEqwK
zQK3`Zxp+VT#U&HkWcjUSP=l*GYGZuo43eVda4k;t>Act=eMm%a!vAJN%TJp0rAfNq
zC=(ZYRjH;OiFs(}RDE3Fj7?gq0ky-au|Sv*b`X)sOt_Tjc)!lTHhqIH`Zjwj6LTPd
zeKUdVB~oVw^4(IQMs ;}3_5
z1be6Z6(xRmurJ@b6|F*(Ep}Lk%A02Mm9X;}rE^xHTT2%S3bH(A9CchZ;BuBhhTDkl
zGU?gXG@2V7`A}qn9E^5tNE@Q!^X@5{C$h@g&U#eiU=~c6L;gOpKdSW(ZNR+Wl~V){
z6qWVWw{e1q;w0N6djHTSz=Y&`13087dNfZPXfixg(nU`l%D{^WJXj+@GQD?Sj4*M`
ze&kSFpnF@X+5G`Xih}7uXsj@0;=5e*Gllki&e0WoK1pX!Wm!Mr1a1EC;LP1(Jb$d!
zO@`jZR^&_Iq?+7X)Rd_2uJk`A-gg6xa|EBAIwS{dhO}cG48aNXeY;=Hq$Mm5;d@~y
z<#FGhPQHjVAD7U47J`53>ls3^EO&bJ$vKXh(zu^Qa~o$%Rv6&sZ|D|fUQzAbKuMx?
z2~5tSL1HPk1q_p)aqP2mJa{lEm+K@(OdAK&^=OJZlH<8el71DbG|_Ju*_WDh95ShN
zH-X_c&KM!z&dOQdsA_J1YpZ*_?BxKCb|@KlzWg`X{2*H4(8nC%BXjp7?AZ+gNQ#&q
ziglU0&|12We#$O~hYY&*7=xJ^Tb1@%`TkwhR~>|pT3u@;3a~*kyW9fi{7C3$+Ks5m
z-lqmQ8Z@r5zg4x&WjH8#H`+KFY&pAh6yp%?bS7FqUchuL>z*ua7d4?aA?SS_x!by`
z${h6{A Vt9Qfcj|H%t%u}Cg)(ck;Q72@^7{i&xO5Db3%HIYaNI}
z#(*DpCk*HC?z)$E+<6@hQ#Tf+yD5&yx;toTIWxn$+3CbM+iBmr(=JM5TM8&u2T|FV
z=msm*nM{H_R>Ft~opCZeGYxwhrn&i!AKRSfU!H0Q&*u~uIJx{)?>&{U;4-6UbQ=_y
zgIg#cb&8NTmFZ0IQ}YGy%-!U?Kt}Bmzv~z~b7|p8SnX@!-v(SK_}gWi3zu2X)U9K+
zPc`=NhNT?vI5lD7Cgd$TX543 veJD^5k_g?m`qqhE? {vySh!KPh
zvxV4vKTtAEXGe$1aI6G5mEZaY0OhrC+egyYQU8o^!NmH}-|P
zw!R83cQsfpq4WirmkG3QReepK)*Litq5%T1J}*LPI#dNSQwgp-=flEUZz{Olr~#G=f1lG=yFW!P
z61_gBVp5rMvL?hpf_0|7)0mGdZA@A+&G^kDXk0QVG#cP5V5%*TX^wHeGAz;A10$3s
znpkL>o>*
I$H(Vx%sidW_$h^R2R&c{F=9?L_xH5S(#BXHxz{h{xK8?R^-
zEy?nC*x{{Re&;#t7Gb7C1=cK^E8`K~aD<`IL6dE_pLlpIce2N7$BwBu*|NWqzD4`o
z>z5ReP|Jeh?in~?#V*+jX}u=>EN*zg8DXiaJK6A1%Xr`gUW?9+1IJfDYss9$wIF1X
z-HTRfbj>sb-=Ep)dq=qNf=L8Ol0QcYuWENYPhzq3GZ{>?re9bZ4|Etn5jNF5`CInw
z4bKv>-QeL3r60JCuzxSVxF<7QuPJ$^e1J>qElLTJdNM-lJRNoUqIZnnzC6bFQ0(4J
zb;;@{2oLPn9-7sZq0kT2C2DiP&lkfwb)95irm{Ivq-a9_-QR>*L0!NT#7GVHdot5Y
zWcjXI7#JYpfa#^QFKDga67TXFHFzlLK`_r=RHPiv(0L18#z@ru;YOoX4Jt)F?NZiQ
z4FAgItI=uu#iVberMsH?(uIZ?(Nw>9A2KO|0#<*|+q?+?VDt4cy1;TJYhHQ)(j|s+7Ecw|pm6RpZso1nA`h#tWU3R>Tj(?(njwxG$2?@ekq#O>
zCps&`nYy#p82juc{Yz>~zJ-uy<~0;W_FI8tVX81<+Z{2XE`RV(=YzaxB8oStLNI#`
zj;8+p^0d(&31qY4R=odtDyWxT(K|bCE-&GRN=ppxepaTMmbKf{pg1J?W3P)x4KL|X
zC=Jf)U?mN~u@s#KBf2(VykRAQoO)87DpkptyyV;M!2t4c(e~FBKlH;9YHGTW^0I@C
z;Qo9-PW)@hu+5I82iRGWP>J9w$r{WBru4N)qe&%--R{0ZIqn^O?q(vOH-UfDxfBMA
z!iItX
E^mP1=
zDeq>)x92+d_Qbs_W!Jj_aShkrk9!Dwe+_EVNhkZ7W~)5DYpilbQfbUP4cv=8bmh&N
zo#q^g`)(&BT*hG0%YVtRnCIqX?Q@GR@ij@-&y;oQqNQ3^Ue8^bs8w;px^ELS2FU5m
zs`k(1Fxb~r*cRNU$E5bX?UHC*bUg!2`&Wx7$+oZD;fn#H(l)J^5TcznQ0utnlfK0x
zHkGxNh4=k}?2kc(Lp-AP+dU&o#n9)a6KEq%QR%{&6L?trIgnjCH}vi``UZp}T5ic-
zVUy}U7m^Ooc=e#?-x=S#P>$_ZU7bY6H(v$0mM6B0-Ymuw(s0D;KEoO%XFg5Vxufm`
zC61=M0PA}-rI7q{RiTX=*ynR%vU!ZbLp+u&_+~WBNs}JR;~t0gQHMLVcffRnhS$K_
zYV>D7vrqT9PuI>bc8N?xH24^E@Q?&GokAFfN$uNL-zYZU1lg{3Jms{#eb}vAEVz?d
zy&Q?aHECj(aU#a95b`Fnh`?FMHJ`CoMOJ%2P=lLKb6^GlBTt>TIFsLdZL1y!Njl{ef8)r2pA9c`9+W5`9Rdl0slFjP9%s=*EZ82ikD
X~<0uqk
z!S67%wbF)P=0+Us3Cje`+oCcAteWo;TB1PeSs00TRbeR6j}rcF*tdQCZMoltV0-Lz
zi9>6knUV|th6`SJeNV{G+M<>|H=I
z7?_+aeI->|rA#eKJ$Ze|pFG^YkvyBSlc6v&A7L-X!c!QcBRY{lh<>jCG@?J<4~k65
zFI0(#4Gri&o+{hS?c-(d7rs%cm{pm2iHa&%3mtUpl~xSM(Z3h)8GTJPvU)CPt2!c~
z6ffrs?BwBM*~QHg#PsZ0SUSx~-7N1@WPgtg2Q2~=y$?N()Lh9mj^1K@Jt0t*Mg$@8
z6|VkDPdl)QVEcZoh`%V~ISh)+no&&E<(L&Ts!@_ByNHY3K{J!6XkFyT>k>o)P?3<@
z_iU=I-mzG^t%nNy*{PUAv#6+o+5vvFJZ;yB0i58bXl4$T!Q`@Z+L}m5t)!okO8bwy
z<4_}y4t9JQ8@bVH8Jl@ai)J~SQH{H1hIM%M>!EDDBg30Ej?Xh)d#;q!fyfR&C0kTE
z)Y<*`b6E$V>!+l5ALk=O05cefSf?0~O`crGBG=g}`H36V1bsJNGGiw_>q9egaq|)l
z^w04nuVStm2QzOI5O*EnNnU>BCi{4%hLm?LtFhF=Fj((?zmX
zk~jisU%c%L>7RM})~Ay=-%j+@X;AF};e2|~;OaQf7The1+Q{b