From 286cd0e82607447afaaa8831b71aca92e50c67f8 Mon Sep 17 00:00:00 2001 From: xiaoyue Date: Fri, 5 Nov 2021 11:45:28 +0800 Subject: [PATCH 1/6] add PRG --- .../PRG/Contracts/TableDefTools.sol | 324 ++++++++ 2021-BeiJing-BSN3/PRG/Contracts/User.sol | 191 +++++ .../PRG/Contracts/lib/DateTimeLibrary.sol | 300 ++++++++ .../PRG/Contracts/lib/SafeMath.sol | 106 +++ .../PRG/Contracts/lib/Strings.sol | 717 ++++++++++++++++++ 2021-BeiJing-BSN3/PRG/Contracts/lib/Table.sol | 56 ++ 2021-BeiJing-BSN3/PRG/Contracts/proposal.sol | 252 ++++++ 2021-BeiJing-BSN3/PRG/Contracts/report.sol | 101 +++ .../PRG/Contracts/utils/StringUtil.sol | 292 +++++++ .../PRG/Contracts/utils/TimeUtil.sol | 94 +++ .../PRG/Contracts/utils/TypeConvertUtil.sol | 124 +++ 2021-BeiJing-BSN3/PRG/README.md | 24 + 12 files changed, 2581 insertions(+) create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/TableDefTools.sol create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/User.sol create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/lib/DateTimeLibrary.sol create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/lib/SafeMath.sol create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/lib/Strings.sol create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/lib/Table.sol create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/proposal.sol create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/report.sol create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/utils/StringUtil.sol create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/utils/TimeUtil.sol create mode 100644 2021-BeiJing-BSN3/PRG/Contracts/utils/TypeConvertUtil.sol create mode 100644 2021-BeiJing-BSN3/PRG/README.md diff --git a/2021-BeiJing-BSN3/PRG/Contracts/TableDefTools.sol b/2021-BeiJing-BSN3/PRG/Contracts/TableDefTools.sol new file mode 100644 index 000000000..b24136200 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/TableDefTools.sol @@ -0,0 +1,324 @@ +pragma solidity ^0.4.25; +pragma experimental ABIEncoderV2; +import "./lib/Table.sol"; +import "./lib/Strings.sol"; +import "./utils/StringUtil.sol"; +import "./utils/TypeConvertUtil.sol"; +import "./lib/SafeMath.sol"; +import "./utils/TimeUtil.sol"; +import "./TableDefTools.sol"; +/* +* 使用分布式存储下表结构、CURD工具以及预定义常数 +* +*/ +contract TableDefTools { + + /******* 引入库 *******/ + using Strings for *; + using StringUtil for *; + using TypeConvertUtil for *; + using TimeUtil for *; + using SafeMath for *; + + /******* 表结构体 *******/ + struct Bean { + // 表名称 + string tableName; + // 主键 + string primaryKey; + // 表字段 + string[] fields; + } + + /******* 使用到的表结构 *******/ + Bean t_user_struct;//1.用户表 + Bean t_proposal_struct;//2.需求表 + Bean t_report_struct;//3.反馈表 + + + /******* 执行状态码常量 *******/ + int8 constant internal INITIAL_STATE = 0; + int8 constant internal SUCCESS_RETURN = 1; + int8 constant internal FAIL_RETURN = -1; + int8 constant internal FAIL_NULL_RETURN = -2; + int8 constant internal FAIL_ALREADY_EXIST = -3; + int8 constant internal FAIL_INSERT = -4; + int8 constant internal FAIL_LACK_BALANCE = -5; + int8 constant internal FAIL_NO_REWARD = -6; + + /******* 事件状态码常量 *******/ + uint8 constant internal EVENT_GIVE_LIKES = 10; + uint8 constant internal EVENT_OBTAIN_LIKES = 11; + uint8 constant internal EVENT_ATTEND_LOCATION = 12; + + + // 1.用户表 + // 表名称:t_user + // 表主键:user_id + // 表字段:user_name,user_password,activate_time,user_type,registered_status,user_creditpoint; + // 字段含义: + // |------------------------------------------------|-------------------|--------------------------|--------------------|--------------------------| + // | 用户ID(主键) | 用户名 | 登陆密码 | 注册时间 | 身份类别(农民/议员/监察员)| + // |------------------------------------------------|-------------------|--------------------------|--------------------|--------------------------| + // | user_id 【可以采取递增】 | user_name | user_password | activate_time | user_type | + // |------------------------------------------------|-------------------|--------------------------|--------------------|------------------------| + // | 注册状态(0-未激活、1-已激活) | 信用积分(默认100) | + // |------------------------------------------------|----------------------| + // | registered_status | user_creditpoint | + // |------------------------------------------------|----------------------| + //定义表名,表主键,以及表内包含的其他属性值 + string constant internal TABLE_USER_NAME = "t_user"; + string constant internal TABLE_USER_PRIMARYKEY = "user_id"; + string constant internal TABLE_USER_FIELDS = "user_name,user_password,activate_time,user_type,registered_status,user_creditpoint"; + // 2.需求表 + // 表名称:t_proposal + // 表主键:proposal_id + // 表字段:user_id,proposal_content,proposal_time,approval_cnt,disapproval_cnt,check_result; + // 字段含义: + //|------------------- |-------------------|-------------------|-------------------|-------------------|-------------------|-------------------| + //| 留言内容ID号(主键)| 用户ID(主键) | 提议内容 | 提议时间 | 赞成票数 | 反对票数 |审核结果 | + //|--------------------|-------------------|-------------------|-------------------|-------------------|------------------—|------------------—| + //| proposal_id | user_id | proposal_content | proposal_time | approval_cnt |disapproval_cnt | check_result | + //|------------------- |-------------------|-------------------|-------------------|-------------------|-------------------|-------------------| + string constant internal TABLE_PROPOSAL_NAME = "t_proposal"; + string constant internal TABLE_PROPOSAL_PRIMARYKEY = "proposal_id"; + string constant internal TABLE_PROPOSAL_FIELDS = "user_id,proposal_content,proposal_time,approval_cnt,disapproval_cnt,check_result"; + // 3.反馈表 + // 表名称:t_report + // 表主键:report_id + // 表字段:user_id,to_user_id,event_content,event_type + // 字段含义: + // |-------------------|-------------------------------------|---------------------|----------------------| + // | 反馈ID | 用户ID | 反馈的用户对象ID | 事件内容 | 事件类型【举报/好人好事】| + // |-------------------|--------------------|----------------|---------------------|----------------------| + // | report_id | user_id | to_ user_id | event_content |event_type | + // |----------------------------------------|----------------|---------------------|---------------------| + string constant internal TABLE_REPORT_NAME = "t_report"; + string constant internal TABLE_REPORT_PRIMARYKEY = "report_id"; + string constant internal TABLE_REPORT_FIELDS = "user_id,to_user_id,event_content,event_type"; + /* + * 字符串数组生成工具 + * + * @param _fields 带解析的字符串 + * + * @return 解析后的字符串数组 + * + */ + function getFieldsArray(string _fields) internal pure returns(string[]){ + string[] memory arrays ; + Strings.slice memory s = _fields.toSlice(); + Strings.slice memory delim = ",".toSlice(); + uint params_total = s.count(delim) + 1; + arrays = new string[](params_total); + for(uint i = 0; i < params_total; i++) { + arrays[i] = s.split(delim).toString(); + } + return arrays; + } + + + /* + * 1.初始化一个表结构 + * + * @param _tableStruct 表结构体 + * @param _tableName 表名称 + * @param _primaryKey 表主键 + * @param _fields 表字段组成的字符串(除主键) + * + * @return 无 + * + */ + function initTableStruct( + Bean storage _tableStruct, + string memory _tableName, + string memory _primaryKey, + string memory _fields) + internal { + TableFactory tf = TableFactory(0x1001); + tf.createTable(_tableName, _primaryKey, _fields); + _tableStruct.tableName = _tableName; + _tableStruct.primaryKey = _primaryKey; + _tableStruct.fields = new string[](0); + Strings.slice memory s = _fields.toSlice(); + Strings.slice memory delim = ",".toSlice(); + uint params_total = s.count(delim) + 1; + for(uint i = 0; i < params_total; i++) { + _tableStruct.fields.push(s.split(delim).toString()); + } + } + + + /* + * 2.打开一个表,便于后续操作该表 + * + * @param _tableName 表名称 + * + * @return 表 + * + */ + function openTable(string memory _table_name) internal returns(Table) { + TableFactory tf = TableFactory(0x1001); + Table table = tf.openTable(_table_name); + return table; + } + /* + * 3.用户登陆并以Json格式输出用户信息 + * + * @param _tableStruct 表结构 + * @param _primaryKey 待查记录的主键 + * + * @return 执行状态码 + * @return 该记录的json字符串 + */ + function loginInToJson(Bean storage _tableStruct, string memory _primaryKey,string memory _userpasswordhash) internal view returns (int8, string memory) { + // 打开表 + Table table = openTable(_tableStruct.tableName); + Condition condition = table.newCondition(); + condition.EQ("user_id", _primaryKey); + condition.EQ("user_password", _userpasswordhash); + // 查询 + Entries entries = table.select(_primaryKey, condition); + // 将查询结果解析为json字符串 + return StringUtil.getJsonString(_tableStruct.fields, _primaryKey, entries); + } + + /* + * 4.查询表中一条记录并以Json格式输出 + * + * @param _tableStruct 表结构 + * @param _primaryKey 待查记录的主键 + * + * @return 执行状态码 + * @return 该记录的json字符串 + */ + function selectOneRecordToJson(Bean storage _tableStruct, string memory _primaryKey) internal view returns (int8, string memory) { + // 打开表 + Table table = openTable(_tableStruct.tableName); + Condition condition = table.newCondition(); + // 查询 + Entries entries = table.select(_primaryKey, condition); + // 将查询结果解析为json字符串 + return StringUtil.getJsonString(_tableStruct.fields, _primaryKey, entries); + } + + + /* + * 5.查询表中一条记录并以字符串数组的格式输出 + * + * @param _tableStruct 表结构 + * @param _primaryKey 待查记录的主键 + * @param _conditionPair 筛选条件(一个字段) + * + * @return 执行状态码 + * @return 该记录的字符串数组 + */ + function selectOneRecordToArray(Bean storage _tableStruct, string memory _primaryKey, string[2] _conditionPair) internal returns (int8, string[] memory) { + // 打开表 + Table table = openTable(_tableStruct.tableName); + // 查询 + Condition condition = table.newCondition(); + if(_conditionPair.length == 2){ + condition.EQ(_conditionPair[0], _conditionPair[1]); + } + Entries entries = table.select(_primaryKey, condition); + // int8 statusCode = constDef.INITIAL_STATE; + int8 statusCode = 0; + string[] memory retContent; + if (entries.size() > 0) { + // statusCode = constDef.SUCCESS_RETURN; + statusCode = 1; + retContent = StringUtil.getEntry(_tableStruct.fields, entries.get(0)); + + }else{ + statusCode = FAIL_NULL_RETURN; + retContent = new string[](0); + } + return (statusCode ,retContent); + // 将查询结果解析为json字符串 + + } + /* + * 6.向指定表中插入一条记录 + * + * @param _tableStruct 表结构 + * @param _primaryKey 待插记录的主键 + * @param _fields 各字段值 + * @param _isRepeatable 主键下记录是否可重复 + * + * @return 执行状态码 + */ + function insertOneRecord(Bean storage _tableStruct, string memory _primaryKey, string memory _fields, bool _isRepeatable) internal returns (int8) { + // require(bytes(_primaryKey).length > 0); + // require(_fields.length == _tableStruct.fields.length); + int8 setStatus = INITIAL_STATE; + int8 getStatus = INITIAL_STATE; + string memory getContent; + string[] memory fieldsArray; + Table table = openTable(_tableStruct.tableName); + if(_isRepeatable){ + getStatus = FAIL_NULL_RETURN; + }else{ + (getStatus, getContent) = selectOneRecordToJson(_tableStruct, _primaryKey); + } + if (getStatus == FAIL_NULL_RETURN) { + fieldsArray = getFieldsArray(_fields); + // 创建表记录 + Entry entry = table.newEntry(); + entry.set(_tableStruct.primaryKey, _primaryKey); + for (uint i = 0; i < _tableStruct.fields.length; i++) { + entry.set(_tableStruct.fields[i], fieldsArray[i]); + } + setStatus = FAIL_INSERT; + //新增表记录 + if (table.insert(_primaryKey, entry) == 1) { + setStatus = SUCCESS_RETURN; + } else { + setStatus = FAIL_RETURN; + } + } else { + setStatus = FAIL_ALREADY_EXIST; + } + return setStatus; + } + + /* + * 7.向指定表中更新一条记录 + * + * @param _tableStruct 表结构 + * @param _primaryKey 待更新记录的主键 + * @param _fields 各字段值组成的字符串 + * + * @return 执行状态码 + */ + function updateOneRecord(Bean storage _tableStruct, string memory _primaryKey, string memory _fields) internal returns(int8) { + Table table = openTable(_tableStruct.tableName); + string[] memory fieldsArray = getFieldsArray(_fields); + Entry entry = table.newEntry(); + Condition condition = table.newCondition(); + entry.set(_tableStruct.primaryKey, _primaryKey); + for (uint i = 0; i < _tableStruct.fields.length; i++) { + entry.set(_tableStruct.fields[i], fieldsArray[i]); + } + int count = table.update(_primaryKey, entry, condition); + if(count == 1){ + return SUCCESS_RETURN; + }else{ + return FAIL_RETURN; + } + } + /* + * 8.修改各字段中某一个字段,字符串格式输出 + * + * @param _fields 各字段值的字符串数组 + * @param index 待修改字段的位置 + * @param values 修改后的值 + * + * @return 修改后的各字段值,并以字符串格式输出 + * + */ + function getChangeFieldsString(string[] memory _fields, uint index, string values) public returns (string){ + string[] memory fieldsArray = _fields; + fieldsArray[index] = values; + return StringUtil.strConcatWithComma(fieldsArray); + } +} diff --git a/2021-BeiJing-BSN3/PRG/Contracts/User.sol b/2021-BeiJing-BSN3/PRG/Contracts/User.sol new file mode 100644 index 000000000..46ae790b2 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/User.sol @@ -0,0 +1,191 @@ +pragma solidity ^0.4.25; +pragma experimental ABIEncoderV2; +import "./lib/SafeMath.sol"; +import "./utils/TimeUtil.sol"; +import "./utils/StringUtil.sol"; +import "./utils/TypeConvertUtil.sol"; +import "./TableDefTools.sol"; + +/* +* User实现用户的链上信息管理,本合约主要是针对用户表进行的一系列操作。后面的留言表以及资源表会用到积分管理,因此需要引用本合约 +* 以Table的形式进行存储。主要包含功能有:1.用户注册2.查看用户是否注册3.查看用户信用积分4.用户登陆5.对用户信用积分进行管理 +* 首先看用户是否已经在链上注册信息,若未注册,则可以进行注册。 +* 用户注册实际上是在合约用户信息表中插入一条记录,描述该用户的详细情况。 +* 用户处于已注册状态才会有记录信息,因此,注册后方可使用其他板块功能。 +* +*/ + +contract User is TableDefTools{ + /******* 引入库 *******/ + using TimeUtil for *; + using SafeMath for *; + using TypeConvertUtil for *; + using StringUtil for *; + /* + * 构造函数,初始化使用到的表结构 + * + * @param 无 + * + * @return 无 + */ + constructor() public{ + //初始化需要用到的表。用户信息表 + initTableStruct(t_user_struct, TABLE_USER_NAME, TABLE_USER_PRIMARYKEY, TABLE_USER_FIELDS); + } + // 事件 + event REGISTER_USER_EVENT(string userid,string usertype,string activatetime); //注册用户事件.记录注册人身份,类型,注册时间 + event DEL_CREDITPOINT_EVENT(string user_id,string grade,string time); //扣分时间,扣分人id、扣分数、扣分时间 + event ADD_CREDITPOINT_EVENT(string user_id,string grade,string time); //加分时间,扣分人id、扣分数、扣分时间 + /* + * 1.用户注册 + * + * @param _userid 用户id + * @param _fields 用户信息表各字段值拼接成的字符串(除最后三个字段;用逗号分隔。最后三个字段分别是注册时间【根据注册时间生成】,注册状态 + 注册后这个值默认为1,信用积分默认为100分),包括如下: + * 用户ID(主键) + * 用户名 + * 登陆密码 + * 注册时间 + * 注册状态[1代表已注册,0代表为注册] + * 信用积分 + * + * @return 执行状态码 + * + * 测试举例 参数一:"191867345212322" + * 参数二:"江会文","123456","农民" + *注册成功返回SUCCESS否则返回错误码,错误码对应的问题请参考DB + */ + function activateUser(string memory _userid,string memory _username,string memory _userpassword, string memory _usertype) public returns(int8){ + // 获得当前的时间 + string memory _passwordhash=TypeConvertUtil.bytes32ToString(sha256(abi.encode(_userid,_userpassword))); + string memory nowDate = TimeUtil.getNowDate(); + string memory firstFiveParams=StringUtil.strConcat7(_username,',',_passwordhash,',',nowDate,',',_usertype); + string memory lastTwoParams = "1,100"; + string memory storeFields = StringUtil.strConcat3(firstFiveParams,',',lastTwoParams); + emit REGISTER_USER_EVENT(StringUtil.strConcat2("注册人的ID为:",_userid),StringUtil.strConcat2("注册人身份为:",_usertype),StringUtil.strConcat2("注册时间为:",nowDate)); + return insertOneRecord(t_user_struct,_userid,storeFields,false);//最后的false代表主键下记录不可重复 + } + + /* + * 2.查询用户是否已经注册 + * + * @param _userid 用户id + * + * @return 注册状态,1为已注册,0为未注册 + * + * 测试举例 参数一:"191867345212322" + + */ + function isUserActivated(string memory _userid) public view returns (string) { + int8 retCode; + string[] memory retArray; + (retCode, retArray) = getUserRecordArray(_userid); + return retArray[4]; + } + /* + * 3.查询用户的身份类别 + * + * @param _userid 用户id + * + * @return 用户身份类别 + * + * 测试举例 参数一:"191867345212322" + */ + function getUserType(string _userid) public view returns (string) { + int8 retCode; + string[] memory retArray; + (retCode, retArray) = getUserRecordArray(_userid); + return retArray[3]; + } + + /* + * 4.查询用户信用积分。返回uint类型 + * + * @param _userid 用户id + * + * @return 用户信用积分值 + * + * 测试举例 参数一:"191867345212322" + */ + function getUserCreditNum(string _userid) public view returns (uint) { + int8 retCode; + uint UserCreditNum; + string[] memory retArray; + (retCode, retArray) = getUserRecordArray(_userid); + if(retCode == SUCCESS_RETURN){ + UserCreditNum=TypeConvertUtil.stringToUint(retArray[5]); + return UserCreditNum; + }else{ + return uint(-1); + } + } + /* + * 5.用户登陆 + * + * @param userid 用户id + * @param userpassword 用户密码 + * @return 用户所有信息并以JSON格式返回 + * + * 测试举例 参数一:"191867345212322,123456" + */ + function Login(string memory _userid,string memory _userpassword) public view returns (int8,string) { + string memory _passwordhash=TypeConvertUtil.bytes32ToString(sha256(abi.encode(_userid,_userpassword))); + return loginInToJson(t_user_struct,_userid,_passwordhash); + } + /* + * 6.查询用户信息并以字符串数组方式输出 + * + * @param _userid 用户id + * + * @return 执行状态码 + * @return 该用户信息的字符串数组 + * + * 测试举例 参数一:"191867345212322" + */ + function getUserRecordArray(string userid) public view returns(int8, string[]){ + return selectOneRecordToArray(t_user_struct, userid, ["user_id",userid]); + } + /* + * 7.向用户表进行积分管理操作 + * + * @param _primaryKey 用户ID,唯一主键 + * @param _integral 需要进行增加/扣除的分值 + * @param _opcode 操作符:为1加分,为0扣分.根据用户发言好坏决定它是否会被扣分 + * @return 执行状态码 + *测试举例 参数一:"191867345212322",5,1 + */ + function updateUserIntegral(string memory _userid, uint _integral,int8 _opcode) public returns(int8) { + // 该用户当前信用积分值 + uint userHasIntegral; + // 该用户更新后的信用积分值 + uint userNowIntegral; + // 查询用户信息返回状态 + int8 queryRetCode; + // 更新用户信息返回状态 + int8 updateRetCode; + // 数据表返回信息 + string[] memory retArray; + // 获得当前的时间 + string memory updateTime= TimeUtil.getNowDate(); + // 查看该用户记录信息 + (queryRetCode, retArray) = selectOneRecordToArray(t_user_struct, _userid, ["user_id", _userid]); + //该用户存在 + //将用户信用积分转换为整数进行操作 + userHasIntegral =getUserCreditNum(_userid); + // 更新用户信用积分,对积分进行对应加分/减分操作。 + if(_opcode==0){ //为0 扣分 + userNowIntegral=SafeMath.sub(userHasIntegral,_integral);//调用Safemath的减法操作,避免溢出问题 + //记录日志 + emit DEL_CREDITPOINT_EVENT(StringUtil.strConcat2("扣分人的ID为:",_userid),StringUtil.strConcat2("当前信用积分值:",TypeConvertUtil.uintToString(userNowIntegral)),StringUtil.strConcat2("信用积分更新时间为:",updateTime)); + }else{ //加分 + userNowIntegral=SafeMath.add(userHasIntegral,_integral); + + emit ADD_CREDITPOINT_EVENT(StringUtil.strConcat2("加分人的ID为:",_userid),StringUtil.strConcat2("当前信用积分值:",TypeConvertUtil.uintToString(userNowIntegral)),StringUtil.strConcat2("信用积分更新时间为:",updateTime)); + } + //对信用分操作完毕后。更新用户表 + string memory changedFieldsStr = getChangeFieldsString(retArray,5, TypeConvertUtil.uintToString(userNowIntegral));//转换回字符串类型 + return(updateOneRecord(t_user_struct, _userid, changedFieldsStr)); + } +} + + diff --git a/2021-BeiJing-BSN3/PRG/Contracts/lib/DateTimeLibrary.sol b/2021-BeiJing-BSN3/PRG/Contracts/lib/DateTimeLibrary.sol new file mode 100644 index 000000000..bcc5d59d4 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/lib/DateTimeLibrary.sol @@ -0,0 +1,300 @@ +pragma solidity ^0.4.25; + +// ---------------------------------------------------------------------------- +// BokkyPooBah's DateTime Library v1.01 +// +// A gas-efficient Solidity date and time library +// +// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary +// +// Tested date range 1970/01/01 to 2345/12/31 +// +// Conventions: +// Unit | Range | Notes +// :-------- |:-------------:|:----- +// timestamp | >= 0 | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC +// year | 1970 ... 2345 | +// month | 1 ... 12 | +// day | 1 ... 31 | +// hour | 0 ... 23 | +// minute | 0 ... 59 | +// second | 0 ... 59 | +// dayOfWeek | 1 ... 7 | 1 = Monday, ..., 7 = Sunday +// +// +// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence. +// ---------------------------------------------------------------------------- + +library DateTimeLibrary { + + uint constant SECONDS_PER_DAY = 24 * 60 * 60; + uint constant SECONDS_PER_HOUR = 60 * 60; + uint constant SECONDS_PER_MINUTE = 60; + int constant OFFSET19700101 = 2440588; + + uint constant DOW_MON = 1; + uint constant DOW_TUE = 2; + uint constant DOW_WED = 3; + uint constant DOW_THU = 4; + uint constant DOW_FRI = 5; + uint constant DOW_SAT = 6; + uint constant DOW_SUN = 7; + + // ------------------------------------------------------------------------ + // Calculate the number of days from 1970/01/01 to year/month/day using + // the date conversion algorithm from + // http://aa.usno.navy.mil/faq/docs/JD_Formula.php + // and subtracting the offset 2440588 so that 1970/01/01 is day 0 + // + // days = day + // - 32075 + // + 1461 * (year + 4800 + (month - 14) / 12) / 4 + // + 367 * (month - 2 - (month - 14) / 12 * 12) / 12 + // - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4 + // - offset + // ------------------------------------------------------------------------ + function _daysFromDate(uint year, uint month, uint day) internal pure returns (uint _days) { + require(year >= 1970); + int _year = int(year); + int _month = int(month); + int _day = int(day); + + int __days = _day + - 32075 + + 1461 * (_year + 4800 + (_month - 14) / 12) / 4 + + 367 * (_month - 2 - (_month - 14) / 12 * 12) / 12 + - 3 * ((_year + 4900 + (_month - 14) / 12) / 100) / 4 + - OFFSET19700101; + + _days = uint(__days); + } + + // ------------------------------------------------------------------------ + // Calculate year/month/day from the number of days since 1970/01/01 using + // the date conversion algorithm from + // http://aa.usno.navy.mil/faq/docs/JD_Formula.php + // and adding the offset 2440588 so that 1970/01/01 is day 0 + // + // int L = days + 68569 + offset + // int N = 4 * L / 146097 + // L = L - (146097 * N + 3) / 4 + // year = 4000 * (L + 1) / 1461001 + // L = L - 1461 * year / 4 + 31 + // month = 80 * L / 2447 + // dd = L - 2447 * month / 80 + // L = month / 11 + // month = month + 2 - 12 * L + // year = 100 * (N - 49) + year + L + // ------------------------------------------------------------------------ + function _daysToDate(uint _days) internal pure returns (uint year, uint month, uint day) { + int __days = int(_days); + + int L = __days + 68569 + OFFSET19700101; + int N = 4 * L / 146097; + L = L - (146097 * N + 3) / 4; + int _year = 4000 * (L + 1) / 1461001; + L = L - 1461 * _year / 4 + 31; + int _month = 80 * L / 2447; + int _day = L - 2447 * _month / 80; + L = _month / 11; + _month = _month + 2 - 12 * L; + _year = 100 * (N - 49) + _year + L; + + year = uint(_year); + month = uint(_month); + day = uint(_day); + } + + function timestampFromDate(uint year, uint month, uint day) internal pure returns (uint timestamp) { + timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY; + } + function timestampFromDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) internal pure returns (uint timestamp) { + timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR + minute * SECONDS_PER_MINUTE + second; + } + function timestampToDate(uint timestamp) internal pure returns (uint year, uint month, uint day) { + (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); + } + function timestampToDateTime(uint timestamp) internal pure returns (uint year, uint month, uint day, uint hour, uint minute, uint second) { + (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY); + uint secs = timestamp % SECONDS_PER_DAY; + hour = secs / SECONDS_PER_HOUR; + secs = secs % SECONDS_PER_HOUR; + minute = secs / SECONDS_PER_MINUTE; + second = secs % SECONDS_PER_MINUTE; + } + + function isValidDate(uint year, uint month, uint day) internal pure returns (bool valid) { + if (year >= 1970 && month > 0 && month <= 12) { + uint daysInMonth = _getDaysInMonth(year, month); + if (day > 0 && day <= daysInMonth) { + valid = true; + } + } + } + function isValidDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) internal pure returns (bool valid) { + if (isValidDate(year, month, day)) { + if (hour < 24 && minute < 60 && second < 60) { + valid = true; + } + } + } + function isLeapYear(uint timestamp) internal pure returns (bool leapYear) { + (uint year,,) = _daysToDate(timestamp / SECONDS_PER_DAY); + leapYear = _isLeapYear(year); + } + function _isLeapYear(uint year) internal pure returns (bool leapYear) { + leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); + } + function isWeekDay(uint timestamp) internal pure returns (bool weekDay) { + weekDay = getDayOfWeek(timestamp) <= DOW_FRI; + } + function isWeekEnd(uint timestamp) internal pure returns (bool weekEnd) { + weekEnd = getDayOfWeek(timestamp) >= DOW_SAT; + } + function getDaysInMonth(uint timestamp) internal pure returns (uint daysInMonth) { + (uint year, uint month,) = _daysToDate(timestamp / SECONDS_PER_DAY); + daysInMonth = _getDaysInMonth(year, month); + } + function _getDaysInMonth(uint year, uint month) internal pure returns (uint daysInMonth) { + if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { + daysInMonth = 31; + } else if (month != 2) { + daysInMonth = 30; + } else { + daysInMonth = _isLeapYear(year) ? 29 : 28; + } + } + // 1 = Monday, 7 = Sunday + function getDayOfWeek(uint timestamp) internal pure returns (uint dayOfWeek) { + uint _days = timestamp / SECONDS_PER_DAY; + dayOfWeek = (_days + 3) % 7 + 1; + } + + function getYear(uint timestamp) internal pure returns (uint year) { + (year,,) = _daysToDate(timestamp / SECONDS_PER_DAY); + } + function getMonth(uint timestamp) internal pure returns (uint month) { + (,month,) = _daysToDate(timestamp / SECONDS_PER_DAY); + } + function getDay(uint timestamp) internal pure returns (uint day) { + (,,day) = _daysToDate(timestamp / SECONDS_PER_DAY); + } + function getHour(uint timestamp) internal pure returns (uint hour) { + uint secs = timestamp % SECONDS_PER_DAY; + hour = secs / SECONDS_PER_HOUR; + } + function getMinute(uint timestamp) internal pure returns (uint minute) { + uint secs = timestamp % SECONDS_PER_HOUR; + minute = secs / SECONDS_PER_MINUTE; + } + function getSecond(uint timestamp) internal pure returns (uint second) { + second = timestamp % SECONDS_PER_MINUTE; + } + + function addYears(uint timestamp, uint _years) internal pure returns (uint newTimestamp) { + (uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY); + year += _years; + uint daysInMonth = _getDaysInMonth(year, month); + if (day > daysInMonth) { + day = daysInMonth; + } + newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY; + require(newTimestamp >= timestamp); + } + function addMonths(uint timestamp, uint _months) internal pure returns (uint newTimestamp) { + (uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY); + month += _months; + year += (month - 1) / 12; + month = (month - 1) % 12 + 1; + uint daysInMonth = _getDaysInMonth(year, month); + if (day > daysInMonth) { + day = daysInMonth; + } + newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY; + require(newTimestamp >= timestamp); + } + function addDays(uint timestamp, uint _days) internal pure returns (uint newTimestamp) { + newTimestamp = timestamp + _days * SECONDS_PER_DAY; + require(newTimestamp >= timestamp); + } + function addHours(uint timestamp, uint _hours) internal pure returns (uint newTimestamp) { + newTimestamp = timestamp + _hours * SECONDS_PER_HOUR; + require(newTimestamp >= timestamp); + } + function addMinutes(uint timestamp, uint _minutes) internal pure returns (uint newTimestamp) { + newTimestamp = timestamp + _minutes * SECONDS_PER_MINUTE; + require(newTimestamp >= timestamp); + } + function addSeconds(uint timestamp, uint _seconds) internal pure returns (uint newTimestamp) { + newTimestamp = timestamp + _seconds; + require(newTimestamp >= timestamp); + } + + function subYears(uint timestamp, uint _years) internal pure returns (uint newTimestamp) { + (uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY); + year -= _years; + uint daysInMonth = _getDaysInMonth(year, month); + if (day > daysInMonth) { + day = daysInMonth; + } + newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY; + require(newTimestamp <= timestamp); + } + function subMonths(uint timestamp, uint _months) internal pure returns (uint newTimestamp) { + (uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY); + uint yearMonth = year * 12 + (month - 1) - _months; + year = yearMonth / 12; + month = yearMonth % 12 + 1; + uint daysInMonth = _getDaysInMonth(year, month); + if (day > daysInMonth) { + day = daysInMonth; + } + newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY; + require(newTimestamp <= timestamp); + } + function subDays(uint timestamp, uint _days) internal pure returns (uint newTimestamp) { + newTimestamp = timestamp - _days * SECONDS_PER_DAY; + require(newTimestamp <= timestamp); + } + function subHours(uint timestamp, uint _hours) internal pure returns (uint newTimestamp) { + newTimestamp = timestamp - _hours * SECONDS_PER_HOUR; + require(newTimestamp <= timestamp); + } + function subMinutes(uint timestamp, uint _minutes) internal pure returns (uint newTimestamp) { + newTimestamp = timestamp - _minutes * SECONDS_PER_MINUTE; + require(newTimestamp <= timestamp); + } + function subSeconds(uint timestamp, uint _seconds) internal pure returns (uint newTimestamp) { + newTimestamp = timestamp - _seconds; + require(newTimestamp <= timestamp); + } + + function diffYears(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _years) { + require(fromTimestamp <= toTimestamp); + (uint fromYear,,) = _daysToDate(fromTimestamp / SECONDS_PER_DAY); + (uint toYear,,) = _daysToDate(toTimestamp / SECONDS_PER_DAY); + _years = toYear - fromYear; + } + function diffMonths(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _months) { + require(fromTimestamp <= toTimestamp); + (uint fromYear, uint fromMonth,) = _daysToDate(fromTimestamp / SECONDS_PER_DAY); + (uint toYear, uint toMonth,) = _daysToDate(toTimestamp / SECONDS_PER_DAY); + _months = toYear * 12 + toMonth - fromYear * 12 - fromMonth; + } + function diffDays(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _days) { + require(fromTimestamp <= toTimestamp); + _days = (toTimestamp - fromTimestamp) / SECONDS_PER_DAY; + } + function diffHours(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _hours) { + require(fromTimestamp <= toTimestamp); + _hours = (toTimestamp - fromTimestamp) / SECONDS_PER_HOUR; + } + function diffMinutes(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _minutes) { + require(fromTimestamp <= toTimestamp); + _minutes = (toTimestamp - fromTimestamp) / SECONDS_PER_MINUTE; + } + function diffSeconds(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _seconds) { + require(fromTimestamp <= toTimestamp); + _seconds = toTimestamp - fromTimestamp; + } +} \ No newline at end of file diff --git a/2021-BeiJing-BSN3/PRG/Contracts/lib/SafeMath.sol b/2021-BeiJing-BSN3/PRG/Contracts/lib/SafeMath.sol new file mode 100644 index 000000000..554fb5a82 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/lib/SafeMath.sol @@ -0,0 +1,106 @@ +pragma solidity ^0.4.25; + +/** + * @dev Wrappers over Solidity's arithmetic operations with added overflow + * checks. + * + * Arithmetic operations in Solidity wrap on overflow. This can easily result + * in bugs, because programmers usually assume that an overflow raises an + * error, which is the standard behavior in high level programming languages. + * `SafeMath` restores this intuition by reverting the transaction when an + * operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + */ +library SafeMath { + /** + * @dev Returns the addition of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `+` operator. + * + * Requirements: + * - Addition cannot overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, "SafeMath: addition overflow"); + return c; + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting on + * overflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot overflow. + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + require(b <= a, "SafeMath: subtraction overflow"); + uint256 c = a - b; + + return c; + } + + /** + * @dev Returns the multiplication of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `*` operator. + * + * Requirements: + * - Multiplication cannot overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 + if (a == 0) { + return 0; + } + + uint256 c = a * b; + require(c / a == b, "SafeMath: multiplication overflow"); + + return c; + } + + /** + * @dev Returns the integer division of two unsigned integers. Reverts on + * division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + // Solidity only automatically asserts when dividing by 0 + require(b > 0, "SafeMath: division by zero"); + uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + + return c; + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b) internal pure returns (uint256) { + require(b != 0, "SafeMath: modulo by zero"); + return a % b; + } +} diff --git a/2021-BeiJing-BSN3/PRG/Contracts/lib/Strings.sol b/2021-BeiJing-BSN3/PRG/Contracts/lib/Strings.sol new file mode 100644 index 000000000..4b659fec4 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/lib/Strings.sol @@ -0,0 +1,717 @@ +/* + * @title String & slice utility library for Solidity contracts. + * @author Nick Johnson + * + * @dev Functionality in this library is largely implemented using an + * abstraction called a 'slice'. A slice represents a part of a string - + * anything from the entire string to a single character, or even no + * characters at all (a 0-length slice). Since a slice only has to specify + * an offset and a length, copying and manipulating slices is a lot less + * expensive than copying and manipulating the strings they reference. + * + * To further reduce gas costs, most functions on slice that need to return + * a slice modify the original one instead of allocating a new one; for + * instance, `s.split(".")` will return the text up to the first '.', + * modifying s to only contain the remainder of the string after the '.'. + * In situations where you do not want to modify the original slice, you + * can make a copy first with `.copy()`, for example: + * `s.copy().split(".")`. Try and avoid using this idiom in loops; since + * Solidity has no memory management, it will result in allocating many + * short-lived slices that are later discarded. + * + * Functions that return two slices come in two versions: a non-allocating + * version that takes the second slice as an argument, modifying it in + * place, and an allocating version that allocates and returns the second + * slice; see `nextRune` for example. + * + * Functions that have to copy string data will return strings rather than + * slices; these can be cast back to slices for further processing if + * required. + * + * For convenience, some functions are provided with non-modifying + * variants that create a new slice and return both; for instance, + * `s.splitNew('.')` leaves s unmodified, and returns two values + * corresponding to the left and right parts of the string. + */ + +pragma solidity ^0.4.25; + +library Strings { + struct slice { + uint _len; + uint _ptr; + } + + function memcpy(uint dest, uint src, uint len) private pure { + // Copy word-length chunks while possible + for(; len >= 32; len -= 32) { + assembly { + mstore(dest, mload(src)) + } + dest += 32; + src += 32; + } + + // Copy remaining bytes + uint mask = 256 ** (32 - len) - 1; + assembly { + let srcpart := and(mload(src), not(mask)) + let destpart := and(mload(dest), mask) + mstore(dest, or(destpart, srcpart)) + } + } + + /* + * @dev Returns a slice containing the entire string. + * @param self The string to make a slice from. + * @return A newly allocated slice containing the entire string. + */ + function toSlice(string memory self) internal pure returns (slice memory) { + uint ptr; + assembly { + ptr := add(self, 0x20) + } + return slice(bytes(self).length, ptr); + } + + + /* + * @dev Returns the length of a null-terminated bytes32 string. + * @param self The value to find the length of. + * @return The length of the string, from 0 to 32. + */ + function len(bytes32 self) internal pure returns (uint) { + uint ret; + if (self == 0) + return 0; + if (self & 0xffffffffffffffffffffffffffffffff == 0) { + ret += 16; + self = bytes32(uint(self) / 0x100000000000000000000000000000000); + } + if (self & 0xffffffffffffffff == 0) { + ret += 8; + self = bytes32(uint(self) / 0x10000000000000000); + } + if (self & 0xffffffff == 0) { + ret += 4; + self = bytes32(uint(self) / 0x100000000); + } + if (self & 0xffff == 0) { + ret += 2; + self = bytes32(uint(self) / 0x10000); + } + if (self & 0xff == 0) { + ret += 1; + } + return 32 - ret; + } + + /* + * @dev Returns a slice containing the entire bytes32, interpreted as a + * null-terminated utf-8 string. + * @param self The bytes32 value to convert to a slice. + * @return A new slice containing the value of the input argument up to the + * first null. + */ + function toSliceB32(bytes32 self) internal pure returns (slice memory ret) { + // Allocate space for `self` in memory, copy it there, and point ret at it + assembly { + let ptr := mload(0x40) + mstore(0x40, add(ptr, 0x20)) + mstore(ptr, self) + mstore(add(ret, 0x20), ptr) + } + ret._len = len(self); + } + + /* + * @dev Returns a new slice containing the same data as the current slice. + * @param self The slice to copy. + * @return A new slice containing the same data as `self`. + */ + function copy(slice memory self) internal pure returns (slice memory) { + return slice(self._len, self._ptr); + } + + /* + * @dev Copies a slice to a new string. + * @param self The slice to copy. + * @return A newly allocated string containing the slice's text. + */ + function toString(slice memory self) internal pure returns (string memory) { + string memory ret = new string(self._len); + uint retptr; + assembly { retptr := add(ret, 32) } + + memcpy(retptr, self._ptr, self._len); + return ret; + } + + /* + * @dev Returns the length in runes of the slice. Note that this operation + * takes time proportional to the length of the slice; avoid using it + * in loops, and call `slice.empty()` if you only need to know whether + * the slice is empty or not. + * @param self The slice to operate on. + * @return The length of the slice in runes. + */ + function len(slice memory self) internal pure returns (uint l) { + // Starting at ptr-31 means the LSB will be the byte we care about + uint ptr = self._ptr - 31; + uint end = ptr + self._len; + for (l = 0; ptr < end; l++) { + uint8 b; + assembly { b := and(mload(ptr), 0xFF) } + if (b < 0x80) { + ptr += 1; + } else if(b < 0xE0) { + ptr += 2; + } else if(b < 0xF0) { + ptr += 3; + } else if(b < 0xF8) { + ptr += 4; + } else if(b < 0xFC) { + ptr += 5; + } else { + ptr += 6; + } + } + } + + /* + * @dev Returns true if the slice is empty (has a length of 0). + * @param self The slice to operate on. + * @return True if the slice is empty, False otherwise. + */ + function empty(slice memory self) internal pure returns (bool) { + return self._len == 0; + } + + /* + * @dev Returns a positive number if `other` comes lexicographically after + * `self`, a negative number if it comes before, or zero if the + * contents of the two slices are equal. Comparison is done per-rune, + * on unicode codepoints. + * @param self The first slice to compare. + * @param other The second slice to compare. + * @return The result of the comparison. + */ + function compare(slice memory self, slice memory other) internal pure returns (int) { + uint shortest = self._len; + if (other._len < self._len) + shortest = other._len; + + uint selfptr = self._ptr; + uint otherptr = other._ptr; + for (uint idx = 0; idx < shortest; idx += 32) { + uint a; + uint b; + assembly { + a := mload(selfptr) + b := mload(otherptr) + } + if (a != b) { + // Mask out irrelevant bytes and check again + uint256 mask = uint256(-1); // 0xffff... + if(shortest < 32) { + mask = ~(2 ** (8 * (32 - shortest + idx)) - 1); + } + uint256 diff = (a & mask) - (b & mask); + if (diff != 0) + return int(diff); + } + selfptr += 32; + otherptr += 32; + } + return int(self._len) - int(other._len); + } + + /* + * @dev Returns true if the two slices contain the same text. + * @param self The first slice to compare. + * @param self The second slice to compare. + * @return True if the slices are equal, false otherwise. + */ + function equals(slice memory self, slice memory other) internal pure returns (bool) { + return compare(self, other) == 0; + } + + /* + * @dev Extracts the first rune in the slice into `rune`, advancing the + * slice to point to the next rune and returning `self`. + * @param self The slice to operate on. + * @param rune The slice that will contain the first rune. + * @return `rune`. + */ + function nextRune(slice memory self, slice memory rune) internal pure returns (slice memory) { + rune._ptr = self._ptr; + + if (self._len == 0) { + rune._len = 0; + return rune; + } + + uint l; + uint b; + // Load the first byte of the rune into the LSBs of b + assembly { b := and(mload(sub(mload(add(self, 32)), 31)), 0xFF) } + if (b < 0x80) { + l = 1; + } else if(b < 0xE0) { + l = 2; + } else if(b < 0xF0) { + l = 3; + } else { + l = 4; + } + + // Check for truncated codepoints + if (l > self._len) { + rune._len = self._len; + self._ptr += self._len; + self._len = 0; + return rune; + } + + self._ptr += l; + self._len -= l; + rune._len = l; + return rune; + } + + /* + * @dev Returns the first rune in the slice, advancing the slice to point + * to the next rune. + * @param self The slice to operate on. + * @return A slice containing only the first rune from `self`. + */ + function nextRune(slice memory self) internal pure returns (slice memory ret) { + nextRune(self, ret); + } + + /* + * @dev Returns the number of the first codepoint in the slice. + * @param self The slice to operate on. + * @return The number of the first codepoint in the slice. + */ + function ord(slice memory self) internal pure returns (uint ret) { + if (self._len == 0) { + return 0; + } + + uint word; + uint length; + uint divisor = 2 ** 248; + + // Load the rune into the MSBs of b + assembly { word:= mload(mload(add(self, 32))) } + uint b = word / divisor; + if (b < 0x80) { + ret = b; + length = 1; + } else if(b < 0xE0) { + ret = b & 0x1F; + length = 2; + } else if(b < 0xF0) { + ret = b & 0x0F; + length = 3; + } else { + ret = b & 0x07; + length = 4; + } + + // Check for truncated codepoints + if (length > self._len) { + return 0; + } + + for (uint i = 1; i < length; i++) { + divisor = divisor / 256; + b = (word / divisor) & 0xFF; + if (b & 0xC0 != 0x80) { + // Invalid UTF-8 sequence + return 0; + } + ret = (ret * 64) | (b & 0x3F); + } + + return ret; + } + + /* + * @dev Returns the keccak-256 hash of the slice. + * @param self The slice to hash. + * @return The hash of the slice. + */ + function keccak(slice memory self) internal pure returns (bytes32 ret) { + assembly { + ret := keccak256(mload(add(self, 32)), mload(self)) + } + } + + /* + * @dev Returns true if `self` starts with `needle`. + * @param self The slice to operate on. + * @param needle The slice to search for. + * @return True if the slice starts with the provided text, false otherwise. + */ + function startsWith(slice memory self, slice memory needle) internal pure returns (bool) { + if (self._len < needle._len) { + return false; + } + + if (self._ptr == needle._ptr) { + return true; + } + + bool equal; + assembly { + let length := mload(needle) + let selfptr := mload(add(self, 0x20)) + let needleptr := mload(add(needle, 0x20)) + equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) + } + return equal; + } + + /* + * @dev If `self` starts with `needle`, `needle` is removed from the + * beginning of `self`. Otherwise, `self` is unmodified. + * @param self The slice to operate on. + * @param needle The slice to search for. + * @return `self` + */ + function beyond(slice memory self, slice memory needle) internal pure returns (slice memory) { + if (self._len < needle._len) { + return self; + } + + bool equal = true; + if (self._ptr != needle._ptr) { + assembly { + let length := mload(needle) + let selfptr := mload(add(self, 0x20)) + let needleptr := mload(add(needle, 0x20)) + equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) + } + } + + if (equal) { + self._len -= needle._len; + self._ptr += needle._len; + } + + return self; + } + + /* + * @dev Returns true if the slice ends with `needle`. + * @param self The slice to operate on. + * @param needle The slice to search for. + * @return True if the slice starts with the provided text, false otherwise. + */ + function endsWith(slice memory self, slice memory needle) internal pure returns (bool) { + if (self._len < needle._len) { + return false; + } + + uint selfptr = self._ptr + self._len - needle._len; + + if (selfptr == needle._ptr) { + return true; + } + + bool equal; + assembly { + let length := mload(needle) + let needleptr := mload(add(needle, 0x20)) + equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) + } + + return equal; + } + + /* + * @dev If `self` ends with `needle`, `needle` is removed from the + * end of `self`. Otherwise, `self` is unmodified. + * @param self The slice to operate on. + * @param needle The slice to search for. + * @return `self` + */ + function until(slice memory self, slice memory needle) internal pure returns (slice memory) { + if (self._len < needle._len) { + return self; + } + + uint selfptr = self._ptr + self._len - needle._len; + bool equal = true; + if (selfptr != needle._ptr) { + assembly { + let length := mload(needle) + let needleptr := mload(add(needle, 0x20)) + equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) + } + } + + if (equal) { + self._len -= needle._len; + } + + return self; + } + + // Returns the memory address of the first byte of the first occurrence of + // `needle` in `self`, or the first byte after `self` if not found. + function findPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns (uint) { + uint ptr = selfptr; + uint idx; + + if (needlelen <= selflen) { + if (needlelen <= 32) { + bytes32 mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1)); + + bytes32 needledata; + assembly { needledata := and(mload(needleptr), mask) } + + uint end = selfptr + selflen - needlelen; + bytes32 ptrdata; + assembly { ptrdata := and(mload(ptr), mask) } + + while (ptrdata != needledata) { + if (ptr >= end) + return selfptr + selflen; + ptr++; + assembly { ptrdata := and(mload(ptr), mask) } + } + return ptr; + } else { + // For long needles, use hashing + bytes32 hash; + assembly { hash := keccak256(needleptr, needlelen) } + + for (idx = 0; idx <= selflen - needlelen; idx++) { + bytes32 testHash; + assembly { testHash := keccak256(ptr, needlelen) } + if (hash == testHash) + return ptr; + ptr += 1; + } + } + } + return selfptr + selflen; + } + + // Returns the memory address of the first byte after the last occurrence of + // `needle` in `self`, or the address of `self` if not found. + function rfindPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns (uint) { + uint ptr; + + if (needlelen <= selflen) { + if (needlelen <= 32) { + bytes32 mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1)); + + bytes32 needledata; + assembly { needledata := and(mload(needleptr), mask) } + + ptr = selfptr + selflen - needlelen; + bytes32 ptrdata; + assembly { ptrdata := and(mload(ptr), mask) } + + while (ptrdata != needledata) { + if (ptr <= selfptr) + return selfptr; + ptr--; + assembly { ptrdata := and(mload(ptr), mask) } + } + return ptr + needlelen; + } else { + // For long needles, use hashing + bytes32 hash; + assembly { hash := keccak256(needleptr, needlelen) } + ptr = selfptr + (selflen - needlelen); + while (ptr >= selfptr) { + bytes32 testHash; + assembly { testHash := keccak256(ptr, needlelen) } + if (hash == testHash) + return ptr + needlelen; + ptr -= 1; + } + } + } + return selfptr; + } + + /* + * @dev Modifies `self` to contain everything from the first occurrence of + * `needle` to the end of the slice. `self` is set to the empty slice + * if `needle` is not found. + * @param self The slice to search and modify. + * @param needle The text to search for. + * @return `self`. + */ + function find(slice memory self, slice memory needle) internal pure returns (slice memory) { + uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr); + self._len -= ptr - self._ptr; + self._ptr = ptr; + return self; + } + + /* + * @dev Modifies `self` to contain the part of the string from the start of + * `self` to the end of the first occurrence of `needle`. If `needle` + * is not found, `self` is set to the empty slice. + * @param self The slice to search and modify. + * @param needle The text to search for. + * @return `self`. + */ + function rfind(slice memory self, slice memory needle) internal pure returns (slice memory) { + uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr); + self._len = ptr - self._ptr; + return self; + } + + /* + * @dev Splits the slice, setting `self` to everything after the first + * occurrence of `needle`, and `token` to everything before it. If + * `needle` does not occur in `self`, `self` is set to the empty slice, + * and `token` is set to the entirety of `self`. + * @param self The slice to split. + * @param needle The text to search for in `self`. + * @param token An output parameter to which the first token is written. + * @return `token`. + */ + function split(slice memory self, slice memory needle, slice memory token) internal pure returns (slice memory) { + uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr); + token._ptr = self._ptr; + token._len = ptr - self._ptr; + if (ptr == self._ptr + self._len) { + // Not found + self._len = 0; + } else { + self._len -= token._len + needle._len; + self._ptr = ptr + needle._len; + } + return token; + } + + /* + * @dev Splits the slice, setting `self` to everything after the first + * occurrence of `needle`, and returning everything before it. If + * `needle` does not occur in `self`, `self` is set to the empty slice, + * and the entirety of `self` is returned. + * @param self The slice to split. + * @param needle The text to search for in `self`. + * @return The part of `self` up to the first occurrence of `delim`. + */ + function split(slice memory self, slice memory needle) internal pure returns (slice memory token) { + split(self, needle, token); + } + + /* + * @dev Splits the slice, setting `self` to everything before the last + * occurrence of `needle`, and `token` to everything after it. If + * `needle` does not occur in `self`, `self` is set to the empty slice, + * and `token` is set to the entirety of `self`. + * @param self The slice to split. + * @param needle The text to search for in `self`. + * @param token An output parameter to which the first token is written. + * @return `token`. + */ + function rsplit(slice memory self, slice memory needle, slice memory token) internal pure returns (slice memory) { + uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr); + token._ptr = ptr; + token._len = self._len - (ptr - self._ptr); + if (ptr == self._ptr) { + // Not found + self._len = 0; + } else { + self._len -= token._len + needle._len; + } + return token; + } + + /* + * @dev Splits the slice, setting `self` to everything before the last + * occurrence of `needle`, and returning everything after it. If + * `needle` does not occur in `self`, `self` is set to the empty slice, + * and the entirety of `self` is returned. + * @param self The slice to split. + * @param needle The text to search for in `self`. + * @return The part of `self` after the last occurrence of `delim`. + */ + function rsplit(slice memory self, slice memory needle) internal pure returns (slice memory token) { + rsplit(self, needle, token); + } + + /* + * @dev Counts the number of nonoverlapping occurrences of `needle` in `self`. + * @param self The slice to search. + * @param needle The text to search for in `self`. + * @return The number of occurrences of `needle` found in `self`. + */ + function count(slice memory self, slice memory needle) internal pure returns (uint cnt) { + uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr) + needle._len; + while (ptr <= self._ptr + self._len) { + cnt++; + ptr = findPtr(self._len - (ptr - self._ptr), ptr, needle._len, needle._ptr) + needle._len; + } + } + + /* + * @dev Returns True if `self` contains `needle`. + * @param self The slice to search. + * @param needle The text to search for in `self`. + * @return True if `needle` is found in `self`, false otherwise. + */ + function contains(slice memory self, slice memory needle) internal pure returns (bool) { + return rfindPtr(self._len, self._ptr, needle._len, needle._ptr) != self._ptr; + } + + /* + * @dev Returns a newly allocated string containing the concatenation of + * `self` and `other`. + * @param self The first slice to concatenate. + * @param other The second slice to concatenate. + * @return The concatenation of the two strings. + */ + function concat(slice memory self, slice memory other) internal pure returns (string memory) { + string memory ret = new string(self._len + other._len); + uint retptr; + assembly { retptr := add(ret, 32) } + memcpy(retptr, self._ptr, self._len); + memcpy(retptr + self._len, other._ptr, other._len); + return ret; + } + + /* + * @dev Joins an array of slices, using `self` as a delimiter, returning a + * newly allocated string. + * @param self The delimiter to use. + * @param parts A list of slices to join. + * @return A newly allocated string containing all the slices in `parts`, + * joined with `self`. + */ + function join(slice memory self, slice[] memory parts) internal pure returns (string memory) { + if (parts.length == 0) + return ""; + + uint length = self._len * (parts.length - 1); + for(uint i = 0; i < parts.length; i++) + length += parts[i]._len; + + string memory ret = new string(length); + uint retptr; + assembly { retptr := add(ret, 32) } + + for(i = 0; i < parts.length; i++) { + memcpy(retptr, parts[i]._ptr, parts[i]._len); + retptr += parts[i]._len; + if (i < parts.length - 1) { + memcpy(retptr, self._ptr, self._len); + retptr += self._len; + } + } + + return ret; + } +} diff --git a/2021-BeiJing-BSN3/PRG/Contracts/lib/Table.sol b/2021-BeiJing-BSN3/PRG/Contracts/lib/Table.sol new file mode 100644 index 000000000..814eab06d --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/lib/Table.sol @@ -0,0 +1,56 @@ +pragma solidity ^0.4.25; +contract TableFactory { + function openTable(string) public constant returns (Table); //open table + function createTable(string,string,string) public constant returns(int); //create table +} + +//select condition +contract Condition { + function EQ(string, int); + function EQ(string, string); + + function NE(string, int); + function NE(string, string); + + function GT(string, int); + function GE(string, int); + + function LT(string, int); + function LE(string, int); + + function limit(int); + function limit(int, int); +} + +//one record +contract Entry { + function getInt(string) public constant returns(int); + function getAddress(string) public constant returns(address); + function getBytes64(string) public constant returns(byte[64]); + function getBytes32(string) public constant returns(bytes32); + function getString(string) public constant returns(string); + + function set(string, int) public; + function set(string, string) public; +} + +//record sets +contract Entries { + function get(int) public constant returns(Entry); + function size() public constant returns(int); +} + +//Table main contract +contract Table { + //select api + function select(string, Condition) public constant returns(Entries); + //insert api + function insert(string, Entry) public returns(int); + //update api + function update(string, Entry, Condition) public returns(int); + //remove api + function remove(string, Condition) public returns(int); + + function newEntry() public constant returns(Entry); + function newCondition() public constant returns(Condition); +} \ No newline at end of file diff --git a/2021-BeiJing-BSN3/PRG/Contracts/proposal.sol b/2021-BeiJing-BSN3/PRG/Contracts/proposal.sol new file mode 100644 index 000000000..f7740fa35 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/proposal.sol @@ -0,0 +1,252 @@ +pragma solidity ^0.4.25; +pragma experimental ABIEncoderV2; +import "./lib/SafeMath.sol"; +import "./utils/TimeUtil.sol"; +import "./TableDefTools.sol"; + +/* +* +* proposal实现用户提议功能。针对用户提议内容会调用一次文本审核api接口,若存在违规词将会给用户扣分 +* 首先查看用户是否注册,登陆。如果没有则不能提议 +* 操作的表为t_proposal. +*user_id,proposal_content,proposal_time,approval_cnt,disapproval_cnt,check_result +*/ +contract proposal is TableDefTools{ + /******* 引入库 *******/ + using TimeUtil for *; + using SafeMath for *; + event PROPOSAL(string proposalid,string Userid,string SuggestContent,string time);//提议事件.提议人ID,提议标题,内容。时间 + event APPROVAL(string proposalid,string Userid,string time);//提议事件,谁什么时间投了赞成票 + event DISAPPROVAL(string proposalid,string Userid,string time);//提议事件,谁什么时间投了赞成票 + /* + * 构造函数,初始化使用到的表结构 + * + * @param 无 + * + * @return 无 + */ + constructor() public{ + //初始化需要用到的表。建言献策表 + initTableStruct(t_proposal_struct, TABLE_PROPOSAL_NAME, TABLE_PROPOSAL_PRIMARYKEY, TABLE_PROPOSAL_FIELDS); + } + /* + * 1.用户提议 + * + * @param _proposalid 提议ID号 + * @param user_id 提议人ID + * @param proposal_content 提议内容 + * @param proposal_time 提议时间(自动获取) + * @param approval_cnt 支持票数(默认0) + * @param disapproval_cnt 反对票数(默认0) + * @param check_result 审核结果(默认审核中) + * @return 执行状态码 + * + * 测试举例 参数一:"17846" + * 参数二:"尊敬的领导,本人通过网络知道了了去年事务部和十大银行签了优抚协议,其它省份落实的很好,希望江西省也能对接下江西银行,江西农商银行等" + *注册成功返回SUCCESS,以及提议的句子。否则返回错误码,错误码对应的问题请参考TableDefTools写的 + */ + function suggestUser(string memory _proposalid,string memory _userid,string memory _content) public returns(int8){ + //获取时间 + string memory nowDate = TimeUtil.getNowDate(); + + // string memory storeFields = StringUtil.strConcat5(_userid,',',suggestfields,',',nowDate); + string memory lastThreeParams = "0,0,审核中"; + string memory storeFields = StringUtil.strConcat7(_userid,',',_content,',',nowDate,',',lastThreeParams); + emit PROPOSAL(StringUtil.strConcat2("提议的ID号为:",_proposalid),StringUtil.strConcat2("提议人的ID为:",_userid),StringUtil.strConcat2("提议内容为:",_content),StringUtil.strConcat2("提议时间为:",nowDate)); + return (insertOneRecord(t_proposal_struct,_proposalid,storeFields,false)); + } + /* + * 2.根据提议ID号查询提议人ID号和提议内容并以Json字符串方式输出 + * + * @param _proposalid 提议id + * + * @return 执行状态码 + * @return 该用户所有提议信息的Json字符串 + * + * 测试举例 参数一:"17846" + */ + function getSuggestRecordJson(string _proposalid) public view returns(int8, string){ + return selectOneRecordToJson(t_proposal_struct, _proposalid); + } + /* + * 3.据提议ID号查询提议人ID号和提议内容并以字符串数组方式输出 + * + * @param _proposalid 提议id + * + * @return 执行状态码 + * @return 该提议人ID和提议内容信息的字符串数组 + * + * 测试举例 参数一:"17846" + */ + function getSuggestRecordArray(string _proposalid) public view returns(int8, string[]){ + return selectOneRecordToArray(t_proposal_struct,_proposalid, ["proposal_id",_proposalid]); + } + /* + * 4.根据提议ID号查看提议内容 + * + * @param _proposalid 提议id + * + * @return 提议内容 + * + * 测试举例 参数一:"17846" + */ + function getSuggestContent(string _proposalid) public view returns(string){ + int8 retCode; + string[] memory retArray; + (retCode, retArray) = getSuggestRecordArray(_proposalid); + return retArray[1]; + } + /* + * 5.根据提议ID号查看提议人ID号, + * + * @param _proposalid 提议id + * + * @return 提议人Id + * + * 测试举例 参数一:"17846" + */ + function getSuggestId(string _proposalid) public view returns(string){ + int8 retCode; + string[] memory retArray; + (retCode, retArray) = getSuggestRecordArray(_proposalid); + return retArray[0]; + } + /* + * 6.根据提议ID号查看当前提议的支持票数 + * + * @param _proposalid 提议id + * + * @return 提议人Id + * + * 测试举例 参数一:"17846" + */ + function getApproval(string _proposalid) public view returns(uint){ + int8 retCode; + uint proposalApproval; + string[] memory retArray; + (retCode, retArray) = getSuggestRecordArray(_proposalid); + if(retCode == SUCCESS_RETURN){ + proposalApproval=TypeConvertUtil.stringToUint(retArray[3]); + return proposalApproval; + }else{ + return uint(-1); + } + + } + + /* + * 7根据提议ID号查看当前提议的反对票数 + * + * @param _proposalid 提议id + * + * @return 提议人Id + * + * 测试举例 参数一:"17846" + */ + function getDisApproval(string _proposalid) public view returns(uint){ + int8 retCode; + uint proposalApproval; + string[] memory retArray; + (retCode, retArray) = getSuggestRecordArray(_proposalid); + if(retCode == SUCCESS_RETURN){ + proposalApproval=TypeConvertUtil.stringToUint(retArray[4]); + return proposalApproval; + }else{ + return uint(-1); + } + } + /* + * 8根据提议ID号查看当前提议的审核结果 + * + * @param _proposalid 提议id + * + * @return 提议人Id + * + * 测试举例 参数一:"17846" + */ + function getResult(string _proposalid) public view returns(string){ + int8 retCode; + string[] memory retArray; + (retCode, retArray) = getSuggestRecordArray(_proposalid); + return retArray[5]; + } + /* + * 9.向proposal表进行投赞成票操作 + * + * @param _proposalid 提议id,唯一主键 + * @param _userid 投票人的ID + * @return 执行状态码 + *测试举例 参数一:"191867345212322",123,1 + */ + function Approval(string memory _proposalid,string memory _userid) public returns(int8) { + // 该提案当前支持票票数 + uint proposalHasApproval; + // 该提案更新后的支持票票数 + uint proposalNowApproval; + // 查询信息返回状态 + int8 queryRetCode; + // 更新信息返回状态 + int8 updateRetCode; + // 数据表返回信息 + string[] memory retArray; + // 获得当前的时间 + string memory updateTime= TimeUtil.getNowDate(); + // 查看该用户记录信息 + (queryRetCode, retArray) = selectOneRecordToArray(t_proposal_struct,_proposalid, ["proposal_id",_proposalid]); + proposalHasApproval=getApproval(_proposalid); + proposalNowApproval=SafeMath.add(proposalHasApproval,1); + emit APPROVAL(StringUtil.strConcat2("提议的ID号为:",_proposalid),StringUtil.strConcat2("已投支持票,该投票人的ID为:",_userid),StringUtil.strConcat2("投票时间为:",updateTime)); + string memory changedFieldsStr = getChangeFieldsString(retArray,3, TypeConvertUtil.uintToString(proposalNowApproval));//转换回字符串类型 + if(proposalNowApproval>9){ + string memory changedFieldsStr4 = getChangeFieldsString(retArray,5,"支持"); + return(updateOneRecord(t_proposal_struct,_proposalid,changedFieldsStr4)); + } + return(updateOneRecord(t_proposal_struct,_proposalid,changedFieldsStr)); + } + /* + * 10.向proposal表进行投赞成票操作 + * + * @param _proposalid 提议id,唯一主键 + * @param _userid 投票人的ID + + * @return 执行状态码 + *测试举例 参数一:"191867345212322",1 + */ + function DisApproval(string memory _proposalid,string memory _userid) public returns(int8) { + + + // 该提案当前反对票票数 + uint proposalHasDisApproval; + + // 该提案更新后的反对票票数 + uint proposalNowDisApproval; + + // 查询信息返回状态 + int8 queryRetCode; + // 更新信息返回状态 + int8 updateRetCode; + // 数据表返回信息 + string[] memory retArray; + // 获得当前的时间 + string memory updateTime= TimeUtil.getNowDate(); + // 查看该用户记录信息 + (queryRetCode, retArray) = selectOneRecordToArray(t_proposal_struct,_proposalid, ["proposal_id",_proposalid]); + //该提案存在 + //将提案票数转换为整数进行操作selectOneRecordToArray + proposalHasDisApproval=getDisApproval(_proposalid); + + // 更新投票结果 + proposalNowDisApproval=SafeMath.add(proposalHasDisApproval,1);//调用Safemath的减法操作,避免溢出问题 + //对信用分操作完毕后。更新用户表 + string memory changedFieldsStr = getChangeFieldsString(retArray,4, TypeConvertUtil.uintToString(proposalNowDisApproval)); + //过半通过/不通过 + if(proposalNowDisApproval>9){ + string memory changedFieldsStr3 = getChangeFieldsString(retArray,5,"反对"); + return(updateOneRecord(t_proposal_struct,_proposalid,changedFieldsStr3)); + } + emit DISAPPROVAL(StringUtil.strConcat2("提议的ID号为:",_proposalid),StringUtil.strConcat2("已投反对票,该投票人的ID为:",_userid),StringUtil.strConcat2("投票时间为:",updateTime)); + return(updateOneRecord(t_proposal_struct,_proposalid,changedFieldsStr)); + } +} + + diff --git a/2021-BeiJing-BSN3/PRG/Contracts/report.sol b/2021-BeiJing-BSN3/PRG/Contracts/report.sol new file mode 100644 index 000000000..61c7535f9 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/report.sol @@ -0,0 +1,101 @@ +pragma solidity ^0.4.25; +pragma experimental ABIEncoderV2; +import "./lib/SafeMath.sol"; +import "./utils/TimeUtil.sol"; +import "./TableDefTools.sol"; + +/* +* +* report实现用户反馈。用户可以对其他人进行举报或者表扬好人好事 +* 操作的表为t_report.主键为report_id +* user_id,to_user_id,event_content,event_type +*/ +contract report is TableDefTools{ + /******* 引入库 *******/ + using TimeUtil for *; + using SafeMath for *; + //反馈人在XX时间反馈XXX做了XXX事情,该事情类别为X + event FEEDBACK(string reportId,string Userid,string ToUserid,string event_content,string time); + /* + * 构造函数,初始化使用到的表结构 + * + * @param 无 + * + * @return 无 + */ + constructor() public{ + //初始化需要用到的表。反馈表 + initTableStruct(t_report_struct, TABLE_REPORT_NAME, TABLE_REPORT_PRIMARYKEY, TABLE_REPORT_FIELDS); + } + /* + * 1.用户进行反馈 + * + * @param _reportid 反馈ID号唯一主键 + * @param _userid 反馈ID + * @param _toUserid 被反馈对象id + * @param _content 反馈内容 + * @param _type 反馈类别 0为好人好事 1为举报做了坏事 + * @return 执行状态码 + * + * 测试举例 参数一:"17846" + * 参数二:"1","2","张三欠钱一直迟迟不还","1" + *注册成功返回SUCCESS,以及留言的句子。否则返回错误码,错误码对应的问题请参考TableDefTools写的 + */ + function feedback(string memory _reportId,string memory _userid,string memory _toUserid,string memory _content,string memory _type) public returns(int8){ + //获取时间 + string memory nowDate = TimeUtil.getNowDate(); + + string memory storeFields = StringUtil.strConcat7(_userid,',',_toUserid,',',_content,',',_type); + + + emit FEEDBACK(StringUtil.strConcat2("反馈的ID号为:",_reportId),StringUtil.strConcat2("反馈人的ID为:",_userid),StringUtil.strConcat2("反馈对象的ID为:",_toUserid),StringUtil.strConcat2("反馈内容为:",_content),StringUtil.strConcat2("反馈时间为:",nowDate)); + + + return (insertOneRecord(t_report_struct,_reportId,storeFields,false)); + } + /* + * 2.根据反馈ID号查询反馈内容并以Json字符串方式输出 + * + * @param _reportid 反馈id + * + * @return 执行状态码 + * @return 该用户所有留言信息的Json字符串 + * + * 测试举例 参数一:"17846" + */ + function getReportJson(string _reportid) public view returns(int8, string){ + return selectOneRecordToJson(t_report_struct, _reportid); + } + /* + * 3.据留言ID号查询留言人ID号和留言内容并以字符串数组方式输出 + * + * @param _reportid 留言id + * + * @return 执行状态码 + + * + * 测试举例 参数一:"17846" + */ + function getReportArray(string _reportid) public view returns(int8, string[]){ + return selectOneRecordToArray(t_report_struct,_reportid, ["report_id",_reportid]); + } + /* + * 4.根据留言ID号查看留言内容,最后通过这个内容去调用文本审核api + * + * @param _reportid 留言id + * + * @return 留言内容 + * + * 测试举例 参数一:"17846" + */ + function getReportContent(string _reportid) public view returns(string){ + int8 retCode; + string[] memory retArray; + (retCode, retArray) = getReportArray(_reportid); + return retArray[2]; + } + + +} + + diff --git a/2021-BeiJing-BSN3/PRG/Contracts/utils/StringUtil.sol b/2021-BeiJing-BSN3/PRG/Contracts/utils/StringUtil.sol new file mode 100644 index 000000000..b723c9214 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/utils/StringUtil.sol @@ -0,0 +1,292 @@ +pragma solidity ^0.4.25; +pragma experimental ABIEncoderV2; + +import "../lib/Table.sol"; + +/* +* 处理字符串的工具合约 +* +*/ +library StringUtil { + + /* + * 比较两个字符串是否相符 + * + * @param string1 各字段名 + * @param string2 记录的实例 + * + * @return 各字段值 + */ + + function compareTwoString(string string1, string string2) pure internal returns (bool) { + if (bytes(string1).length != bytes(string2).length) { + return false; + } else { + return keccak256(string1) == keccak256(string2); + } + } + /* + * 得到表中指定一条记录的值 + * + * @param fields 各字段名 + * @param fields 记录的实例 + * + * @return 各字段值 + */ + function getEntry(string[] memory fields, Entry entry) internal view returns (string[] memory) { + string[] memory values = new string[](fields.length); + for (uint i = 0; i < fields.length; i++) { + values[i] = entry.getString(fields[i]); + } + return values; + } + + + /* + * 得到表中指定一条记录的值,以Json字符串格式输出 + * + * @param fields 各字段名 + * @param primaryKey 主键值 + * @param entries 多条记录的实例 + * + * @return 执行状态码 + * @return 记录值 + */ + function getJsonString(string[] memory fields,string primaryKey, Entries entries) internal view returns (int8, string memory) { + string memory detail; + if (0 == entries.size()) { + return (int8(-2), detail); + } + else { + detail = "["; + for (uint i = 0; i < uint(entries.size()); i++) { + string[] memory values = getEntry(fields, entries.get(int(i))); + for (uint j = 0; j < values.length; j++) { + if (j == 0) { + detail = strConcat4(detail, "{\"primaryKey\":\"", primaryKey, "\",\"fields\":{");//这里订正了!!fields左边缺个双引号 + } + detail = strConcat6(detail, "\"", fields[j], "\":\"", values[j], "\""); + + if (j == values.length - 1) { + detail = strConcat2(detail, "}}"); + } else { + detail = strConcat2(detail, ","); + } + } + if (i != uint(entries.size()) - 1) { + detail = strConcat2(detail, ","); + } + } + detail = strConcat2(detail, "]"); + return (int8(1), detail); + } + } + /* + * 字符串拼接工具(后面strConcatX都为字符串拼接工具方法,X为字符串数量) + * + * @param str1 待拼接字符串1 + * @param str2 待拼接字符串2 + * @param str3 待拼接字符串3 + * @param str4 待拼接字符串4 + * @param str5 待拼接字符串5 + * @param str6 待拼接字符串6 + * + * @return 拼接完成后的字符串 + */ + function strConcat8( + string memory str1, + string memory str2, + string memory str3, + string memory str4, + string memory str5, + string memory str6, + string memory str7, + string memory str8 + ) internal pure returns (string memory) { + string[] memory strings = new string[](7); + strings[0] = str1; + strings[1] = str2; + strings[2] = str3; + strings[3] = str4; + strings[4] = str5; + strings[5] = str6; + strings[6] = str7; + strings[7] = str8; + return strConcat(strings); + } + /* + * 字符串拼接工具(后面strConcatX都为字符串拼接工具方法,X为字符串数量) + * + * @param str1 待拼接字符串1 + * @param str2 待拼接字符串2 + * @param str3 待拼接字符串3 + * @param str4 待拼接字符串4 + * @param str5 待拼接字符串5 + * @param str6 待拼接字符串6 + * + * @return 拼接完成后的字符串 + */ + function strConcat7( + string memory str1, + string memory str2, + string memory str3, + string memory str4, + string memory str5, + string memory str6, + string memory str7 + ) internal pure returns (string memory) { + string[] memory strings = new string[](7); + strings[0] = str1; + strings[1] = str2; + strings[2] = str3; + strings[3] = str4; + strings[4] = str5; + strings[5] = str6; + strings[6] = str7; + return strConcat(strings); + } + + /* + * 字符串拼接工具(后面strConcatX都为字符串拼接工具方法,X为字符串数量) + * + * @param str1 待拼接字符串1 + * @param str2 待拼接字符串2 + * @param str3 待拼接字符串3 + * @param str4 待拼接字符串4 + * @param str5 待拼接字符串5 + * @param str6 待拼接字符串6 + * + * @return 拼接完成后的字符串 + */ + function strConcat6( + string memory str1, + string memory str2, + string memory str3, + string memory str4, + string memory str5, + string memory str6 + ) internal pure returns (string memory) { + string[] memory strings = new string[](6); + strings[0] = str1; + strings[1] = str2; + strings[2] = str3; + strings[3] = str4; + strings[4] = str5; + strings[5] = str6; + return strConcat(strings); + } + + function strConcat5( + string memory str1, + string memory str2, + string memory str3, + string memory str4, + string memory str5 + ) internal pure returns (string memory) { + string[] memory strings = new string[](5); + strings[0] = str1; + strings[1] = str2; + strings[2] = str3; + strings[3] = str4; + strings[4] = str5; + return strConcat(strings); + } + + function strConcat4( + string memory str1, + string memory str2, + string memory str3, + string memory str4 + ) internal pure returns (string memory) { + string[] memory strings = new string[](4); + strings[0] = str1; + strings[1] = str2; + strings[2] = str3; + strings[3] = str4; + return strConcat(strings); + } + + function strConcat3( + string memory str1, + string memory str2, + string memory str3 + ) internal pure returns (string memory) { + string[] memory strings = new string[](3); + strings[0] = str1; + strings[1] = str2; + strings[2] = str3; + return strConcat(strings); + } + + function strConcat2(string memory str1, string memory str2) internal pure returns (string memory) { + string[] memory strings = new string[](2); + strings[0] = str1; + strings[1] = str2; + return strConcat(strings); + } + + function strConcat(string[] memory strings) internal pure returns (string memory) { + // 计算字节长度 + uint bLength = 0; + for (uint i = 0; i < strings.length; i++) { + bLength += bytes(strings[i]).length; + } + + // 实例化字符串 + string memory result = new string(bLength); + bytes memory bResult = bytes(result); + + // 填充字符串 + uint currLength = 0; + for ( i = 0; i < strings.length; i++) { + // 将当前字符串转换为字节数组 + bytes memory bs = bytes(strings[i]); + for (uint j = 0; j < bs.length; j++) { + bResult[currLength] = bs[j]; + currLength++; + } + } + return string(bResult); + } + + + /* + * 字符串数组拼接为字符串的工具,各字符串之间以逗号进行连接。 + * + * @param strings 字符串数组 + * + * @return 拼接后的字符串 + */ + function strConcatWithComma(string[] memory strings) internal pure returns (string memory) { + + uint bLength = 0; + string memory commaString = ","; + bytes memory oneCommaBytes = bytes(commaString); + + for (uint i = 0; i < strings.length; i++) { + if(i > 0){ + bLength += oneCommaBytes.length; + } + bLength += bytes(strings[i]).length; + } + string memory result = new string(bLength); + bytes memory bResult = bytes(result); + uint currLength = 0; + for ( i = 0; i < strings.length; i++) { + bytes memory bs = bytes(strings[i]); + if(i > 0){ + for(uint k=0;k < oneCommaBytes.length; k++){ + bResult[currLength] = oneCommaBytes[k]; + currLength++; + } + } + for (uint j = 0; j < bs.length; j++) { + bResult[currLength] = bs[j]; + currLength++; + } + } + + return string(bResult); + } + +} \ No newline at end of file diff --git a/2021-BeiJing-BSN3/PRG/Contracts/utils/TimeUtil.sol b/2021-BeiJing-BSN3/PRG/Contracts/utils/TimeUtil.sol new file mode 100644 index 000000000..18dcd97bb --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/utils/TimeUtil.sol @@ -0,0 +1,94 @@ +pragma solidity ^0.4.25; + +import "../lib/DateTimeLibrary.sol"; +import "./StringUtil.sol"; +import "./TypeConvertUtil.sol"; + +/* +* 获取当前时间的工具合约 +* +*/ +library TimeUtil { + + using DateTimeLibrary for uint; + using StringUtil for *; + using TypeConvertUtil for *; + + /* + * 得到当下的日期及时间,分别以字符串方式输出 + * + * @param无,直接调用 + * + * @return dateString 当前日期字符串 + * @return timeString 当前时间字符串 + * + */ + function getNowDateTime() internal view returns(string dateString, string timeString){ + (uint year,uint month,uint day,uint hour,uint minute,uint second) = DateTimeLibrary.timestampToDateTime(now/1000); + string memory nowDate = StringUtil.strConcat5( + TypeConvertUtil.uintToString(year), + "-" , + TypeConvertUtil.uintToString(month), + "-" , + TypeConvertUtil.uintToString(day)); + string memory nowTime = StringUtil.strConcat5( + TypeConvertUtil.uintToString(hour), + ":" , + TypeConvertUtil.uintToString(minute), + ":" , + TypeConvertUtil.uintToString(second)); + return (nowDate, nowTime); + } + /* + * 得到当下的日期及时间,以字符串方式直接输出 + * + * @param无,直接调用 + * + * @return dateString 当前日期字符串 + * @return timeString 当前时间字符串 + * + */ + function getNowTime() internal view returns(string nowtimeString){ + (uint year,uint month,uint day,uint hour,uint minute,uint second) = DateTimeLibrary.timestampToDateTime(now/1000); + string memory nowDate = StringUtil.strConcat5( + TypeConvertUtil.uintToString(year), + "-" , + TypeConvertUtil.uintToString(month), + "-" , + TypeConvertUtil.uintToString(day)); + string memory nowTime = StringUtil.strConcat5( + TypeConvertUtil.uintToString(hour), + ":" , + TypeConvertUtil.uintToString(minute), + ":" , + TypeConvertUtil.uintToString(second)); + string memory NowDefiniteTime=StringUtil.strConcat3(nowDate,'日',nowTime); + return (NowDefiniteTime); + } + + /* + * 得到当下的日期,以字符串方式输出 + * + * @param无,直接调用 + * + * @return dateString 当前日期字符串 + * @return timeString 当前时间字符串 + * + */ + function getNowDate() internal view returns(string dateString){ + (uint year,uint month,uint day) = DateTimeLibrary.timestampToDate(now/1000); + string memory nowDate = StringUtil.strConcat5( + TypeConvertUtil.uintToString(year), + "-" , + TypeConvertUtil.uintToString(month), + "-" , + TypeConvertUtil.uintToString(day)); + return nowDate; + } + +} + + + + + diff --git a/2021-BeiJing-BSN3/PRG/Contracts/utils/TypeConvertUtil.sol b/2021-BeiJing-BSN3/PRG/Contracts/utils/TypeConvertUtil.sol new file mode 100644 index 000000000..25f3b95d0 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/Contracts/utils/TypeConvertUtil.sol @@ -0,0 +1,124 @@ +pragma solidity ^0.4.25; + +/* +* solidity类型转换工具合约 +* +*/ +library TypeConvertUtil{ + + /* + * 将string转化为bytes32的工具方法 + * + * @param source 字符串 + * + * @return bytes32值 + */ + function stringToBytes32(string memory source) internal pure returns (bytes32 result) { + + bytes memory tempEmptyStringTest = bytes(source); + if (tempEmptyStringTest.length == 0) { + return 0x0; + } + assembly { + result := mload(add(source, 32)) + } + } + + + /* + * 将bytes32转化为string的工具方法 + * + * @param source bytes32值 + * + * @return 字符串 + */ + function bytes32ToString(bytes32 source) internal pure returns (string) { + bytes memory bytesString = new bytes(32); + uint charCount = 0; + for (uint j = 0; j < 32; j++) { + byte char = byte(bytes32(uint(source) * 2 ** (8 * j))); + if (char != 0) { + bytesString[charCount] = char; + charCount++; + } + } + bytes memory bytesStringTrimmed = new bytes(charCount); + for (j = 0; j < charCount; j++) { + bytesStringTrimmed[j] = bytesString[j]; + } + return string(bytesStringTrimmed); + } + + + /* + * 将string转化为uint的工具方法 + * + * @param source 字符串 + * + * @return uint值 + */ + function stringToUint(string source) internal pure returns (uint result) { + bytes memory b = bytes(source); + uint i; + result = 0; + for (i = 0; i < b.length; i++) { + uint c = uint(b[i]); + if (c >= 48 && c <= 57) { + result = result * 10 + (c - 48); + } + } + } + + + /* + * 将uint转化为string的工具方法 + * + * @param source uint值 + * + * @return 字符串 + */ + function uintToString(uint source) internal pure returns (string){ + if (source == 0) return "0"; + uint j = source; + uint length; + while (j != 0){ + length++; + j /= 10; + } + bytes memory bstr = new bytes(length); + uint k = length - 1; + while (source != 0){ + bstr[k--] = byte(48 + source % 10); + source /= 10; + } + return string(bstr); + } + + + /* + * 将bytes转化为address的工具方法 + * + * @param source bytes值 + * + * @return address值 + */ + function bytesToAddress (bytes source) internal pure returns (address) { + uint result = 0; + for (uint i = 0; i < source.length; i++) { + uint c = uint(source[i]); + if (c >= 48 && c <= 57) { + result = result * 16 + (c - 48); + } + if(c >= 65 && c<= 90) { + result = result * 16 + (c - 55); + } + if(c >= 97 && c<= 122) { + result = result * 16 + (c - 87); + } + } + return address(result); + } + + + +} \ No newline at end of file diff --git a/2021-BeiJing-BSN3/PRG/README.md b/2021-BeiJing-BSN3/PRG/README.md new file mode 100644 index 000000000..8c89a7b80 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/README.md @@ -0,0 +1,24 @@ +# 开拓者-数字金融与乡村治理 + +## 项目简介 +.. +## 项目背景 +.. +## 项目目标 +.. +## 方案 +.. + +|作品名|参赛队员姓名|学校/公司名| +|-----|---------|----------| +|数字金融与乡村治理|蒲沧龙|浙江工业大学之江学院| +|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| +|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| +|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| +|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| +|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| +|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| +|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| +|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| +|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| +|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| \ No newline at end of file From 165aafbc4e750d9fd82feee308203dd77f91d58a Mon Sep 17 00:00:00 2001 From: xiaoyue Date: Fri, 5 Nov 2021 11:47:36 +0800 Subject: [PATCH 2/6] add PRG-img-folder --- 2021-BeiJing-BSN3/PRG/img/README.MD | 1 + 1 file changed, 1 insertion(+) create mode 100644 2021-BeiJing-BSN3/PRG/img/README.MD diff --git a/2021-BeiJing-BSN3/PRG/img/README.MD b/2021-BeiJing-BSN3/PRG/img/README.MD new file mode 100644 index 000000000..60a9e38d3 --- /dev/null +++ b/2021-BeiJing-BSN3/PRG/img/README.MD @@ -0,0 +1 @@ +img files \ No newline at end of file From 42321f10e25457a990a5ea1a4d41d7f1bc0c4492 Mon Sep 17 00:00:00 2001 From: wangningbo <2536935847@qq.com> Date: Fri, 5 Nov 2021 11:57:22 +0800 Subject: [PATCH 3/6] update README.md --- 2021-BeiJing-BSN3/PRG/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2021-BeiJing-BSN3/PRG/README.md b/2021-BeiJing-BSN3/PRG/README.md index 8c89a7b80..1edccf68e 100644 --- a/2021-BeiJing-BSN3/PRG/README.md +++ b/2021-BeiJing-BSN3/PRG/README.md @@ -12,7 +12,7 @@ |作品名|参赛队员姓名|学校/公司名| |-----|---------|----------| |数字金融与乡村治理|蒲沧龙|浙江工业大学之江学院| -|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| +|数字金融与乡村治理|王宁波|无锡太湖学院| |数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| |数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| |数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| From cde0eefdbf65547842577dc967e06e9d4d70e16b Mon Sep 17 00:00:00 2001 From: xiaoyue Date: Fri, 5 Nov 2021 12:20:14 +0800 Subject: [PATCH 4/6] change README.md --- 2021-BeiJing-BSN3/PRG/README.md | 23 ++++++++++++++++++----- 2021-BeiJing-BSN3/PRG/img/img1.png | Bin 0 -> 183724 bytes 2 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 2021-BeiJing-BSN3/PRG/img/img1.png diff --git a/2021-BeiJing-BSN3/PRG/README.md b/2021-BeiJing-BSN3/PRG/README.md index 8c89a7b80..9efdae12c 100644 --- a/2021-BeiJing-BSN3/PRG/README.md +++ b/2021-BeiJing-BSN3/PRG/README.md @@ -1,13 +1,26 @@ # 开拓者-数字金融与乡村治理 ## 项目简介 -.. + +“开拓者”项目是基于区块链可信大数据AI的下一代的“数字金融+农村社区”治理优化系统,通过将村庄居民的基础情况与行为分类,转化为积分等可以量化的信息,全部上链管理,对个体进行评价。主要包括三个方面: + +- ①积分量化行为进行奖惩,区块链通证经济激励。并通过积分兑换和公式等方式对居民进行激励,鼓励向好。 +- ②AI 社交网络,关键节点让治理更高效。居民的行为不仅用于转换积分,还可以被追踪记录,并呈现为社交网络图,方便居民对个人关系及村庄对居民进行管理。 +- ③积分助力金融,可信大数据智能风控。积分还可以进一步计算以衡量居民个人信用,促进决策。 + ## 项目背景 -.. -## 项目目标 -.. + +- 2019年6月,中共中央办公厅、国务院办公厅印发《关于加强和改进乡村治理的指导意见》,并发出通知,要求各地区各部门结合实际认真贯彻落实。实现乡村有效治理是乡村振兴的重要内容。农村基层组织,村民自治。 +- 2014 年 3 月银监会发布了《农村中小金融机构行政许可事项实施办法》,放宽了村镇银行准入门槛,为农户提供更便利的金融服务。2019 年中央一号文件提出,打通金融服务“三农”各个环节,建立县域银行业金融机构服务“三农”的激励约束机制。 +农村小额信贷+农村保险 + ## 方案 -.. +- 居民首次注册后,在“我的”界面中,通过“信息填报”选项进行填报;然后通过发布/领取任务/建言献策进行事务求助或积分获取,与此同时还可以建言献策;居民的行为会连接其他人,据此会产生关系网络图,居民可以通过“我的-我的关系图”查看自己与其他人的关系密切程度; +- 此外,居民的基本信息和个人行为积分会被内部计算后得出信用积分,居民据此参加融资等活动。 + +![avatar](./img/img1.png) + +## 团队成员 |作品名|参赛队员姓名|学校/公司名| |-----|---------|----------| diff --git a/2021-BeiJing-BSN3/PRG/img/img1.png b/2021-BeiJing-BSN3/PRG/img/img1.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb3f00d5a2c26ad30a7fcee8e3849720d6f3201 GIT binary patch literal 183724 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�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

tHc>(qIq;Cj9llFzD|n(EeQn zfgHq`{Q@Ih-x{GB+=jdZKt@Lbuik#qx%3h+>nTuwhC5GAzqqd%C$k6kZGJx8=KA;X zy$*cxAh#jBG!HN3ILbE&?7mA4OOR$t)-52gy8LZL7b*U?&D)JkptDj_m^(h9alBZ; zBzDx!u|vZfM=w_~D<;TCx&-;csytv`RT2|RC+zv7Jn|vH%nwqP{^PjV(KlcgE*Nqi zf5>{Lz&K`g3t$9P@v!%t5QV8-%p5P@*OQwawjft2@Xr54NUuBCn(2+%hnS`ExL1{8 z7s%^b1erv{aN9t3iAK%(7w!C6@n;>anXa1uVE8>Yif;b+#O_pk>>3t0mw8vaQg;+P z!LSVX(#>0t?;t*>E_1&FT0zv&opDD+X)tcUY}~ynuG6z+%HFr!SI7J-@TZsay`Dr5 zIDU7QDfU7pEcADCC5k!X}KeSA7Rrp5U?8xG6Gl)lush1=Mo3FBhfCBPS?i= zhs3BM3U_`Ug01>QAdE@7d;;`RT{5`V@e=m)!!a~aLN`pCfb8S}b-CQKB=JnWeK$br zAwo%!YYh6O_1#e538z}@Yx0RJD|4mv!xyPlJk}Qc+0;E|XN?EnO}jjD`4Qu4V8+83 za-YqxcXM;kK%Z|fhE-O62^dX423&xg2STc~;KtwIZ8inZEN?g^HRtIXHP1AWVJJ$@Gg5)kpmd_1 zh8b>zRv9q93@4IN@395>(Q)grM4tNJ+uDEk27c&uZbO5(UgpVdl_~}-JIt}(!VWD| zu?TX8r=~(6kIplHdS<2#c2w?q#;*-uIU-FY^3d$;jvT+!sY{q-d+c_ffrxyv*;uGA zFs$D0j@T8xOqVctQ$R_FM6`oQ5SqzJDR?%0B>Tz!-s?J!YK*=?6qq!0JrlyagYux< z?>dcNLt>;jD>qi_NXxEg2s$ntLK2hD0))bY(}0ocO|G~Tj1cRMOC8v5lhTv#Nbo4D z)e}qFD{pNxEQ$D>+ zS|~<#u*d|lZAxmp^s{QrZQ%!=#)5=b)clFH$HE~jQ7kUXhCc);hnes_FdlU;4pwQT z^7h;S1GcUvL0~tw2YD2u7x}CpUI!?=;NjKRG7)npjE>>feR+M`N+8d{Q=yfyovugf z-oPQ9$)=QyT&R$c5JFcD`%D6rp1g7aJmg}m z)a0={De>y1VB-GyJ1-n%D35g0AF+5mMd-4~W7QyaYc$F~0@AjB{rW{HQIQtznp&C= z47>|bo-aaoSK%KgT7BNXAc&Ag`rzC#r=IXCwb; zyeR%}EkLutFgdwFl<;%tJvw`T3GvS5<66Dvek2)1^lTky^JNq&+*n1x20drkGP}R5 zW`!*nO`+5Yj#fxtD5?upv=w3I&p==e#44+H9dph> zr%{dIwU}%sD0lQ!;3hT{DKu=FW#NP2X-&%{h@7)eGt<>=0>kbUY7h>GvbH}v0pw91xNRMe03z2}%>@yz-#yyN%xPL-HDx#HU&qP_@&rl6|D zp*O)^4CJU3j;65KHmocL2@?!8As7Ddg%T@266KR`X|YP!#2^q~Dy$8N<9Kz36m z#-(Wvdb;eeQ}El~nxX!rtilL+TL4GM;JZ=c@ES(WL9f`{;K>c|fS}0axalp&Yu|2W zyohcB@jZ;|{v8+pa|n++`&u30gVA%eX&Cpp;a8ZM(t+4#&%$_s$_&b)Z(qK^KC=yq z%Nr0v-q=Mu{e=UsE@kpIgp-;-ShmIo`M`ol%_7#HFCWk{ZfCy3q~e}^fHJ1=U2%E^tm98ZU}7MeoPVczrNC2(JML47Q{ftR$k}vKYBSuTIFOWS zU~RW9V*Q*ZBfPqkcS6Jmes|9|xBg6UUW4@z3}L~BoE{eyrF#E5Lc?MZs07B0>qCOY zniNmq1rfDst~zLyU|Mt@;}Pg#fp6z)W!D+#=3t8Ew>{sY3E4i{QX&I`s>U*NPoITG`X_Pxmy!V% zxSc`zt;e4a!sYN9p<=8IolB6>TyK|u@!>ePGhB_gJ3;nsFNXVjwo!!Nneq2w)~zSi z)eySCoT3C06{rY`tE)j6P$CKTa6i9Dh*E?!DWPPj**N;aQn7VVVR}~6Lm2`+2r~mH z>)|hI0|pkTGN41LSfpM$r@E48<8nnpQ!4&DrNWrdRTvELNY)B|UcE(fETHL}FL33G zNW(p?k!Jds+%H1kyH|Nem2 z`}{dcyF9<5L6CiWM7&-%^%W(IUpkV;HnzTenFnbsp?QG9P3I?PF>Mq5i^|l>SiGLu z6lhCqL#E7@j$X-jMH*lu$Jv0!4P~BQX7HR#j+!exK)?t2<|M=@4=M8jTFYuz%(lON zZHJ2la4gC3IUC1tj>+RC#l)hXMc+_oAjDV6u-}1*Hah-T(eH57eB>1IgO6cj50u8< z^UaizCy<8S0C%T)=?*kt-(Yk260*@r)hr;{=BlJvFsnZ^hMI;wylci&Iygd*5BV$A zEA}4Xx*wXJt+y}f8h`pa01cZ}2fBpcL_KHz$F3#%*UJ7zPP~ZzjoML+a6ZV-leZmb zWg#Z>R};@2vNPSF*N|Tcu+S&ZXM^?cI#iMCVO+N=fJ(8dqWpI^jgWrxe6uVCOiU>6 zL#u44POx|ly`&#ZW||$g1Q~V`Vmb}f-#)a@iOX#+l^SDVCUxP(SBcK0w61sRr9|Jz zxoN^W9av#e4`-D2);VJ>#j(fLR*$Zv_mz6EkL}s(8{g*P$Z zm{irH=s;KVWQ&KL)re4YVoUWW_kaJ{WGBx-lCqSjk4t$1_b6J`J~;SFCI)JI*hs>T z1Sz*P`0}BvtC*(L<|`Us;ua~cp=sn9?UrT5?yp@^ns27aACMq8(*}C;^_s5k?}R}t zw3oX(F62~V5yTrr@1jUgjd9Lvb>EKPi&IM|q<7|rzI6#uSw<>Jl) zZ9-C$$TG^71Bk3ATOi{A_XNnc-ZkD{4eTOYX7Ao!Wdk`B{P9c2qc?zA=IHr~M1v&W z#PPFS>b))_lO|3qv)&1cPWcHZ?NfN-e8G@OIJ+VB!t?ryMP!M%vmz(zO_36ZT?E8d z_3Sk6=|nd8MgCsEV%eixT3YVl@uHTEafM7z*dGl6`pJ}$?9{d8R9}c10ZHap7<%#X zO-gkWfoi3~b0Xwca4;h~--xGv<$ahSybl`dfRMZkohN}+uV7ffB_{ID+s*KNwon{R z!x_dKG?#JGS?cvD?edO}KTu2e95l-EuqO@q_zS#yJ2Kq=JNAEQ-SW#d z)zt|O_8SamIkH_~CIDHvk;yyu``$g@=VssA!c=DUJVbm~UvNj_K(3j32L-#eqO`u!ayUics2C$j4l{n2OZ>YX;!>*&c!pH zU%tW?Q7*{!KPE$9Ai(I*h`~_#-bFCcwlhe}IU#X_jUwqqxYqcvYSTv;dP-^(4sdsk zf$JBcBkV)zfKR+?Z+WWcq1qU+D+QW4^pvLB8gB>OJu7$e^%vF8M=&=XgG1nqzFds2 zF$lw-GP^HT=@~U~>m-Oa^*GS z9H_qlr}{=!guIQj?5@Q*sc|=T23DhV$0ORSDhQw1ljzE{+S?_G%276l$|C>wGNogy zzXnA!%H$XZvrd=JcnLJd)FNd^Vsxga>?@=1|O3(wEIc0&cH9 z(Kyh5gH8h}J{b4~b|DkDL5vcs9zR3wp}=FgLsaITs7mLjVO|c=w6OHauh{3MM`fct zs~1#X+G8@Pz?HB=UazA2FPa_Yg!o0h(HnRyqk;RKg5Ael&*`b{W*VL>_mpr);jg(Ut( zR|OJ3BE)2@t{L|vruHtMfY{fYCG%`^6wjEw&b+cP@ibNOmM{uPvC%&zD?a%DgcvKU z8srtTI&-lyQt8?Dm$*OJ)^Dh2sbehYiZ&pew8BI8#HBNb!KA?g!xzC2aNnJ~_amle zP5SnM4)>YOD8MH=>Xb67ej@Ap2Zk`3CX=4hdThzj!#n1)Z0Jm%GJ+}PtE?asYNDAnR!R412{GuJm#$INJRu3 zvb|u~y#DR|S%msC>x6J(0Zrz?7%3sffA#%ytsj<_#=@J`T!@}DNjEd?pSquQ9Kkiw zdinCrkwS`dj?b)%@|THfNuD2qzS5w40+g%-1;1#{HE7K@lz%?E_>fqfY*w#xX)M(| zG%mvxrp3@@qSz9;`Rql(mgG?I$4V|4GcVFsL=SeBT)LSnTXn96al!54t>1%%R*C~7P7*~;0 z^Z@uDFfnkVid+DrmhLm{9`o{v<*>g%_)xPuKKJA)i~w{o>gS!A3yQ{j;LaexR>|M% zgO_cli|tK;9D{f-cG;t{@DL_O5@iwHF=Q|~Yv;|fY{;X`Pr{Wvj9H|jhPFf6fZ@=B zw7`Klw!Jr(g(@C2tpVul%T=_eB~YFCrtSWUT9}PKfys{`lzHpRbuO1 z;C<+@_=IsAguSBrC77u&mbMbHkW7)N>+Qt8*yiF_Wa7L&A_*lkZVb6CF%5du~l9Q2M4385UYV^)` z6=7Zr zId8MR&!8~vT)LoV3IpqB*0!CuJA{%gOgG2+l?nX?R2?vVqf9_JRyj7{n3#HmPRvS; zi5@$$zJlXPe^T*lJ#gGnOMtg+f^N}Y6t;;qJ_~SN6O7X^JM(4EOtsLJk$xz%U5*!v3|U_E{-5SR*_kLhX0bykJ=kVO zil);7`a*cjhMY^n@*IPdGjvOeue4ZANzqJMJywmHVw&<~QtS8r&bZKITv1PS#nX3X zwGL2EkFGeL58)L}$2cMJkuF3+d(jY{ z0KYkd8VGo1Z8&paAp#a_Z59SLi9;dbZ7Vm^>bH=RE8yj3Bi33 zGgc2D+$Rk1A`2l55bPfiJAC(z>+rh7<2XUm=PZ`l1kCe)qJ$$MrP=--D=VumhMsVC zh%jFRn@5?@ivR4!-pbqANtzg9^^eW1 z0Mub{R`j{+&h!{Zy~dP9N1qBEN6yE%KwR|lA69Y1U4gxj#;r2fI2uFhd1ezv7$t#3 zEBxj{tBq)mL!^e4B&#PMsL^ySfOLr^^z^@eWe$A=6e&0fpTwNcHMZ)2#fah`3| zZHZZkoQ^jF)o@oOz@(_Cr^RZ#mml!hW5CD^lUmTIXp|ZQPFOk*Tl4X#&$A^Q;^V;@ z2lfrvf@Di_(k8-T^9?n&cZBsn*C0i;mLO0iPIydhUZym$8# zjL@7Ulm~sJ4`#aF{Es*M=~4QrPERL4hV6p!XkdKt#ge<+7a7*SEC%N6^J&V`%Z|&4 zl8UqZ#bY-Wi{O|?kal@}W%i7vN=_oP`kD9tb@!D~QMTQ`11KPAARsLvEr@gp0>aQG z-6f55NUNlDx3t92BOQt~NQ0Dg4k6vl{~Dj?UFThAt+Uqoc-FZ;&Kl*OedXT!7sFUM zQct=ZzZl(1e+<1}Lae1}YV9c2Bu#{K`-^J`Htgf#y%KenFH<@~2SAap=j2c&%k)wZ z6dTsGRpJ2_u6V>T-G~#^A`sgW4?N3hywJ6Y34+1pUYv1fSgQU^7oAWB*u~$tWGmN! zus_p}slf@B;U@c7jrrhC=Yzz&aQj(XH=yjyo>o*7f?fao%ScR=sdi#_Nt#qN3hZPk~CVVj)l;1)W;p9s38=9DveT?sLA#HnNmfa%J8{ z9bVuPPs$;sVnnSAlrbflNSU4x#?XV_bVXrd;jpEPyE~Y`KpEP3O`geK{WT!(fD0&) z)j;{FMk+~Smjty~02v%WQ2-f`m4idq6d3p)sf->#B>}4KFF)k9TG5zsFy+L|%;mIAd8Mxz%;h!smuF}E zzUd(ZB1g*Dq{gkF5FTx5>>1Tz0`hMZ-wH4fL%&!l8wDAsyNo~qxCd~&jP5NYZ`o^I z{%?6Jqyyg#ro9T;l;x+G;KujFx4i5X#A+qK8*8*qEoE8+N(*-=uv9-R<{4$=B~t@t zS$yLe%{HbGd&aPe6%GFb_%mV2yLq2`2qYzjn74~`alR6n9aX545zpzcBn*jD>{wK^ ziYz*cq3C$JXk{Ra;^YUST=nm5u_rWd=MH;OB!8!|1I&+&S3hD!kpTr{UEm?SwYC+RVSIzW%&m_x|VjzcU#JJWAiGg&qt zXxjiv4ZiyziU|J^JyRMQ3zYXXVLGlI4>cbitCFZay z@B)C%!xAj@8~9>-ySTW31%QoSYj+85gJ7%G7p4LQ^SApnnAmPcIcSh9C>bGupNYYnK1VkkwRfQ0XzGl67qTN^}JHiWYk zpg91a`J=EtFRP@=53Y}m;O@(kkowFNlWb5s5lE>~`CU0Cf7L?gejd%WNo=DgB?(fd zs%3r@my?IYpfoGm=h;>-=O@rxkgo>X2yYM*F#gxShB&d`R=oUO<$dl1>;!fIG7PK| zAnh7t+z$+AFHd$rxwl&w6B%fA1r|1&Uft08Axc|v=Iie6?pyvQ^4tvBe0u12uZ`2o z!}F%%VqmXmxBVw=ba8I|TE;)CH8L{t@3{Y%sGjHER7d7_O8);JTX{QHQ=0j8b<;OmXnP~2 z&@(xSpx%^Ln9^RlmioyPipXU5C_0PM4GouS1~^l1qU6H?so0*S92R2cDzUM^@0pkS zgPXyGo~!}rZBk!e7XLv?b(o{enEg&mfjA=1Gxi#9Rt9~JUfq_n3QdLqTi^GI#}2R5OL2N zmU!ROL_2dbznii!OGp>*nOSp6>quDrAy3d0()LyGTOyk3L0ylhQB0}6+5uT~MtsJ6 z#}^s$Jbk|!Uih@|1CRZg){xyMR{2>7Ih@93ChGHAKkw zmM~PxH5&lyPOqb3Y2^0cjl804_#K6+gs?OdI1Oadb(tUdCv>D!GXIEvdFKe{?FENS z3Q$0fZRrMPvrKE#E-%7+=7Bw{x3{;ku{aJiFZSgKn!t_&Z`y+g4-S@*5f0wV4mWEK zH%lBhFU$01L$=3JiU+`=6XA3T%uk~fvqZ0fly#PX^Q#72xy{+EtDY*P!bN?Z9 zGmfn$rfbMm|4}G=R57CA;P7VB?|Kr&%`&U2%Hnb^_9)8&2p^P{JD|H3*F0l!`M(GbQExe9-SEq1?NJ^bqwEfaEZFrpA#)gB-_UPY*QoPo8=I%E}55$3b2V zBAYyB^K34I4AZz0_JlyO65x4`LF1-pk3!o{M{-@Z$QsVlngo8S&)FZKU3eyj53pG!M|!+-CzU)@H`@( z**7e4*3p*_W|9@nw! z5V5;w{y`nnFCd(C2bJ1LrHx}GQAOOFPfk@Vu#e$qubCN&BGOCxXp5FEMlhsa1z|+n zphr8~YBS!KQfZv~UEo)dF4c#f$E~2Lp^=wkoTi@uf7fB@X@v+kU@Tg)9&wgL|48c_ z`!0UER>8GV-^x&x{$5o}5mGno&eBXCuaw!SVd`Vt$9(XCWegz5N%CM<2bQ?43aCx( z6*D`%OI>VzVULx8OleZT8)?KGw`Ile%FxoWr`JyR#Kgn^BGb`e?B-n6g1RbjS75k9;-AA> z;lhJS6AlX_qqt+9ciO}zRx)mli;H_duIFa2{y6h}uoC2N{C4g}q(yr97Cq`J>X9aX znx=^5XyQ-NefgdQzhu$U`>1yBQX)O$F{?7jaaNl&d-X1^KK=&_U;yO)kDj3^%hSom z=2VnOP1fs*i3G!BSU=W9eg>W2LnUmU|wCDZfgDJ>+|;8ND_!qHX{b zL*LVU%W>&T)Qw|MJn$#!Py;6GGIbYk&}DlPBt7Ed;zn*>5jR%$T$GuAR4kUh3;`-lj~+aIb6}M!yR4PMd#nc`U&&M{#ga|DW?gp+Ym(}h9Z@V1x z9y%7OUzlZB=68kZMVs6Wja#XYUZV4C$qW6||7Aj_PepD?ttKr7>UQAyXy(ZARC?lD zb}g@Lq})iQ0(3wnwc!3bbdvPQ>wYeu2UW9l=|;I8OTx-AU50($i%7|^jzH!+_ViY< zTcn=Ry0ApyjuCZTH@YxdtA2WB)qNMhbi30LrjxcLvpO7CrZl2E4GazNYVQ&s zeNH>cCd-&d9(n6&XEG;Vel89qWlh87aBj^vZJ^)>4%Z2GGum%meZyWR&>+q;k|ch1 zTb!moNUyMN)T`Mby&;$HrS6jqJJ(Cqy5adlsgb)-=auKNY__eLB}ih3j3$Y;&q-yX zY>yhvZBZ#K7v?9x4~t4LKmLOymy<46#?4!CS*ewYm3J>{_J=g`NO&Ng{R}^*d<$Gb ziQ|=;wvG8fDw}<5LEi?xPAr0ift~Bgpbo2mJ~FyxsSX0F$zUT+VSZXZ0(4A)3x!l9 z+Y#$T3-nBNHn4x?XH{vpf7l>NcyV4U9H58hhE6!F8VJ%~T#vq(+wq~HrKP=aeVvZi zJ^!u4By8?C$8`9Lx}AHYidH_GvP0co)5Dq4?Mp?z2JbGB%dRerj})A;p2|4H{yGSU z+`Of=tt_(UY6Ux9CazSbFz@+E9Y!cE4}n3HUUl*`=I1Hf-d>^}!L|VHR8JcCK>lUJlErYJ{fc(nOcE>6=tNlV zZmX#Nn{*Z_uy~Jp9E*wY1HYxPB(RPTz;ef0FS3wjOTS}Rp%!nbuhI`WkVzat;>9tL zmRSA*K4Tm*UABaVuXp0pV|tYkLG_ANvQj|yYhA~yix`V_o~acr&qG>qJ6w@=X0|*X zlO*?Jg|F~X!6Zi+O>=}fwmNdNHvOb82c}r4hDRSOaupJ{$$*GyAWZo|AFL)UIzyq4 zT-Kf?6IC&sp*7iPy_d4X9@VsM_Dr|f5Xl&Br930ad(dz_Bvz;;`vf}0tB}gqPs72Y zVfM%S?ky*5sntl~?2d3Ch2>fKP%dTVHgi;{OKc*sz%^nz?A&t4O}DsaC6ZTIwxe0D znRJ5CgrobQjdpgMV`dS#;CA~xIha{Fh6z_i?0!Qeg=p8B(XHL*?j+YNUp=p7%xL!F zNEn?OoqQ88o_)r3&YM>w0U6^%kgXe3Xd`_f1tXrbqE zyTSEvc-f&9e$X54{AT{;SO7fW2<}J$v9h3pm9tGSZC?c3y@yYL$%op4TZVak`c|^f(tqMTpWL22m+TkODrNk1_v+V=Eloce7xFJ zJe-Brye_lchCdH~j<&wr*nNN%KV$2@g+(~KByfq`;%G%)Md`FlOp|g?3n*_r>2&px zX6*_vu<^w(jb7Kp$|yLE3bAxp)UiQDoRUUC-aID^&okyBbz`%k%krVH(*5=u4R|9X z+_Fo1tA2UsD*?t;n&0(~M)QPyokT*>`NyfsqN^f5r={8~GC~P0Tv&9cvcIY_j*f&4 z)A$R;UOiXw!<{#@(`ux%cfq0W^YS`_|3Z4}B&roauJg!yG_pVKT}r_xU4Q2f^C|cVeJzc)=u6qe6bDTq5u3za-A>4-y-_8%-tk}Y)T%a0k=2PnE38b zq492ZR4?0^NIy^gKprOf`JLd`>WHLvMx5un2X{>;Ja+d!Dk#i6o7F#UJG^)6Z94pA z8kx=MoI;QK-&L|KuT5u9G8{rAJMF^gKtA6f> zob3z8wVN*ydmWwlnbN~E(iSEcKTtCPT?(5wbsZ9uBryI#i)mg{jKy ztjfYJ{jTSc!ljUrc^t8O<2qs~Eg%eM(!Patjm;RS^}t64gA*+uk<8gL4L+Wh&0N1W z9tg5dy?L$j{yL1yUj_1+$4M;M{938SY2`;K9dcEd(eGr`-L^ou%MNae(14fKmmvfr zKMnwgT3}Z6aq-Na`uor4&1!0P#zeKVyD;|BH?f~pk16w)JthdF*DAyo^dI)=%<0lW zA*}YOY^SW~rWKwS8)*5CoW;IE^z%6n>GOF_M=%tXkOheS>_>#S_E?hR0b@8I^`wP| zYf}(*g{Bo0J?nI&m~;gaZ?bdI53L(cFU7RAI@oL9+2FS6ATAu^`z^LckeA47hqp#B z*VhGTZ7M^W#4lN%CNu;-{JRxQDkG{pmzX!uko5yZL zTq7HwcH)_D9ilKrsD-DPKVUU+rnweghIl-%c>c%#)tkp`0s&6!%PEBIVW>TxHV5s% z5h+T&Z8ikKgc#}WXw>UX;2;Q<-W2JHvzk+OsrBx9H90BN5>L0GUNu}-izW;q^kJKBt*BG9U!}e~-ro@q!R#yW%W=?Yqj-n$EmL}iVI+Y@FTV{&kE~AHII*%2Q9BBAVw@Jv=(w0iz zt(~?{{8~nB+2Efh%71*OnPE?)5?Nn$_xoYZz38&XiTLQz&~UO}Lt}cX zY3VTv#vIp)^nXL6U-`JS;@!EvOGmzH&6`aVXIKCFr|`<=zMsd_@PMyx{PgdmvZ&$6 zILTLbwQa^F556{6GfXdkWfMXu*|jz0wEYuf+UaM+WJA{1g@5jL zmD9NC=IP-o&7aqcS@)o&b-?NzjAMrB< z?#bf8u(P#ZhtR9uhm$wMWTM1>|BQQ%s#gZ7_M12b3b z**~ucJ||QD@2~&euK)k~di}rqE(q??Vktb$*MQkI(Lr(qo z|D2A;EKRtGp$$@o=+USt>yrFjDCVe_!Vg!~bl`#HyX>bRV!Ze*>=?&`zCXf;^d6az z-7$H~P^=?#7k~xo4j5kXg6UC{`*$A1REYWQerB)8w(NxX=U%oh=N{FI8-5JG#@5wa zK9lGf;jGRcR+v9{YBP~TfnfUQaAK&|L2zy{C%sf%|7i?CkSNv==H1? z-un;U_ z4d$cNrHU@pq}_r1oyRrIB#0#8DTANJpD9fzQ;+StZQ`d(13MvZ)jAX~w$i|=UY1h* zM29MBj#iZ|)7SN-`OjlZzZiVanQ*u~5o_RhLrlhL%^qJLJ886|Ww#f?Zi6~SEDJgR z?i#i#R3oSE-#eLJ!V=QGYd(E19xEHq`&^5SOH3Af$YdVy+x*V^GS~XvgbEAxmQAJ9 zJi2NY)kh>ln75#hgzwmoZBco9ws}F9JUvWoYx}#Y_@ae;*pe`YLOd3I{uIqjn^+2(sjG!A13?FA z%v%cnNS51?Qnf4OAG^hcn;qCfolKwa6w@PglIi=Nzn}fi;zDPGRO3g*F-U3UT@Vzo00 zu`56g(lZknU%NGCta}!zkLX~$)#n>@&L5kdodtfhfEA)Y33yeI6`aWB{=vc4%b!yk zxvPzw+BtVwIRePD(?9z>&J>DJCD~`lOIjX3?eBdjK7^?eP&cPNP^DqI8cU%1BOG1? z*}pn>HwY+`;A?U+U};a*U{)tfS^i=&$iS{+U~u9y?>ZMw!XaDw06?L-An~flUTVyF zR$HD={kaF)Ie{59etjuX=|@!-JReAgqRX|R0BSAk)~Sb~Vz@6%D3-b2NqWa#Z_-tN z65StKrOw>te0hQ2p3F94kN1mSXQ$>cW|%Gjmnk>HJKunsl4_EGqIrU~lbPA3vZ)E6 z&jZ^Iz4IX?1{SUiq>(vI_ccnzVS2jS_K}hJ%#%Bk7Bw1u_(ahR*gmauvL)t&;58ld zG&*!xjirm!L7j;MKv#jt3BQO444!B@tRv^Q#H~Qt1-K&aOZ>c@KoJhWTDTP$PJvGs z02l5a9GK+74>m9N-tTBVfEkFk@}J(k?Wy;;xt1gO>9cs4Wyh^?&B_15y=ZQSLeR-M z{`MD&`s0(!(K;3K!-l?AHvFW!@Hd0aja4ef>vQ^`vR7VOy5b28P01pHmicuM{E_XP6x7s73n1I6_pP29(e-%qX`MT&7RT4_oHk%V z8kD(?0x<)1=cGUyWmyFU1?K#k2_@nEA3br5t*6astncC0t(3Kt@3gD@}r7+;k2+23hJ4*S`#@v*LkE*>mmy*RYAqm^kq#(n-~ zx8ZutsUFjX(k5ZQihf+jX8t*p4+@k`OAnifF2ph!2P~TJ!HIJwVgv9olrDX#y4vBN z^|MOw2$R|=x=A<&738V0F-ZJXWls*riqwEjsX^v?f~>igI1^tk%GKDP=NbftJv#02Ov@~jpuP$9t+RQ_-qbl%tES@kj<}&H%=%l8nqll{XVNR6p z-rjY8eSjzhT{cjBSwOY{#I3ak`^Gs@->W+Kgkw4w9ByuP@~3-Ca^OS?DSQ6+aDEr^ z>bgl_S>eSAv@oBGMkklTB7!tko=`nH^gTR0JM{8q&m7m55h#gNLAdItwUfbM~4SW3xaL8!Sn= zQ5RR&V<2gr9Y53EzygtuqOybQ01IKDr`4GZ2;FGEY8?!L#JBfZMM^!V&s#rYj7(g! zA*xqhhulKmMqV{;LuQma)|Pxq2O5m^9#*1kns+;f>O+^7-RDESE0@Yz+})0EE_XXt z%zRJgWb1haD+#|5DciHx7{d?(5P;9{Pf1DP#Pb6PcBXv648>*xG`Z0l zjS>{exb-r@PopHEu%IB4QfSt`3mWUah-(ONKDxvtnjHEKE_=bn^bNG@5M@G96apVAPQC+IgpmhIZRpU0W$Np<=H_r!=J|Jfpm6g* zY!#+fJ_{5fkbe%+;KM?DBKx;DS=kh<0qnU-UW2^DQJ9X72yt%$4(G>Iynx(Csu4MQj8dx#Y6Ypf4z(ugob|*s&Vb2=L zwuDFbbSbgSD%sp+eg2|DDU#~ZcbUkIm$lBKKT}7?Avnqs8qBK=yP!u8 zIJA4L`D^RzsD}TGtM(Vb6%~5l2Ile`4H7OaO&SD2=`SQCB%qAoG8C(tngDY$_6I$5 z$0-2nY$~c0M5*I+HuRZ2?M7Q9%Ka+N_JV1%~{gi~1}tMjtq-|_b7Q#gj@_Ni&dF-_aM~R?_nPy(9+)g1Kd{clC=~WB^1N}9 z+ngq8IUDQ#q0+@6FdY|wSas4SSOJ?RAm^R0r5$_ei*8=t#L!8f?9Ed%THW=~4kI!2 zItL!`+L_*mY4dCe7&c?QTO%XL*7!8_Z;vR+Z+iEHGw7j3M7BuD2jEP`e~-#`hpCnt z>;e4_xC!N7qvWDawyOt!I}eHwzHphZ9`pfLLwmRWEXlpN-rBoSdTR{RP`snf3LKRmxU@Wh9y?yvLNxscQ>PonxlXbyRL|*hAnr4UX|SH zmP=3(i-@{hb&5c3umi(n z#}~bTS$F}cV(4#yR%<^X4N$`;K;v3b(XH{BS9KepquvtKv9W=v0z1Z4Pf=0PGI(ST z6E-@m6pNoY5+nK6PDfvLIS`v^*XC|*I5+`8Vei^=a#@habAPHYx)!yv^Q!s$=dWR* zXzBU$awO1+AS6_x!uFxK7=yjN;xpj)TqvMh=9{}R>T3E!$gvJBZij##J`e#psCbu| zWInYyTG-ARe+`7~csoIx^k67k!YUOrfTU~xa4^e-;&@7$3IK5WN0naK!J0iBcj1#a z`+bHtz!U5F^J-^jl17z&Cs6;(5&8Jfki-^jW=jO;jRK!=fG)6Jz@pQcI;8F=h?4&l zp(w8y)jwEU@T3HqelC88GzcMl^oK4Z@7tgt1cIjll@wR+ti-K$Xg%qT+Pl2k6BM6v z6m~KFA|o)ZgE1J8%L3=b^YOT7WA9ojy(Hvlx%)vP%6EUWw8hL;)uEJzLh+~J_SaO0 zrkm>3+n*wS&z4Ec9hP88vu5f}^LY~a;{TzPX3nnyW>mIjX5d7mst2@aiY_a-&iu`Z zJ2fz~j?b2$>lsE9mi2N9~SsgbLfFu2FboU^;{mSmv-pWCST4?8W_ z(@-Vqmh&MY2PExJXMVMfvG>{U#rZ>p#Tb&)MK?TKHr>cFyv?qjFr$Oxn~a(o82YsO z0U-r&i_mLu*#s9@FkKv)k0<{8`Sa~P7TSs@)va%^S}GupUWUjNTF0oE@XDkcOkMY! zSObs`n{EnskYrBN{d%)Y6)~Ik18W*OPwB)0#@%-dfO8b5hDAV;9yxvf zOY5P{VY2*~Wsq^$mSnvS3kUlEhk?K0&Qo||BKcd4539i7%JOTr9(|8&v&cK&T{J)J zwne(y-=IOfm*u&ag1qV{0 z6yeMc&=?Xb^FkbvpUz%0cgY3VPh00tkY(+g zMp8N^Uamf7^7-?G=8L4`uBF+|S8{ddTrwC_DJfr{hDKU|Cb@t*Yn0M@=WK_z$nx1UI{5)&7KhcM=!m9o|;P`!GJkR>aTw zAp!~#mGrtyHA5XQ#K36M&%t&w7r?}#GOl~bhit4vNBi3V<i~qu5a)8Dq~v|$cjdFvf+*p3{@HYM!p=v1Jtjg3*X8iuo1(rf6Ls2N z0}FkIGS2+QdGLllRIraVgE8x(Fe2d#ual+sfd!5K0ky|jt)ch1G{}1?Y+XH8fDYzw z!#(bxu9L2!pUeGsUK+v5B$*TFdkzkYy-B5F5DkS&S&6TuG87A^Y-RsEK97_atetQZ zr0lW(&KZwR3~AYWm#GQEf23vloR3t{YX+muF6m7$qA$t5aR<#Zj(P6~36&J?AKCEv zn~Afdf#u*x8j9c^O1o%DXwD4fd!n~}j-^la^jci%&%f1czhK*$@q7L$F0W`W$vjCh zQy6t0^ILnK6`HdFV904HDa=WIwX;rr_0H=*vtIZCYi4MTdVh)&#T##Lz25M|#Kg|d zPKY-`cfP^<{2;0IYBf9iv6X96csZ(++>jaH#D{`IybJD61kxC>1a0VIWKv+=%z||c za*r|!N-33kHanxLy6UYjvw4*z3isW=$2?mh^JTWF)t`T_`gX2nuDhy~TTdcWT-z+A z6cQF^Z*JBwD)YX|ZPu;uHAj;Dd)1+&d*v=O4MdUX=J7tiG!oa!gmCl~m&P3Rr$kKq zS<9QMs#Jj|VcEE~XQn2L1V|bzJ}^STB+B$Ya2z}=g&(kY*cJu4uwh0Q6d^n_`0rrw z@!@}*9W~E8uCM1?TNkZcAC02hX}TEQqikK($^@ah3XU1>UH7|Wet>UNXl+*}j79du z-ex}dC6%jEh9HlK&qCW``*FVcAbu~MsiP1Mi>W_(*FI1--Tz@cj#Az4(CZxYPA@XCR-F--zKQ0Yr1PgRsl-)~HAD#4c6`{zk9fyW6eID91GCo&S6b?x9${G!hKo*t z>NqDPS}H{sQ$F^QIn2@9(z4BlFIN_hXD%OWJwFiFy+0=mrI^P8lrxO3eIGN-G7L*G zP}2k&w%6BAX=&k-3c zgCz#iQ}sd$PMME<#M{w9la*8X{xoT*{l(Yoc~A^yYMjvE(16@+LubKoYJ)uegmwGN z7`p#tdqS_A$9L_1N&NIfbu==*)!Lv& zLhU*?{7A>zd3Cgz5JpcF>p(OUsHVr|AM~dD1I^QTTr-iJKFs7awf&Ot*s=c4#6uWz_P_;aGK1038d zyz1rs(wo2C7mJ71r=N)xe@0Wn5X0jisuE^JF1Nrt2 z(cgl{m>k(fxMkT-Dqr~cxX*sj=A}$I@{bovwl~6dhZd6OAK-*$nWy^53=%Qh#+tc%4?8a||vnD9~C7uKX53k1w9Q>QW9dx!3G zopf{JwwUVle3Cy+TsB`O8X$ zc+-jdDXa-R%5RM;eZ3QAtF9%#4Rz%hyE^d48{me!U_v@?L+l`J8*q&uII?zebII&a zt2h4kxFEyRwc+81}`u9@@|@WH{Wn+^W8^mm2a_5p5JBr+a9rz)4nWmB?GPR z9P+^HFX8d@#b Date: Tue, 9 Nov 2021 16:38:42 +0800 Subject: [PATCH 5/6] update README --- 2021-BeiJing-BSN3/PRG/README.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/2021-BeiJing-BSN3/PRG/README.md b/2021-BeiJing-BSN3/PRG/README.md index 3994b85be..a94f1567a 100644 --- a/2021-BeiJing-BSN3/PRG/README.md +++ b/2021-BeiJing-BSN3/PRG/README.md @@ -26,12 +26,4 @@ |-----|---------|----------| |数字金融与乡村治理|蒲沧龙|浙江工业大学之江学院| |数字金融与乡村治理|王宁波|无锡太湖学院| -|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| -|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| -|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| -|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| -|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| -|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| -|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| -|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| -|数字金融与乡村治理|xxxxx|xxxxxxxxxxxxxxxx| \ No newline at end of file +|数字金融与乡村治理|江会文|江西师范大学| \ No newline at end of file From 9a809540c24ee3f5cef72e5fe206a773deb1f6fd Mon Sep 17 00:00:00 2001 From: JiangHuiWen <651971130@qq.com> Date: Fri, 26 Nov 2021 16:50:19 +0800 Subject: [PATCH 6/6] updateReadMe.md --- 2021-BeiJing-BSN3/PRG/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/2021-BeiJing-BSN3/PRG/README.md b/2021-BeiJing-BSN3/PRG/README.md index a94f1567a..e9d9c7e38 100644 --- a/2021-BeiJing-BSN3/PRG/README.md +++ b/2021-BeiJing-BSN3/PRG/README.md @@ -26,4 +26,5 @@ |-----|---------|----------| |数字金融与乡村治理|蒲沧龙|浙江工业大学之江学院| |数字金融与乡村治理|王宁波|无锡太湖学院| -|数字金融与乡村治理|江会文|江西师范大学| \ No newline at end of file +|数字金融与乡村治理|江会文|江西师范大学| +|数字金融与乡村治理|罗智文|江西师范大学|