说明
参数列表的可选属性
M:表示必选。
O:表示任意可选。
C:表示条件可选。
创建模板
说明
创建视频短信模板,提交模板是变量模板时,变量模板仅文本可添加变量,且最多包含 5 个变量,顺序依次为:${v1}、${v2}、${v3}、${v4}、${v5}
方法
参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 发送账号 |
templateName | string | M | 模板名称 |
sign | string | M | 已经在平台创建的签名 |
body | List | M | |
--> type | string | M | text|video|audio|image |
--> exType | string | M | 后缀格式,和 type 配合使用 text:txt video:mp4/3gp audio:mp3 image:jpg/gif/png |
--> content | string | M | 本文素材直接传内容,文件素材时(图片、视频、音频等等),可传 base64,和文件 url,根据 contentType 指定 |
--> contentType | int | C | content 类型(文本不考虑该值)如果是文件时,1:base64,2:文件素材 url 不传默认是:1 |
--> sort | int | M | 内容排序 |
isDynamic | int | C | 动态模板标记,当创建动态模板时此字段为必须 |
timestamp | string | M | 时间戳,1970/1/1 到现在的秒数,10 位 200 秒内请求有效 |
signature | string | M | 签名 |
templateLink | string | C | 模板链接完整示例 |
返回值
字段 | 数据类型 | 描述 |
---|
code | string | 返回码 |
message | string | 错误描述 |
data | object | |
--> templateId | string | 模板 id |
示例
请求:
{
"appId": "rDOMKNMLaE",
"body": [
{
"exType": "txt",
"content": "变量一 ${v1},变量二 ${v2},变量三 ${v3},变量四 ${v4},变量五 ${v5}",
"sort": 1,
"type": "text"
}
],
"templateName": "视频短信模板",
"sign": "【视频短信测试】",
"isDynamic": 1,
"timestamp": "1624938115",
"signature": "1d6cb525296b0e7c50e5dd7e05457135b5b8eed369ce5048e6bde2d6b10a1071"
}
响应:
{
"code": "102000",
"message": "请求成功",
"data": {
"templateId": "127873750216474624"
}
}
查看模板状态
说明
查询模板状态
方法
参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 发送账号 |
templateId | string | M | templateId |
timestamp | string | M | 时间戳,1970/1/1 到现在的秒数,10 位 200 秒内请求有效 |
signature | string | M | 签名 |
返回值
字段 | 数据类型 | 描述 |
---|
code | string | 返回码 |
message | string | 错误描述 |
data | object | |
--> statusName | string | 模板状态说明 |
--> status | | 模板状态:1 平台审核中 2 营商审核审核中 3 审核成功 4 审核失败 |
-->templateId | string | 模板 id |
-->operator | string[] | 模板可发运营商标识:1 移动 2 联通 3 电信 |
--> rejectReason | string | 审核驳回原因 |
-->expireFlag | string | 模板有效性:0 失效 1 有效 |
-->isDynamic | string | 动参或非动参标识:0 非动参 1 动参 |
示例
请求:
{
"appId":"rDOMKNMLaE",
"templateId":"1410869910296330240",
"timestamp":"1624938115",
"signature":"8fa6891ab01c4b509870a6e9e6ce25e6074d33beb65aaa4575f9affbb7b0bdaa"
}
响应:
{
"code": "102000",
"message": "请求成功",
"data": {
"statusName": "审核成功",
"templateId": "146351173975146503",
"operator": ["2", "1", "3"],
"status": 3
}
}
查询模板列表
说明
查询模板状态
方法
参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 发送账号 |
pageNo | string | M | 页码 |
pageSize | string | M | 页大小 |
status | string | M | 模板状态: 空字符串表示查询所有状态的模板;1 审核中 2:等待运营商审核,3:审核成功(等价于上架),4:审核失败, |
timestamp | string | M | 时间戳,1970/1/1 到现在的秒数,10 位 200 秒内请求有效 |
signature | string | M | 签名 |
返回值
字段 | 数据类型 | 描述 |
---|
code | string | 返回码 |
message | string | 错误描述 |
data | object | |
--> templateName | string | 模板状态说明 |
--> status | | 模板状态:0 等待商户送审 1 审核中 2 等待运营商审核 3 审核成功 4 审核失败 |
-->templateId | string | 模板 id |
-->sign | string | 签名 |
-->createTime | long | 创建时间 |
-->auditTime | long | 审核时间 |
--> remark | string | 备注 |
--> rejectReason | string | 审核驳回原因 |
--> suffix | string | 可以不管 |
-->expireFlag | string | 模板有效性:0 失效 1 有效 |
-->isDynamic | string | 动参或非动参标识:0 非动参 1 动参 |
-->cmccStatus | int | 移动可用标识:0不可用,1 可用 |
-->cuccStatus | int | 联通可用标识:0不可用,1 可用 |
-->ctccStatus | int | 电信可用标识:0不可用,1 可用 |
pageNo | int | 页码 |
pageSize | int | 页大小 |
totalPages | int | 总页数 |
totalRecords | int | 总条数 |
-->contentList-->sort | int | 模板顺序 |
-->contentList-->contentType | int | 资源类型:0 文本 1 图片 2 音频 3 视频 |
-->contentList-->contentUrl | string | 资源链接 |
-->contentList-->contentText | string | 视频短信文本 |
-->contentList-->fileSuffix | string | 文件后缀 |
示例
请求:
{
"appId":"rDOMKNMLaE",
"pageNo":1,
"pageSize":10,
"status":"2",
"timestamp":"1624938115",
"signature":"90eb66134c360cdbd067112189f98fb2263c5099481d60c99b28915cff9267de"
}
响应:
{
"code": "102000",
"message": "请求成功",
"data": [
{
"templateName": "测试 123",
"templateId": "117194636828606469",
"sign": "【视频短信演示】",
"status": "2",
"createTime": 1598405379000,
"auditTime": 1598405404000,
"contentList": [
{
"sort": 0,
"contentType": "1",
"contentUrl": "https://static2.253.com/rcs_sms/stable/images/36ab30a3-c48a-4e45-9ef5-2dec3d303fe7.png",
"contentText": null,
"fileSuffix": "video/mp4"
}
],
"remark": "麻烦 MV",
"suffix": null
}
],
"pageNo": 1,
"totalRecords": 1,
"totalPages": 1,
"pageSize": 10
}
查询签名列表
说明
提供查询某一个客户在 RSC 里面申请过的历史签名信息
方法
参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 发送账号 |
isByPage | boolean | O | 是否分页查;默认 false |
pageNo | int | O | 页码,如选择分页查询,未赋值,则默认值为 1 |
pageSize | int | O | 页大小,如选择分页查询,未赋值,则默认值为 10 |
auditStatus | int | O | 审核状态: 默认查询全部的。1 审核中 2 审核成功 3 审核失败 |
timestamp | string | M | 时间戳,1970/1/1 到现在的秒数,10 位 200 秒内请求有效 |
signature | string | M | 签名 |
返回值
字段 | 数据类型 | 描述 |
---|
code | string | 返回码 |
message | string | 错误描述 |
data | object | |
--> id | string | 签名 id |
--> auditStatus | int | 状态: 1 审核中 2 审核成功 3 审核失败 |
-->sign | string | 签名 |
-->resourceFile | string | 资源文件多个以逗号隔开 |
-->createTime | long | 创建时间 |
-->cmccStatus | int | 移动可用标识:0不可用,1 可用 |
-->cuccStatus | int | 移动可用标识:0不可用,1 可用 |
-->ctccStatus | int | 移动可用标识:0不可用,1 可用 |
pageNo | int | 页码,未按分页查询的忽略该字段值 |
pageSize | int | 页大小,未按分页查询的忽略该字段值 |
totalPages | int | 总页数,未按分页查询的忽略该字段值 |
totalRecords | int | 总条数,未按分页查询的忽略该字段值 |
示例
请求:
{
"appId" : "rDOMKNMLaE",
"isByPage" : false,
"pageNo" : 3,
"pageSize" : 1,
"timestamp": "1635143858",
"signature": "f2a8e86fc9a4f714594e20f1ed1cc87cf986bf9a37da0b6eaf6fb64d094a374a"
}
响应:
{
"code": "102000",
"message": "请求成功",
"data": [
{
"id": "1403243377205444608",
"sign": "【上海地阳】",
"auditStatus": 2,
"resourceFile": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/b711077d-302f-4d0c-b333-b515e292cd27.jpg",
"createTime": 1623394262000
},
{
"id": "1393108680487993344",
"sign": "【视频短信测试】",
"auditStatus": 1,
"resourceFile": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/1b9802f4-0370-43a3-b779-19de970b6c36.jpg",
"createTime": 1620977967000
},
{
"id": "1382175702903685120",
"sign": "【上海赛豪文化】",
"auditStatus": 2,
"resourceFile": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/94702458-8816-420a-acdd-c67e57bff8b0.jpg",
"createTime": 1618371342000
}
],
"pageNo": 3,
"totalRecords": 3,
"totalPages": 3,
"pageSize": 1
}
模板审核结果推送
说明
接收方 http 类型为 post,数据类型为 json,返回 ok
因为移动、电信、联通不会同时成功,所以可以会推多次,用户自行解析就行
推送参数
字段 | 数据类型 | 描述 |
---|
templateId | string | 模板编号 |
status | Integer | 审核状态:3:成功 4:失败 |
remark | string | 备注 |
time | string | 时间 |
cmccStatus | Integer | 移动审核状态:0:无状态 3:成功 4:失败 |
cuccStatus | Integer | 联通审核状态:0:无状态 3:成功 4:失败 |
ctccStatus | Integer | 电信审核状态:0:无状态 3:成功 4:失败 |
expireFlag | string | 模板有效性:0 失效 1 有效 |
对方接收到状态报告后需要返回:”ok”
{
"templateId":"146xxxxxx23243",
"status":3,
"remark":"审核成功",
"time":20201030111523,
"cmccStatus":3,
"cuccStatus":3,
"ctccStatus":3,
"expireFlag":"1"
}
模板发送
说明
用于提交视频短信的模板
方法
参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 发送账号 |
submitNo | string | M | 提交号,客户端提供,作为客户端的提交标识长度不超过 32 位 |
templateId | String | M | 模板 id |
phones | String[] | C | 手机号,为静态模板发送时候 此字段必填 |
dynamicVars | List | C | 动态模板参数,为动态模板发送的时候此字段为必填(格式看具体示例) |
timestamp | string | M | 时间戳,1970/1/1 到现在的秒数,10 位 200 秒内请求有效 |
signature | string | M | 签名 |
返回值
字段 | 数据类型 | 描述 |
---|
code | string | 返回码 |
message | string | 错误描述 |
data | object | |
--> submitNo | string | 提交号 |
-->batchId | string | 批次号,一次提交算一个 |
--> errphone | string[] | 返回提交的号码中的错误号码 |
示例
请求:
静态模板示例
{
"appId": "vUgOfi0Ltd",
"submitNo": "202009221649",
"phones": ["18918416998", "13381728253", "18551473662", "16601722151", "187179501591"],
"templateId": "126701341765533703",
"timestamp": "1624938115",
"signature": "5f4b61127355887572afad448e2e64e548b00f3c9f845079cbb931f2fe11a61d"
}
动态模板示例
{
"appId": "rDOMKNMLaE",
"submitNo": "202009221649",
"dynamicVars": [
{
"phone": "18551473662",
"v1": "赵联通",
"v2": "测试 3",
"v3": "测试 4",
"v4": "测试 5",
"v5": "测试 6"
},
{
"phone": "16601722151",
"v1": "赵移动",
"v2": "测试 3",
"v3": "测试 4",
"v4": "测试 5",
"v5": "测试 6"
}
],
"templateId": "1410869910296330240",
"timestamp": "1624938115",
"signature": "fab1434cade0894dc93838b8276b94230bd7ed49ecc1d98ad8d64b3cc097ed7d"
}
响应:
{
"code": "102000",
"message": "请求成功",
"data": {
"errPhone": ["187179501591"],
"submitNo": "202009221649",
"batchId": "1445638435275804672"
}
}
状态报告推送
说明
接收方 http 类型为 post,数据类型为 json数组,返回 "ok" (注意:直接返回字符串 ok)
推送参数
字段 | 数据类型 | 描述 |
---|
submitNo | string | 提交号 |
phone | string | 手机号码 |
createTime | long | 状态报告返回时间 |
batchId | string | 批次号 |
deliveryStatus | string | 1 成功 2 失败 |
clErrorCode | string | 错误代码 |
accountId | string | 用户编号 该字段已无效 |
msgId | string | 当前消息唯一标识 该字段已无效 |
对方接收到状态报告后需要返回:ok
批量推送格式
[
{
"accountId":"208458",
"batchId":"1353610635174481920",
"clErrorCode":"CL_1000",
"createTime":1611560900063,
"deliveryStatus":"2",
"msgId":"172372892338618368",
"phone":"156********",
"submitNo":"20845820210125154818660"
},
{
"accountId":"208458",
"batchId":"1353610635174481920",
"clErrorCode":"CL_1000",
"createTime":1611560900090,
"deliveryStatus":"2",
"msgId":"172372892435087360",
"phone":"159********",
"submitNo":"20845820210125154818660"
}
]
上行消息推送
说明
接收方 http 类型为 post,数据类型为 json,返回 "ok" (注意:直接返回字符串 ok)
推送参数
字段 | 数据类型 | 描述 |
---|
accountId | string | 用户 id 该字段已无效 |
codeNo | string | 拓展码 该字段已无效 |
codeNoAddress | long | 完整拓展码 |
createTime | string | 上行时间 |
msgId | string | 消息 id |
phone | string | 手机号 |
upContent | string | 上行内容 |
batchId | string | 批次号 |
submitNo | string | 提交号 |
对方接收到状态报告后需要返回:”ok”
推送格式
[
{
"accountId":"167475",
"codeNo":"0004",
"codeNoAddress":"1065086140390004",
"createTime":1606745282003,
"msgId":"173579743935856640",
"phone":"18717950159",
"upContent":"好的,来自晓白",
"batchId":"1412651215151221",
"submitNo":"637e904rd9hf"
}
]
状态报告拉取
说明
状态报告通知方式默认为推送,此接口需要联系运营开启(需提供出口 ip)。
开通此接口功能后,状态报告保存时间为 72 小时;数据拉取成功后服务器会删除当前拉取成功的数据,不再保存!请用户及时存储。
方法
参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 发送账号 |
num | number | O | 拉取个数(上限 100,默认 20) |
timestamp | string | M | 时间戳,1970/1/1 到现在的秒数,10 位 200 秒内请求有效 |
signature | string | M | 签名 |
返回值
字段 | 数据类型 | 描述 |
---|
code | string | 返回码 |
message | string | 错误描述 |
data | List | |
--> phone | string | 手机号码 |
--> batchId | string | 批次号 |
--> submitNo | string | 提交号 |
--> deliveryStatus | string | 1 成功 2 失败 |
--> createTime | Long | 状态报告返回时间 |
--> clErrorCode | string | 错误代码 |
示例
请求:
{
"appId":"aaaaaaaaaaa",
"timestamp":"1656036438",
"signature":"xxxxxxxxxxxxxxxxxxxx"
}
响应:
{
"code":"102000",
"message":"请求成功",
"data":[
{
"phone":"18717950159",
"batchId":"1111111111111",
"submitNo":"2222222222222",
"deliveryStatus":"1",
"createTime":1656036261113,
"clErrorCode":"CL_0000"
},
{
"phone":"18912345678",
"batchId":"3333333333333",
"submitNo":"44444444444",
"deliveryStatus":"1",
"createTime":1656036261115,
"clErrorCode":"CL_0000"
}
]
}
上行消息拉取
说明
上行消息通知方式默认为推送,此接口需要联系运营开启(需提供出口 ip)。
开通此接口功能后,上行保存时间为 72 小时;数据拉取成功后服务器会删除当前拉取成功的数据,不再保存!请用户及时存储。
方法
参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 发送账号 |
num | number | O | 拉取个数(上限 100,默认 20) |
timestamp | string | M | 时间戳,1970/1/1 到现在的秒数,10 位 200 秒内请求有效 |
signature | string | M | 签名 |
返回值
字段 | 数据类型 | 描述 |
---|
code | string | 返回码 |
message | string | 错误描述 |
data | List | |
--> codeNoAddress | string | 完整拓展码 |
--> msgId | string | 消息 id |
--> createTime | long | 上行时间 |
--> phone | string | 手机号 |
--> upContent | string | 上行内容 |
--> batchId | string | 批次号 |
--> submitNo | string | 提交号 |
示例
请求:
{
"appId":"aaaaaaaaaaa",
"timestamp":"1656036438",
"signature":"xxxxxxxxxxxxxxxxxxxx"
}
响应:
{
"code":"102000",
"message":"请求成功",
"data":[
{
"phone":"18717950159",
"codeNoAddress":"1111111111111",
"msgId":"2222222222222",
"upContent":"1",
"createTime":1656036261113,
"batchId":"1412651215151221",
"submitNo":"637e904rd9hf"
}
]
}
获取余额
说明
根据appId获取当前账户余额
方法
参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 发送账号 |
timestamp | string | M | 时间戳,1970/1/1 到现在的秒数,10 位 200 秒内请求有效 |
signature | string | M | 签名 |
返回值
字段 | 数据类型 | 描述 |
---|
code | string | 返回码 |
message | string | 错误描述 |
data | Object | |
--> balance | BigDecimal | 余额数或条数。具体由displayType字段决定 |
--> displayType | Integer | 显示方式。0:按单价1:按条数 |
修改模板
说明
视频短信修改模板,传入模板id对其修改,修改参数与模板创建参数基本一致。
新增退订语关键字自动追加的最后一个文本帧末尾,没有文本帧则自动创建一帧。
文本帧中无需添加退订语,如已有退订语必须和关键字中的退订语保持一致。
方法
参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 发送账号 |
templateName | string | M | 模板名称 |
sign | string | M | 已经在平台创建的签名 |
body | List | M | |
--> type | string | M | text|video|audio|image |
--> exType | string | M | 后缀格式,和 type 配合使用 text _ txtvideo _ mp4 3gpaudio _ aac mp3image _ jpg gif png |
--> content | string | M | 本文素材直接传内容,文件素材时(图片、视频、音频等等),可传 base64,和文件 url,根据 contentType 指定 |
--> contentType | int | C | content 类型(文本不考虑该值)如果是文件时,1:base64,2:文件素材 url 不传默认是:1 |
--> sort | int | M | 内容排序 |
isDynamic | int | C | 动态模板标记,当创建动态模板时此字段为必须 |
timestamp | string | M | 时间戳,1970/1/1 到现在的秒数,10 位 200 秒内请求有效 |
signature | string | M | 签名 |
templateId | string | M | 模板id |
unSubscribeWords | string | M | 退订语。自动追加至最后一个文本帧末 |
templateLink | string | C | 模板链接完整示例 |
返回值
字段 | 数据类型 | 描述 |
---|
code | string | 返回码 |
message | string | 错误描述 |
data | object | |
--> templateId | string | 模板 id |
示例
请求:
{
"appId": "rDOMKNMLaE",
"body": [
{
"exType": "txt",
"content": "变量一 ${v1},变量二 ${v2},变量三 ${v3},变量四 ${v4},变量五 ${v5}",
"sort": 1,
"type": "text"
}
],
"templateName": "视频短信模板",
"sign": "【视频短信测试】",
"isDynamic": 1,
"timestamp": "1624938115",
"signature": "1d6cb525296b0e7c50e5dd7e05457135b5b8eed369ce5048e6bde2d6b10a1071",
"templateId": "127873750216474624",
"unSubscribeWords": "拒收请回复R"
}
响应:
{
"code": "102000",
"message": "请求成功",
"data": {
"templateId": "127873750216474624"
}
}
创建签名
说明
创建签名接口。
方法
参数
Body:
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 发送账号 |
sign | string | M | 签名名称 |
customerCode | string | M | 所属客户编码,请查枚举例子 |
industryCode | string | M | 行业属性编码,请查枚举例子 |
signType | string | M | 签名类型 0:非游戏类1:游戏类 |
timestamp | string | M | 时间戳。格式:System.currentTimeMillis() / 1000 |
signature | string | M | 验签签名,参与字段由appId、sign、customerCode、industryCode、signType、timestamp组成 |
body | SignMaterialBody | M | 素材body |
SignMaterialBody:
字段 | 数据类型 | 可选属性 | 描述 |
---|
authorizeFile | List< MaterialParam> | M | 授权文件。限制3个, |
entrustFile | MaterialParam | M | 委托书文件。限制1个 |
jobPermitFile | MaterialParam | M | 营业执照文件。限制1个 |
editionFile | List< MaterialParam> | C | 网终游戏出版物号。限制10个。当签名为游戏类时必传。 |
softnessFile | List< MaterialParam> | C | 软件著作权登记证书。限制10个。当签名为游戏类时必传。 |
MaterialParam:
字段 | 数据类型 | 可选属性 | 描述 |
---|
source | string | M | 素材来源,1:base64(默认) 2:url |
type | string | M | 素材格式 eg:png |
content | string | M | 素材具体内容:具体的base64 或 具体的url |
返回值
字段 | 数据类型 | 描述 |
---|
code | string | 返回码 |
message | string | 错误描述 |
data | object | |
--> signId | string | 签名id |
示例
customerCode 所对应的 customerName
[
{
"customerCode": "1",
"customerName": "党政军"
},
{
"customerCode": "2",
"customerName": "民生"
},
{
"customerCode": "3",
"customerName": "医疗器械、药店"
},
{
"customerCode": "4",
"customerName": "电商"
},
{
"customerCode": "5",
"customerName": "沿街商铺(中小)"
},
{
"customerCode": "6",
"customerName": "教育培训"
},
{
"customerCode": "7",
"customerName": "房地产"
},
{
"customerCode": "8",
"customerName": "游戏"
},
{
"customerCode": "9",
"customerName": "金融"
},
{
"customerCode": "10",
"customerName": "物流"
},
{
"customerCode": "11",
"customerName": "微商(个 人)"
},
{
"customerCode": "12",
"customerName": "企业(大型)"
},
{
"customerCode": "13",
"customerName": "其他"
}
]
industryCode 所对应的 industryName
[
{
"industryName": "农业",
"industryCode": "01"
},
{
"industryName": "林业",
"industryCode": "02"
},
{
"industryName": "畜牧业",
"industryCode": "03"
},
{
"industryName": "渔业",
"industryCode": "04"
},
{
"industryName": "农、林、牧、渔专业及辅助性活动",
"industryCode": "70"
},
{
"industryName": "其他采矿业",
"industryCode": "05"
},
{
"industryName": "煤炭",
"industryCode": "06"
},
{
"industryName": "石油",
"industryCode": "07"
},
{
"industryName": "黑色金属矿采选业",
"industryCode": "71"
},
{
"industryName": "有色金属矿采选业",
"industryCode": "72"
},
{
"industryName": "非金属矿采选业",
"industryCode": "73"
},
{
"industryName": "开采专业及辅助性活动",
"industryCode": "74"
},
{
"industryName": "其他制造业",
"industryCode": "08"
},
{
"industryName": "农副食品加工业",
"industryCode": "75"
},
{
"industryName": "酒、饮料和精制茶制造业",
"industryCode": "76"
},
{
"industryName": "纺织业",
"industryCode": "77"
},
{
"industryName": "纺织服装、服饰业",
"industryCode": "78"
},
{
"industryName": "皮革、毛皮、羽毛及其制品和制鞋业",
"industryCode": "79"
},
{
"industryName": "木材加工和木、竹、藤、棕、草制品业",
"industryCode": "80"
},
{
"industryName": "家具制造业",
"industryCode": "81"
},
{
"industryName": "造纸和纸制品业",
"industryCode": "82"
},
{
"industryName": "印刷和记录媒介复制业",
"industryCode": "83"
},
{
"industryName": "文教、工美、体育和娱乐用品制造业",
"industryCode": "84"
},
{
"industryName": "石油、煤炭及其他燃料加工业",
"industryCode": "85"
},
{
"industryName": "化学纤维制造业",
"industryCode": "86"
},
{
"industryName": "橡胶和塑料制品业",
"industryCode": "87"
},
{
"industryName": "非金属矿物制品业",
"industryCode": "88"
},
{
"industryName": "黑色金属冶炼和压延加工业",
"industryCode": "89"
},
{
"industryName": "有色金属冶炼和压延加工业",
"industryCode": "90"
},
{
"industryName": "金属制品业",
"industryCode": "91"
},
{
"industryName": "通用设备制造业",
"industryCode": "92"
},
{
"industryName": "专用设备制造业",
"industryCode": "93"
},
{
"industryName": "铁路、船舶、航空航天和其他运输设备制造业",
"industryCode": "94"
},
{
"industryName": "电气机械和器材制造业",
"industryCode": "95"
},
{
"industryName": "计算机、通信和其他电子设备制造业",
"industryCode": "96"
},
{
"industryName": "仪器仪表制造业",
"industryCode": "97"
},
{
"industryName": "食品制造业",
"industryCode": "98"
},
{
"industryName": "废弃资源综合利用业",
"industryCode": "99"
},
{
"industryName": "金属制品、机械和设备修理业",
"industryCode": "100"
},
{
"industryName": "烟草",
"industryCode": "09"
},
{
"industryName": "化学原料和化学制品制造业",
"industryCode": "10"
},
{
"industryName": "燃气生产和供应业",
"industryCode": "11"
},
{
"industryName": "电力",
"industryCode": "12"
},
{
"industryName": "水的生产和供应业",
"industryCode": "101"
},
{
"industryName": "房屋建筑业",
"industryCode": "13"
},
{
"industryName": "土木工程建筑业",
"industryCode": "102"
},
{
"industryName": "建筑安装业",
"industryCode": "103"
},
{
"industryName": "建筑装饰、装修和其他建筑业",
"industryCode": "104"
},
{
"industryName": "装卸搬运和仓储业",
"industryCode": "14"
},
{
"industryName": "铁路运输",
"industryCode": "15"
},
{
"industryName": "道路运输",
"industryCode": "16"
},
{
"industryName": "公交",
"industryCode": "17"
},
{
"industryName": "水上运输",
"industryCode": "18"
},
{
"industryName": "航空",
"industryCode": "19"
},
{
"industryName": "邮政",
"industryCode": "20"
},
{
"industryName": "管道运输业",
"industryCode": "105"
},
{
"industryName": "汽车制造业",
"industryCode": "106"
},
{
"industryName": "互联网和相关服务",
"industryCode": "21"
},
{
"industryName": "电信",
"industryCode": "22"
},
{
"industryName": "软件和信息技术服务业",
"industryCode": "107"
},
{
"industryName": "批发",
"industryCode": "23"
},
{
"industryName": "零售",
"industryCode": "24"
},
{
"industryName": "住宿",
"industryCode": "25"
},
{
"industryName": "餐饮",
"industryCode": "26"
},
{
"industryName": "银行",
"industryCode": "27"
},
{
"industryName": "证券",
"industryCode": "28"
},
{
"industryName": "保险",
"industryCode": "29"
},
{
"industryName": "其他金融业",
"industryCode": "108"
},
{
"industryName": "房地产",
"industryCode": "30"
},
{
"industryName": "租赁",
"industryCode": "31"
},
{
"industryName": "商业",
"industryCode": "32"
},
{
"industryName": "旅游",
"industryCode": "33"
},
{
"industryName": "研究和试验发展",
"industryCode": "34"
},
{
"industryName": "专业技术服务业",
"industryCode": "109"
},
{
"industryName": "科技推广和应用服务业",
"industryCode": "110"
},
{
"industryName": "水利",
"industryCode": "35"
},
{
"industryName": "环保",
"industryCode": "36"
},
{
"industryName": "公共设施管理业",
"industryCode": "37"
},
{
"industryName": "土地管理业",
"industryCode": "111"
},
{
"industryName": "居民服务",
"industryCode": "38"
},
{
"industryName": "机动车、电子产品和日用产品修理业",
"industryCode": "112"
},
{
"industryName": "其他服务业",
"industryCode": "113"
},
{
"industryName": "教育",
"industryCode": "39"
},
{
"industryName": "国防院校",
"industryCode": "114"
},
{
"industryName": "卫生",
"industryCode": "40"
},
{
"industryName": "社会工作",
"industryCode": "41"
},
{
"industryName": "国防医院",
"industryCode": "115"
},
{
"industryName": "医药制造业",
"industryCode": "116"
},
{
"industryName": "广电",
"industryCode": "43"
},
{
"industryName": "文艺",
"industryCode": "44"
},
{
"industryName": "体育",
"industryCode": "45"
},
{
"industryName": "娱乐",
"industryCode": "46"
},
{
"industryName": "文化和旅游",
"industryCode": "117"
},
{
"industryName": "政府",
"industryCode": "47"
},
{
"industryName": "共产党机关及人民政府",
"industryCode": "48"
},
{
"industryName": "公安",
"industryCode": "49"
},
{
"industryName": "监察",
"industryCode": "50"
},
{
"industryName": "民政",
"industryCode": "51"
},
{
"industryName": "司法",
"industryCode": "52"
},
{
"industryName": "财政",
"industryCode": "53"
},
{
"industryName": "人事",
"industryCode": "54"
},
{
"industryName": "国土",
"industryCode": "55"
},
{
"industryName": "海关",
"industryCode": "56"
},
{
"industryName": "税务",
"industryCode": "57"
},
{
"industryName": "质检",
"industryCode": "58"
},
{
"industryName": "工商",
"industryCode": "59"
},
{
"industryName": "统计",
"industryCode": "60"
},
{
"industryName": "气象",
"industryCode": "61"
},
{
"industryName": "地震",
"industryCode": "62"
},
{
"industryName": "海洋",
"industryCode": "63"
},
{
"industryName": "审计",
"industryCode": "64"
},
{
"industryName": "烟草专卖",
"industryCode": "65"
},
{
"industryName": "法院",
"industryCode": "66"
},
{
"industryName": "检察院",
"industryCode": "67"
},
{
"industryName": "新闻",
"industryCode": "42"
},
{
"industryName": "国际组织",
"industryCode": "68"
},
{
"industryName": "其他",
"industryCode": "69"
},
{
"industryName": "综合管理机构",
"industryCode": "118"
},
{
"industryName": "政治工作机构",
"industryCode": "119"
},
{
"industryName": "动员工作机构",
"industryCode": "120"
},
{
"industryName": "政法机构",
"industryCode": "121"
},
{
"industryName": "直属院校",
"industryCode": "122"
},
{
"industryName": "ZQ",
"industryCode": "123"
},
{
"industryName": "LJ",
"industryCode": "124"
},
{
"industryName": "HJ",
"industryCode": "125"
},
{
"industryName": "KJ",
"industryCode": "126"
},
{
"industryName": "HJJ",
"industryCode": "127"
},
{
"industryName": "ZZ",
"industryCode": "128"
},
{
"industryName": "LQ",
"industryCode": "129"
},
{
"industryName": "WJ",
"industryCode": "130"
},
{
"industryName": "融合事务管理机构",
"industryCode": "131"
},
{
"industryName": "退役事务管理机构",
"industryCode": "132"
},
{
"industryName": "融合企业",
"industryCode": "133"
}
]
请求:
{
"appId": "bagAMscK57",
"body": {
"authorizeFile": [
{
"source": "2",
"type": "jpg",
"content": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/8773315f-e7b8-43a6-ba84-22624b1601e2.jpg"
},
{
"source": "2",
"type": "jpg",
"content": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/8773315f-e7b8-43a6-ba84-22624b1601e2.jpg"
},
{
"source": "2",
"type": "jpg",
"content": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/8773315f-e7b8-43a6-ba84-22624b1601e2.jpg"
}
],
"entrustFile": {
"source": "2",
"type": "jpg",
"content": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/8773315f-e7b8-43a6-ba84-22624b1601e2.jpg"
},
"jobPermitFile": {
"source": "2",
"type": "jpg",
"content": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/8773315f-e7b8-43a6-ba84-22624b1601e2.jpg"
},
"editionFile": [
{
"source": "2",
"type": "jpg",
"content": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/8773315f-e7b8-43a6-ba84-22624b1601e2.jpg"
},
{
"source": "2",
"type": "jpg",
"content": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/8773315f-e7b8-43a6-ba84-22624b1601e2.jpg"
}
],
"softnessFile": [
{
"source": "2",
"type": "jpg",
"content": "http://253-assets.oss-cn-hangzhou.aliyuncs.com/rcs_sms/stable/images/8773315f-e7b8-43a6-ba84-22624b1601e2.jpg"
}
]
},
"customerCode": "3",
"industryCode": "04",
"sign": "创蓝文化",
"signType": 1,
"signature": "62bd2e07d1be29ee59b42f89159956baf3a5a138fd618c45f0ab869a9f16ec56",
"timestamp": 1709276995
}
响应:
{
"code": "102000",
"message": "请求成功",
"data": {
"signId": "127873750216474624"
}
}
签名状态推送
说明
返回 "ok" (注意:直接返回字符串 ok)
推送参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
signId | string | M | 签名id |
status | Integer | M | 审核状态。1审核中 2审核成功 3审核失败 (签名总状态有一个运营商可用即为成功) |
remark | string | M | 备注 |
cmccStatus | Integer | M | 移动审核状态。0不可用,1 可用 |
cuccStatus | Integer | M | 联通审核状态。0不可用,1 可用 |
ctccStatus | Integer | M | 电信审核状态。0不可用,1 可用 |
对方接收到签名状态后需要返回:"ok"
示例
推送格式:
{
"accountId": "256995",
"cmccStatus": "1",
"ctccStatus": "0",
"cuccStatus": "1",
"pushUrl": "http://rcs-dev.cm253.com/rcs/api/msg/callback_cl",
"remark": "审核成功",
"signId": "1762686661960269824",
"status": 2
}
修改账号回调地址
说明
修改账号的签名、模板、状态报告、上行回调类型与地址。
方法
请求参数
字段 | 数据类型 | 可选属性 | 描述 |
---|
appId | string | M | 账号appId |
signNotifyType | string | M | 签名状态获取类型:0 关闭 1 推送 |
signNotifyUrl | string | C | 签名推送地址(signNotifyType为1时必填) |
templateNotifyType | string | M | 模板状态获取类型:0 关闭 1 推送 |
templateNotifyUrl | string | C | 模板推送地址(templateNotifyType为1时必填) |
reportNotifyType | string | M | 状态报告获取类型:0 关闭 1 推送 2 拉取 |
reportNotifyUrl | string | C | 状态报告推送地址(reportNotifyType为1时必填) |
replyNotifyType | string | M | 上行获取类型:0 关闭 1 推送 2 拉取 |
replyNotifyUrl | string | C | 上行推送地址(replyNotifyType为1时必填) |
timestamp | string | M | 时间戳,1970/1/1 到现在的秒数,10 位 200 秒内请求有效 |
signature | string | M | 验签签名 |
示例
请求格式:
{
"appId": "XXXXX",
"signNotifyType": "1",
"signNotifyUrl": "http://rcs-dev.cm253.com/rcs/api/msg/callback_cl",
"templateNotifyType": "1",
"templateNotifyUrl": "http://rcs-dev.cm253.com/rcs/api/msg/callback_cl",
"reportNotifyType": "1",
"reportNotifyUrl": "http://rcs-dev.cm253.com/rcs/api/msg/callback_cl",
"replyNotifyType": "1",
"replyNotifyUrl": "http://rcs-dev.cm253.com/rcs/api/msg/callback_cl",
"timestamp": 1718768809,
"signature": "af8dae668163534e218d0db00b94521340db5d72ceeec62b8e9c683195c1e26c"
}
响应格式:
{
"code": "102000",
"message": "请求成功",
"data": null
}
附录
状态报告错误码对照表
返回码 | 返回信息 |
---|
CL_0000 | 成功 |
CL_1000 | 失败 |
CL_1001 | 黑名单 |
CL_1002 | 通道错误 |
CL_1003 | 超频 |
CL_1004 | 内容存在敏感词或不符合规则 |
CL_1010 | 短链获取失败 |
CL_1012 | 平台黑名单 |
CL_1013 | 平台通道错误 |
CL_1015 | 平台地区屏蔽 |
CL_1016 | 风险号码屏蔽 |
CL_1020 | 禁用签名拦截 |
CL_1021 | 反投诉策略拦截 |
CL_1023 | 无效变量,变量字符不能大于20且变量中不能包含链接 |
错误码
错误码 | 说明 |
---|
102000 | 成功 |
500 | 系统异常 |
1002 | 手机号码格式错误 |
1003 | 费用扣除失败 |
1004 | 白名单 |
1005 | 黑名单 |
1006 | 手机号超频 |
1008 | 用户没有配置通道包 |
1010 | 模板不存在 |
1013 | 内部错误,创建模板错误 |
1015 | 账户余额不足 |
1018 | 账户发送超限 |
1019 | 手机号为空 |
1020 | 未识别的类型 |
1301 | AppId 不能为空 |
1303 | SubmitNo 不能为空 |
1306 | Phones 不能为空 |
1311 | TemplateID 不能为空 |
1316 | IP 地址限制 |
1317 | 账号错误 |
1318 | 该模板为动态模板,变量参数不能为空 |
1319 | 当前变量模板参数不满足条件:不能重复、最多添加 5 个参数、变量模板参数与提交模板参数个数不一致 |
1330 | 模板标题过长,不能超过 20 个字符 |
1331 | 短信签名校验失败,请先报备签名 |
1332 | appId 或 appSecret 不正确 |
1333 | / > < ! ' & script ../ ./ alert 【 这些特殊字符不行 |
1334 | 视频短信模板内容不能为空 |
1335 | body 中 exType 不能为空,排序不能为空,content 内容不能为空 |
1336 | type 和 exType 不匹配或 type 不支持 |
1337 | body 大小不能超过 2M |
1338 | 通道不存在 |
1339 | 当前存在通道不支持变量模板 |
1340 | 模板不存在 |
1341 | 状态参数错误 |
1342 | 必填参数为空 |
1343 | submitNo 长度不能超过 32 |
1344 | 超过最大限制条数 |
1345 | 签名校验错误 |
1346 | 时间戳或签名长度过长 |
1347 | 时间戳超时 |
1348 | 模板名称不能为空 |
签名算法
**第一步:**根据参数的名称,排除 signature 参数在外,按照 ASCII 升序拼接参数
示例:appId=rDOMKNMLaEisDynamic=1sign=【视频短信测试】templateName=视频短信模板 timestamp=1624938115
**第二步:**用 HmacSHA256 算法对拼接的字符串进行加密,秘钥为客户密码,生成签名。
HmacSHA256(string)后的结果就是 signature 的值
特别提醒和推荐:创建模板接口的 body 字段不参与加密,我们对 list 中的内容拼接推荐如下方式(中间无空格,属性之间没有逗号):
1、如果 list 中是 object 则按照如下格式拼接,也是按照 ASCII 码顺序拼接参数:
[{phone=13900001111v1=变量1v2=变量2},{phone=17600001111v1=变量1v2=变量2}]
2、如果 list 中是 string 格式的号码则按照如下格式拼接:
[13912345678,13814785236]
常见接口的请求参数和需要加密的字符串如下:
1、创建静态模板
请求参数:
{"appId":"tkIEPrflI3","body":[{"content":"V2静态模板","exType":"txt","sort":"1","type":"text"}],"isDynamic":0,"sign":"【唐华春主账号签名】","signature":"d35ce2a008926f15a6675f3efffb1ba211fa2426c74ad273f2613767f7d6f35b","templateName":"V2_静态模板","timestamp":1636699086}
参与加密:
appId=tkIEPrflI3isDynamic=0sign=【唐华春主账号签名】templateName=V2_静态模板timestamp=1636699086
2、创建动态模板
请求参数:
{"appId":"tkIEPrflI3","body":[{"content":"V2动态模板变量一 ${v1}变量二 ${v2}变量三 ${v3}变量四 ${v4}变量五 ${v5}","exType":"txt","sort":"1","type":"text"}],"isDynamic":1,"sign":"【唐华春主账号签名】","signature":"fe91e1d75b389f7941a34db08b5133415d767bcc32e89186a39a33cb913fb5d1","templateName":"V2_唐华春动态模板","timestamp":1636699087}
参与加密:
appId=tkIEPrflI3isDynamic=1sign=【唐华春主账号签名】templateName=V2_唐华春动态模板timestamp=1636699087
3、查询模板状态:
请求参数:
{"appId":"tkIEPrflI3","signature":"01cc4650d6dcaea5f1472bd1eff97cecce5754cc3f5df158bdf8dc6c1d9d9d9a","templateId":"1418","timestamp":1636699999}
参与加密:
appId=tkIEPrflI3templateId=1418timestamp=1636699999
4、查询模板列表
请求参数:
{"appId":"tkIEPrflI3","pageNo":1,"pageSize":10,"signature":"827d9a71458a251f02c6970526ffeb67666f85c5faaaaf794cea83f88774daaa","status":"3","timestamp":1636700053}
参与加密:
appId=tkIEPrflI3pageNo=1pageSize=10status=3timestamp=1636700053
5、发送静态模板
请求参数:
{"appId":"tkIEPrflI3","phones":["13712345678","15612124545","18998745612"],"signature":"476a31747f553e84d5e5f4608604a2cc31d85e86467d4f687f4d296bd61c9df5","submitNo":"68fd057e454340fa8bb224c2fcfec19f","templateId":"1420","timestamp":1636700182}
参与加密:
appId=tkIEPrflI3phones=[13712345678,15612124545,18998745612]submitNo=68fd057e454340fa8bb224c2fcfec19ftemplateId=1420timestamp=1636700182
6、发送动态模板
请求参数:
{"appId":"tkIEPrflI3","dynamicVars":[{"phone":"13900001111","v1":"变量1","v2":"变量2","v3":"变量3","v4":"变量4","v5":"变量5"},{"phone":"17600001111","v1":"变量1","v2":"变量2","v3":"变量3","v4":"变量4","v5":"变量5"},{"phone":"18900001111","v1":"变量1","v2":"变量2","v3":"变量3","v4":"变量4","v5":"变量5"}],"signature":"8e38f6036491aca9f6f43029ec388162b3b84e8a7bb11a81b8ac837b6d948441","submitNo":"299cbbf7b29d446dacea3d445eeaa89b","templateId":"1417","timestamp":1636700243}
参与加密:
appId=tkIEPrflI3dynamicVars=[{phone=13900001111v1=变量1v2=变量2v3=变量3v4=变量4v5=变量5},{phone=17600001111v1=变量1v2=变量2v3=变量3v4=变量4v5=变量5},{phone=18900001111v1=变量1v2=变量2v3=变量3v4=变量4v5=变量5}]submitNo=299cbbf7b29d446dacea3d445eeaa89btemplateId=1417timestamp=1636700243
java 完整示例
java 示例包含所有的请求接口,Http 工具类和 json 工具类都用了 hutool 包,开发者可以自行替换,hutool 的 maven 坐标为:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.14</version>
</dependency>
示例:
package com.chuanglan.test.video;
import cn.hutool.core.lang.UUID;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.*;
public class ApiV2NoBody {
private static String appId = "tkIEPrflI3";
private static String sign = "【唐华春主账号签名】";
private static String appSecret = "Is2cVPFvCHXxBY";
private static String host = "http://172.16.41.225:8092";
private static String base64 = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAJuAoADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0+/8A+P6b/eqv2qzf/wDH9N9ardq9Kn8J4s9wooorQkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiijvQMKKO9J2z2pOSW5Sg2L9aT6Vz+q+M9H0tvKMxmm/55xc1ylz4017UG/0aKKyi9/mJrkq4yETspYKpI9HmuIrf555Y4h/00OKxb7xjolhJ5ct55j/APTJTIP0rzqS2kuPnu7y4uSf78h2flUscEUQ/dRRr9ErzqmZdjvp5d3Oql+IkJbZaaZcTJ/eJ2/zqjc+ONYdv9G02KIdvMfNY/50VyTx0jshgoouf8Jj4oP/ACzsB/2zP+NL/wAJh4pA4Fl/3wf8apd+aRhkYOay+uSNPqcTQh8b+JI2HnWVow/2P/11fX4keUyJdaROmerowIrlJLSRG3wzOG9DTItQMcnlXKBT/Ot6eMkZTwUWel2HjTQ9Qm8qK68qX0mG3H51uxSxSxB4XSRP76HNePSW1rcqd8cbA98VFDf3Oht5unX8ibf+WLncld1LHX3OKrl/Y9p70lcRoPxDtbwrbasBaXB/jz+7eu2Vw6h1OQeeK9KnXjI82ph5RHUUlL/kVte5zNWCiiigQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFWbD/j9h/3qrVZsP8Aj9h/3qzqbGlPcL//AI/pvrVbtVi//wCP6b/eqv2op/CTPcKKKK0JCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiijsc0DsFH0pk0sVvC0sziONeWJPArz3W/G9xqEj2eicRdJLo/0rlr4iMDqoYaVU6jXPFenaHHiWTzrg9IY/vmuE1PXNa18nzZDZ2p/5ZR/fP1qlBZpHIZZXM1wfvSSHk1ZJCDmvExGPlLY9zD4GMdyCCzhtx8ic+vrVj8aQHJ4pa82dRy3PRjTSCiiisig71FJPFH95xT2QOOSfwqu2n278kOfxq1YWpFLqkKfdy1QNq8h+7EKsnTLb+4fzqC40yJIi6yEYFaLlJdyudUuD0wM1AzyXc43EbzgVLbWD3Cl+g7VJBYSR3qJKCR1zWl4pEWbY5dLmxzIBUUunTIckbk+tbtFY+1aZpyIwl0+K4Gwy7X9HrR0+fXNKbFlfusY6KehqeWCOUfMPn7Y60weZb8H5l9fSt6eKkjGdCMtzodN+IcluyQ61a+WP+e0f3K7qyv7XUYVmtZUmU90NeUlI5Y8MAymqkH2/Q7j7VpMxQdWhz8r16eGzDW0jzsRl63ie00Vznhnxba+IIxH/qb1R88NdF9a9inVVTY8SpSdN2YtFFFamQUUUUCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKs2H/H7D/vVWqzYf8AH7F/vVnU2NKe4l//AMf031qv2qxf/wDH9N9ar9qKfwkz3CiiitCQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACj68UUdqBhVLVNUtdKszdXcojRfzNR63rNroenveXT4QfdT++a8m1LU7jXLz7dqb7YR/x7w+lcGJxKgehhsI5u7Lmq6ze+KZ9777bTR92Hu/1qAzw2wEUSdOgSoFe4vfugxRVcgt44F+ROfX1rwK9dyep9DSoKC0Gj7RKPmPlD261KsSIOlO6nmiuRu5vYO2BRRRSGFFFFSAUUUUBqHSq1zGbhki/gHLVZNH9aaEIERAAowBS9gaYzhFLntT/T3pgFFFFAwo9h0ooqQI8bOnQ1J1PFB96Qdaq4rFC9s5UmW+sHMN3F0KV6H4Q8Ux6/aGK4AjvoeJE/v+9cZ9KzZxcaXfR6rYErLGfnHrXp4PF20PPxmGU0e2dqWszQdYh13S4r2A/e++P7hrTr6OnPmR83Up8rsFFFFaGQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABVmw/4/Yf96q1WbD/j9h/3qzqbGlPcS/8A+P6b/eqv2qxf/wDH9N/vVX7UU/hJnuFFFFaEhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAHbmqmoahb6XZS3lzIFjjGee9Ws7Oc8CvG/G3iR9d1P7Fbvizgf/vs1y4ityI7MNQ9pIoatrsviDU3vZwfJX/VW/apLSze4YSz/dqLTbPzCJGGIwenrW0B7V83iK7kz6WhSUFYQADoOKWj9aK4nqdIUUUUgCiiigAooooAKKKKACiiigOpFNzCwpLaTzLeNz1xT5f9U9VNKObUg9mrRLQReooorMYUUUUAFFFFABSEB1KEZzS0U4uzE9UHhbVD4e8Rm2lc/Ybw4x/cNetdgRzXjGpW32u1O3iSP51PpXo3gvWf7Y0CORz/AKRB+6l/CvosvxF1ZngZhh7e8jou3WiiivZPFCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKs2H/H7F/vVWqzYf8fsP+9WdTY0p7hf/APH9N9ardqsX/wDx/Tf71V+1FP4SZ7hRRRWhIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFJ7UvemTSpBA8rn5YwXP4UpOyKhC7ON+IfiH+zNLNhbv8A6VcDH0SvMbG2LyJGOp+8an1nU5dc1+e+Y/LnZF7AVo6XBsi81urdK+exte59LgqHLEuxxiOMIB0p/wBaKK8Zs9JIOc0UUUhhRRRQAUUUUAFFFFABRRRQAUUUVQEVw+y2kPtVDSZPmkQ1Z1BwlnID3rO0t8XeOxrWK90h6M3KKBRWRQUUUVIwooooAKO1FFUAVP4Ovf7K8VmzY/6PeD5B/wBNKg7VQ1IyW/k30PEtvJvzXZgqnLUOTE0+ame0jOOaWq9jcx3llDcxHckiAg+tWPpX1VN3Vz5WorMKKKK0MgooooAKKKKACiiigAooooAKKKKACiiigAooooAKs2H/AB+w/wC9VarNh/x+w/71Z1NjSnuJf/8AH9N9ar9qsX//AB+zfWq/ain8JM9wooorQkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKT6UALSUYpcUAJR3pcU6gY2jFOooAbjiuS+IuqHTvDjRocS3DeWK6+vJvibefaNetbIPmOKPeR71yYidonZg6d5nI2kGAkY6muojTy4wo7Vh6dHvvF9ua3vpXzGId2fT0lZAKKKK5zYKKKKkAooo7UAFHbmikLhPvdKaQhaKz7a5+0Xz4+4BgVodzVNAFFFHeoGFH0opkkgjUuenWmlcDO1WX7kQ+tUbN/LuIz+FNnlM85du5piHDIT2612Je6Yt6nT0H2pqHfGh9RTutcktzVbBRRRUjCiiigAooooAO1RXEYngeI9CKl+lJ9K0puzImro7H4eXr3nhWKNh/wAerGD8q6v6V518O55I9Z1WyJxFxJGK9Er6zBz5qZ8pjYWqC0UUV2HGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABVmw/4/Yf8AeqtVmw/4/Yf96s6mxpT3Ev8A/j+m/wB6q/arF/8A8f03+9VftRT+Eme4UUUVoSFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRSd6WgYUlLTqAG4op1FSAYope1Lii4xtLilpe1FwsNxRinUUXKsJjivC/Fknn+NdT7osmF9q91b7pNfPmoSfaNdv5T/FL19a8/GvQ9PL1qW9JH79iewrYrH0r/XuK2O/NfO1dz6GmHeiiisS0FFFHvQIKPpUUtxFEuXcVmXGqO+RCNo9TVQptibNKe5itx8z/N6ViXupmX5D8qntSW1tdapeJb20bzTN+lSa5pEekapFY+aZbiKPfM46ZPaumFKxm2S6SMzvjgAVs8Vn6VHshdyOtaHaueo1cuAUUfSkJEa5boKzSuUKSAMnpWNqV55jGJPuD9aW91DzAYoTgetZiRzXdwlraxmWaQ4AFdNOnYzcxY47i8n+z2sZlkHL47CkU5jHWvZfCnhK30DS2EgEl3Mn72THTPavIr6zGl6veadnJgkKfWt90QblnIJLWMj6VOKytJn4MJPI6Vq9ua4qi1NUwooFFSUFFFFSAUUUUAFH0oo71cRMl8NSPB48tccRzROj/ka9W7Yrxv7T9i1zS7gdfO2fnXsffivpcvleJ85mEPeF70UUV6h5IUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFWbD/j9h/3qrVZsP8Aj9h/3qzqbGlPcS//AOP6b61X7VYv/wDj+m/3qr9qKfwkz3CiiitCQooooAKKKKACiiigAooooAKKKKACkpelIBQAUv0op1AxoFOopcVIxKWlxRQAYopadSKGUtOxRigAxRiloqR2EpaWigY1v9W/0r50l41G7z/z0NfRjfdIFfPurQfZvEeow/3Za8/GHp4Adp77LxPfit2uYSTy5BJ6e9aDau+RtiB+teHUhc92E9DXpjSJGMu4A96xJNQuJD9/aPQVWLu/3iTUqgPnNqbU4YzhTuNZ82ozSDC/KPaqlLDFLczrDbxSSyn+COtFTsS5iM+cljk/WtXQvDeo+I5h9mjMdr/HcP0rq/Dvw4Mmy61o8dRaj+tejQW8NtEkUEaRxqOgqyDnI9P0rwPoE9yoAdU5lfq79q8dEsuoXsty5JlnkL4Jziuq+I3iH+09SGk2r5t4D+8P981k6XaeXGJW4pN2RSRfhjEUKRL0WpO1RySxxgl3H51nXGqfwQj/AIHXKoXZrfQvz3MVuMuevQetY13evcHGcJ6VXkkMhy53H+VWtJ0e/wDEF2LbT4zj+OU/cSuiFO25m2VYLe51C6WzsozJM3HHavX/AAh4Pt/D9qJpsS38g/eP6ewq54b8KWPhy1CQjzLk/wCsmPUmt76iqbICvJvibpf2TWINVQAR3A2ED+/XrPfpzWL4p0ZNd0Ce1Y/vNm+P/fFKDGeIJI8UgYcEc10NvcJcRbx17+1c0geNnhmG2WLKOPcVYguHt5A6/lU1IXGmdH9fwo61Db3MdxHlTz3FTVzNWNU9AoooqBhRRRTAKKKPpTEUNRH72zlP/LK5jf8A8fFezQyCSKOT+8ua8X1mRBZ7AfnLJx+New6Xn+ybInr5Kfyr6LLdjwcyLdFFFeweIFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABVmw/4/Yf96q1WbD/j9h/3qzqbGlPcL/8A4/pvrVbtVi//AOP6b61X7UU/hJnuFFFFaEhRRRQAUUUUAFFFFABRRR0oAKTvS9aKADvTqO9LUjEpcUuKXtQMTHFApRThSKGgU6ilxxQMSl7+lLRUDCjpS0YoGJS06igYnNJT6KAsJjmvCfGdubfxtfk8Cb50r3fFeT/FWyePVrG/CfJIvlfXFceJV4ndg3aRw/ag9KM/LxTMl5BGkZklboqd68g9tD+9RCTfKI4gZJD0Cc5rrdG+HGq6oFm1CT7HCP8Aln/HXouieEtJ0KMfZ7cGX/nrIMk1LmM870P4f6nqmybUP9Dtj2x+8Nem6N4f07Q4tllbgORzIfvvWp3GQKKhzGGecZ6e1ch468UpoWmG2gfN7OPkA/g962fEOv23h/TJLq4I3/8ALNPU14PfX91rmpS3125bJzVQVwEs+JPOny7k81oy6nMRhQI1qhvCelME/mOBCjyv/sCm0BPJI8jZclj7moy4yEwWk/uDqa6LRvA2t6wRJPGLO2PO+Tq4r0jQfBek6GodIvPuP+esnWjYRwvh34f3uqlLjUs21r18v+N69S03TrPS7RbayhSKIdh3q3jjGPp7UfyqGxhRRRUgHejtRS0AeR/ETw//AGdqa6rbR/6NPxKB2euQUZwK9+1TTodV06WyuEzFIMV4VqemXGjanNYXAOYj8r/3xWqeghy2d1GwaLH1FaFvcXAAE8RPuKz7TUHtxsbLLWol/byKCJce1c9RGiLPaio/Pix98Uxry3jHzSgVlyMu5Pzij3rOm1m1i6Hf9KpS63NIcQxYz3pqkDmbckiRjLMB+NZtxqo+5D19TWb5d5dt85JPtUkOnS3N5BYQYM077OvSumlQTZhUqcqNjwv4eufEmopcuxFpA2Xk/vkdq9kVBGqoBhAOKp6VpkWlaZb2dvwka+nWr30r6TDUeSJ81ia/PIPpRRRXUcQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFWbD/j9h/wB6q1WbD/j9h/3qzqbGlPcS/wD+P6b/AHqr9qsX/wDx/Tf71V+1FP4SZ7hRRRWhIUUUUAFFFFABRRRQAUUdqdUgFGKKWncqwdqWilqLlWCnUYpcUwExS4pRRUXKCijFPxRcdhtOxR1paVwsJS0UvepuOwlFL3ooKsFFL1ooEJ2rlfiDpB1XwtMYkJmt/wB5H7etdWRSSxpJE0TfckGHH1qKkbo2pT5ZHzMsjzmOKCMyTSdEA616/wCBPDFjp+mxX7RCW+lGTI/8Bqx4e+H9to2r3Woy4kkZj5Kdo0rhPEHjDVtKi/siyIgAyWl7mvKq0rHs0q6aPX7i7trQZuJooh/00fFFveW12M21xFLj/nmc18yz3Fxctm4vLiVyf45TTYbm4tGzb3dxCR/ckNZexRp7Q+o/p3o7V474W+KF5ZzR2uuYmticC5HVPrXrsFxHcQR3EDho2GQfWsZ03E1U7nFeJvA2o+JdRNxNrUccA/1UPkn5P1rKi+E8yECTWEKf7EOP616f3pD09qSbK0OIt/hdoaKv2k3M0g9JMCprnUPB3gpg+y3juV4/0dcyfjXKeN/iPcSXMulaK/lxx5SS59fpXmrSAuXeUySn+Nzk10Qp9zCdSx6bqHxfuJVdNN0wROOksr5z+FY4+Kfin+JrDB/6Yf8A1646NJpf9TbSt9EpZILiP/W20q/VK15ImfOz0/Svi5gxxatpxAP35oj0/wCAV6PpmqWer2a3VjcCaOT07V8z5yeePauj8G+I5vD2tRYl/wBEmfZNGfuD/brKdJFqofQNFRpcRPGsgdNhGc5pfNi7yp/33XO6bubKaH0Uzz4v+esf/fdJ9og/56x/990cjHzokrlPG/hhNc03zoBi9gGYz/f9q6j7RF/z1j/76o82I/8ALVP++xQosXOj5zHm/MjEKynY646EUbJSPviu3+Inh9LO8GsWhj8qXiZB2PrXEk/3SnNbcgcyEWJ3ODKatR6UZMFpRj3bNVP3hH30oKOes361Lpj5zUTTrCA5mnT8Dimm9sIOIIjK49v61lfuR1fLD1p4kJ+5Hx79DU8hV9C5Nf3VwcZ8qI/wA811/wANdK+0XtzqcoG2H92uf51wkgcLvbv0Ar27wfpn9leG7WIj55B5h/Hmu/B0/euebjatom2elFO+lN6V7cdD596sKKOlFMkKKKKACiiigAooooAKKKKACiiigAooooAKKKKACrNh/wAfsP8AvVWqzYf8fsP+9WdTY0p7iX//AB/S/wC/VbtXG+M/iG/h7xRdWE1lwOVkHcVgr8RPteAl9HFnohUZrKFS0TZ0rs9Qz60BwehBrzOTVLm4+c3UhB9Hpkd5cxtvW4kH/A6f1gf1ZnqHfFFefweJdRgxmUMg9RWnB4wcnE9sAvqhqlVTM3QZ1tB6Vi2/ijTp+Wcw4/56VpW9/bXfMEySfQ1XOiHBosf5FFIPUc0tXcizHUUU7FK47BRS07FIoKXtRS1IxKWilpDCnUUuKRQnSgUtLUgJS0UtAxKXvRTqRQ2nYope1ACUUuKWgdhv6Uc5z2p/5Ug6896TYDcdeK8Y8XeF7rVfF8lvamONS/zyOcBErj/HfibXYvFF/afb7iKKOU7EjkK8Z4rkv7U1SRvMN9eMTxu81ua5amp34f3T6F0rwl4R0S3UXElnPOPvTXMq5NP1C08BzoUuf7KPuki5rwBdN12+hM/kXUsY/iJqnb6XeXVwIUj/AHhOADWHsjpdU73xTo/hq2D3Gi60CO9vJzmug8FfErRNF8M29jqFxL58WeBETjmuLh+FfieeLzFtUwfesHXPDWq+HZVj1G3eIyfdPY0ckXoJTktT2qb40eHoz+6inl/DH9KxdW+NlncadPb2mmzpLImxZDL0rxY9aAe3ahUIoTrtl430h45AJ5963tM8W2ukKv2bRbSWX/nrcruNdH4W+FUWu6FFqtzqbwRyJvIRM4qpYfDZ79rjUVuZIdBt5PL+0yph5ccHYPwrWCT0M3NrUafjB4jQBIorCMDpsh/+vVSf4qeJ5wR9oiQH+4mKlk8L6XA53SSGMHqRjirml+E7HVbryrCzkupRzsjc1t7Ax+snF6lrt9qziS6kBYHrVL7XNjHmn86+hPDfgbwTriS2N3o8ltfxffj896j1b4K2mmq99oubox8mxlHEg9A/rWbhYuFS54gfEusPGEOpXG1RwN1VTq1/J966lP8AwKuw+Ium6TatpV1pNv5Ec8DebH/dkDYNXfhNoGk6/e6hBqVt53lojR/MR61m7I3SbPPjfXR6zv8AnSC9us/6+T86+nIfh/4agPyabH+PNX4fC+hwfd0q2/GIGuf6xA19kz5YW8vv4ZpfwqZLrVifke5P0Br6rGjaUn3dKssf9ey04aZYD7ljaD6QrS+sLsP2Ej5c2eIriMx+RqEikdPKc1VeHU4JDE8VwkidVZSCK+tFgij+5Ei/QV5j8TdM+z6laajEgCzDyn/3+tH1hdh+yZ43HFqcnTzPxrb0Xwvqeq3So+8IfTvW3p9hLqN5HbwgszGvZ9A0CHRrNAEHnH75qJ4hWNYUjmdH+HENtDH9ofb7Dr+dWNX8B2/2V5LTll/gPeu37cCj+DHaua92bnhWm6JJe+KbSwwdvmeYfoK9xWMRxhF4C/IPauYs7OK28cTfuxuaPfH7ZzXUY49K9rBL3TwsweolJTu1IetekmeSxlFOppoEFFHeiqEFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFWbD/AI/Yf96q1WbD/j9h/wB6s6mxpT3PGPjXZu/jEXPRGiCfzrzIxule1/GyDMdrKB8wnfJ/CvHu9cT2PThZleG5uLdt8MpV/Y1q2/ifUoB80gm/66VlTRgDio6kdjrrfxmm0faLY7/UGtW38QadcEIJsOfUV55SdqYj1RJYpDhJEb6GpASO5FeVxXE0R/dSyL9DWnb+I9Rt+PN3D/bo5hWR6ZBq9/bDZFdOqe1acHiy+jUBkSQep615pb+MMDFzbfUoa14PEumz4zL5Z/2+KrnZPs0ekQeMbc4Sa3kHqRWrb+INNuCAlxg+4xXmcVxDOMxSB/pUtP2rIdBHrCTwyY8uaNvoamFeSxXEsRykrp/uGtC38Q6lbfduM/7/ADWiqmboHpdFcPD44lgXNzBGw/v7sV0Gg+JbLxAJRbZ3RdatTTJdOxt4paKWmQJS8UUVIw4p3FJThSKCijrS0gEpaWigYnWlopaRQlFPooAbijnJ9qdR34oGeDfG7w0bfU4dcgTEcw2S+x7Vt/D22j1f4YTRxRR+dbSffx3HP8q7L4j6V/a/gfUYQm6SGPz4xjuK85+BeqfvtU0WdwI2Hmov+30rnmjqpM7Dwp4bj8XyS6l4hhjubWL9xbW3SMern3qTxl4f8HeHNPXZ4esmupP9X14962vBkv2fUtU0w8Rxy5iT2rmfjEX862xnHkcf990UkmOs7GF4UGuadFJqemRyTaGsh+0Q54j9SlL8aY4rjwxpt8vVpgAfYoTWRofxA1LRvD8miQRRNDLn5z1Gau/EA/aPhdpcrZ3+fnk9etRUhaRdKd0Z/wAPvhvpniPw2+o6g04lkkZF2Ht61wPinQJ/DevXOnTfwHKn1TtXuHwelM/gRc/w3Lp/Kuf+NmjborPV0X7p8mQ46/5xWCqPnsdDprlubfw236l8NZbZD+82yQr/AN8Vb8ZiTR/DehaKnyxC2Dyj1kAFcr8ENXH+naXI+MfvYxnvXo/j/Sjqeiw38ALS2owwA/g7mt6OlQ562sTwrUrh5LtwSdqnArp/h74wtfCd9cNd2xljmHUdUrn9QsJPNMsXKHrjtVSGymuG2BDjua7mrnnJ2PS4PEgv/G0WsW0RijlkGFP5V7V2/CvDPBOkPf67axqP3UHzyH0r3LIA9gaxqWR0ULnzB8XYhb+I9QiQYijuU8tfT93z+tWfghn+3b0joIx/WrPx3kt/+EitUhxvkj8yU46npVn4G2TCTVLph8pCIp9eua46r9w7qSfMey/jRRRXlHoBR+NFFFx6hXKfESyS58KzSn78BDr+JxXV1m63bpf2JsW5MxA/I5oRRzXgHw+LSzGozp+9k/1ee1dVqepw6Zb+bKef4EH8dWYo47aBYgAI4xiuTNvN4h1ZpTxbRHYntQBH/besahMBbgRA9EjrptN+3+V/ppjHsOtS2dhDZQ+XEgHv3NWf4apbk3OelGfG8OO1vz+tdCffmuf0wfa/FF9ddY4l8tDXQ9q9zBK0Twse7yGUlPptdyZ5rQ2kNOpKomww0g6U+m9KoQUUUUCCiiigAooooAKKKKACiiigAooooAKs2H/H7D/vVWqzYf8AH9D/AL1Z1NjSnucf8WrdJfDt5J/HFKhH5ivBa+kvGtl9v0rUoW6bHf8ALmvm3tXHJHfSZHN/q6r1Zb7hqtULY2YUUUUxBRRRQAUnf296WigB0cskbZWQj6VoW/iDUbc/64yD0es7txSxR+ZJigDqbPxZK5xNbA+8dXptdeSPMMe3PrXORxiNQF6Vai/1fNILE8txLOcvIWNd18KpMa5fR54Nt/7OK4Kum8AXb2/i61j/AOe52fpTg9Sai0PcPpS9qMHvS10X0OIKdRilouUJTqKKQw+lApaKRQU6iikMOtGKXpRQAUUtFSMSiloouFiOWNJYmjcfIw5r5m0iV/BXxXCz8rFcmM++7/8AXX07j614h8bfC0sd1B4iso22D5Lgxjof71TPY2pvod8J0sviYpziOaEJx3Jq38RPD76xo4mhTdLB1HqleV+G/GkGsS6LHcSeXf25SJif4wOhz3r3BL+Xyh0x7iuZVOVnXKkpxPna20CaTUEiALfNxx1rqPirANO8A6XY5+fzxx+Br1WWCySRrgWtvEw5eURgH86+f/ib4iXxL4litLJ91tB+6Q54c+tVOrzsUKXKeifByMx+BeRjdcyH+VdB440f+3PCl9aqmZfL3x/Wp/C2lHRPDVhYPsEsUQEmB1etr61wSmvaXO1Q9yx8q+GNZm8L+JYLzBHlNtlHt3r6n0rVIb3T47mBhLbTKHx1614z8Tvh7Is8uuaTEWjb554UHT/aHtXPeAPiDP4WmFjeZl0uR/mHeP3FdfNfWJz2toz2TWfAllqE7XGm3Atmk5eJ/uD6VlW3w21CSYCe8gjjB5PrXUaR4g0rXYhJp17HNxkonVPrWp39DTWJqLQzeGgxdE0rTvDloYrfLSH78n96pLzUP3TPIfKiUZf2rO1DVLHSofOv7qK2j9ZDjNeMfET4mjVYpNJ0VnFofklm7ye30qfaSqFKnGCON8bayfEPi28uYs+WZNkQ9hxXuvw30M6H4PtYpl2yzfvZM9s15n8NfAU2r3sWq6hEY7GI74w3/LU/4V70MYAHSsq9RW5TalDqLRR3orgOoKKKKACm7E3ByOcU6imBWvY5Jbd4k6yfJn0qS2to7aBYokAUD86lo4pAHFUdWvxZWbOPmlb5I09TU17ew6fD5lw+O3uao2FnLeXQ1G9Tbj/Uxf3B611UKTmzCvVUEWNF086fp6RyczN88n1NaBp5xxjoaK92nDlR8/WqczI6SnUlamIlMNPptNEsbSU7tTTgLk8CqJG0VWfULWPrNGfoarnWbLPWT8qfOKzNGisqTXIR9xHNQ/8ACQf9O4/77pc6HyG3RWH/AMJAcf8AHuP++qP+EgP/AD7/APj1HOg5DcorFXX/AO9Dt/Gp11y1xz5gP0o50FmadFVI9RtZB/rkH+/xVoOHXevI9aaYhaKO3NFMQVZsP+P6H61WqzYf8f8AD9azqfAXT3K+txGY3kX/AD1DoPyr5jvYPs99cW5/5Zyun5GvqS+/4/pv96vm7xVaPZ+Jr+NuCZS/5muWS907aL94xf4DVU/eq3VSTiT8ayOljfrS0UUxBRRRQAUUUUAJ3qe2/wCPhag/xp8L7Jh9aARr1PB901W9amg71BZP29a1fC9wLTxPYTHoslZQ61Naki8hI4/ep/OqRnM+ku9OpkUgkjSQdG5FSda6DkClo7UtIBKWnYooLDFGKXpRSAKKWjrUjCiilpAJ1pcU6jmgY3FFOo6UAFV7yzt9QtJbW5jEsUqbGQ96sUfWkC3PnLx98Lbrw3M+p6VIZLBn/wBXnDxZrAsvG/i/SrdYYr25WJeiNH/9avprxBYf2hot1b4y2N6j1Ncp4ct7LU9LEV1ZxTSwPsfzFzXJVmono0FzI8RufEvjPxKos5Li7mRj/q0TFdDo3gSXRYbbUNWUC7lkHlwk58v/AGzXt1tZW1mv+j28cX/XMYrm75P7V8YRQnAitVy2T1rlnXutDrp0rbnWDOOv6UU1XBHGPzp1cjNrAyB1wwBBrzrxV8JtN1p3utOkWyuuuB/q3r0WjvWlOpJbETgmfOV38N/F2j3BFrBLMv8Az0t5MCoBpvjv/UiK/wDpur6T7880vet/rJl7I+drP4ceMNXmC3aSwoT9+4kyK7/w18IdN0uaO51WX7bOv/LP/lnmvSvrR24pPENlKkkMiijgiEcKCOMdEFPo+tFczbbNUgooopDClzSUtACUdqjEsbzPED8y9R6U6TJUgHHvQAjyxxLvlcKB61n/ANp3F5L5OlWr3D/89f8AlmlMvNMt/JkluDJMR0EhyK7HSLcWelwRKgUBeldVCjzHLXr8pyn/AAj11YTi+1Ai9fHOP+WdasUiSR70ORXRnn6VyHiD/iT3Mcton+t+9H0FerQgo6Hl15uZdx27/wA6SuVHijUY8F9NQj2lqeHxha5Au7eW2c/7PFdvIzkaOjplRWt7a3se+3mSUf7BqY0iLDcUlOxXOeM9cfQtBlnhx9ob5I/8adwSuWtR1mO0Jjiw0g/SuYvdbQkvcXgGfevNLvW9RvGJlupOfQ1QJLk5OfWsXUNVQPR5fEOlRj/j6DH2FVJPFtgDwHb6VwVLio52aeyO4PjOy/54y0o8Z2WP+PeX9K4ak+tLnD2R3i+L7AkZSQVai8S6VIebgL9a857+tFPnD2R6jDqllP8A6q5Q1ZWRHPykH6GvJcD2JqeG9urc5huJF+j1XOL2R6tz2p6yyxnMchFed23ijUYD+8cSr/t9a2rPxjbSAJcxPGfUc01MydM7iDWbiP7/AO9Falvq9vOQCdp965G2v7W8X9xMjcdAas+nvWimZOFjtAQeQRirNj/x+w/WuEGt/wBnfemHHOyuq8M6vFrEkcsOcrJhwac5+6EFqaN//wAfsv8Av14T8ToPK8XSSAfJJGn8q93vj/ps31rx/wCLlvi80+4XvG4P6Vk17hvTfvHmtVph+9qz2xVefrmufqdpF2paKKYgooooAKKKKAClX/WA0lFAGuOV47ipYfvVBF/qkx6VNF/rBUFlmlV9kmR2qW0t5Ly4WGLYHP8AfbaK7TRfh/FcFHv76Nh3jtzn9aohnpfhi4Nx4Z0+ZvvNAma18+lYlnbR2FnFawZ8qIbBmpw5H3XK/Stk9DBo1PpS1mC4lH8ZqUXkoPODRcVjQpelUxfp/cNSC8iI5OKm4almjFNE8Z/jFOBz0oCwUtO+lFJjCiijvQAUv4UUvWkMSilooASloo+lK4Cdz6Vw80X/AAj3irBH+iXv3f8AYNdz9ay9e0hNX054jxLH88T+j1hXp8yOrDVOVjf1/rWHrOjPcTpe2vy3C9R/fqbRL97iB7a4+W7g+SUVr9hjivJkrM9aMjk4nuPM2ASLL/cJ6V01uJRAglfdJ3pSkSP5uwAjq9JBcJcRCVOhP8qRT1JaKKKQgooooAKKKKdwCiiikAUUUc9qAuFMeRIo2kY/Koyaea5fxFqn2hv7Otn6n94RQNGlohNwtzfn/lvJgfQVrH37iq1hALewiiAxtUVOz7AXPAFNK7FN2REY/tOoW1r1y29/oK68DAwO1YPh63MjS37jlvkj+lb/ANa9ahC0Txq87yFrjvGb/wCkWye2a7HJ7VwviydZdTWPvEmDXZQV5nMzCpkiI6/MgKH1p/fAFTJaXEg+WJ/yr1roz3MptP8ALkEtlLJBKO6dK07DxTNaSC21dMA9LgdDUv8AZ90P+WRqvPZuYjHLC+09QUrOUYsOU6yKSOeMSxOJFPQivK/ire+ZqFnZK/8Aq03sPrWzbXF1oEwe3JmsT96E/wAH0rgPGOof2r4imugHCMAiZrlqqxUIamD3ooorlN+gUUUUAJRS0UAFFFFABRRRQAUn1FLSUASJLJE2+KQqR6Vvaf4nvh/o8rhvM4Eh7Vz3epLZ9l1GaaM5wOkZzJIS2WJ9a7j4aXeNVezxyx8z8q4btzXReBrl7fxfYBf+Wsmw/StX8JilqeoX3/H7L9a86+KlmJPDkVx/HHME/OvRb/8A4/Zv96uS8fW32nwdfesSeZT+wTB++eB9qin+6Kl78VHL/q/pXKd62K3filopkj7FyaYuo+imLKj9DTu3FAC0UnfmloAKKKKANG0O+BKnX74qrYn9z9KtCoLRfgOJkx+dbCXE0Z+SWRf9x6wh0BrWR8xgjvVEM1rbxDqto2Yrp/8AgfNatv451KP/AF0cc314rl+/FJ9aq4rHe2/xAiJ/0i1Iz/zzrVg8YaRPw0xi/wCuleW9OpxSbx2NFxWPZ4NUsbgfubqNvpVoEEcEV4eH6bSfbmr0Gr6jbf6i6lUD0NO4rHsdKHcdHNeXQeNNWgADSRyj/ppWrB8QCFAns93+4cUXCx6At3KnR6mGoSA8gGuOg8caVJjzTJF7bc1q22t6bcLlL2Mf77baCdToV1FP4kIqUXsJPJxWPHJHKMo4YexzT880WA2lnifo4qUH0rApwkdOjmiwG7S1ii8mQf6zNTR6hKPvAGiwGpR3qiupp/FGQKmW/hPAOKQaFijtTBLGekiU8EE8E1JS0Zzmu6VLHOurWA/fr/rYx/y0FPsbyK/tRKh5PUeldB25rmNV0ufTLh9S05P3Z+e4tx39xXDiKHVHoYev0ZPqBf8Asy6I6+S/8qZpiCLTbZD18sGls7y21O182Ihlbqh61WuNGjuJMvdXK+iI3Argasdysan0orFOjXUBzaalKCO0vINaFnJdf6q6iAkH8a/cekOxaoo7cGigQUUUUAFHbNFH4fWmAUEhFyTgVVv9RtdOi825kAx0Hc1xOq+IL/VZTFbRSR23oB1q1Tb2FzRW5s6z4g377axP+9LWZo1obnUY8/cX5zWUPtEYA+yvgV0eg6jbWcJE8M8crdXMRx+dW6bQvaQOr6HgZqExSX92lnD35lPoKj+1m4Kw2GJJZfu46Cul0rTE0+3x1lk5kPrXRQoa3Zx4iv0RcgijghWKIYRRgVJQOlFdp59xjMFGeAB1rzPUbg3mpTynrurtvEV6LPS5Mffl+QCuEtYjPdRxDvXZhofaM2bmlWEYt0mdMs3rWmX5CIhZ/QUn+rjAX/gArZsbRLeEYHzHk1VWqNIzhaXknSLZ9aDp91jDRRn1reHSjtXP7Vjscld6RHJ/rbV1/wBuuB8T+CjLC81qN307V7Wen/1qqz2UM/LJ83qKtVu4rHyfd2clnKUccCq1e5+OPAAubeS9s4gXHLBeprxW8tJLOcxsMe+Kh6lleij6UUhhRRRQAUUUUAFFFFABRRRQAnanj7wptJ3oB7HTqcjI6dq3PBo/4rDS/wDruK5+2ObeM+orovBv/I4aX/13FaS2MFueq33/AB/TfWsjXLf7Zod7bAf62IpWxff8f0v1qseVINbL4Tn/AOXh8wSDZI498VFJ/qzV/V7f7NrF1Dj/AFchqmehrjluejDYpDrihkDjBo/iOaDQHUpyxmM57UgkdBwanuBlc1U60mMsi5P8QqVZ0foao0dqBGlRUECHaCTU3emBdsDywNW6oWR/fY9qv1DLRaj/ANWK0rN8w4/u1mQ8r1q/Yvy6dM1SJZc7c1HJLs4FLI+FzVbrzTEBJPWijvmikAdqMnsTRRQA4SOOlO81+9R0UASif1FKJxnkVDRzQBeTU7iMfurqdfpIRWrbeMNWtovLS6GP9pc1zlH1p3FY7i3+Id5Gux7WKd/7+7FbFt48054/9JjlWT0jGa8v7UZouKx7Jb+KNHuY9/22OH2lODWnb3Nvdrvt5UkHqK8J3n1qQXEyD5ZH/OncVj3f2FJ9a8Wttf1OzP7i6da1bXxzq1ucvIJ/+ulO4WPVe/FSCSRD99/zrzu3+I77gbqyDf8AXPitWDx/pMpxKkkP15ouKzOzF7cJ0f8AMVMNUkA+aNDmubt/EelXf+pvY8+5xVu51SztkzLMhyOAnOaVkxp2K0unywa99vsRGsUn+uiJ4Fa4uIjN5IkHmYziuSvfEcsvyWyeSn9/vUWhXBTV43d/vcZNcdfDq1zspYh3sdx9KKP8iivMaseinoH0ooopDDvR9TQeOp471jap4kstOygfzZf7kdNAa7OEUljgD1rnr7xL5k4s9Ji+0znv2FZ8FprfiuXLZtrT8q7bSNCstHgCQR/N/FIer10UqDZhVrqJi2Hhvyx/aWtSGecDf5f8KVhWs/2iOabYF82QvsAxivRbiPzIJI8cMPzrzawD27TWcv8ArI3r06NJI8urXcjpvDdnHeXv79Nyqldm1vaxwndDF5ffKVyvg4/6RKO4rZv3k1G9FhA+Il5mP9KucUQqjLlj9gIZrIQY7+WKuZrIl8PWZANvvtpBzvjqubjVtJBNwBd24/iT7wqUguzoD0oPFULLWLW9X93Jh/7r8VX1/VF0/T2wf3snypVKDuSct4kv/tupGJT+6h+QUzQ4w92znoBWV7n7x71u6CPllPvXpwhy0yFqzetoxcXkaHoDvNb2Ky9Kj/eSyf8AAPyrUrzqj1LF7UUUVABSYpaKAG4GMY4ryj4j+B1khk1Sxj+U8yxj+H3r1g9KjliWaJo3UMjDBBppgfIk0bwSmNhjFR16N8RfB50q9M1un7iT54z6e1eddzVsoKKP8KKQwooooAKKKKACiiigAo60UUCZu2JzaR+wrp/Bv/I4aX/13FctphzZD2NdR4N/5HHS/wDruKuWxj9o9Xvv+P6X/eqCrF7/AMfsv+/UA6VvD4DmfxHz948tvs3jG/GPkZt4rnO9d78WLbyPEdvKOksOf1rghXJU3PQpP3Sq/wDrTSU6YfNTKRTGSjMbVRHStA9MVnHg4pMaFoooqSi1bHMePepu1V7Y8kCrNUQya2OLhK0e/wDwGsqE4mXPrzWr2zUsaLEPQ4qxbviYe9VIDzVkcc+lCBmlP/qziq4qaQ74cjoahqxBRRRSAKKKKACiiigAooooAKKKKYBRRRSAKKKKACiiigAo596KKADtxXW6bJ5mnxOa5Kum0OTfp+Mf6s4polmj2zUkUfmTJHvK7j19KZ34pwOHB9KbV0EHZm+95rnh4CO+t/tNsP8AlqP8asQeM9NcAOJYz/uV2lk6Xmm28rAMGTPNUrnwxotyS8tjHuPevPqYa+x6NPE9zAPizSQP9cfyqpceNLJIyLeJ5G/2+K6GPwXogOfsqH2NaFtoWmWbZt7KKMjvWawxo8SjgdniXxHgRRPbWzHr0H510GkeBrKz2zXZ+0zeh6V1gAHQAD6UtdMMOkctTEtjFRI48KAqDsKXvyKcfem10JJHI5XDv1rivFmnPZ3a6tAmFb5JQO1dr9ahuLeO5t2ilTKSDB9qtMzZxel6mbC4W7TmMjkVvaDqcVxAbqF9xkf979a4+S0fTNRm06f7h/1f41R8O6o+h6pNbTZMWea6IQTJTPaIZxNFuFZ2oT75fKXtVSyvBsEsEgZW/KmyScF2PualUveLMvVxDHB5gTEvYjg1hz3dxciMXEvmeWPkqxqN39rnJB+VelUz1zXoU6SM2w+tbfh//VzCsStXQnxdSJ6pVVV7gI7PShiB/wDroa0Ko6ZjyHx/fNXq8ae5oFFFFIAooooAKSg1VN5EL37MW/eYyBQBT1/R4db0qW1mA5Hyt6GvmjXtLl07UJYpU2srbGHvX1ZXj3xR0IfbDeog2zDn61dPsB4/24opzIY5XjPUdabTsWFFFFIAooooAKKKKACjvRSGgDZ0o5tT/vV1Xg7/AJHDS/8AruK5LSj+6euu8G/8jjpf/XcVp0MftHrF7/x+y/71QjpU95/x+S/71QCt4fCcs9zzD4wW/wC40+5HXcUrymvb/ilbef4VMuP9RJmvEK5Ku530H7pDP1BFQd+asT/dFV+1QaMWqMwxM9Xe1VLgYkzTEiKijvRUFkkBxKM96uf41Si4lSrvaqIYA4Fa6/dFZHtWtAcxJQxomhP7z8Ksiqsf36tfSgbLsB32nPam9jSWb/LIlL3oJYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVu+HpflmiHf56wvpWp4fnEd46f89F2CmiWdHS96Sl6VXQg9P8AC0/n6Bb+q/JW19a5PwNcb9OlhJ5V99dZUMtCH2opetJQPUDSUtFAhKSl6UUCGc44oP6040UAcv4w0/zbNb+EfvYP5V57q4CTQXqfck+SvZJ4knheNx8hGCK8r1aye3a706XrGd8ZrooTM2P0nWZtMbCfNCT9ytjUPFEc4WKAHyyPmc1xtnJvhHsMVP8AXrXoxgmZ8x0KOkkeVORTu2RWBFPLFJlTWlBqCSHEvD+tbLQVy9VvTJ/Kvo8dCcVSVwRkEGlBwcr1qZq6Gj0jSz+4Yf7VaFc9oeoLKFyf9YPyroe1eLUVpGqFoooqBhRRRQAlcdrk72fiOK4HYCuxrk/GEWHtZR7g1UdxM6iGQSQpIOhGa5XxvbR3FjGG9xWloF6JdLVHbmLg1g+JtRS7uEhiOVi6mtKUHzA3oeF67Zm2u24PpWX0ru/F9hvJlH/LQZ/GuD5zV1YWGhaKKKxLCiiigAooooAKKKQ0wNXSukg967Dwb/yOGl/9dxXHaT/y0rsfBn/I3aX/ANdxVdDHqesXn/H9N/vVCKnvf+P2X/fqAVvD4DlnuYXjKz+2+E76LH8G/wDKvnb6V9P6lF5+mXUX96J/5V8yTxG3uJIj1jOKwqnXh2Qy8xmqgq43KmqlYo6GJ9aguEJUEA4Bqc9DWvZxobVcgc9aYjl+/FL25rop9Kt5ckfKe2KzJ9IuIhlP3ie1QVcodDxWgrZFUCjocMCDV2H/AFSfSqQmPrRtDmFPas3tWhZH9049KGCLA61d9/aqlWlOVBqSmT252Tj0qZuuKqA4YGrj/eqiBtFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFXNKkSLVLaRugNU6WP/AFqexpoTO27UvWlkkSSQun3G6U3vzVEnWeA59moTxH/lonFd9XmPhOf7Pr8G48EEV6dUTGgoo+lFQUFIaWjtTFYSkpaO1UISk7U6k7UtASuJj9a5DxjpXmCG/jHMfySfStnVfEGnaRE5uLgGQdI0PJriNV8Wajq7GK3QQW3v1NR7dRZtDDORzWw2mpyw/wB75x9Ks1Wvift0Lsck96s17GGqc0Tkr0+VhSHrzR1oNdhiSxTyxH5SauJqf/PVPyrO+tH0oC50ljrcdvMm13++P0r1G3lE8CSg8Oua8LB2MCO3NereDr/7TpQiJy8deZi4dTWDOk5xS0lLXD0LCiiimAlYPiuAz6LIVHzRnOfSt6q95ALizli/vIVpx3EeS6bqF1+9h819p5Iz1q39etUY4jb6tNEeMcVe/WvYopWMrmZrkHn6Y5/u815bexeVdOgHHWvYZUEkTIeQa8x162MUxz96M4rHEwNIMxu9FJ9KWvPNQooooAKKKKACiijvR1A1NK+7Ia7Dwb/yOGl/9dxXJ6UP9HJ/266vwb/yOGl/9fFaS2Mep63e/wDH7L9ahHXFTXn/AB+y/wC9UI4rWHwnM9xCMg98182eJLc23iTUoyMf6S/86+lq8C+JVv8AZ/Gk4HSRUf8AOs6p00GckenFVCME1bqq/wDrTXOjpYw1q2bkQDHSsutK2/491oBFsSZ9qePaoKBkVI7FmCwt7+6SKaMMves7W9Pi0+9CQZEbDOK07G58q4V26CsrW9RTUNUOwHbGNlUhMoVbsTy4qpViyOJjnvTYkX+1WYv9WKretWID8pqCyXtVpX3wpntVWpoDlXH41RBLRR9aKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKPp0oooA7GxwdNtdvXyhu+tT96o6Gd+ir/e816vdvpVohliwlFve28pOAsgJNevwXEd3Es0EgaNuhFeL11unnUdCijubHN1ZSIDJb9x9Kwqz5TenDmO/wCO1NNYVj4v0m7UB7gQS/8APOTrWl/aljjIuosfWs1UQ3Qki3RWVceJ9Htx899Fn0rKm8cWrnZZWtxO/snFN1YjVCR1JpryxxpvlkCp6uelcVca34nu1/0axS1Hr1rnr601i4O+/kuG/HisniEaww3c7bUfGel2RdFkNzL/AHI+f1rlNS8W6vqLEW5+yW5/77xWOsSR/dTFLWMq9zqhh4ojWAeYXbMkhPJc1J9KPpS+1RzXNuhn6oP3Ucg6iplOY1NF+m+zf25qKzO+3jwa97L53R4+MWpMKWiivXPPCiiigArrPA9/5Oo+ST8snyVydXNKuDb3scinBBrmxELxHE9u7UtQ28yz26Sg5DCpT3ryDo3FopKQ+9AhTSHpRniszVNbs9LiLzyjcBwM0r2KSucR4mshaeIBIvSaqf0qvqWunWdTSUnEanAqxXr4b4DGSsxtch4rsMyM4H+sGfxFdjWVrlt9o098DmPmtKqvEEeU/WirF5F5F26djyKr968lrU3QUUUUgCiiigApDS0nenYTNvTkxZj611Xg3/kcNL/67iubtI9lrGB6V0vgxS3i/S9oziYfhVy2MftHrV7/AMfsv1qCpr3/AI/ZfrUNaw+E53uOrxz4wW4j1mxuAOZoyPyxXsdeb/F+y8zS7K+/54vs/P8A/VUVDWk9Tx3vVaf79WfWq846GuY7WR1pwf6hPpWZWpB/qU+lDBEtFFNNSUSwfeNYdxH+/dxw2a3Ie9Yr/wCtbNUSyMZxzU1txMlRcU+M4lSmJbmvUkHce1R0+D7xqCyx3p0RxIKbQPvCqIZb7milKEYz3pKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAN7w25dbuMnhQhStmuf8ADb/8Tbyz9ySN8/gK6EVaIYdq7jw9IZNHjfuCUrhjXW+FJC9nPGeitxXLiV7p04Z6mje6NYagcz26b/7/AHFUB4Q0wc/vz/wKrd7q4gmNtaxme6/55joPrVf+y9RvwH1C+ePH/LK34/WvLuz1UkTRaHpFvx9ni3j+/WlFHEkYEKJsHpWWfDVgfvfaCf8Ar5aopvDxjYS2F7PE6/dV2LCi7HZG73o474rnI/EFzp7fZtXtz5p/1ckfSStPbr9wv+j2VtHnvLIf8KEmxTdh15pdreKfNhG7++OtcpqulvpcnzODEehzXVr4f1i7jKXeqiHP/PGMcU+HwRp5XZdy3N0f9uU1vChIweIijz03MQPL/lU0Nve3EgEFjO2e5UgV6hbaJptnEI4rODA7umavgBAAiAJW8MOZPFHmkfg7WrsbJkigjbuTmuXsgR5kZ6q+K9yOc8fyrxzWLYWXim/t04j3/JXq4NcrsefXqcxF2oNAo6V66OMWiiilewBTo32Sq465ptJnjis5WY0enaP4ksLbTIIbiRw6jHC5rT/4SnScczvx/wBMzXkPmSAcOfwNRXEsvljEjjP+3XmV6ahqdNKDkz19/F2kqOJXJ/3cVm3Hju1jP7qFz75rz0b/AC8NmgAnoD+VeY8Qd0MKdLe+M9RuPkRxGD/crnZ5ZLkkyuWz61Yh0q+nI228mD3Nalv4Xkf/AI+Jgo/2Oayde50ww8UclZkRykej106uHUODwaytasE0/V3ii+4y5FPsbsJ+7f7vavoMBPmgeVjFaRqd6Yyb0KHoRilH6GncV6DVzmPNta0i4kvWW3ieSRf4AOcViT2F1bD9/azxe8kZFem6g8mn6jb6nCPnif5/euj8Rm3vfDMlwEjlQ7CCR7151WkVzs8H7UV2sthayjmFPwGKqnQrLkhHyf8AarDkNuhytJ3r0q1+Gdre2UVwL+WIsOmzNMn+FhQfuL8sf9tMU/ZsydVHnPrUkCeZKo9a7GX4Za1/BLbH6tUth8NNXF2j3E1vGg7xtkij2bE6qMxEJIREyemB3r0/wLoB0yaG5uEAuZT0/uil0rw3ZaWN/wDrpv8AnpIK6Kw/4/oT71o4e4c6n7xLe/8AH7L/AL9RDrU17/x+S/Woe9FP4QnuKK4/4m2hu/Bdxt/5ZSJL+VdgKyPFlubjwpqkS8sbZ8VMyqe582VFP90GpcFGwetV5zziuXqd6ehF2rWh/wBWtZY61qx/6se1S9wQ+iiigolh6GsJv9YTW7B91qwieSR61SJYlIOtLSf4UxGupyufWpYv9ZUEBzAn0qYHDZqCy0aKKKog39Stj/ZumXij91JCIvq46/zrL+tddb2Yv/hYJVQtLZ3bnA7A7P8ACuRpIAooopiCiiigYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAWdPlMGp2zjjMmz867BxsZx71wpcxFZAPuuCK7s/Osb/wB6ND+lUiGN7Vf03WP7Ijnc87k+Ue9Z9WtNs49QvorOU4875A/9w1FdXia0HaR2ek2As7NS/M0nzySetQajrgtpha2sZmnPZORVI6d4s/48jGnljjzO1dRoXh+30iIu5866k/1kv+FeYqGp6Uq6SOXc+KNvnfYiF9N4qTT/ABIJZvs19EYZenTFd/jrmue8SaBbarbtIoSK7X7knv6U50bE061yvfWVvqFv5UyAg9D6VT0vWJdCmTTdTJa1PENx/Q1U8P6wSWsLs7Zo/kHvW3d2kN5A0U6B0NYwnys3muZHQrIkiiRXDKehFL+FcHFJq3hiQm3zeWGeYz1Suo0nxBYayn+jSjzOpiJ+YV30qyZ59XDtGoffmkpeD05NJ3roujlasIa82+Ilt9n1i0vQn7tl2E+r16V3x3rmvGelHVNCbyhultz5kYralO0jNnnVIaigk3xgdxwalz3r1VWVjNU2WLKzm1C8jt4ASzfpXolh4R0ixgX7b5c0p6+Ya5HwrfpYXhulQSEcOPSt+wkTVNazeynYeUBNcFeu27ItQsdF/wAI5osq8WURX2rj/FHhI2Hl3Gno8kbNjy/7lehwW0VuMRcA+9M1Aj7JJk9RXJOu4rc6KdNNnldr4Uv7jmeSOBfTvWtbeE7GJg8pklcf366CjivMq4mcz06dKMSI20L8eUnFKIIh0QVJzR3rmubB24oo70UAcf4yjxdWlx1/grn66rxjGHsrV/Sas0WFuOdhzX0eWT908rGorWN2+fKfJTtWpUaxxx9EFSV7R5pBcQJc27xN0as+21B49CvdKuD+8iIMfuM1r1ja5Zl1F1CP3kf3/pWNWFyzJ4rT0iwS5kMkvRe1ZUUnmKCOlb/h7P733ri2Zq3odlaAC1jAHA7VL0NNg/490z6U/wCtaHnz3D6UUUVRAVZsP+P6H/eqtVmw/wCP+H/erOfwl09yW9/4/ZfrUQqW8/4/Zf8AeqIdKiHwlz3FHWkeMSxvG4yrcUo6UvbPWkyonyvqH7jULmIjDCV+PxrO68mvo/xH8PNF8Qh5HhEF0f8AltFxn6+teQeI/h1rWgFpFiN1ajpJEOn1rncDqjM5EdRWsOgFZIzu6c5rWHoKzaNkOooptIomT/VvXPRnJINdDH/qTXNKcSH61RLLFJ3o+lHemI0rM5t+asVTsjmM1aqCy2OlOpicxin/AE9KCTv/AIeSSXOmarpwfho+n1rj54vs9xLC3WNildJ8Nbjy9auLcdJYv1FM8caf9j15pVQCKcbwP51gp+9Y1cfdOa+tFHfk9qK6TCwUUUUDCiijGTzQAUVpnTEdQVkIJqvJp0yfd+YUwKlFSSW8qdYzUdABRR9aKQBRRRQAUUUUAFFFFADZOVOa7LTpTcaXay9cgofwrjj0INdJ4cl8zRmT/njJj86pEs1as6fcGz1G3uB1jkzVYe1J26U5WsET2tCDEp9R3pxPHJ4A6muHs/HcUUax3EMrYHaOkufFMmuSDTtPieFZP9bMeMJXFOqkdlOjJl/UNcutQuGstI+VFOJLk9B9Krx6Jb8vdPJdSnrJI/8AhVlRbaZZ7MhYlrDuPFgG94LUtEv8ea45zcjthSSNCXw9pz/6qHyZf+ekZ5qSAX1pKIpz9phPST+MfWs6y8US3eNtjLIn9+Na6CKTzFQ7HXP98c1gbDyOOR+FY2oeHLa5l862c21z18yM9T71s0URbRO5h23iDVtEPk6tC91B0+0R11FnrFhfxCW3uoyvucVRYCRSjAEN1TrWTceF9MuJfMMRjb/pmdtdMMRYwnQjI6w3dt3uIh9ZBWZd+JNJtGMcl0GkHREGc1hDwnpuct5rf78tX7fS7C2wYrWJSO+zmtPrLMlhEcNc6feapqk91p9nOsckmcHArStfBk0uHvrnA/55x9RXaUfSoli6jNlQijAk0O30+z/0WM7x958/fqkCQflPNdYeR7EVhahYGBjKg/dmtsPVvuc9el1Rb09JbiHzJpndOmM8VoqSkQiDnFUdDilkgk2umF5x/wDWq8OvTrWVdyuXQSF+lFISAMtwKpzavYQf628iUj/arBU5s6edIu0VhT+LNNjB2l5H/wBhKzpfGE0gIt7L6OXrWGEqSM3Wijrqjknhgz5sqLj1NcY+o65eD5pUiU9Ni4qIad5rb7qaSdh3c11U8uqMyli4o0fEWr2d/aJbW0nnS7+w6VH2A70kcEcXCRBfpT69vB4b2KPPxFfnCiij9a7zlCoLl0jgff0PapJHEYzIcCsLUtQBOf4R0FRJkq9zJceVelB0NdJ4e6zZrmYQ8splb8K6nw6D5ch/264Z6s26HZw/6iP6U40iD92KU9atHnz3CijrRTJCrNh/x/Q/71Vqs2H/AB+w/wC9WdTY0p7kt7/x+TY9ahHtU19hb2bJ/iqsZEHWuT28UjqdGbZKKcM54qv9o9BSG4fFZTxkUa08HNlvjvTW8oqUfBU9qpGRz1JpK5J446qeDOS8X+A9B1S0lvYY/st0o3l4v468Z+tfQWtv5ei3jjtGa+fO9XSq85c6fIL9KTtTqK3MiSMEwEAc4rlz96uqB8u33jtUGn6fFrdillYWzzapLJhAP89KCTER8jr0p3aun8Y/DvU/Blpa3VzKkscw+coP9W/pXLRvnr1qhF6xPLir1Z1kf31aHsKllrYsQn5fpUlRQdMVLQSdJ4FnEHiq3LdCjj8xXb+PdP8AtOjrcomZID19ErzPQ5DFrtmQesyD9a9wvbaO8spraUZjlXBrjqO1Q6aavE8MVDIQEGSegFSPbXEQzLDJGh7ulemfDfw1CL29vL2IGa3l8pUI+4fWuh+Jlp9o8HysesUofPoOa7Yao45OzPDfrR2qfRdLv9UMu5PLiH8frWi3hfVt2IbV5/8ArkN1OwXMf9altU33UeKfeafeae2y6tpYHPaRMZqXTEzPvI+7QM1h04oo+lFUMMDuKlstMj1G6+zhBlkNRVr6DmOa5uh/ywhd/wBKAOIniMFxJEf+WblKZT5pPPmkl/vOX/OmVIBRRRQAUUUUAFFFFAB2rZ8Ky/Nc257jzKxv8at+HZfL1uNP+evyU0Szre1HuaTvxRiqeoloxQ5QEmM7ema6XwdGhgubg43lsVm6XPEA8c5OD3FQeXeWU8yWXmyQyHeDFz+deZXpSueth6sXGxoeIbm41HUY9Otc8cVrab4bt7OFftH7+Udz0FZfhSS3Rbq6uZAtxnHzntVq5124vJ3h00AJGPmmk6JXJqjrOiWOOPhECj0p/b2rjLa31HVZ8xX1x5K/fm6A/QV06vb6ZAEnuTx/HLJUiZc7UVQi1vTpZNi3kWTx9+r/APBntSAO/tR2o+tUp9Xs7clDKJJP+ecfL/lTjBtkXSL340wug6uBWdDaavrB4P8AZ9rnv/rD/hVxfCdkV/0i4uZn75lrohh2zKVeKHG5t0+9NGP+BVVm1nToP9bdRgirD+EtJ8psW5Zz/fNeTEi0vZredMYkI57V0U8E5GM8Yj0ObxZpkZ+SQy+yCqM3jGMjEVjIR/t1y8boRhCMU7vXoU8vSOapirnX6HqLpdx3IHlCT76Z6VhX2s6lJdzILwqgkOAPSnfaDbadHt/1jCsvr1710wwcXuc/1hodJLLJ9+aRj/v0gj3nAGSaKUOUIK8EV0QwlJEvESZfg0wdX/KrscEcY+VAKyBeXA6SVKupzZ5wa2VKCM3UbNandqzRqnrHUo1OHHORV2sRcu9+KPrVUX9uR98ioJ9YtYhw+4iquhmjVWe8ig6kE+lYdxrkspxCh59KhisL69clztFS2A+91UyHC/MfQVCNLubmGWWUlSF3j3rWtNLt4IDIuGlA7jpVTxFrcWn2YYENMyEBM1lUdlqNK7M62fzLeJ89q6vw7Hi1PvJXFaPdpeabFMox2Neg6BHi3tuOTXJe7NqmkTpccYpven96aetao8yW4g6UtIOlLTJCrNh/x+w/71Vqs2H/AB+w/wC9WdTYqnuYt94n05/El9pzy+TNFLs+b+M1eBB5XBHqK8j8c8eN9Y/67mm6R4t1LSwkRlMtuP4H7V87Ui2fS07WPX+nU03eucZGfrXJWPiS31VcLMVk/uOavDIOR1FY+zZspI6GisyDUHTiXkVfinjlXKnIrJwNEzM8Tv5fhm/f0jrwKvdvGT48I6kfWP8AqK8K7V34TQ4sQLTaO1FdpzF22s5NQaO1iwJJvkBPavSPB+n6d8K9LutV8QzR/wBoT/JHFGMvs9qzvC+lWugWMXiDWEzIT/olsern1qvqt5LrE8s16fMDdj0FBG5x/jvx5eeNNUEjfubGLIt7f+prkgdh4ruk8Bza/PI+jx+XHH1L8Jn2rltW0DUtDnMV/avHj+LHyn8an2kTTkdiO0f98nPWtTtXPRyGMgjrW5bzieEOO3WqEW4D8xqftxVaH/WVZFUSS28nkXcMo/hkD177Y77i1tjk5ljQ/mK+fT1Ir3zwzcpcadp8qngRon5CuKstTppPQztX8Wx+DNVS1ishJaytmeUffMlQ65440rX/AA5d2scU8PnRlEllxszUfizR01Oaa3lyCH+R64PU9AvrTTo8fN5Ofud81005qxzzpmv4YEcdrLbrMJW8zflO1et+G0KaSpaIRyZP1rw/whqD2F7cTKmWjiz5ZFdV4W+JIs57gasC0cpBWRO1bXRk0zV+Llnv06xugBkS7CfwrzjS0xG7nvXV+NfHln4g0/7DaWr+WHz5rmuasUxaJx1oGiyKKPpRQUH1rQhn+xeHdSuT/wAtE8v86z+3NWdacReChGeDNP8A4UdAOQi+4KfUcP3BUlSwCiiigAooooAKKKKADvTbaU2+oRSjgq9Oqs/E1AHoTgCTApO31qG0kE9lBL3kTNS/XmtOhBpaQ6ee6S4wwrUaz2HfbyGPHpXPWwLzoi962WS9t4zycA9qfIpLUhTcXoYclpeW8rRMhxIeJKvyS2zm306F9tqCPPk7vV2D7POc3DnzP9qqkuh3BlkMVwixM28ZHrXDWwnY9Cji+5rXuu29pEllpKCWU8fJ2pLHQzI32nUpDPOxzs/gSs7TQNKnclElYjl63otYt5F6uD6GuOeGkjqWKix9zpVlcxBHt046EcVUTQhE2Yr24jQ/wA5q7/aMXQZNRNqI/hjwax9m1uX7Qt2vh/TZP+Pm4uJj6PJt/lW3aaZY2aYt7eP6nk1yTX8rjjApYdUvIHBWd/oeldNJpHPUUmdz7Un1rAtPEcZULcoV9xXL698W7HSJWig027ncdHdDEP1FdinE450pHoufTg9vevKviAmmjV1jtB/pp+ebHSuR1X4ueJb/AClvJFZxnp5afMPxrL0KDX/FGsP5BkuZ25lmkPT6muilNGc6bNRd5LlX4p0ckifPvOBXaWXguysoSNX1IMT2hTGPxq0LDwVbx7Gl3Af89Lla6/rCRlyM4ibULmXDmTaOwpgubjPXNd2U8EygDMYx6XK0f2F4WvP+Pa6lVz6SbqaxKE6bOIF5L3jFO+3y55iFdFf+C7q2ie4s5o7uIckJw4/CuYwR161vCqmS1Yl+2y/88hS/bZT/AMsx+dQd+tBIHXpV85Nifz7mT7qA1Ittqcg4R9p9qZa6nLb8RSgj0rYh1+I8TRlT6impoepRTQ7yX52l2/WrcHh6EEPLISatDW7Dbk3AH14qjd+L9OgJEReZ/QUnUiilFs0RZw2ckflRjDHFFxcw2k4lllSOPHOa4++8WXtyMQIIU/WsaeeW7k8y4leRvV65p4yKNYYds6O+8U4EsNgn+s/5aHtXMTA3cpe4JlPvS444oxz6V51XEykzsp0Ei54UcuLq1/55y/JXsGkxbGTHRUryPwcmfF5tx0K+Z+VezafHiJj611UHdHHidC72php9MrqR5bF7UUUUxBVmw/4/Yf8AeqtVmw/4/of96s6mxpT3PF/HJ/4rfV/ec1zv1rvfH/hPUh4g1DUoE86GWXfhOqfhXCEFCQQVI9RXjTge7TmnoAd0behIf1Fb+meK7m02R3I86IfmK57tR/Ss7G1z1Kx1Sz1CPfbygn09Kvq7xtlTg15FDLLbyh4XKyDpiun0vxfJHiK/G5P+eg6j61m4FJmp451949J/s3YC911PtXl5j4r0bXtOTxJbxXGnSo0sY6Z6iuFurK5s5TFdRGPHr0rppWRz1blDp1rqvB+hw3Jl1jVf3emWfznP/LR+yVj6Zp8uq6lBZQDMkz7BXR+M7+K3WLwxpp/0Oz4kI/5ayV0nMyjq+vy65rSXUp8u3U7Io+yJXRaH4budbZZrjfBYdR/flrnPD+nkeI9NiuYgYpJBkP3Fe0CWGMBPMRcf7VcuIm+h00oLqNtbaGzt1t7eMRxr0HpTL7T7XU7d4bu3jmjI6OKk+12//PxF/wB/BSfbLYf8vMX/AH8FcHvnX7h5d4k+EaPuuNCl2t18mT/GvM7izv8AQrww3ts8LDhga+mW1OyTrcR/nWRq0/h/V7fydSRJl7Zj6V1Uqkupzzguh4bBIkmChyKu/StXVfB1tZXHm6JemaFv+WMq/OPfNbmhaFpUGy41aUyOP+WKD+ddXtDn5DG0Twxf65IPIiK2/wDHI/SvXtF0waPpUNkshby/4z71Qg8Q6bBtiiiKxjjjtW5HLHLGJI3DIfSuCtOVzspwVi1fW8V7bx3BHzdDWPLpYKkB8g9jW500zDHrJVWsnUaLUEzCs9CtTd+c0UYkAeM47ZGK5LV/htdWcjHT7gTKOQJOpr0GLi6kA6Hmr8vMMUh69PyrT27Rm6SPArvT7/T5fLurV43962oRiJB6CvUNVEY02YyoMbeprzOu3D1OY5qsOUKKO/FFdRiHfil8WkR6LpUI4P3yKFHzAe9VfGzlNUt7cfdit0FAGBAflqWoIThsetT1IBRRRQAUUUUAFFFFAB3qvL981YqvN96hAddoMnm6PHz/AKttlaRrA8Lyb1niPRfnrf7VoiBY3KSq46it9dTO35o81z/Aro7W4hnt4oyBnHINHtFHcXJfYh8qW9PmAJGKSW2uYu5ZPrU8sAiybdyvtTPt9wi4MfI71ksTSb3G6FRdB0Fzb7QjRhT70XEFqQSJMNTY7RLk+a0gJb07Uhs5beXzIvmxW65GZptMgH2iMZ2EpUsdwh+9wami1FMbJwVqhfXtigypAPtWc6EWbQryTL4BfhcmrMdhM454rl4/EbWjf6Nn+hru7dzJbxyN1YV5eIjyHoUp8xDFp8aYL5Y0Xml2N/EYrq2jkU+qVb/SkPIrljN3N+RWPOdc+GenEmSwuhayH/lnKfkpvg6R/CUOoaTqv+jfbP8AVXcfOP8A61SavFN4j8VyWdu+0RjZz04rH1zRptGuIopphL5i5BFehSZxVWXh4W1e5vJLie5k1e2YfuntJSBn36ViX2l+ILKYxi1jUegj8z+dRxXEsDApK6MvpWinifXI8bNVuFA6c11WOdVClaW2teYPtNsCnolsua3bvRJL2yA0rw9qK3P/AD8PMYwPyeqX/CWa+euq3FVbvWdSvV/0m+ll+po5GP2h13hy5ufB0Mk2tavHdS+X+7so/mP415pf+IHn1G6l5XdK77B2yavnJ6nJrEOlxmeR5XLZbpR7RwHCmpC/248j7E8xvwqeOW4l5O9R9afHbxRj5EAqSpeIkbrDxGjen3XNPMkp+9KcfWkoqPrEh+wQ3Z65P1pcc0tFS6s2WqaQUUUVm3cpKwUUUUkM0PB/HjiPH8VtJ/SvboI/LgRPTrXjPgaLzfHtsOwtpCf0r2uvVw2x4+MeolM70803vXWjzwooo70xB0qzYf8AH7D/AL1VatWP/H9Dj1rOfwmlPclveb2Uf7deR+NbKL/hI7jagXKoePpXrl7/AMfsv1ry7xsP+Kic+safyrgqr3D0cO/eOGmtpYueqVF2rb7VWns0kHHBrhPRM3vRipJIHjPzDIqP6UAT215cWcokglMbD3rprbxJa38X2fV7ePnjzMVyXbBo7UXA9M0Pw9a6db3+t6VKjyrD5cKSfcDn3rzaa0urDUUe/ieP585Peu28OXF0PA+o/YT++t7hJSn99MUlr4gsNVj+z6hCisf7/Q1qpmPJcxTrlghDiUEqeCOoobxPa5P7y4auli8L6J/rFs45Ae9XItE0yD7llGPpSc0WqbOIPiO2P3I5WP0pV1W6lP7nTpJK9KtbCwK48sK/0rSXT7YDiMVk6hSps8qjl1yQ/JoslWV0/wASTj5bOKM/7Zr1FbeIfdjSnhBnhPpxUe1ZXIeZReHPFMhyxgUVfTwdq8gHm34j9cRivRo7OU87AB70pt4o/v3CfhzSdSQckTz+LwBI5zPqsrfQYrqvD3hwaXE0UUs7RE5YynOK2BJZx8qjzfyqGa5kk4yI09BWbn3GkSXcqOViT/Vx/rVKa4SM+WvMh7VGZJJ/kg4Tu9SxQJEOOvrWLNVoJBGUG9vvNzVuT/j1iB9TTYYwcu/EY/WklkMkmcYA6UAY3iOXy9DuMHlsV57XbeMJNmmwp/eauJFenhFoceIYdaKKK6zmJrSPzLyJB3NaXibwVfanem+tJY2Lf8s24qtokfmaxbD/AG+a9JX7tc2Iq8hvSppnhV7oep6Yxe5s5IwP48cVTEvrX0CyB1w6A1j3/hfSdQJM1nGGI++lYQxnc0lhjxkSA9Kf2rur/wCGaHJsboj2lrmb/wAIa3p2S1uZF7GPnNbqvFmMqLRl96PxqJ/OgbZLG6EdnGKTz+elaqSZlytE1FReatP8xPWrAd35qtL981K0o7VAeTk0Aa/hyTGpmPPEg5/Cus7VwlhIYr6EjrvruzVpkdRO9bWmbHtwcDP0rGrb0cB7SY78MpGBivLzKUlTujuwXK56lztRx3o/Cj9a+S9vUiz6L2UGiBrfkmFypNUdQ1C/t1wsRZMferVo4PWvQw+azp/EcVXL6ctjimub28kKLvLeiVesvDd7eHMvyj1710qRxxtkRJmtKG9jPDjaRXpf2wpI4/7O5TNsPC1nbEPN+9cetb4AQAAcCmLIjjKkU+s54j2pUKPIFQ3kogtJpScbYzU3asPxXL5Xhy6weTj+dVSWoVHZGN4Gieea9v5PvyNwapfEH/kJWoH/ADy/rXQeDIki8Px4IJLkmud+IB/4mdqB2i/rXdTvzHHU+E5GjvRRXoo4go+vrRRTJDvVNupwauqMyIPU13k/gaxv7GGW3JglaNCfQ8VyYidjtw6PNup4FFbeq+E9V0wktCZY/wC/H/hWKQUOCCDWCqXOpoSikzzxR2+tUIWiiigAopO1HegBaO+BRUF1cJbQlz17CmlqJuyOz+Gll5/iS7vhz5EXl/8Aff8A+qvVz1rxP4feJf7DvXiugPs94+ZD3Q17WrhxvUgg162H2PExerDtTDTz0pldSOMWij0ooEFWLH/j+h/3qr1ZsP8Aj9i/3qzqfCa09yS+P+mS/wC9XmfjgY1lHPeOvTbvm9l/3q858ep/xMLV/VDXFVXuHZh375yPegUvajtXnnrIaQDwaqTWQJynB9KuUUAY8kbxnEgxTPfFbLIHGG5qnNZd0P4UCJdE1u50K+FzbbGB4kjfo4ro2fwdrhV5zcaVdNy2xd0dcYwKE5BBpvvTuRY9HsbPR9Ob9z4xtpIu8cgH+Nb8E/h6U+Wuv2xkPaMg140BzSDIORRdAkz3TyNIgb5rieXHolS/2pZ2+Bb2zyf9dGryLS/Et5p5Ebkzw+j9q9B0PW9J1FUkhkHmjkxydRUs0sdlayjyUlubdIVPRO5qNtR2SZhtY8flSXiSSsJ0G6JhxUCwSvwsZrJtgkh0uoGU5ubc7f8ApnJTZoIkSN4fuSDIGKeRDZqDORJL2iTvULyvLIZJRj0A/gqJvQaWug0uEBcnAFVsPcnnKQ9v9ujBuJsEfuo/1q0MDpWLZqhFTZgYxjtToo/MbYvU0lLLL9msJbjq5+QClBXHLQkmkDkRqPlj6VED+tURHdOA4uRz7UeXfRnmVGq3ASZg+M5PltowfeuSrovFckpnhSYAEJXO16mHjaJ59d6hQaKK6DI2fDEfmauh/ujNegdq4nwfHm9lk9Biu2rzsYztwyCiiivOOsWk7Zoop7AUrzSLC/BFxZxSZ/j2/PXL6l8OtNkjaW2kngx1x81dr3zVq2kSON9xODW9KpJuxlUgjw+98GalblzAI5oweMdT+FYlzZ3NnJsuYZIT/t19C3Wn29xukACk8+ZH2rEvdKKB98aSxn+MDNazq1aZnClTkeH54or0298J6VeD5YfIY/xx1g3ngSaPL21yjIOz9aIZhH7Qp4N9DkQ+xkI7Gu9tnD2kTg5yorkLvRNRsv8AXWsgH55rp/D6S3GnRpsfzBxzXSsbTSuYfV6ly72rY0oXESyZysUg596W20+ODDvhnq906V4uPzGM/dR6eFwTj7zNqLRkuY45Y5HX13Csy9tha3DRKche9NFxP+7jEp2A8e1bM1k/2f7Vc3PnNGegHBrzoxjVjobuc6UtTB74o61sJfQ3MyxfZN8fTHeo9Y0tbFvMjb5W7elZVMLZXNqeLTfKZdHajvxQSMc1yanXoKruh+Q4+lWor9xw4/GsyW8ij75PpVWXUHPCgAV0U51EYThE6mO7il6OMntVfVtOj1TT5LWVyvmfxjtWJp0VzcajDIUcqr8mupmjdI3xxXp0MSr6nBVpnnEuha5okh+yTFl7BG5P4Vh6tPfzzxnUt4kA+Tf6V6I+/d83Ws3VNKh1SIb/AJZAOHFe1RqJnnVaTPPqK2bvwxf25/dbJvpVF9Lvo/vW713KojkdOSKlFTrYXT9LeT8qtRaFqMrjFsQnqTQ6iQlTZQh/10fua9qshiygzniJOPwrgtL8LeVMstw/mODkRpXfwBxEu4cgc15+JqXO/D07EhHHPesbU/C+lapnzbcRyf34+K2c1DNeW8C/NIBXEqljrseb6r8P723bzLCTz0A6d65S4trizl8q4iMUnpJ1r16fX4wcRR5PvWBrly97YXBmROFJ6VtCsS6Z53RUclxFH95xiq0moxjhRn0rsijBsufSmySJGuXcAfWsuXUJT0O36VSaV5GwvzPWigS5mncamiL+5596qRRyXEnmzn6UQWnO+Xk/pVxEJOFGT2xW8KZzVKo3t9a9r8A6jNqHhuP7RnfCdmfUV5PaaYeHm/74r17wXbG30Lf0ErbxXZSR51edzoTR0opB0rqOTqLRRRQIKs2H/H9D/vVWqzYf8fsP+9WdTY0p7j73/j9l+tcB4/H76yP+y9d/e/8AH7L9a4Tx8PltH9M1yVP4Z2UPjOJpKKK809ZBRRRQMPpRRRQAx40kGGFUZrMg5Q5FaP0ooAxTweetFa0tvHKMEfjVGa0kjPHIoEVu3NOV3jk3oSrj0pvf3paAOv0Px5f6cViuZZJofrzXoGn+IItYhzbX5Y90zgivEKkguJraUSwyFZB3FRNDR7tHGiMT/Eep70lw/lwM/ftXn+i+P5YwkOpoZB/z2FdvDeWup2he1mjkRv7lcrhK5tdWLUMQjiSMdufrUlQW8nmRAn7w4Iqes5lIKdcIJLSOMjhs02pmG+1Uj+HinFiaMqEvZyiF8mM/cq/9Khu4hLA+eq02yl821Ung1e4jkfGJzqUAPTyv61zldH4xH/Ewg/65/wBa5yvWw/wnn1dwooorcyOs8Gx/up3/ANqut7VzPg8YspT6tXS9+K8rF6s7sPohfej6UscbyN8iE0rRyIeUNcvsmb+0iNoo+oxUU5lC/IM0uRj50yXOByahku4o/wCPJ9qy55bgnDkiouo5NawhZg3c04L3zLvER8l/7/rV77QYuZ4jH38yL7h+orDgtIrwSRTEqPX0quI9W0Y/uJPtlv8A88n6ivRpxvH3jkmrPQ6GWzt7iPzBjHaWLoazZ7CWIbx+8iP8Y5qOx1ezvJP3Uj2V2f8Alm/etb7SY2/0mMrn/ltHyhrkxGBjP4TWniJR3MPg8HkdqakUcWfKjC59K3prOG5UvwoPPnR9KzZ7CWDkjdHj76V4mIwtaC8j0aGIpSKvaijt6UfSvInGdz0YtWDtzVuy1CW0BA+aM9VNUJJ4o/vOKqyahj7ic1rS5lsZVFGW508OuRwZaGzSNj3rL1HWjctmeQcdAKxDLNO2OSfRKt2uiXlx1HlKe5rodV25Wcqp04u5E+oZ4iFQj7TdnC75PpW7Fo9haYN1KkjfWmya5bwEJY2plQPsMg6CoUexUq5VtvD1zIQZ3EQq/FYaZZyBGcSS+h5rnb3xHqX259oEltHIExH3rPl1D7PfXM6OI/MXARzzV/V5yMlJyZ3bahsTEEYUCq7XEsrdT9BXBXXi94IPKiOGA++fvmsu08X36ahF5Up+aQBs1pTwU73NnS0ueuCBHiXenQVG2nxE8ZFWUJKgnqacPevUheJxtamedM4GJP0o/sw/89TWhkelV5r22tx88qCtPatEclyuNM55kp40+EcnJx71Rn11MkQxZ9C9Z0+p3U/Vyo9BUuuylTR0DXFnZgnegNUZ9dQcQx59zWGSSeTk0nPesnO5aikW5tTup85l2j0SqpJJyfxpKKm7K0Fzis/XD5ei3hP/ADyer+eaoavh9LuYgQHZcc1vQptyMas0keSb3f7kZNOFvcP1woroI9IP8UgH0qzHpkKHnLfWvdp0tDyZ4g5tLAE/MTJV+DT5MfJFtHvW8sEUY+WMCpO1bKmc7r3MyLShnMr/AICr8NvFAMKgFTxRSztiKJ5CfQV0eleC768Ae6PkRe/WtVExdQxNNsJdTvUtoerd/SvW7W3S0tI7dBgRjFQadpFnpcPlW8YBPUnvV7jtWsEYTncYaXpR3orQyCiiigAqzYf8fsX+9VarNh/x+w/71Z1NjSnuOvf+P2b61xnjpP8AiXRP6PXZXv8Ax+S/WuV8bjOggj/nqK5p/wAM6aT/AHh5z/hRRRXls9mOwUUUUDCiiigA60UUUAFFFFAEM1tHJyOHqhNbyxDkcetav0NBoAxeaK0ZrNJDkcGqMsTxn5hx60CI/c1asdRutMn820meJu+O9VfrR3pNXC53+k+OY5JFS+TyZz/y0T7jf4V2VtqlvcRhw45754/OvDu2Kv6frF5pbb4ZTsH8B5BFZzpFKR7arhx8pBHqKswHJeJuEavP9J8UadqBEVy5s5fTPy11EdpK43xXAI7HNY+z5S7tly9cW8Ugl69MVFYIY7cbutO8pJfKS5OZI+FkPerONnGMUmNHH+M4z5tvL/s4rlq73xRZm70zegy0J31wXavRw09DjroKKO1Haus5rHa+CUM9vNEvUNXcw6dGn+tO6vPPA1yItSaMnAbmvUOo56VDpRkJ1XHQFjSNcIABS9uaPoKKv2cDL2krkD20Lg5jH5VUuNL8wfuJfL+vNaVFQ6EGaKvJHI3ukX8eXfMq+1ZZBDYPDivQu1VLrTra7H72Mb/UVi8PY3hie5xdvO9u29QCPeryXEc6/Icf7Dnr+NSX2hTWw3w5kj/UVkkEHkcioUnDc3dp7Fm+0+1vRieLL9n7n6elUkOraRzbzfa7YdY5Ov0Bq0lw6DB+ZD61ZiAlieRDjb69vpW0KikS7xIbDWLK4m2QyPp97/HFJwK247gxA+enlkj/AFsY4f6isC7sLa7XZcRAEc59PfNVkGraP/x6yG7t/wDnjL1NOVNMPQ6HVLS3FlLdKgyvePoa457yaTgnA9BXQW+t2GqQSWspNrOx+dHrQtdLsrdcxRBif4zXi4zBL4onfQxEkrM5WDS7y5b5YiP9/itOLQre3G++uRjGSOmKvTXspJC4VRxxWNq0kb6fPHLMF3Jgbz0NeByS9pY6+eUkaCanpVsTHZeXJIF35FZMPiyW/lMTJ5LSR74ihzmufOq6dYWjIUSSdk2OQeDWHceIz5Qht4wsa9Pb8a7aeDvqSqUmdGs8iXCTXV0kiq53CSLEgqhNrdrZQ+TDI5iXlcv/AErlJr25uM5c81asNA1LU2Hk20mxv+Wh6V2ww6W5sqUY7li48QSyeYkI2q3OE4Q/hWW1xcXMmwFyT/AB1rutM+HH3ZNQuOO8aV1FtpeiaNFsijjyOeeTWnuxB1Ix2PM9L8H6vqOwi3MUWeTJxj8K7TSfh5Z2jLNdyvNKp34HyitubXQDi3h/Os6fULmfh5Tj2pOqjGdVs6Sa/trdfnlHHYVnT6+P+WEZ+prDPJ55pBWLkZJFufU7qc8yED2qoevvR25o7UrsoO9HbFFFNJsLh2oo70uPWrVJkOYwkBST0FZUniOwEpiifzZPbp+dbKxJcSCJh8sh2GtYfDPw/vBEb+owa9DD4VPc48RiOXQ4abWLiQnyhtSqMskkjZeQt9TU+vWyad4hvLO3J8qJ9gB+lXPB9pFqHiCK3uU8yLa52V6lOhGJ506kpGT7d6uwaVqNxs8qznIPQ+XxXr8Wl2MC4js4v++KsBAgwoCj0FdUTjueaWngTU55AZzHDGe+cmt6x8CWMH/HzK87j0+Wut703timQ2U7XTrOyGLa3ji+i1ZNLSHrVIhidqQ9KOlNNWiBBS0UUxBRRRQAVZsP+P2H/eqtVmw/4/Yf96s6mxpT3Fvf+P2X/frmPGIz4df/AK6Cunvv+P2X/ernPFib/Ds3tzWD/hnRT+M8yoo96K8qS1PYjsFFFFIsKKKKACiiigAooooAKKKKAD6U0oCMHmnUUAU5rIH54uDVNkeM4YYrY601kEnDDNAGMKPpV2aywMofwqoQUOCKBDfxrZ0nxPqOjkCKTzIf+eT81jd6Wk4XGmetaV4t0zWI/Ld/Ilx9xzWzDqIjPlTHzYscSdxXhvQjBwfatrTPE95YERzHzou4PWs+Qq56teyypH8qBoWHBzmuTvNDjkO+3/dn+52q/o/iS3u1/cyg5HML1r/Z4bvm3fbJjmI/0rSGhM0mcFPYXFux8yI49RVb613M0RQ+XMmMdM1n3GkW04JK7WPcVuqxjKkYWlXn2LUYpv4M/NXs2nXYu7RXDgmvIrjQ7iMnyT5g/Wtzw5rs2nSLa3QK4+47/wAq6YVEzlqUmel9qKqW+oW9woOcE9qma4iQfNKBV3RhyMloqo+p2sY/1gNUZ/EEScJz9aTqRQ1TmzZqN7iKMZdwK5ifXZZBhc4qoZ7y4PygmsZ4mKNlhmdHPrFvGDt5z68VzV/cLcXBkQIOOwpwsJZDmV6sR6fEOuWrjq4lSO+lQcTLxk8DOauWMcscvzIfLbhx7VfWKNPuoPyp/auX29jfkuUbm2uLP5x+8gzwfSo45I5CQpxn+B+9ascmwHPKN2PeqE+nxpNlP9VL3/uH0rpp4kwlSKl3p1rfqBcRAsOhx/KqhTV9EjeS3uPtNpGMmOTtWn5Vxb9P3kdQXtwJNJu40BEpiOErSVSMojpxakef6h41mkkdIfl+nBrm7nVbq5YmSWtyx8EalfyF5gIY89+orp7Pwho+mYe6l86Uetea6dNO568KkUjzu00+91CXEFvJIT37V1GnfDy9uNj3sqRJ6CuwGo29pHss7WNR9KqT39xcffkP0FDqIl1X0H2vhzQdHIdwJZB3PJq9JrMcS7LaLGO9Y/U80lZObZjzN7lqfULqf70px6Cqpznk80UVN2wCiiiizDQKKXtSdauFJshzQUd6Wit4ULEuoGKKO1KqFzhRzWnJFGd2xKO3NW4tOlc/MNoq5Fp0SH5yWoc0gsZtsjvcRYQ8OM1381xFbQGWaQRovOT2rnoI0jkUKoAzVf4jSPH4Kuyp+td+Dnc87ErU878R3lvqHiO/urZ/Mikk+U568Vp+A5YoPEiGaWOMGN8bzXmiahInakbU5c71yGHfNdymcz2PqbtTKzvDxkPh+xLklzEOTWjWy1ON7getNNLSGqRI2mnrS0nerQmJTacelM70EBzS0UVQgooooAKs2H/H7D/vVWqzYf8AH7D/AL1Z1NjSnuLff8f0v1rD8Rjf4fu/aM1t33/H/N9aydcGdCveP+WRrB/wzeD/AHh5NRR3orzJHsw2HRxvIwRAS57CkZHRiGBGKv6H/wAhm2+tdfqGiWuoLlhtk/vpXPOpymihc4Cj6Vpalod1YEuU3Rf3xWd2qozTBqwlFHWirEFFFFABRRRQAUUUUAFFFFAB9aY8aScMKfRQBny2bocpyKqdDg1t1FLBHKORzQIyqTvmrE1pJGePmFV/0oAcrvGwdDtI6YrpNL8X3FuRHdjzlH8Y++K5qj0HagaZ6/p2vxX8I2vHPHjlH6pVv7Pa3B/0aQxv2jk/xrxqCeW3l8yGR1Yf3DXVaX4wz+61Acf89EpDO1ms5oD8yZA/jHIqu8aSLhwOasaddyXMIlsrgSRfX5KtvIXb/SLIH3T5aXODiUYJXtxhPu9h6VKJbqQ/LnFWovsCD+MP6SD+tWYymPkkiI9Aal1mL2aM5bO4kOWP51YXTk6u5NXtkuP9TJj6Uwvs6xkfWsXUkzRRiNjt4o+kYz61LiovtEfc0faI+xPtWTuy9CX86O9Rh9/3YpD+FO2XJ6W0mP8AbpchVx1HaozFdY/5YRfV6rTXNrAP398S/cRpRyhzFp5EQcnt09acPntCZhtTzA6DvWHLrkcRItbfn+/Id1Z8+oXVzJvllcn0SjnSDludFPqFtAP3soyPTmsm51iOQ/uoRn1esnnHPJo/WsvaMtRLE17cz5DSnYewqv25ooqbtlhR3yKKKEmw5kFFFLWipNkuaEopaK1hQIcxKWilAJOACfwrVJIzuxPpRVqLT55OqYHvV2LTIkGWJeh1EgtcyQC54BNWYrCWQ8jb9a1o4kjGFQfhTz71k61x2KcWnRJ975jVmONI+EAUU/tzS9qyc2VoHejvRRU3AdH/AK1frVb4iDf4JvvYVaT/AFqfWofH4z4J1L2jr1cDsebifiPnDHagjPSipIE8y6jjHd69BbmD2Pp/Rx5ej2SekKfyq3UFiMafaj0iT+VT11xOCYlNp1MqkZgabS96SrRI3rSUtFMkKKKKACiiigAqzYf8fsP+9VarNh/x+w/71Z1NjSnuF/8A8f8AL/vVmaoN+k3SesZrSv8A/j+m/wB6qNyN9pKPUVm1+7LX8Q8gPU0lLJxI+expOleTPc9ynsaGif8AIYtvrXoPfivPtE/5DFt9a9Brz6x1QAgOMMODWTc+E4dREr2p8mYDp2Na3ar+mdZKvBq8jLEPlieW6hpV5pcxjuoiuP4+1Ue1e2z21vdwGK4iSSM/3+1cVrPgRwTNpn/fp/6GvUnQ0OKniL7nD0U+e3ltJ3iuIzFIOqP1pnauZqx1pphRS0lIYUUUUAFFFFABRRRQAUUUUAHaq81tHKM9DVige9AGVLbyxHkZHqKh7c1t9e36VWms0k5j4egRnUnanvFJH94U2gC3Y6neadOJbWd4yO3rXeaL4/t7gLDqKeTJ/wA9B0Neb9uKPrUuFykz3iKSG5jEkLxyKR1Bpxgi6+WK8Y0rXb/R5AbWY7f+eZPyV6Do/jix1ALFdYtZz6niuacGjRTOn+zx+hp4GzoTRkbd4+4ec1Tm1Szg6ygn0FZc7LULl/zJB/y0IoNxIBzJisCfXXJIhjAHYmsya9uLjlpT+FS6hXszp7jWIYvvTZPsKy5/EDkkQx493rF6nmiodRlKmTz39zcffleoO/NLzSdannY+UKKKKEmx7BRRS1qqTZLqWEpRRR35raGHRDmHeij60c9K05EiLsKKsRWU0v8ABirkWloDl33H0pOokFjL5J4BP0qzFZTyfwYHvWxHbxx/dQU+s3WGkUIdMjH3jmrkcEcfCpT+/WisnUbKsJS0UVmAUUUUAFFFFABR3oooAWP/AFqA8c1H48I/4QrUckcwmmXUjwWk0qcMsZcZ9RXheteJ9Y1yZ/tt7IUPGxDtT8q9XBPQ4MStTH+lWtMwdUtQxwPNGTVWlU7GB9K9E5WtD6mtJIntIvKlRlEY5HNTdua+bbHxLf2TKYLy4iC/weYcV1+m/FTU4v8Aj6SK7Hp92t4TON0j2E+9JXFaf8SdIuRGl0JYJW68fIPxrprHV7DUyfsV5FOR/wA83zitU0ZODRdpuad3pnbnFaIzF7UUUduaZIUUUUAFFFFABVmw/wCP2H/eqtVmw/4/Yf8AerOpsaU9xL//AI/pv9+qxGQQe9Wr/wD4/wCb61V7GpX8MuP8Q8dnH+kSD/apnep74Yvps/36gryKm57lP4TQ0T/kNW3+/XoNefaH/wAhm1+v9K9CHWvOrHVTDtV/TeA9Z5rR0/8A1RNbYJe8c+Mful6newplPr30tDw+bUo6lo9lqsJjniGT0I6iuA1nwdeacTNbf6TB/wCPivThS/WsZ0kzop12jwvBHDAr6g0CvVtX8KWGqAybPJn/AL6V59q3h6/0hj50e6LtInSuOpSaO+nXTMqijtx0orE3uFFFFABRRRQAUUUUAFFFFABRRRQA0gOORxVWaw5yh/CrnSigDGaN42wyU3tW1JGkgwwqlLZd0/KgCnR3PHSlIKH5uDTfpUyBbnY+G7i4fTiGlkZQehNbHbrzWL4aGNMz/tmtmvPq7nZT2DvR3oo71lytjug5oo60tawpNicxKOtLRWyoIhzCiij9a05IIhthRU0dpNJyEOPWrsWl95X/AAFN1IoLGYOferEVnNJ0GBWtFbRRdE596mrF1x2M6LSwPvvn6Vcjt4oh8sY/CpaKydRsqwe1FFFQAUUUUgCiiigAooooAKKKKACiiigAooooArX/APyDrr/rk/8AKvnnZvmKe9fRF/8A8g66/wCuL/yr5+gjzO0h6CvUwRw4kW4iiij461UqSeUyyn0FWNJ0q81vUY7KyjDSt+Qr0tzjvoU+1HOfeu2k+FfiSP7sds3r+9qpL8OPEkfW1jP0anyMn2kTlllkGcPzVmHUbiI/Kzj3Q4rXfwJ4jj/5h0h+gqvJ4S8QRjnSbnrz+6NO0kT7jNPTfiBrFkVH2yRo1/5Zv0Ndhp/xUjcf6dZg57w//Xryy70rUdPjD3dlPCO3mJtqsEcsEHyk/pVqbJnSjY+nLG8i1CyiuoCfLlAODVmsnw3BHb+HLGKJwcQpkg5BOK1+a64O5wzVmJRRRTJCiiigAqzYf8fsP+9VarNh/wAfsP8AvVnU2NKe4X5/06b/AHqqnpVq/wD+P6b61W7VEPgK+2eS6qmzVrpPSSqdaOvps129A/56VnV5VX4j26Pwmhof/IZtfr/SvQh1rz3Q/wDkM2v1/pXoI6V5uIOymL2rSsP9R+NZvY1pWP8AqPxroy9e8cmN+Et0tNpa+g6Hhj6XtTB1p1IodTZI4pV2SoGB6g0tKM4qGrlxkcjrXgaG5zNp5EMn/PPsa4G+0+606cw3ULxt/Ovbffiq17p9rqEHk3UIlj7ZHSuepQudVPEWPE/rR9a7LWvAk1vvn00+bEP+WRPz1x7xyQSmOVCrjqHrknTaO2FRSG0UUd6zNQooooAKKKKACiiigAooooAPpRRRQBHLEkg+YVSms3QZXkVo/Sjtj0oauC3NXQZI4NJG9wvzmryahFLdJCmTnvXOegH4Vb03i+i9KwdG5qqh0fej6UUdaSgkO9wo+vFSpbSyD5YzVuLSzwZX49KbqJBYz+1Sx200hG2M4rYis4Yz8qfnU3Q8Vk6o7GcmlkHMp/KrkVtFH0QZqXoeBS1g5tlWE47UUtFRcAooooAKKKKACiiigAooooAKKKKACiiigAoo+lFABRRx0o74oGwooop2EVr/AP5B10O/lP8AyrwCc+VEYx99jz7V9A33/IPuf+uT/wAq+drh980hJ716mCOHEjVQySBFG5zxivePh54TGgaWLq6Qfbrgb2/2B6Vxvwy8IDULj+2L6E/Z4f8AUg9JH/rXsvOTXr04Hl1ZidqT60uabmt0jlbD8ajmkEUEkrdI0306op4/tEEsR/5aRlKbQJ6ng+vapdeINZmmmk/dKxSMegrPNlHjANaOpadNpGpTWtwmHEhKe6VX+tc7R2QasdL8PNcurDXE0qeQtbTfcB7PXr/bivHPA2kS6h4jivRHm2tPn3/7dexd62pvQ5qthaKPeitTAKKKO1ABVmw/4/Yf96q1WbD/AI/4f96s6mxpT3Evv+P2b/eqsatX/wDx+y/Wqp6VMPgG/iPMvEybNfuvd6x63fFgxrsp9RmsKvKr/Ee3Q+E0ND/5DNr9f6V6EK890P8A5DNr9f6V6CK8zEHbAK07P/UCs361pWnEC115eveOLHPQs0tMFOHWve6HiDqfUfel6UmUP70tIKO9IaHUtNpelSPqLx681mar4fsdXU+fEFlHSQVp5OKO3FS4XNYTaPKtY8JX2lkyIDPb9pB2rn8YPIr3brwehrmta8GWOph5bcCC49uhrkqUDspYg8uorR1XQ77R5SlzEdv/AD0TpWd3wa5XGx1KaYUUfWikWFFFFABRRRQAUUUUAFFFFABVzSkMmoxIvU1TNaWg/wDIZt6mb0GjrItMJ++/4Vcjs4Y+iZPvVjtg0dq8+dRm6QmMe1LRRUDCiiikAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUlH0ppNiFo7UhcJyxAFUJ9YsrchHmByf4Oa0VGTJdRI0O1IzhBy4Aqe0tnvII5oXTypBkP61z/AIy0+/ihiki81ohnzPLBwgAHP862jhqhk68Sxea7Y2fBk8xvRKwbrxZcScQRiIeprns8nijoMDpWipIfOdR4au7m81GZ55C4CdO1dTx3rlvBwcm6/eIFAB2dzXUda56qszSGpDff8g+5/wCuT/yrwrQtKGu+JrXTDJt8+Qg17rff8g+5/wCuT/yr53cv552Z37+1d2COTEn1FZ2cOn2MVrboFjiGwVMwxnp+BqK2CCyhCY/1aE/lT2I7dK92nseHUeoyij8aK2MgpVCFiGzj1FIelFTZgjK8R+HLfXLF42RBcY/dyY5FefWfw81aS4KTPbCKOUIxP8Y7kDFesB/zFN+lRyGntCKzsLbT7NLa1iSOMeg61J3FLRVpEN3CiijtVCEHbkml+nrRR1pAFWbD/j/h/wB6q1WbD/j+h/3qip8BdP4hL7/j9m/3qr1Zv/8Aj+l/36rfSph8A5fEedeMhs1lD6x1zvFdT44GNWtz28quX7815mIXvHsYd+6aGh/8hu1+p/lXoVee6H/yGrX6/wBK9BFeTiNz0IB2rTt/9SlZnatSD/Ur9K7suR52YMlzxS9KbS17vQ8fqP7UtJRUjHdqWm0uaQx9LTM06kVcdS02lqSri07nFMpelIYk1vFcRmKaNGU9iK4vW/AaOHl0w7T1MRrt+1FZTp3NoVOU8OurS4spjDcxPFIOxFQ9+a9q1LS7PVIfLu4kYDofQ1wOt+B7qw3y2RM1uP4P4xXJOk0dlOunucnRSlDGx3Ahx2IpOlY8rOlNMKKKKQwooooAKKKKAA1o6D/yGbf6/wBKzq0dD/5DNt9aipsNbnoHalpO2aWvNkdK2CiiikAUUUUCCiiigAooooAKKKKACiijtTsAe1FJ3wATU8VnNL91MfWtYUZMzdRIh7UdxWnFpQ4Mr5PtVDxLrFl4W0G4vnCLJjEQ/vvXTDBt7nNPEnOa54v0jQGaK5uN1yoyYo+WrCg+IlvqbvFaDyX7eZ1ryS+vZtRv5rq4fdJMxc/jVfnP8j6V0wwyRm8Q2ewT6hc3fMtweO2cVyHiPXDGBa2so8w/6xx2FcuNQukj8oXD7T2zVb77D++etdMIJMwnJn1B4PfZ4O0hF7WsfPrxWpexfbLGe2OMyxun5iqPhCMx+DtIQ9Rax/yrW2AHINdXL7pyuT5jxKSMxSvGeqvim1f1qCO31y7hizsWU4zVCvLqKzPWpu8Tf8JkDUJM/wDPOuz71xHhX/kKHHdK7f0rhrbnTBEF6QLK4LEACM9uteT+F/Bh1zxL5bOWs4v3krg4/wCAV63NGJ4niJH7xNnTpT/Dfh+38OWksUJ8yWZg8jnvXfl6uefjJ2NfyxAqIp+UDGBTaV+SM/zpK91KyPEbuHSk+tFAA7YqhCEvuXCDaevPSndqO9FAAaT8KWigLid+lL2oooAKKKKACiiigQVZsP8Aj+h/3qrVZsP+P+H/AHqip8BpT+IS+/4/ZiePmqsa2LrTHkuncSKFY9MVCNJbr5i8e1Z06iSKmveOe1PR7XVYtlwnI+64ri9U8JXtmWktwZ4h6da9VXSZGBzKvH+zS/2NKQf3sfHX5etY1Ixkb0ZyieMaIhTXbZWGHD/0r0BQX+71rcl8G281zHO/lecp+8Fq0NBdOBLHx/s1508KpSO5YlpGCts5PzcVcjGFA9K0jpEn/PVf++aBpEh/5ap/3zXdh6caRw160qhQ7Uuav/2TJ/z1X/vmnf2Q/wDz1X/vmur2iOflM+lq+NJk/wCeq/lS/wBlP/z0X8qXtEPkKPNLVz+y36eYn5U4aY//AD0X8qXMiuQpUozV3+y3/wCei/lR/Zb/APPRfyqfaILFWirY0xv+egpf7Nb/AJ6D8qXOVYp0vSrn9mP/AM9RS/2Y/wDz0X8qXtB2ZT7UVc/s1/8Anov5Uo01/wDnov5Uc4JFTvRVv+zW/wCegoOmt/fX8qV0ylc5rWfC9hq6l2jEU3Z0rzzWPDF/o5LyR+ZB2lFe0/2c/wDz0FKdJMiEMyMvoVrCpBM6adRo+ex1560dq9Z1n4b296we0mW2mPX5crWMPhVeqeNSt+f9g1zOB2Qmef8A1or0I/Ce+x/yErb/AL9mj/hU9/8A9BO2/wC/ZqbMfMee0V6D/wAKpv8A/oJ23/fs0f8ACqb/AP6Cdt/37NLkK5zz4da0dD/5DFtn1rrx8Kb7/oJW3/fDVYsfhneWl/FM+owMFPQIazmtBqZZ780tbX/CNTZ5nj/I0n/CPS/8/C/981xOmbKoY2Pf9KK2P+Eel/5+F/75p3/CPS/8/C/981PsWP2hi0Vtf8I9L/z8L/3zR/wj0v8Az8L/AN81XsZD9ojForZ/4R6X/n4T/vmj/hHJ/wDnvH+RqfZi9ojGora/4R2b/n4T/vmj/hHZv+fhP++aPZh7RGJ35NKOvFb8Xhs5/eTgj2FX4tDWIYUx59dtdFLDc25lOrbY5mKyuJRxH8vqauRaUMZlf8BW/wD2Y+M+YufpTDp74zvTP0rvp4aJw1MTIzo7eKL7qYqb6Vd/s9/76/lR/Zr4/wBYv5V1QhGJzOcpGVfXlvp9lLdXUojhiGXfNfN/jvxhL4r1cuuVs4eIY/617X44+H/iHxVIsEOtW1tYIuREVYkn3/M1xv8Awzzq2f8AkO2X/fpqbZUEeNdsUHpXsv8Awzxq3/Qdsv8Av01L/wAM76v/ANByw/79PWdzax4z2p8f+tX6+tew/wDDPOr5x/blhn18p6ltP2fNQS6je61q0aDcCyJGwJpp6ktaHoHhp/M8M6WR0Nslanf3qxa6CLCzitIJAIYk2qPpU/8AZUhx+9X8q6OfQ5GtTxbxOhTxHeZ7yVk16lrPw4u9T1WW4jvreMMM7ShrN/4VTff9BK2/74avPqLU9Si7I5nwsf8Aibc+ldwelR6V8N7vTr0TtfwPx0CGugPhqYciePP0NefVhqdMKhhg/Mlao6DHapk8NzZB+0rx/s1cOjyDgzL/AN816GX+6edjtTO7U3vzWkdJk/56r/3zSf2Q/wDz1X/vmvX9qjyuQze9L+FaX9kyf89V/wC+aT+ypf8Anqn/AHzT9qg5DO/CkrT/ALJk/wCeq/8AfNH9kyf89V/75pe1QchmUVo/2TJ/z1X/AL5o/smT/nqv/fNP2qFyGdRWl/ZUv/PVP++aP7Kl/wCeqf8AfNP2qHyMzaK0f7Jk/wCeq/8AfNH9kyf89V/75o9qg5DOorR/smT/AJ6r/wB80f2TJ/z1X/vmj2qFyGdVqx/4/Ycf3qsf2VL/AM9U/wC+amtNMeK4jkMoIU9KzqVE1Y0pw1P/2Q==";
public static void main(String[] args) throws InterruptedException {
// //创建静态模板
buildTemplate("V2_静态模板", 0);
// //创建动态模板
// buildTemplate("V2_唐华春动态模板", 1);
// //查询模板状态
// queryTemplateStatus("1418");
// //查询模板列表
// queryTemplateList("3");
// //发送静态模板
// sendStaticTemplate("10401", "18717950159");
// //发送动态模板
// sendDynamicTemplate("10873");
}
private static void buildTemplate(String templateName, int isDynamic) {
//封装模板内容
Map<String, Object> contentMap = new TreeMap<>();
contentMap.put("exType", "txt");
contentMap.put("sort", "1");
contentMap.put("type", "text");
if (isDynamic == 1) {
contentMap.put("content", "V2动态模板变量一${v1}变量二${v2}变量三${v3}变量四${v4}变量五${v5}");
} else {
contentMap.put("content", "疫情从未停止,大家仍然提高警惕,坚持佩戴口罩!\n" +
"此信息免流,回T退订");
}
List<Map<String, Object>> contentList = new ArrayList<>();
contentList.add(contentMap);
Map<String, Object> contentMap2 = new TreeMap<>();
contentMap2.put("exType", "jpg");
contentMap2.put("sort", "2");
contentMap2.put("type", "image");
contentMap2.put("content", base64);
contentList.add(contentMap2);
//封装需要加密的内容
Map<String, Object> map = new TreeMap<>();
map.put("appId", appId);
map.put("sign", sign);
map.put("body", contentList);
map.put("templateName", templateName);
map.put("isDynamic", isDynamic);
map.put("timestamp", System.currentTimeMillis() / 1000);
//生成签名
map.put("signature", sha256(map2Plaintext(map)));
//请求生成模板
String url = host + "/rcs/api/v2/template/addVideo";
System.out.println("准备提交的参数为:" + JSONUtil.toJsonStr(map));
System.out.println("提交返回值:" + HttpUtil.post(url, JSONUtil.toJsonStr(map)));
}
private static String listTreeMapToString(List<TreeMap> list) {
StringBuilder s = new StringBuilder("[");
for (int i = 0; i < list.size(); i++) {
s.append("{");
list.get(i).forEach((k, v) -> {
s.append(k.toString());
s.append("=");
s.append(v.toString());
});
s.append("}");
if (i < list.size() - 1) {
s.append(",");
}
}
s.append("]");
return s.toString();
}
private static String listObjectToString(List<Object> list) {
StringBuilder s = new StringBuilder("[");
for (int i = 0; i < list.size(); i++) {
s.append(list.get(i).toString());
if (i < list.size() - 1) {
s.append(",");
}
}
s.append("]");
return s.toString();
}
private static void queryTemplateStatus(String templateId) {
String url = host + "/rcs/api/v2/template/findTemplate";
Map<String, Object> map = new TreeMap<>();
map.put("appId", appId);
map.put("templateId", templateId);
map.put("timestamp", System.currentTimeMillis() / 1000);
map.put("signature", sha256(map2Plaintext(map)));
String res = HttpUtil.post(url, JSONUtil.toJsonStr(map));
System.out.println("准备提交的参数为:" + JSONUtil.toJsonStr(map));
System.out.println("查询模板状态结果:" + res);
}
private static void queryTemplateList(String status) {
String url = host + "/rcs/api/v2/template/listVideoTemplate";
Map<String, Object> map = new TreeMap<>();
map.put("appId", appId);
map.put("pageNo", 1);
map.put("pageSize", 10);
map.put("status", status);
map.put("timestamp", System.currentTimeMillis() / 1000);
map.put("signature", sha256(map2Plaintext(map)));
String res = HttpUtil.post(url, JSONUtil.toJsonStr(map));
System.out.println("准备提交的参数为:" + JSONUtil.toJsonStr(map));
System.out.println("查询模板列表结果:" + res);
}
private static void sendStaticTemplate(String templateId, String phone) {
Map<String, Object> map = new TreeMap<>();
map.put("appId", appId);
map.put("submitNo", UUID.fastUUID().toString().replaceAll("-", ""));
map.put("templateId", templateId);
List<String> phones = new ArrayList<>();
phones.add(phone);
map.put("phones", phones);
map.put("timestamp", System.currentTimeMillis() / 1000);
map.put("signature", sha256(map2Plaintext(map)));
String url = host + "/rcs/api/v2/msg/submitVideoTemplate";
System.out.println("准备提交的参数为:" + JSONUtil.toJsonStr(map));
System.out.println("发送静态模板结果:" + HttpUtil.post(url, JSONUtil.toJsonStr(map)));
}
private static void sendDynamicTemplate(String templateId) {
List<Map<String, Object>> mapList = new ArrayList<>();
mapList.add(buildDynamicVars("13900001111"));
mapList.add(buildDynamicVars("17600001111"));
mapList.add(buildDynamicVars("18900001111"));
Map<String, Object> map = new TreeMap<>();
map.put("appId", appId);
map.put("submitNo", UUID.fastUUID().toString().replaceAll("-", ""));
map.put("dynamicVars", mapList);
map.put("timestamp", System.currentTimeMillis() / 1000);
map.put("templateId", templateId);
map.put("signature", sha256(map2Plaintext(map)));
String url = host + "/rcs/api/v2/msg/submitVideoTemplate";
System.out.println("准备提交的参数为:" + JSONUtil.toJsonStr(map));
System.out.println("发送动态模板结果:" + HttpUtil.post(url, JSONUtil.toJsonStr(map)));
}
private static Map<String, Object> buildDynamicVars(String phone) {
Map<String, Object> dynamicVars = new TreeMap<>();
dynamicVars.put("phone", phone);
dynamicVars.put("v1", "变量1");
dynamicVars.put("v2", "变量2");
dynamicVars.put("v3", "变量3");
dynamicVars.put("v4", "变量4");
dynamicVars.put("v5", "变量5");
return dynamicVars;
}
private static String map2Plaintext(Map<String, Object> map) {
StringBuilder builder = new StringBuilder();
map.forEach((k, v) -> {
if (!"body".equals(k)) {
if (v instanceof List) {
if (JSONUtil.toJsonStr(v).contains("{")) {
List<TreeMap> list = JSONUtil.toList(JSONUtil.toJsonStr(v), TreeMap.class);
builder.append(k).append("=").append(listTreeMapToString(list));
} else {
List<Object> list = JSONUtil.toList(JSONUtil.toJsonStr(v), Object.class);
builder.append(k).append("=").append(listObjectToString(list));
}
} else {
builder.append(k).append("=").append(v);
}
}
});
return builder.toString();
}
private static String byte2String(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
int v = b & 0xFF;
String hv = Integer.toHexString(v).toLowerCase(Locale.CHINA);
if (hv.length() < 2) {
sb.append(0);
}
sb.append(hv);
}
return sb.toString();
}
private static String sha256(String plaintext) {
try {
System.out.println("需要加密的参数为:" + plaintext);
Mac sha256 = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(appSecret.getBytes(), "HmacSHA256");
sha256.init(secretKey);
byte[] bytes = sha256.doFinal(plaintext.getBytes());
String sign = byte2String(bytes);
System.out.println("签名为:" + sign);
return sign;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
没有更多了