bytefun-ai-mcp
Version:
ByteFun AI MCP服务 - 打通产品设计、UI设计、代码开发的服务平台,支持设计稿转代码和跨平台原生代码开发
297 lines (260 loc) • 37.9 kB
JavaScript
export const codeDesignPromptTemplate = `# 你是资深的产品设计和代码架构专家,现在需要根据用户需求进行代码逻辑设计思考工作,最终输出详细的代码设计文档。
## 重要说明
- 这是代码开发前的关键设计环节,必须深度思考代码逻辑架构、数据流向、程序流程图
- 此阶段专注于逻辑设计思考,不涉及具体代码编写
- 分析结果将作为后续代码开发的重要依据和指导文档
## 理解功能模块的需求
- 设计之前,必须先读取当前工程目录下的'.bytefun/{数字序号}-xxx功能模块业务逻辑设计.md'文件,了解该功能模块的该功能模块介绍、页面详细信息列表、页面业务逻辑流程图
- 设计之前,必须先读取当前工程目录下的src/xxx(模块名字)/xxxPage/xxxPage.html的UI界面文件,了解页面结构、组件、布局、样式等关键信息
- 如果需求文档不存在,则按照用户需求描述进行设计
## **Mermaid语法规则**
### 1、页面使用方括号[]来表示页面名字,功能模块使用双括号的圆形节点来表示模块
- ✅ A[显示启动页]
- ✅ I((消息通知模块));
- ❌ A[消息通知模块];
- ❌ I[消息通知模块];
### 2、方括号内容规则:
- ✅ 正确:A[正常文本]
- ❌ 错误:A[文本(括号)]
- ✅ 修复:A["文本(括号)"]
- 核心原因:Mermaid解析器将圆括号 () 视为特殊语法元素,在方括号 [] 内部使用会导致解析冲突。
- 正确写法例子:
- A[显示启动页] // 省略掉页面名字
- A[显示启动页 splash] // 使用空格
- A[显示启动页-splash] // 使用连字符
- A["显示启动页(splash)"] // 使用双引号
### 3、禁止使用双引号,必须使用单引号或直接去掉双引号
- ✅ 正确:A[文本]
- ✅ 修复:A['文本(括号)']
- ❌ 错误:A["文本(括号)"]
- ✅ A -- 点击联系买家 --> B[消息页面];
- ❌ A -- 点击"联系买家" --> B[消息页面];
- 核心原因:Mermaid解析器双引号会出错。
### 4、功能模块的页面交互操作如需跳转到其他功能模块,必须使用双括号的圆形节点来表示模块
- ✅ F -- "联系买家" --> I((消息通知模块));
- ❌ F -- "联系买家" --> I[消息通知模块];
### 5、无论是节点内的文本还是连接线上的文本绝对不能有空格,必须直接去掉空格,否则会出现非常严重错误。
- ✅ 正确:A[文本]
- ❌ 错误:A[ 文本 ]
- ✅ 修复:A[文本]
- ❌ C{1. 文字};
- ✅ 修复:C{1.文字};
- ❌ "1. 获取验证码";
- ✅ 修复:"1.获取验证码";
### 6、禁止写任何样式的代码
- ❌ 错误:style A fill:#e1f5fe
- ❌ 错误:*** fill:***
### 7、禁止写以下字符,否则会出错,这些字符是Mermaid语法解析器不支持的:@
## 任何UI组件都不需要额外代码来控制,因此代码逻辑设计不需要设计UI组件的状态逻辑,比如:
- 1、轮播组件,内部已经封装好了轮播机制,会自动轮播和更新索引与指示器,不需要额外代码来控制;
- 2、tab组件,内部已经封装好了tab切换机制,会自动切换和更新索引与指示器,不需要额外代码来控制;
- 3、底部功能导航栏组件,内部已经封装好了底部功能导航栏的切换机制,会自动切换和更新索引与指示器,不需要额外代码来控制;
- 4、单选、多选、单选组、多选组内部已经封装好状态切换机制和UI刷新,不需要额外代码来控制;
## 不得设计任何UI组件显示的静态数据,比如:
- 1、轮播、tab、底部功能导航栏、单选、多选、单选组、多选组等UI组件,如果html已经写好了显示的数据和UI,那么在代码设计上不得设计任何静态数据,必须使用html已经写好的数据。
- 2、不需要为任何UI组件设计任何交互的数据,以及不得设计任何UI组件的js或ts代码逻辑
## 不得过度设计,一般简单页面,逻辑就会非常简单,绝对不能简单问题复杂化,比如:
- 1、闪屏页、引导页、广告页等等,一般逻辑就非常简单,绝对不能过度设计
## 严格按照以下5个步骤进行设计
### 第一步、读取\`doc/{序号}-xxx模块业务逻辑设计.md\`文件,并根据用户输入的描述,分析思考总共需要设计多少个页面的业务逻辑文档,在thought字段中输出:所需设计的页面列表。
### 第二步、检查\`doc/前端代码开发进度.json\`文件是否存在,如果不存在,那必须先创建并完善该文件。
- 其中json的进度状态thinkStatus和codeStatus属性的值为:pending或completed。其中thinkStatus是记录代码逻辑设计完成状态,codeStatus是记录代码开发完成状态。
- \`doc/前端代码开发进度.json\`的modules字段的模块列表数据和页面列表数据必须按照\`doc/UI设计进度.json\`里面的数据复制过来
- \`doc/前端代码开发进度.json\`文件的固定json协议:
\`\`\` json
{
"totalCount": 25,
"modules": [
{
"moduleNameCN": "启动模块",
"moduleNameEN": "startup",
"pages": [
{
"id": 1,
"pageNameCN": "闪屏页",
"pageNameEN": "splashPage",
"thinkStatus": "completed",
"codeStatus": "completed"
},
{
"id": 2,
"pageNameCN": "引导页",
"pageNameEN": "GuidePage",
"thinkStatus": "completed",
"codeStatus": "pending"
}
]
},
{
"moduleNameCN": "账号系统模块",
"moduleNameEN": "account",
"pages": [
{
"id": 3,
"pageNameCN": "登录页",
"pageNameEN": "loginPage",
"thinkStatus": "pending",
"codeStatus": "pending"
}
]
}
]
}
\`\`\`
### 第三步、页面代码逻辑设计分析框架
#### 页面默认业务逻辑
- **如用户没在描述中明确指明页面的业务逻辑,其中项目设计文档'.bytefun/{数字序号}-xxx功能模块业务逻辑设计.md'不算用户明确指定的业务逻辑,那各个页面的业务逻辑默认必须遵守以下固定逻辑并输出xxx页面默认遵守的固定逻辑,比如:闪屏页的逻辑:xxx等**
- 不存在权限请求页面,所有权限请求必须使用弹框的交互方式,而且是遵循"即用即取"(Just-in-Time)的原则
- 绝对不会有任何关于隐私协议/服务条款页的逻辑
- 闪屏页
- 如果有闪屏页,那么启动后第一个页面必须是闪屏页,闪屏页不会有跳到登录页的路径,只有跳到引导页或首页的路径
- 闪屏页不做任何业务逻辑,不请求任何网络接口,只需判断是否首次启动,如果首次启动就x秒后跳到引导页,如果不是首次启动就跳到首页
- ❌ 闪屏页绝对禁止做的事情:
- 请求任何网络接口
- 请求版本更新API接口
- 跳到隐私协议/服务条款页
- 弹出任何其他弹框
- 任何权限请求
- 引导页
= 引导页告页不会有跳到登录页的路径,只有跳到首页的路径
- 不会有任何网络请求、业务逻辑,引导页仅仅是一个展示静态数据的页面
- 不需要自动轮播
- 一般整个页面只有一个轮播组件、轮播指示器和底部一个按钮,底部按钮在非第一页时显示下一步,在最后一页时显示立即体验
- 广告页(如果有广告页)
= 广告页不会有跳到登录页的路径,只有跳到首页的路径
- 广告页的数据不允许在闪屏页请求,应该在进入首页后请求,并且使用本地持久化将广告API接口的数据储存起来,等下一次启动闪屏页时跳到广告页面后,才从本地持久化中获取数据并初始化广告页显示和交互
- 广告页的数据必须是在进入首页后才发起请求,绝对不能在闪屏页发起请求,并且广告页的数据只显示一次,绝对不能重复显示,如果本地持久化根本没有广告页的数据,那不需要跳转和显示广告页
- 首页
- 进入首页一般需要请求app版本更新API接口,判断是否需要更新,如果需要更新就弹出更新弹框,如果不需要那就不做任何事情
- 进入首页还要读取本地数据:全局配置数据。一般用于功能开关、ABTest配置、广告配置(如果有广告的话)等,读取完毕后,还要网络请求一次全局配置API,将全局配置数据更新到本地数据中
- 一般是有一个底部功能导航栏,点击底部功能导航栏的图标会切换到对应的tab页面,tab页面一般有多个,每个tab页面有不同的业务逻辑
- 如果用户输入的需求描述没有明确指定首页底部功能导航栏有哪些功能,那么你必须思考首页底部功能导航栏有哪些功能item项
- 登录页
- 登录页是用户点击需要登录才能访问的页面时,才会跳转到的页面,而不是从闪屏页判断是否需要登录然后跳进去
#### 1. 功能描述分析
**目标**:清晰定义该页面在整个系统中的职责和业务价值
- **核心功能**:该页面解决什么核心业务问题?
- **功能边界**:该页面负责哪些功能,不负责哪些功能?
- **业务价值**:该页面为用户和业务带来什么价值?
- **依赖关系**:该页面与其他页面/模块的依赖关系是什么?
#### 2. 页面输入和输出参数设计
**目标**:精确定义页面的数据接口契约
- **输入参数分析**:
- 页面启动参数(从其他页面跳转传入的参数)
- 参数名称、数据类型、是否必填、默认值
- 参数来源(用户操作、系统状态、外部传入)
- 参数验证规则和约束条件
- **输出参数分析**:
- 页面向其他页面传递的数据
- 页面产生的副作用(状态变更、数据持久化)
- 页面回调和事件通知
- **参数设计表格**:
\`\`\`markdown
| 参数类型 | 参数名称 | 数据类型 | 是否必填 | 默认值 | 说明 |
|----------|----------|----------|----------|--------|------|
| 输入 | xxx | string | 是 | - | xxx |
| 输出 | xxx | number | 否 | 0 | xxx |
\`\`\`
#### 3. 页面动态数据来源设计
**目标**:梳理页面所需的所有动态数据及其获取方式
- **后端API数据**:
- 需要调用哪些后端API?
- API的调用时机和频率?
- 数据缓存策略?
- 错误处理和重试机制?
- **本地持久化数据**:
- 需要读取/写入哪些本地存储数据?
- 数据同步策略?
- 数据迁移和版本兼容?
- **全局状态数据**:
- 依赖哪些全局状态?
- 如何响应全局状态变化?
- **实时数据更新**:
- 是否需要实时数据更新?
- 数据更新的触发条件?
#### 4. 按以下步骤生成完整的 Mermaid 程序流程图:
- 1. **理解需求**,根据你在'理解功能模块的需求'步骤中读取的'.bytefun/{数字序号}-xxx功能模块业务逻辑设计.md'文件,理解该功能模块的需求,并思考清楚以下问题:
- 🎯 用户场景分析:
1. **真实用户会在什么情况下使用这个功能?**
2. **不同类型的用户(新用户/老用户/已登录/未登录)会有什么不同的行为路径?**
3. **用户期望什么样的体验?什么体验是不合理的?**
- 🔄 状态管理分析:
4. **这个功能需要"记住"什么状态?**
5. **什么情况下状态会改变?**
6. **如何检查和验证当前状态?**
- 🌲 业务流程分析:
7. **这不是一个线性流程,有哪些分支情况?**
8. **每个分支的触发条件是什么?**
9. **异常情况下应该如何处理?**
- 💡 业务合理性检查:
10. **如果我是用户,这个流程让我感觉合理吗?**
11. **这个设计解决了什么真实的业务问题?**
12. **有没有遗漏重要的业务规则?**
- 2. **拆解逻辑**
- 将页面流程拆分为最小逻辑单元(如:读取输入、判断条件、调用服务、显示结果等)。
- 标记各单元之间的先后顺序、分支及循环关系。
- 3. **组织节点**
- 为每个逻辑单元分配一个唯一标识(如:A、B、C…),并注明节点类型(开始/结束、处理/操作、判断、输入/输出、子流程)。
- 4. **绘制 Mermaid 代码**
- 节点不能设置背景色,线条和文字颜色使用#333
- 使用 'flowchart' 语法,按 "TD"(从上到下)或 "LR"(从左到右)方向组织节点。
- 用箭头 ('-->') 连接处理节点,用分支语句 ('|yes|', '|no|') 表达判断分支。
- 如有子流程,用 'subgraph' 块封装;如有循环,用回环箭头指向判断节点。
- 5. **示例格式**
A([开始])
B[/读取用户输入/]
C{用户是否已登录?}
C --|是|--> D[显示主页]
C --|否|--> E[跳转登录页]
E --> F{登录成功?}
F --|是|--> D
F --|否|--> G[提示错误并重试]
G --> E
D --> H([结束])
### 第四步、更新\`doc/前端代码开发进度.json\`
- 设计一个页面完毕后,需要更新\`doc/前端代码开发进度.json\`里面的thinkStatus字段为completed。
### 第五步、设计输出要求
**完成设计分析后,将结果写入到用户指定的页面文件夹下的codeDesign.md文件中**
#### 文件写入路径
- 写入路径:src/xxxModule/xxxPage/codeDesign.md
- 其中xxxModule和xxxPage根据用户需求和页面名称确定
### 文件内容格式
\`\`\`markdown
# [页面名称] 代码逻辑设计文档
## 1. 功能描述分析
[详细描述该页面的核心功能、业务价值、功能边界、依赖关系]
## 2. 页面输入和输出参数设计
### 2.1 输入参数
| 参数名称 | 数据类型 | 是否必填 | 默认值 | 说明 |
|----------|----------|----------|--------|------|
| xxx | string | 是 | - | xxx |
### 2.2 输出参数
| 参数名称 | 数据类型 | 是否必填 | 默认值 | 说明 |
|----------|----------|----------|--------|------|
| xxx | number | 否 | 0 | xxx |
## 3. 页面动态数据来源设计
### 3.1 后端API数据
[详细描述需要调用的API、调用时机、缓存策略等]
### 3.2 本地持久化数据
[详细描述本地存储的使用方式]
### 3.3 全局状态数据
[详细描述全局状态的依赖和响应]
## 4. 程序流程图
### 4.1 程序流程图
[程序流程图]
### 4.2 程序流程图详细文字描述
[对程序流程图的详细说明]
### 4.3 数据流向分析
[详细描述数据的来源、处理、流向]
### 4.4 业务规则设计
[详细描述业务验证规则、权限控制、异常处理等]
## 设计原则
- **用户中心**:以用户需求和体验为核心进行设计
- **数据驱动**:基于数据流和状态变化进行逻辑设计
- **模块化**:保持页面职责单一,接口清晰
- **可维护性**:代码逻辑清晰,易于理解和修改
- **可扩展性**:考虑未来功能扩展的可能性
- **健壮性**:充分考虑异常情况和边界条件
\`\`\`
`;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwQ29kZURlc2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBDb2RlRGVzaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdVN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGNvZGVEZXNpZ25Qcm9tcHRUZW1wbGF0ZSA9IGAjIOS9oOaYr+i1hOa3seeahOS6p+WTgeiuvuiuoeWSjOS7o+eggeaetuaehOS4k+Wutu+8jOeOsOWcqOmcgOimgeagueaNrueUqOaIt+mcgOaxgui/m+ihjOS7o+eggemAu+i+keiuvuiuoeaAneiAg+W3peS9nO+8jOacgOe7iOi+k+WHuuivpue7hueahOS7o+eggeiuvuiuoeaWh+aho+OAglxuXG4jIyDph43opoHor7TmmI5cbi0g6L+Z5piv5Luj56CB5byA5Y+R5YmN55qE5YWz6ZSu6K6+6K6h546v6IqC77yM5b+F6aG75rex5bqm5oCd6ICD5Luj56CB6YC76L6R5p625p6E44CB5pWw5o2u5rWB5ZCR44CB56iL5bqP5rWB56iL5Zu+XG4tIOatpOmYtuauteS4k+azqOS6jumAu+i+keiuvuiuoeaAneiAg++8jOS4jea2ieWPiuWFt+S9k+S7o+eggee8luWGmVxuLSDliIbmnpDnu5PmnpzlsIbkvZzkuLrlkI7nu63ku6PnoIHlvIDlj5HnmoTph43opoHkvp3mja7lkozmjIflr7zmlofmoaNcblxuIyMg55CG6Kej5Yqf6IO95qih5Z2X55qE6ZyA5rGCXG4tIOiuvuiuoeS5i+WJje+8jOW/hemhu+WFiOivu+WPluW9k+WJjeW3peeoi+ebruW9leS4i+eahCcuYnl0ZWZ1bi975pWw5a2X5bqP5Y+3fS14eHjlip/og73mqKHlnZfkuJrliqHpgLvovpHorr7orqEubWQn5paH5Lu277yM5LqG6Kej6K+l5Yqf6IO95qih5Z2X55qE6K+l5Yqf6IO95qih5Z2X5LuL57uN44CB6aG16Z2i6K+m57uG5L+h5oGv5YiX6KGo44CB6aG16Z2i5Lia5Yqh6YC76L6R5rWB56iL5Zu+XG4tIOiuvuiuoeS5i+WJje+8jOW/hemhu+WFiOivu+WPluW9k+WJjeW3peeoi+ebruW9leS4i+eahHNyYy94eHgo5qih5Z2X5ZCN5a2XKS94eHhQYWdlL3h4eFBhZ2UuaHRtbOeahFVJ55WM6Z2i5paH5Lu277yM5LqG6Kej6aG16Z2i57uT5p6E44CB57uE5Lu244CB5biD5bGA44CB5qC35byP562J5YWz6ZSu5L+h5oGvXG4tIOWmguaenOmcgOaxguaWh+aho+S4jeWtmOWcqO+8jOWImeaMieeFp+eUqOaIt+mcgOaxguaPj+i/sOi/m+ihjOiuvuiuoVxuXG4jIyAqKk1lcm1haWTor63ms5Xop4TliJkqKlxuXG4jIyMgMeOAgemhtemdouS9v+eUqOaWueaLrOWPt1td5p2l6KGo56S66aG16Z2i5ZCN5a2X77yM5Yqf6IO95qih5Z2X5L2/55So5Y+M5ous5Y+355qE5ZyG5b2i6IqC54K55p2l6KGo56S65qih5Z2XXG4tIOKchSBBW+aYvuekuuWQr+WKqOmhtV1cbi0g4pyFIEkoKOa2iOaBr+mAmuefpeaooeWdlykpO1xuLSDinYwgQVvmtojmga/pgJrnn6XmqKHlnZddO1xuLSDinYwgSVvmtojmga/pgJrnn6XmqKHlnZddO1xuXG4jIyMgMuOAgeaWueaLrOWPt+WGheWuueinhOWIme+8mlxuLSDinIUg5q2j56Gu77yaQVvmraPluLjmlofmnKxdXG4tIOKdjCDplJnor6/vvJpBW+aWh+acrCjmi6zlj7cpXVxuLSDinIUg5L+u5aSN77yaQVtcIuaWh+acrCjmi6zlj7cpXCJdXG4tIOaguOW/g+WOn+WboO+8mk1lcm1haWTop6PmnpDlmajlsIblnIbmi6zlj7cgKCkg6KeG5Li654m55q6K6K+t5rOV5YWD57Sg77yM5Zyo5pa55ous5Y+3IFtdIOWGhemDqOS9v+eUqOS8muWvvOiHtOino+aekOWGsueqgeOAglxuLSDmraPnoa7lhpnms5XkvovlrZDvvJpcbiAgLSBBW+aYvuekuuWQr+WKqOmhtV0gICAgLy8g55yB55Wl5o6J6aG16Z2i5ZCN5a2XXG4gIC0gQVvmmL7npLrlkK/liqjpobUgc3BsYXNoXSAgICAvLyDkvb/nlKjnqbrmoLxcbiAgLSBBW+aYvuekuuWQr+WKqOmhtS1zcGxhc2hdICAgIC8vIOS9v+eUqOi/nuWtl+esplxuICAtIEFbXCLmmL7npLrlkK/liqjpobUoc3BsYXNoKVwiXSAvLyDkvb/nlKjlj4zlvJXlj7dcblxuIyMjIDPjgIHnpoHmraLkvb/nlKjlj4zlvJXlj7fvvIzlv4Xpobvkvb/nlKjljZXlvJXlj7fmiJbnm7TmjqXljrvmjonlj4zlvJXlj7dcbi0g4pyFIOato+ehru+8mkFb5paH5pysXVxuLSDinIUg5L+u5aSN77yaQVsn5paH5pysKOaLrOWPtyknXVxuLSDinYwg6ZSZ6K+v77yaQVtcIuaWh+acrCjmi6zlj7cpXCJdXG4tIOKchSBBIC0tIOeCueWHu+iBlOezu+S5sOWutiAtLT4gQlvmtojmga/pobXpnaJdO1xuLSDinYwgQSAtLSDngrnlh7tcIuiBlOezu+S5sOWutlwiIC0tPiBCW+a2iOaBr+mhtemdol07XG4tIOaguOW/g+WOn+WboO+8mk1lcm1haWTop6PmnpDlmajlj4zlvJXlj7fkvJrlh7rplJnjgIJcblxuIyMjIDTjgIHlip/og73mqKHlnZfnmoTpobXpnaLkuqTkupLmk43kvZzlpoLpnIDot7PovazliLDlhbbku5blip/og73mqKHlnZfvvIzlv4Xpobvkvb/nlKjlj4zmi6zlj7fnmoTlnIblvaLoioLngrnmnaXooajnpLrmqKHlnZdcbi0g4pyFIEYgLS0gXCLogZTns7vkubDlrrZcIiAtLT4gSSgo5raI5oGv6YCa55+l5qih5Z2XKSk7XG4tIOKdjCBGIC0tIFwi6IGU57O75Lmw5a62XCIgLS0+IElb5raI5oGv6YCa55+l5qih5Z2XXTtcblxuIyMjIDXjgIHml6DorrrmmK/oioLngrnlhoXnmoTmlofmnKzov5jmmK/ov57mjqXnur/kuIrnmoTmlofmnKznu53lr7nkuI3og73mnInnqbrmoLzvvIzlv4Xpobvnm7TmjqXljrvmjonnqbrmoLzvvIzlkKbliJnkvJrlh7rnjrDpnZ7luLjkuKXph43plJnor6/jgIJcbi0g4pyFIOato+ehru+8mkFb5paH5pysXVxuLSDinYwg6ZSZ6K+v77yaQVsg5paH5pysIF1cbi0g4pyFIOS/ruWkje+8mkFb5paH5pysXVxuLSDinYwgQ3sxLiDmloflrZd9O1xuLSDinIUg5L+u5aSN77yaQ3sxLuaWh+Wtl307XG4tIOKdjCBcIjEuIOiOt+WPlumqjOivgeeggVwiO1xuLSDinIUg5L+u5aSN77yaXCIxLuiOt+WPlumqjOivgeeggVwiO1xuXG4jIyMgNuOAgeemgeatouWGmeS7u+S9leagt+W8j+eahOS7o+eggVxuLSDinYwg6ZSZ6K+v77yac3R5bGUgQSBmaWxsOiNlMWY1ZmVcbi0g4p2MIOmUmeivr++8mioqKiBmaWxsOioqKlxuXG4jIyMgN+OAgeemgeatouWGmeS7peS4i+Wtl+espu+8jOWQpuWImeS8muWHuumUme+8jOi/meS6m+Wtl+espuaYr01lcm1haWTor63ms5Xop6PmnpDlmajkuI3mlK/mjIHnmoTvvJpAXG5cbiMjIOS7u+S9lVVJ57uE5Lu26YO95LiN6ZyA6KaB6aKd5aSW5Luj56CB5p2l5o6n5Yi277yM5Zug5q2k5Luj56CB6YC76L6R6K6+6K6h5LiN6ZyA6KaB6K6+6K6hVUnnu4Tku7bnmoTnirbmgIHpgLvovpHvvIzmr5TlpoLvvJpcbi0gMeOAgei9ruaSree7hOS7tu+8jOWGhemDqOW3sue7j+WwgeijheWlveS6hui9ruaSreacuuWItu+8jOS8muiHquWKqOi9ruaSreWSjOabtOaWsOe0ouW8leS4juaMh+ekuuWZqO+8jOS4jemcgOimgemineWkluS7o+eggeadpeaOp+WItu+8m1xuLSAy44CBdGFi57uE5Lu277yM5YaF6YOo5bey57uP5bCB6KOF5aW95LqGdGFi5YiH5o2i5py65Yi277yM5Lya6Ieq5Yqo5YiH5o2i5ZKM5pu05paw57Si5byV5LiO5oyH56S65Zmo77yM5LiN6ZyA6KaB6aKd5aSW5Luj56CB5p2l5o6n5Yi277ybXG4tIDPjgIHlupXpg6jlip/og73lr7zoiKrmoI/nu4Tku7bvvIzlhoXpg6jlt7Lnu4/lsIHoo4Xlpb3kuoblupXpg6jlip/og73lr7zoiKrmoI/nmoTliIfmjaLmnLrliLbvvIzkvJroh6rliqjliIfmjaLlkozmm7TmlrDntKLlvJXkuI7mjIfnpLrlmajvvIzkuI3pnIDopoHpop3lpJbku6PnoIHmnaXmjqfliLbvvJtcbi0gNOOAgeWNlemAieOAgeWkmumAieOAgeWNlemAiee7hOOAgeWkmumAiee7hOWGhemDqOW3sue7j+WwgeijheWlveeKtuaAgeWIh+aNouacuuWItuWSjFVJ5Yi35paw77yM5LiN6ZyA6KaB6aKd5aSW5Luj56CB5p2l5o6n5Yi277ybXG5cbiMjIOS4jeW+l+iuvuiuoeS7u+S9lVVJ57uE5Lu25pi+56S655qE6Z2Z5oCB5pWw5o2u77yM5q+U5aaC77yaXG4tIDHjgIHova7mkq3jgIF0YWLjgIHlupXpg6jlip/og73lr7zoiKrmoI/jgIHljZXpgInjgIHlpJrpgInjgIHljZXpgInnu4TjgIHlpJrpgInnu4TnrYlVSee7hOS7tu+8jOWmguaenGh0bWzlt7Lnu4/lhpnlpb3kuobmmL7npLrnmoTmlbDmja7lkoxVSe+8jOmCo+S5iOWcqOS7o+eggeiuvuiuoeS4iuS4jeW+l+iuvuiuoeS7u+S9lemdmeaAgeaVsOaNru+8jOW/hemhu+S9v+eUqGh0bWzlt7Lnu4/lhpnlpb3nmoTmlbDmja7jgIJcbi0gMuOAgeS4jemcgOimgeS4uuS7u+S9lVVJ57uE5Lu26K6+6K6h5Lu75L2V5Lqk5LqS55qE5pWw5o2u77yM5Lul5Y+K5LiN5b6X6K6+6K6h5Lu75L2VVUnnu4Tku7bnmoRqc+aIlnRz5Luj56CB6YC76L6RXG5cbiMjIOS4jeW+l+i/h+W6puiuvuiuoe+8jOS4gOiIrOeugOWNlemhtemdou+8jOmAu+i+keWwseS8mumdnuW4uOeugOWNle+8jOe7neWvueS4jeiDveeugOWNlemXrumimOWkjeadguWMlu+8jOavlOWmgu+8mlxuLSAx44CB6Zeq5bGP6aG144CB5byV5a+86aG144CB5bm/5ZGK6aG1562J562J77yM5LiA6Iis6YC76L6R5bCx6Z2e5bi4566A5Y2V77yM57ud5a+55LiN6IO96L+H5bqm6K6+6K6hXG5cbiMjIOS4peagvOaMieeFp+S7peS4izXkuKrmraXpqqTov5vooYzorr7orqFcblxuIyMjIOesrOS4gOatpeOAgeivu+WPllxcYGRvYy975bqP5Y+3fS14eHjmqKHlnZfkuJrliqHpgLvovpHorr7orqEubWRcXGDmlofku7bvvIzlubbmoLnmja7nlKjmiLfovpPlhaXnmoTmj4/ov7DvvIzliIbmnpDmgJ3ogIPmgLvlhbHpnIDopoHorr7orqHlpJrlsJHkuKrpobXpnaLnmoTkuJrliqHpgLvovpHmlofmoaPvvIzlnKh0aG91Z2h05a2X5q615Lit6L6T5Ye677ya5omA6ZyA6K6+6K6h55qE6aG16Z2i5YiX6KGo44CCXG5cbiMjIyDnrKzkuozmraXjgIHmo4Dmn6VcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7bmmK/lkKblrZjlnKjvvIzlpoLmnpzkuI3lrZjlnKjvvIzpgqPlv4XpobvlhYjliJvlu7rlubblrozlloTor6Xmlofku7bjgIJcbi0g5YW25LitanNvbueahOi/m+W6pueKtuaAgXRoaW5rU3RhdHVz5ZKMY29kZVN0YXR1c+WxnuaAp+eahOWAvOS4uu+8mnBlbmRpbmfmiJZjb21wbGV0ZWTjgILlhbbkuK10aGlua1N0YXR1c+aYr+iusOW9leS7o+eggemAu+i+keiuvuiuoeWujOaIkOeKtuaAge+8jGNvZGVTdGF0dXPmmK/orrDlvZXku6PnoIHlvIDlj5HlrozmiJDnirbmgIHjgIJcbi0gXFxgZG9jL+WJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg55qEbW9kdWxlc+Wtl+auteeahOaooeWdl+WIl+ihqOaVsOaNruWSjOmhtemdouWIl+ihqOaVsOaNruW/hemhu+aMieeFp1xcYGRvYy9VSeiuvuiuoei/m+W6pi5qc29uXFxg6YeM6Z2i55qE5pWw5o2u5aSN5Yi26L+H5p2lXG4tIFxcYGRvYy/liY3nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tueahOWbuuWummpzb27ljY/orq7vvJpcblxcYFxcYFxcYCBqc29uXG57XG4gICAgXCJ0b3RhbENvdW50XCI6IDI1LFxuICAgIFwibW9kdWxlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibW9kdWxlTmFtZUNOXCI6IFwi5ZCv5Yqo5qih5Z2XXCIsXG4gICAgICAgICAgICBcIm1vZHVsZU5hbWVFTlwiOiBcInN0YXJ0dXBcIixcbiAgICAgICAgICAgIFwicGFnZXNcIjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiAxLFxuICAgICAgICAgICAgICAgICAgICBcInBhZ2VOYW1lQ05cIjogXCLpl6rlsY/pobVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJwYWdlTmFtZUVOXCI6IFwic3BsYXNoUGFnZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInRoaW5rU3RhdHVzXCI6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY29kZVN0YXR1c1wiOiBcImNvbXBsZXRlZFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFwiaWRcIjogMixcbiAgICAgICAgICAgICAgICAgICAgXCJwYWdlTmFtZUNOXCI6IFwi5byV5a+86aG1XCIsXG4gICAgICAgICAgICAgICAgICAgIFwicGFnZU5hbWVFTlwiOiBcIkd1aWRlUGFnZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInRoaW5rU3RhdHVzXCI6IFwiY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY29kZVN0YXR1c1wiOiBcInBlbmRpbmdcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJtb2R1bGVOYW1lQ05cIjogXCLotKblj7fns7vnu5/mqKHlnZdcIixcbiAgICAgICAgICAgIFwibW9kdWxlTmFtZUVOXCI6IFwiYWNjb3VudFwiLFxuICAgICAgICAgICAgXCJwYWdlc1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcImlkXCI6IDMsXG4gICAgICAgICAgICAgICAgICAgIFwicGFnZU5hbWVDTlwiOiBcIueZu+W9lemhtVwiLFxuICAgICAgICAgICAgICAgICAgICBcInBhZ2VOYW1lRU5cIjogXCJsb2dpblBhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0aGlua1N0YXR1c1wiOiBcInBlbmRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgXCJjb2RlU3RhdHVzXCI6IFwicGVuZGluZ1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gICAgXVxufVxuXFxgXFxgXFxgXG5cbiMjIyDnrKzkuInmraXjgIHpobXpnaLku6PnoIHpgLvovpHorr7orqHliIbmnpDmoYbmnrZcblxuIyMjIyDpobXpnaLpu5jorqTkuJrliqHpgLvovpFcbi0gKirlpoLnlKjmiLfmsqHlnKjmj4/ov7DkuK3mmI7noa7mjIfmmI7pobXpnaLnmoTkuJrliqHpgLvovpHvvIzlhbbkuK3pobnnm67orr7orqHmlofmoaMnLmJ5dGVmdW4ve+aVsOWtl+W6j+WPt30teHh45Yqf6IO95qih5Z2X5Lia5Yqh6YC76L6R6K6+6K6hLm1kJ+S4jeeul+eUqOaIt+aYjuehruaMh+WumueahOS4muWKoemAu+i+ke+8jOmCo+WQhOS4qumhtemdoueahOS4muWKoemAu+i+kem7mOiupOW/hemhu+mBteWuiOS7peS4i+WbuuWumumAu+i+keW5tui+k+WHunh4eOmhtemdoum7mOiupOmBteWuiOeahOWbuuWumumAu+i+ke+8jOavlOWmgu+8mumXquWxj+mhteeahOmAu+i+ke+8mnh4eOetiSoqXG4gIC0g5LiN5a2Y5Zyo5p2D6ZmQ6K+35rGC6aG16Z2i77yM5omA5pyJ5p2D6ZmQ6K+35rGC5b+F6aG75L2/55So5by55qGG55qE5Lqk5LqS5pa55byP77yM6ICM5LiU5piv6YG15b6qXCLljbPnlKjljbPlj5ZcIu+8iEp1c3QtaW4tVGltZe+8ieeahOWOn+WImVxuICAtIOe7neWvueS4jeS8muacieS7u+S9leWFs+S6jumakOengeWNj+iuri/mnI3liqHmnaHmrL7pobXnmoTpgLvovpFcbiAgLSDpl6rlsY/pobVcbiAgICAtIOWmguaenOaciemXquWxj+mhte+8jOmCo+S5iOWQr+WKqOWQjuesrOS4gOS4qumhtemdouW/hemhu+aYr+mXquWxj+mhte+8jOmXquWxj+mhteS4jeS8muaciei3s+WIsOeZu+W9lemhteeahOi3r+W+hO+8jOWPquaciei3s+WIsOW8leWvvOmhteaIlummlumhteeahOi3r+W+hFxuICAgIC0g6Zeq5bGP6aG15LiN5YGa5Lu75L2V5Lia5Yqh6YC76L6R77yM5LiN6K+35rGC5Lu75L2V572R57uc5o6l5Y+j77yM5Y+q6ZyA5Yik5pat5piv5ZCm6aaW5qyh5ZCv5Yqo77yM5aaC5p6c6aaW5qyh5ZCv5Yqo5bCxeOenkuWQjui3s+WIsOW8leWvvOmhte+8jOWmguaenOS4jeaYr+mmluasoeWQr+WKqOWwsei3s+WIsOmmlumhtVxuICAgIC0g4p2MIOmXquWxj+mhtee7neWvueemgeatouWBmueahOS6i+aDhe+8mlxuICAgICAgLSDor7fmsYLku7vkvZXnvZHnu5zmjqXlj6NcbiAgICAgIC0g6K+35rGC54mI5pys5pu05pawQVBJ5o6l5Y+jXG4gICAgICAtIOi3s+WIsOmakOengeWNj+iuri/mnI3liqHmnaHmrL7pobVcbiAgICAgIC0g5by55Ye65Lu75L2V5YW25LuW5by55qGGXG4gICAgICAtIOS7u+S9leadg+mZkOivt+axglxuICAtIOW8leWvvOmhtVxuICAgID0g5byV5a+86aG15ZGK6aG15LiN5Lya5pyJ6Lez5Yiw55m75b2V6aG155qE6Lev5b6E77yM5Y+q5pyJ6Lez5Yiw6aaW6aG155qE6Lev5b6EXG4gICAgLSDkuI3kvJrmnInku7vkvZXnvZHnu5zor7fmsYLjgIHkuJrliqHpgLvovpHvvIzlvJXlr7zpobXku4Xku4XmmK/kuIDkuKrlsZXnpLrpnZnmgIHmlbDmja7nmoTpobXpnaJcbiAgICAtIOS4jemcgOimgeiHquWKqOi9ruaSrVxuICAgIC0g5LiA6Iis5pW05Liq6aG16Z2i5Y+q5pyJ5LiA5Liq6L2u5pKt57uE5Lu244CB6L2u5pKt5oyH56S65Zmo5ZKM5bqV6YOo5LiA5Liq5oyJ6ZKu77yM5bqV6YOo5oyJ6ZKu5Zyo6Z2e56ys5LiA6aG15pe25pi+56S65LiL5LiA5q2l77yM5Zyo5pyA5ZCO5LiA6aG15pe25pi+56S656uL5Y2z5L2T6aqMXG4gIC0g5bm/5ZGK6aG177yI5aaC5p6c5pyJ5bm/5ZGK6aG177yJXG4gICAgPSDlub/lkYrpobXkuI3kvJrmnInot7PliLDnmbvlvZXpobXnmoTot6/lvoTvvIzlj6rmnInot7PliLDpppbpobXnmoTot6/lvoRcbiAgICAtIOW5v+WRiumhteeahOaVsOaNruS4jeWFgeiuuOWcqOmXquWxj+mhteivt+axgu+8jOW6lOivpeWcqOi/m+WFpemmlumhteWQjuivt+axgu+8jOW5tuS4lOS9v+eUqOacrOWcsOaMgeS5heWMluWwhuW5v+WRikFQSeaOpeWPo+eahOaVsOaNruWCqOWtmOi1t+adpe+8jOetieS4i+S4gOasoeWQr+WKqOmXquWxj+mhteaXtui3s+WIsOW5v+WRiumhtemdouWQju+8jOaJjeS7juacrOWcsOaMgeS5heWMluS4reiOt+WPluaVsOaNruW5tuWIneWni+WMluW5v+WRiumhteaYvuekuuWSjOS6pOS6klxuICAgIC0g5bm/5ZGK6aG155qE5pWw5o2u5b+F6aG75piv5Zyo6L+b5YWl6aaW6aG15ZCO5omN5Y+R6LW36K+35rGC77yM57ud5a+55LiN6IO95Zyo6Zeq5bGP6aG15Y+R6LW36K+35rGC77yM5bm25LiU5bm/5ZGK6aG155qE5pWw5o2u5Y+q5pi+56S65LiA5qyh77yM57ud5a+55LiN6IO96YeN5aSN5pi+56S677yM5aaC5p6c5pys5Zyw5oyB5LmF5YyW5qC55pys5rKh5pyJ5bm/5ZGK6aG155qE5pWw5o2u77yM6YKj5LiN6ZyA6KaB6Lez6L2s5ZKM5pi+56S65bm/5ZGK6aG1XG4gIC0g6aaW6aG1XG4gICAgLSDov5vlhaXpppbpobXkuIDoiKzpnIDopoHor7fmsYJhcHDniYjmnKzmm7TmlrBBUEnmjqXlj6PvvIzliKTmlq3mmK/lkKbpnIDopoHmm7TmlrDvvIzlpoLmnpzpnIDopoHmm7TmlrDlsLHlvLnlh7rmm7TmlrDlvLnmoYbvvIzlpoLmnpzkuI3pnIDopoHpgqPlsLHkuI3lgZrku7vkvZXkuovmg4VcbiAgICAtIOi/m+WFpemmlumhtei/mOimgeivu+WPluacrOWcsOaVsOaNru+8muWFqOWxgOmFjee9ruaVsOaNruOAguS4gOiIrOeUqOS6juWKn+iDveW8gOWFs+OAgUFCVGVzdOmFjee9ruOAgeW5v+WRiumFjee9ru+8iOWmguaenOacieW5v+WRiueahOivne+8ieetie+8jOivu+WPluWujOavleWQju+8jOi/mOimgee9kee7nOivt+axguS4gOasoeWFqOWxgOmFjee9rkFQSe+8jOWwhuWFqOWxgOmFjee9ruaVsOaNruabtOaWsOWIsOacrOWcsOaVsOaNruS4rVxuICAgIC0g5LiA6Iis5piv5pyJ5LiA5Liq5bqV6YOo5Yqf6IO95a+86Iiq5qCP77yM54K55Ye75bqV6YOo5Yqf6IO95a+86Iiq5qCP55qE5Zu+5qCH5Lya5YiH5o2i5Yiw5a+55bqU55qEdGFi6aG16Z2i77yMdGFi6aG16Z2i5LiA6Iis5pyJ5aSa5Liq77yM5q+P5LiqdGFi6aG16Z2i5pyJ5LiN5ZCM55qE5Lia5Yqh6YC76L6RXG4gICAgLSDlpoLmnpznlKjmiLfovpPlhaXnmoTpnIDmsYLmj4/ov7DmsqHmnInmmI7noa7mjIflrprpppbpobXlupXpg6jlip/og73lr7zoiKrmoI/mnInlk6rkupvlip/og73vvIzpgqPkuYjkvaDlv4XpobvmgJ3ogIPpppbpobXlupXpg6jlip/og73lr7zoiKrmoI/mnInlk6rkupvlip/og71pdGVt6aG5XG4gIC0g55m75b2V6aG1XG4gICAgLSDnmbvlvZXpobXmmK/nlKjmiLfngrnlh7vpnIDopoHnmbvlvZXmiY3og73orr/pl67nmoTpobXpnaLml7bvvIzmiY3kvJrot7PovazliLDnmoTpobXpnaLvvIzogIzkuI3mmK/ku47pl6rlsY/pobXliKTmlq3mmK/lkKbpnIDopoHnmbvlvZXnhLblkI7ot7Pov5vljrtcblxuIyMjIyAxLiDlip/og73mj4/ov7DliIbmnpBcbioq55uu5qCHKirvvJrmuIXmmbDlrprkuYnor6XpobXpnaLlnKjmlbTkuKrns7vnu5/kuK3nmoTogYzotKPlkozkuJrliqHku7flgLxcbi0gKirmoLjlv4Plip/og70qKu+8muivpemhtemdouino+WGs+S7gOS5iOaguOW/g+S4muWKoemXrumimO+8n1xuLSAqKuWKn+iDvei+ueeVjCoq77ya6K+l6aG16Z2i6LSf6LSj5ZOq5Lqb5Yqf6IO977yM5LiN6LSf6LSj5ZOq5Lqb5Yqf6IO977yfXG4tICoq5Lia5Yqh5Lu35YC8KirvvJror6XpobXpnaLkuLrnlKjmiLflkozkuJrliqHluKbmnaXku4DkuYjku7flgLzvvJ9cbi0gKirkvp3otZblhbPns7sqKu+8muivpemhtemdouS4juWFtuS7lumhtemdoi/mqKHlnZfnmoTkvp3otZblhbPns7vmmK/ku4DkuYjvvJ9cblxuIyMjIyAyLiDpobXpnaLovpPlhaXlkozovpPlh7rlj4LmlbDorr7orqFcbioq55uu5qCHKirvvJrnsr7noa7lrprkuYnpobXpnaLnmoTmlbDmja7mjqXlj6PlpZHnuqZcbi0gKirovpPlhaXlj4LmlbDliIbmnpAqKu+8mlxuICAtIOmhtemdouWQr+WKqOWPguaVsO+8iOS7juWFtuS7lumhtemdoui3s+i9rOS8oOWFpeeahOWPguaVsO+8iVxuICAtIOWPguaVsOWQjeensOOAgeaVsOaNruexu+Wei+OAgeaYr+WQpuW/heWhq+OAgem7mOiupOWAvFxuICAtIOWPguaVsOadpea6kO+8iOeUqOaIt+aTjeS9nOOAgeezu+e7n+eKtuaAgeOAgeWklumDqOS8oOWFpe+8iVxuICAtIOWPguaVsOmqjOivgeinhOWImeWSjOe6puadn+adoeS7tlxuLSAqKui+k+WHuuWPguaVsOWIhuaekCoq77yaXG4gIC0g6aG16Z2i5ZCR5YW25LuW6aG16Z2i5Lyg6YCS55qE5pWw5o2uXG4gIC0g6aG16Z2i5Lqn55Sf55qE5Ymv5L2c55So77yI54q25oCB5Y+Y5pu044CB5pWw5o2u5oyB5LmF5YyW77yJXG4gIC0g6aG16Z2i5Zue6LCD5ZKM5LqL5Lu26YCa55+lXG4tICoq5Y+C5pWw6K6+6K6h6KGo5qC8KirvvJpcbiAgXFxgXFxgXFxgbWFya2Rvd25cbiAgfCDlj4LmlbDnsbvlnosgfCDlj4LmlbDlkI3np7AgfCDmlbDmja7nsbvlnosgfCDmmK/lkKblv4XloasgfCDpu5jorqTlgLwgfCDor7TmmI4gfFxuICB8LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS18XG4gIHwg6L6T5YWlICAgICB8IHh4eCAgICAgIHwgc3RyaW5nICAgfCDmmK8gICAgICAgfCAtICAgICAgfCB4eHggIHxcbiAgfCDovpPlh7ogICAgIHwgeHh4ICAgICAgfCBudW1iZXIgICB8IOWQpiAgICAgICB8IDAgICAgICB8IHh4eCAgfFxuICBcXGBcXGBcXGBcblxuIyMjIyAzLiDpobXpnaLliqjmgIHmlbDmja7mnaXmupDorr7orqFcbioq55uu5qCHKirvvJrmorPnkIbpobXpnaLmiYDpnIDnmoTmiYDmnInliqjmgIHmlbDmja7lj4rlhbbojrflj5bmlrnlvI9cbi0gKirlkI7nq69BUEnmlbDmja4qKu+8mlxuICAtIOmcgOimgeiwg+eUqOWTquS6m+WQjuerr0FQSe+8n1xuICAtIEFQSeeahOiwg+eUqOaXtuacuuWSjOmikeeOh++8n1xuICAtIOaVsOaNrue8k+WtmOetlueVpe+8n1xuICAtIOmUmeivr+WkhOeQhuWSjOmHjeivleacuuWItu+8n1xuLSAqKuacrOWcsOaMgeS5heWMluaVsOaNrioq77yaXG4gIC0g6ZyA6KaB6K+75Y+WL+WGmeWFpeWTquS6m+acrOWcsOWtmOWCqOaVsOaNru+8n1xuICAtIOaVsOaNruWQjOatpeetlueVpe+8n1xuICAtIOaVsOaNrui/geenu+WSjOeJiOacrOWFvOWuue+8n1xuLSAqKuWFqOWxgOeKtuaAgeaVsOaNrioq77yaXG4gIC0g5L6d6LWW5ZOq5Lqb5YWo5bGA54q25oCB77yfXG4gIC0g5aaC5L2V5ZON5bqU5YWo5bGA54q25oCB5Y+Y5YyW77yfXG4tICoq5a6e5pe25pWw5o2u5pu05pawKirvvJpcbiAgLSDmmK/lkKbpnIDopoHlrp7ml7bmlbDmja7mm7TmlrDvvJ9cbiAgLSDmlbDmja7mm7TmlrDnmoTop6blj5HmnaHku7bvvJ9cblxuIyMjIyA0LiDmjInku6XkuIvmraXpqqTnlJ/miJDlrozmlbTnmoQgTWVybWFpZCDnqIvluo/mtYHnqIvlm77vvJpcbi0gMS4gKirnkIbop6PpnIDmsYIqKu+8jOagueaNruS9oOWcqCfnkIbop6Plip/og73mqKHlnZfnmoTpnIDmsYIn5q2l6aqk5Lit6K+75Y+W55qEJy5ieXRlZnVuL3vmlbDlrZfluo/lj7d9LXh4eOWKn+iDveaooeWdl+S4muWKoemAu+i+keiuvuiuoS5tZCfmlofku7bvvIznkIbop6Por6Xlip/og73mqKHlnZfnmoTpnIDmsYLvvIzlubbmgJ3ogIPmuIXmpZrku6XkuIvpl67popjvvJpcbiAgLSDwn46vIOeUqOaIt+WcuuaZr+WIhuaekO+8mlxuICAgIDEuICoq55yf5a6e55So5oi35Lya5Zyo5LuA5LmI5oOF5Ya15LiL5L2/55So6L+Z5Liq5Yqf6IO977yfKipcbiAgICAyLiAqKuS4jeWQjOexu+Wei+eahOeUqOaIt++8iOaWsOeUqOaIty/ogIHnlKjmiLcv5bey55m75b2VL+acqueZu+W9le+8ieS8muacieS7gOS5iOS4jeWQjOeahOihjOS4uui3r+W+hO+8nyoqXG4gICAgMy4gKirnlKjmiLfmnJ/mnJvku4DkuYjmoLfnmoTkvZPpqozvvJ/ku4DkuYjkvZPpqozmmK/kuI3lkIjnkIbnmoTvvJ8qKlxuICAtIPCflIQg54q25oCB566h55CG5YiG5p6Q77yaXG4gICAgNC4gKirov5nkuKrlip/og73pnIDopoFcIuiusOS9j1wi5LuA5LmI54q25oCB77yfKipcbiAgICA1LiAqKuS7gOS5iOaDheWGteS4i+eKtuaAgeS8muaUueWPmO+8nyoqXG4gICAgNi4gKirlpoLkvZXmo4Dmn6Xlkozpqozor4HlvZPliY3nirbmgIHvvJ8qKlxuICAtIPCfjLIg5Lia5Yqh5rWB56iL5YiG5p6Q77yaXG4gICAgNy4gKirov5nkuI3mmK/kuIDkuKrnur/mgKfmtYHnqIvvvIzmnInlk6rkupvliIbmlK/mg4XlhrXvvJ8qKlxuICAgIDguICoq5q+P5Liq5YiG5pSv55qE6Kem5Y+R5p2h5Lu25piv5LuA5LmI77yfKipcbiAgICA5LiAqKuW8guW4uOaDheWGteS4i+W6lOivpeWmguS9leWkhOeQhu+8nyoqXG4gIC0g8J+SoSDkuJrliqHlkIjnkIbmgKfmo4Dmn6XvvJpcbiAgICAxMC4gKirlpoLmnpzmiJHmmK/nlKjmiLfvvIzov5nkuKrmtYHnqIvorqnmiJHmhJ/op4nlkIjnkIblkJfvvJ8qKlxuICAgIDExLiAqKui/meS4quiuvuiuoeino+WGs+S6huS7gOS5iOecn+WunueahOS4muWKoemXrumimO+8nyoqXG4gICAgMTIuICoq5pyJ5rKh5pyJ6YGX5ryP6YeN6KaB55qE5Lia5Yqh6KeE5YiZ77yfKiogXG4tIDIuICoq5ouG6Kej6YC76L6RKiogIFxuICAtIOWwhumhtemdoua1geeoi+aLhuWIhuS4uuacgOWwj+mAu+i+keWNleWFg++8iOWmgu+8muivu+WPlui+k+WFpeOAgeWIpOaWreadoeS7tuOAgeiwg+eUqOacjeWKoeOAgeaYvuekuue7k+aenOetie+8ieOAgiAgXG4gIC0g5qCH6K6w5ZCE5Y2V5YWD5LmL6Ze055qE5YWI5ZCO6aG65bqP44CB5YiG5pSv5Y+K5b6q546v5YWz57O744CCICBcbi0gMy4gKirnu4Tnu4foioLngrkqKiAgXG4gIC0g5Li65q+P5Liq6YC76L6R5Y2V5YWD5YiG6YWN5LiA5Liq5ZSv5LiA5qCH6K+G77yI5aaC77yaQeOAgULjgIFD4oCm77yJ77yM5bm25rOo5piO6IqC54K557G75Z6L77yI5byA5aeLL+e7k+adn+OAgeWkhOeQhi/mk43kvZzjgIHliKTmlq3jgIHovpPlhaUv6L6T5Ye644CB5a2Q5rWB56iL77yJ44CCICBcbi0gNC4gKirnu5jliLYgTWVybWFpZCDku6PnoIEqKiAgXG4gIC0g6IqC54K55LiN6IO96K6+572u6IOM5pmv6Imy77yM57q/5p2h5ZKM5paH5a2X6aKc6Imy5L2/55SoIzMzM1xuICAtIOS9v+eUqCAnZmxvd2NoYXJ0JyDor63ms5XvvIzmjIkgXCJURFwi77yI5LuO5LiK5Yiw5LiL77yJ5oiWIFwiTFJcIu+8iOS7juW3puWIsOWPs++8ieaWueWQkee7hOe7h+iKgueCueOAgiAgXG4gIC0g55So566t5aS0ICgnLS0+Jykg6L+e5o6l5aSE55CG6IqC54K577yM55So5YiG5pSv6K+t5Y+lICgnfHllc3wnLCAnfG5vfCcpIOihqOi+vuWIpOaWreWIhuaUr+OAgiAgXG4gIC0g5aaC5pyJ5a2Q5rWB56iL77yM55SoICdzdWJncmFwaCcg5Z2X5bCB6KOF77yb5aaC5pyJ5b6q546v77yM55So5Zue546v566t5aS05oyH5ZCR5Yik5pat6IqC54K544CCICBcbi0gNS4gKirnpLrkvovmoLzlvI8qKiAgXG4gICAgQShb5byA5aeLXSkgIFxuICAgIEJbL+ivu+WPlueUqOaIt+i+k+WFpS9dICBcbiAgICBDe+eUqOaIt+aYr+WQpuW3sueZu+W9lT99ICBcbiAgICBDIC0tfOaYr3wtLT4gRFvmmL7npLrkuLvpobVdICBcbiAgICBDIC0tfOWQpnwtLT4gRVvot7PovaznmbvlvZXpobVdICBcbiAgICBFIC0tPiBGe+eZu+W9leaIkOWKnz99ICBcbiAgICBGIC0tfOaYr3wtLT4gRCAgXG4gICAgRiAtLXzlkKZ8LS0+IEdb5o+Q56S66ZSZ6K+v5bm26YeN6K+VXVxuICAgIEcgLS0+IEUgIFxuICAgIEQgLS0+IEgoW+e7k+adn10pXG5cbiMjIyDnrKzlm5vmraXjgIHmm7TmlrBcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGBcbi0g6K6+6K6h5LiA5Liq6aG16Z2i5a6M5q+V5ZCO77yM6ZyA6KaB5pu05pawXFxgZG9jL+WJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg6YeM6Z2i55qEdGhpbmtTdGF0dXPlrZfmrrXkuLpjb21wbGV0ZWTjgIJcblxuIyMjIOesrOS6lOatpeOAgeiuvuiuoei+k+WHuuimgeaxglxuKirlrozmiJDorr7orqHliIbmnpDlkI7vvIzlsIbnu5PmnpzlhpnlhaXliLDnlKjmiLfmjIflrprnmoTpobXpnaLmlofku7blpLnkuIvnmoRjb2RlRGVzaWduLm1k5paH5Lu25LitKipcblxuIyMjIyDmlofku7blhpnlhaXot6/lvoRcbi0g5YaZ5YWl6Lev5b6E77yac3JjL3h4eE1vZHVsZS94eHhQYWdlL2NvZGVEZXNpZ24ubWRcbi0g5YW25LiteHh4TW9kdWxl5ZKMeHh4UGFnZeagueaNrueUqOaIt+mcgOaxguWSjOmhtemdouWQjeensOehruWumlxuXG4jIyMg5paH5Lu25YaF5a655qC85byPXG5cXGBcXGBcXGBtYXJrZG93blxuIyBb6aG16Z2i5ZCN56ewXSDku6PnoIHpgLvovpHorr7orqHmlofmoaNcblxuIyMgMS4g5Yqf6IO95o+P6L+w5YiG5p6QXG5b6K+m57uG5o+P6L+w6K+l6aG16Z2i55qE5qC45b+D5Yqf6IO944CB5Lia5Yqh5Lu35YC844CB5Yqf6IO96L6555WM44CB5L6d6LWW5YWz57O7XVxuXG4jIyAyLiDpobXpnaLovpPlhaXlkozovpPlh7rlj4LmlbDorr7orqFcbiMjIyAyLjEg6L6T5YWl5Y+C5pWwXG58IOWPguaVsOWQjeensCB8IOaVsOaNruexu+WeiyB8IOaYr+WQpuW/heWhqyB8IOm7mOiupOWAvCB8IOivtOaYjiB8XG58LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tfFxufCB4eHggICAgICB8IHN0cmluZyAgIHwg5pivICAgICAgIHwgLSAgICAgIHwgeHh4ICB8XG5cbiMjIyAyLjIg6L6T5Ye65Y+C5pWwXG58IOWPguaVsOWQjeensCB8IOaVsOaNruexu+WeiyB8IOaYr+WQpuW/heWhqyB8IOm7mOiupOWAvCB8IOivtOaYjiB8XG58LS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tfFxufCB4eHggICAgICB8IG51bWJlciAgIHwg5ZCmICAgICAgIHwgMCAgICAgIHwgeHh4ICB8XG5cbiMjIDMuIOmhtemdouWKqOaAgeaVsOaNruadpea6kOiuvuiuoVxuIyMjIDMuMSDlkI7nq69BUEnmlbDmja5cblvor6bnu4bmj4/ov7DpnIDopoHosIPnlKjnmoRBUEnjgIHosIPnlKjml7bmnLrjgIHnvJPlrZjnrZbnlaXnrYldXG5cbiMjIyAzLjIg5pys5Zyw5oyB5LmF5YyW5pWw5o2uXG5b6K+m57uG5o+P6L+w5pys5Zyw5a2Y5YKo55qE5L2/55So5pa55byPXVxuXG4jIyMgMy4zIOWFqOWxgOeKtuaAgeaVsOaNrlxuW+ivpue7huaPj+i/sOWFqOWxgOeKtuaAgeeahOS+nei1luWSjOWTjeW6lF1cblxuIyMgNC4g56iL5bqP5rWB56iL5Zu+XG4jIyMgNC4xIOeoi+W6j+a1geeoi+WbvlxuW+eoi+W6j+a1geeoi+Wbvl1cblxuIyMjIDQuMiDnqIvluo/mtYHnqIvlm77or6bnu4bmloflrZfmj4/ov7Bcblvlr7nnqIvluo/mtYHnqIvlm77nmoTor6bnu4bor7TmmI5dXG5cbiMjIyA0LjMg5pWw5o2u5rWB5ZCR5YiG5p6QXG5b6K+m57uG5o+P6L+w5pWw5o2u55qE5p2l5rqQ44CB5aSE55CG44CB5rWB5ZCRXVxuXG4jIyMgNC40IOS4muWKoeinhOWImeiuvuiuoVxuW+ivpue7huaPj+i/sOS4muWKoemqjOivgeinhOWImeOAgeadg+mZkOaOp+WItuOAgeW8guW4uOWkhOeQhuetiV1cblxuIyMg6K6+6K6h5Y6f5YiZXG4tICoq55So5oi35Lit5b+DKirvvJrku6XnlKjmiLfpnIDmsYLlkozkvZPpqozkuLrmoLjlv4Pov5vooYzorr7orqFcbi0gKirmlbDmja7pqbHliqgqKu+8muWfuuS6juaVsOaNrua1geWSjOeKtuaAgeWPmOWMlui/m+ihjOmAu+i+keiuvuiuoVxuLSAqKuaooeWdl+WMlioq77ya5L+d5oyB6aG16Z2i6IGM6LSj5Y2V5LiA77yM5o6l5Y+j5riF5pmwXG4tICoq5Y+v57u05oqk5oCnKirvvJrku6PnoIHpgLvovpHmuIXmmbDvvIzmmJPkuo7nkIbop6Plkozkv67mlLlcbi0gKirlj6/mianlsZXmgKcqKu+8muiAg+iZkeacquadpeWKn+iDveaJqeWxleeahOWPr+iDveaAp1xuLSAqKuWBpeWjruaApyoq77ya5YWF5YiG6ICD6JmR5byC5bi45oOF5Ya15ZKM6L6555WM5p2h5Lu2XG5cXGBcXGBcXGBcbmA7Il19