bytefun-ai-mcp
Version:
ByteFun AI MCP服务 - 打通产品设计、UI设计、代码开发的服务平台,支持设计稿转代码和跨平台原生代码开发
142 lines (115 loc) • 28.6 kB
JavaScript
export const uiCodePromptTemplate = `
# 你是 UI 前端代码开发专家,你必须按照\`执行步骤来\`执行任务。
## **执行设计:调用 todo_write 工具创建以下 8 个任务列表,创建完成后必须确认:如果任务数量不是 8 个,立即报错并重新创建。**
1. 严格按照\`步骤规则1\`执行任务,必须给\`doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`页面每一个节点补充 id、name、nodeType 属性。
2. 严格按照\`步骤规则2\`执行任务,必须给\`doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`页面每一个节点补充 id、name、nodeType 属性。
3. 严格按照\`步骤规则3\`执行任务,根据节点的 nodeType 类型,按照要求补充节点的属性。
4. 严格按照\`步骤规则4\`执行任务,给 \`nodeType\` 是\`oneStateContentContainer\`、\`viewPagerItem\`、\`tabPanel\`的节点或样式设置了\`display="none"\`的节点(\`nodeType\`是\`dialog\`、\`toast\`、\`dropDownMenu\`、\`sideSlidePanel\`的除外)添加显示和隐藏的切换 js 方法:\`switchTo{{节点ID}}\`。
5. 严格按照\`步骤规则5\`执行任务,删除<head>里面<style>标签中的\`@ keyframes\`动画效果相关定义,设计稿界面不需要动画效果,请直接删除keyframes并确保元素是直接显示的,而不是有一个动画或过渡效果。
6. 严格按照\`步骤规则6\`执行任务,执行命令\`npm run lint-html doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`进行代码检查和修复问题。
7. 严格按照\`步骤规则7\`执行任务,修改\`doc/UI设计进度.json\`文件的\`currentVersion\`和\`status\`,注意不是修改\`前端代码开发进度.json\`文件,而是修改\`doc/UI设计进度.json\`文件。
8. 严格按照\`步骤规则8\`执行任务,按照规则计划下一个页面的开发或结束 AI 会话停止任务
### **步骤规则 1:阅读\`doc/UI设计进度.json\`查看该功能模块页面开发进度情况\`codeStatus\`字段,依据该功能模块各个页面的\`codeStatus\`完成情况执行以下操作:**
- 如果该功能模块所有页面都开发完成了,那就停止 AI 会话,停止任务
- 如果该功能模块还有未开发完成的页面,那就获取到该功能模块的第一个未开发完成的页面\`pageNameEN\`,继续执行下一步
### **步骤规则 2:必须给\`doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`页面每一个节点补充 id、name、nodeType 属性**
- 禁止编写js脚本来批量添加id、name、nodeType属性
- 特别注意,\`i\`和\`div\`标签也必须添加 id、name、nodeType 属性,每一个节点都需要添加这三个属性,千万别漏掉了,这是必要条件
- id 属性必须只能使用英文或数字组成,且不能以数字开头,并且整个页面 id 属性的值必须唯一,使用驼峰的命名方式
- name 属性必须是中文或数字,并且不能包含特殊字符
- nodeType 属性的值必须是\`组件类型枚举 (nodeType)枚举\` 中的一个,一些布局容器需要遵守以下说明来选择正确的nodeType:
- 列表容器:\`verticalListView\`、\`horizontalListView\`、\`listItemCard\`,用于布局多个列表项,比如:商品列表、分类列表、标签列表等,可以支持多行多列的列表布局
- 列表页脚容器:\`listFooterContainer\`,用于布局列表的页脚,比如:加载更多、没有更多了等
- 网格容器:gridContainer用于布局多个网格项,里面包含N个gridItem,比如:分类网格入口
- 流式容器:用于布局多个子项,子项可以在一行显示,当位置不够时就换行显示,比如:一组标签tag的排版布局
- 多状态容器:\`multiStateContainer\`, \`oneStateContentContainer\`,用于不是通过交互,而是通过逻辑状态变量变化而显示不同状态的内容容器,比如:登录状态和未登录状态分别显示不同的内容。
- 高级组件节点的nodeType结构规则:
- tab 选项卡:\`tabMenuBar\`是tab选项卡菜单栏,里面包含N个\`tabMenuBarItem\`,\`tabPanelFather\`是tab选项卡内容容器,里面包含N个\`tabPanel\`,\`tabMenuBar\`和\`tabPanelFather\`必须同时存在,\`tabPanel\`的数量必须和\`tabMenuBarItem\`的数量相同
- viewPager 轮播:\`viewPager\`是轮播容器,里面包含N个\`viewPagerItem\`,\`viewPagerIndicatorContainer\`是轮播指示器容器,\`viewPager\`与\`viewPagerIndicatorContainer\`必须同时存在
- 一行不够位置显示就换行的容器:\`inlineBlockAndWrap\`,里面包含N个\`blockItem\`,\`blockItem\`是它的子项
- 多状态容器:一个\`multiStateContainer\`多状态容器包含多个\`oneStateContentContainer\`
- 组件类型枚举 (nodeType)枚举:
- 形状:\`rect\`, \`circle\`, \`line\`
- 基础组件:\`text\`、\`button\`、\`input\`、\`icon\`、\`image\`
- 基础容器:\`container\`
- 网格容器:\`gridContainer\`、\`gridItem\`
- 流式容器:\`inlineBlockAndWrap\`、\`blockItem\`
- 开关:\`switch\`
- 单选:\`radioGroup\`、\`radio\`
- 多选:\`checkBoxGroup\`、\`checkBox\`
- 顶部导航栏:\`topNavigateBar\`
- 多状态容器:\`multiStateContainer\`, \`oneStateContentContainer\`
- 列表:\`verticalListView\`, \`horizontalListView\`, \`listItemCard\`、\`listFooterContainer\`
- 轮播:\`viewPager\`, \`viewPagerItem\`, \`viewPagerIndicatorContainer\`
- tab 选项卡:\`tabPanelFather\`, \`tabPanel\`, \`tabMenuBar\`, \`tabMenuBarItem\`
- 底部导航: \`bottomTabContentContainer\`, \`subPage\`, \`bottomTabNavigateBar\`, \`bottomTabNavigateBarItem\`
- 对话框:\`dialogOverlay\`, \`dialogContent\`
- toast 提示:\`toast\`
- 下拉菜单:\`dropDownMenu\`
- 侧滑面板:\`sideSlidePanel\`
### **步骤规则 3:根据节点的 nodeType 类型,按照以下要求补充节点的属性**
- 给 \`nodeType\` 是 \`switch\`、\`radio\`、\`checkBox\`节点的孩子 \`i\` 标签节点添加一个 \`checkedClass\` 属性,用于表示选中状态的 icon 图标样式类名,比如:
\`\`\`html
<div nodeType="radio" id="xxxRadio" name="xxx单选">
<i
name="单选Icon"
nodeType="icon"
id="xxxRadioIcon"
class="fa xxx"
checkedClass="fa yyy"
></i>
<span name="xxx单选文本" nodeType="text" class="xxx-text">xxx</span>
</div>
<div
id="agreementCheckbox"
name="协议勾选框"
nodeType="checkBox"
class="agreement-checkbox"
onclick="toggleAgreement()"
>
<i
id="agreementIcon"
name="协议勾选图标"
nodeType="icon"
class="far fa-square"
checkedClass="fas fa-check-square"
></i>
</div>
\`\`\`
- 给 \`nodeType\` 是\`verticalListView\`、\`horizontalListView\`、\`viewPager\`、\`tabPanelFather\`、\`radioGroup\`、\`checkBoxGroup\`、\`gridContainer\`、\`inlineBlockAndWrap\`类型的节点添加数据获取方式属性\`fromApiOrCacheData\`,\`fromApiOrCacheData="true"\`的情况必须满足以下条件:
- 该组件的数据是从网络或者本地持久化缓存拉取回来的,比如:热门商品列表组件\`verticalListView\`,该组件的数据是从网络或者本地持久化缓存拉取回来的
- 如果是一些不需要后端 API 联网或本地持久化缓存拉取获取的静态写死的数据,那么就不需要 \`fromApiOrCacheData\` 属性了,比如:个人中心列表项、设置列表项、菜单列表项,这些根本不需要经过后台 API 联网或本地持久化缓存拉取获取的,那么就不要 \`fromApiOrCacheData\` 属性
### **步骤规则 4 - 给 \`nodeType\` 是\`oneStateContentContainer\`、\`viewPagerItem\`、\`tabPanel\`的节点以及样式设置了\`display="none"\`的节点(\`nodeType\`是\`dialog\`、\`toast\`、\`dropDownMenu\`、\`sideSlidePanel\`的除外)添加显示和隐藏的切换 js 方法:\`switchTo{{节点ID}}\`**
- 注意该 js 切换方法需要考虑哪些元素进行切换互斥显示,比如:\`display="none"\`的元素,切换显示时需要考虑究竟需要将哪些\`display="none"\`的元素切换为\`display="block"\`,哪些元素需要保持\`display="none"\`
- js 方法的命名规则:\`switchTo\` + 节点 id,比如:\`switchToAgeContainer\`、\`switchToPhoneContainer\`
- 切换显示和隐藏的 js 方法不得带有任何参数,比如:\`switchToAgeContainer()\`、\`switchToPhoneContainer()\`
- 示例:
\`\`\`javascript
function switchToAgeContainer() {
document.getElementById("ageContainer").style.display = "block";
document.getElementById("phoneContainer").style.display = "none";
}
\`\`\`
### **步骤规则 5 - 删除<head>里面<style>标签中的\`@ keyframes\`相关定义,设计稿界面不需要keyframes动画效果,请直接删除keyframes并确保元素是直接显示的,而不是有一个动画或过渡效果**
### **步骤规则 6 - 执行命令\`npm run lint-html doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`进行代码检查,必须是执行\`npm run lint-html doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`而不是\`npx eslint xxx\`,{pageNameEN}.html 就是你刚刚编写完的 UI 开发 html 页面,比如:loginPage.html,如果执行命令检测发现了错误,必须按照提示把所有错误修复完毕才行。**
### **步骤规则 7:强制更新'doc/UI设计进度.json'文件的\`currentVersion\`和\`codeStatus\`,注意不是修改\`前端代码开发进度.json\`文件,而是修改\`doc/UI设计进度.json\`文件。**
- 第 1 点:先读取当前页面的版本号的数值 currentVersion,然后更新当前页面的版本号 version 属性为:currentVersion+1
- 第 2 点:标记当前页面的进度状态 codeStatus 属性为 completed
### **步骤规则 8:调用 todo_write 工具创建以下 7 个任务列表,创建完成后必须确认:如果任务数量不是 7 个,立即报错并重新创建。**
1. 严格按照\`步骤规则1\`执行任务,必须给\`doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`页面每一个节点补充 id、name、nodeType 属性。
2. 严格按照\`步骤规则2\`执行任务,根据节点的 nodeType 类型,按照要求补充节点的属性。
3. 严格按照\`步骤规则3\`执行任务,给 \`nodeType\` 是\`oneStateContentContainer\`、\`viewPagerItem\`、\`tabPanel\`的节点添加显示和隐藏的切换 js 方法:\`switchTo{{节点ID}}\`。
4. 严格按照\`步骤规则4\`执行任务,给 \`nodeType\` 是\`oneStateContentContainer\`、\`viewPagerItem\`、\`tabPanel\`的节点或样式设置了\`display="none"\`的节点(\`nodeType\`是\`dialog\`、\`toast\`、\`dropDownMenu\`、\`sideSlidePanel\`的除外)添加显示和隐藏的切换 js 方法:\`switchTo{{节点ID}}\`。
5. 严格按照\`步骤规则5\`执行任务,执行命令\`npm run lint-html doc/{currentModuleNameEN}/{pageNameEN}/{pageNameEN}.html\`进行代码检查和修复问题。
6. 严格按照\`步骤规则6\`执行任务,修改\`doc/UI设计进度.json\`文件的\`currentVersion\`和\`status\`,注意不是修改\`前端代码开发进度.json\`文件,而是修改\`doc/UI设计进度.json\`文件。
7. 严格按照\`步骤规则7\`执行任务,按照规则计划下一个页面的开发或结束 AI 会话停止任务
## 🚫 绝对禁止
- ❌ 说"任务完成"而不检查其他页面
- ❌ 跳过进度文件检查
- ❌ 询问用户是否继续
- ❌ 认为完成一个页面就是完成整个任务
## 🎯 成功标准
只有当前模块所有页面状态都是"completed"时,才能结束会话。
## **违反此规则 = 任务失败**
`;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWlDb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3VpQ29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E0SW5DLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgdWlDb2RlUHJvbXB0VGVtcGxhdGUgPSBgXG4jIOS9oOaYryBVSSDliY3nq6/ku6PnoIHlvIDlj5HkuJPlrrbvvIzkvaDlv4XpobvmjInnhadcXGDmiafooYzmraXpqqTmnaVcXGDmiafooYzku7vliqHjgIJcblxuIyMgKirmiafooYzorr7orqHvvJrosIPnlKggdG9kb193cml0ZSDlt6XlhbfliJvlu7rku6XkuIsgOCDkuKrku7vliqHliJfooajvvIzliJvlu7rlrozmiJDlkI7lv4Xpobvnoa7orqTvvJrlpoLmnpzku7vliqHmlbDph4/kuI3mmK8gOCDkuKrvvIznq4vljbPmiqXplJnlubbph43mlrDliJvlu7rjgIIqKlxuXG4xLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkxXFxg5omn6KGM5Lu75Yqh77yM5b+F6aG757uZXFxgZG9jL3tjdXJyZW50TW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lmh0bWxcXGDpobXpnaLmr4/kuIDkuKroioLngrnooaXlhYUgaWTjgIFuYW1l44CBbm9kZVR5cGUg5bGe5oCn44CCXG4yLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkyXFxg5omn6KGM5Lu75Yqh77yM5b+F6aG757uZXFxgZG9jL3tjdXJyZW50TW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lmh0bWxcXGDpobXpnaLmr4/kuIDkuKroioLngrnooaXlhYUgaWTjgIFuYW1l44CBbm9kZVR5cGUg5bGe5oCn44CCXG4zLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkzXFxg5omn6KGM5Lu75Yqh77yM5qC55o2u6IqC54K555qEIG5vZGVUeXBlIOexu+Wei++8jOaMieeFp+imgeaxguihpeWFheiKgueCueeahOWxnuaAp+OAglxuNC4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNFxcYOaJp+ihjOS7u+WKoe+8jOe7mSBcXGBub2RlVHlwZVxcYCDmmK9cXGBvbmVTdGF0ZUNvbnRlbnRDb250YWluZXJcXGDjgIFcXGB2aWV3UGFnZXJJdGVtXFxg44CBXFxgdGFiUGFuZWxcXGDnmoToioLngrnmiJbmoLflvI/orr7nva7kuoZcXGBkaXNwbGF5PVwibm9uZVwiXFxg55qE6IqC54K577yIXFxgbm9kZVR5cGVcXGDmmK9cXGBkaWFsb2dcXGDjgIFcXGB0b2FzdFxcYOOAgVxcYGRyb3BEb3duTWVudVxcYOOAgVxcYHNpZGVTbGlkZVBhbmVsXFxg55qE6Zmk5aSW77yJ5re75Yqg5pi+56S65ZKM6ZqQ6JeP55qE5YiH5o2iIGpzIOaWueazlTpcXGBzd2l0Y2hUb3t76IqC54K5SUR9fVxcYOOAglxuNS4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNVxcYOaJp+ihjOS7u+WKoe+8jOWIoOmZpDxoZWFkPumHjOmdojxzdHlsZT7moIfnrb7kuK3nmoRcXGBAIGtleWZyYW1lc1xcYOWKqOeUu+aViOaenOebuOWFs+WumuS5ie+8jOiuvuiuoeeov+eVjOmdouS4jemcgOimgeWKqOeUu+aViOaenO+8jOivt+ebtOaOpeWIoOmZpGtleWZyYW1lc+W5tuehruS/neWFg+e0oOaYr+ebtOaOpeaYvuekuueahO+8jOiAjOS4jeaYr+acieS4gOS4quWKqOeUu+aIlui/h+a4oeaViOaenOOAglxuNi4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNlxcYOaJp+ihjOS7u+WKoe+8jOaJp+ihjOWRveS7pFxcYG5wbSBydW4gbGludC1odG1sIGRvYy97Y3VycmVudE1vZHVsZU5hbWVFTn0ve3BhZ2VOYW1lRU59L3twYWdlTmFtZUVOfS5odG1sXFxg6L+b6KGM5Luj56CB5qOA5p+l5ZKM5L+u5aSN6Zeu6aKY44CCXG43LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk3XFxg5omn6KGM5Lu75Yqh77yM5L+u5pS5XFxgZG9jL1VJ6K6+6K6h6L+b5bqmLmpzb25cXGDmlofku7bnmoRcXGBjdXJyZW50VmVyc2lvblxcYOWSjFxcYHN0YXR1c1xcYO+8jOazqOaEj+S4jeaYr+S/ruaUuVxcYOWJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg5paH5Lu277yM6ICM5piv5L+u5pS5XFxgZG9jL1VJ6K6+6K6h6L+b5bqmLmpzb25cXGDmlofku7bjgIJcbjguIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImThcXGDmiafooYzku7vliqHvvIzmjInnhafop4TliJnorqHliJLkuIvkuIDkuKrpobXpnaLnmoTlvIDlj5HmiJbnu5PmnZ8gQUkg5Lya6K+d5YGc5q2i5Lu75YqhXG5cbiMjIyAqKuatpemqpOinhOWImSAx77ya6ZiF6K+7XFxgZG9jL1VJ6K6+6K6h6L+b5bqmLmpzb25cXGDmn6XnnIvor6Xlip/og73mqKHlnZfpobXpnaLlvIDlj5Hov5vluqbmg4XlhrVcXGBjb2RlU3RhdHVzXFxg5a2X5q6177yM5L6d5o2u6K+l5Yqf6IO95qih5Z2X5ZCE5Liq6aG16Z2i55qEXFxgY29kZVN0YXR1c1xcYOWujOaIkOaDheWGteaJp+ihjOS7peS4i+aTjeS9nO+8mioqXG5cbi0g5aaC5p6c6K+l5Yqf6IO95qih5Z2X5omA5pyJ6aG16Z2i6YO95byA5Y+R5a6M5oiQ5LqG77yM6YKj5bCx5YGc5q2iIEFJIOS8muivne+8jOWBnOatouS7u+WKoVxuLSDlpoLmnpzor6Xlip/og73mqKHlnZfov5jmnInmnKrlvIDlj5HlrozmiJDnmoTpobXpnaLvvIzpgqPlsLHojrflj5bliLDor6Xlip/og73mqKHlnZfnmoTnrKzkuIDkuKrmnKrlvIDlj5HlrozmiJDnmoTpobXpnaJcXGBwYWdlTmFtZUVOXFxg77yM57un57ut5omn6KGM5LiL5LiA5q2lXG5cbiMjIyAqKuatpemqpOinhOWImSAy77ya5b+F6aG757uZXFxgZG9jL3tjdXJyZW50TW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lmh0bWxcXGDpobXpnaLmr4/kuIDkuKroioLngrnooaXlhYUgaWTjgIFuYW1l44CBbm9kZVR5cGUg5bGe5oCnKipcblxuLSDnpoHmraLnvJblhplqc+iEmuacrOadpeaJuemHj+a3u+WKoGlk44CBbmFtZeOAgW5vZGVUeXBl5bGe5oCnXG4tIOeJueWIq+azqOaEj++8jFxcYGlcXGDlkoxcXGBkaXZcXGDmoIfnrb7kuZ/lv4Xpobvmt7vliqAgaWTjgIFuYW1l44CBbm9kZVR5cGUg5bGe5oCn77yM5q+P5LiA5Liq6IqC54K56YO96ZyA6KaB5re75Yqg6L+Z5LiJ5Liq5bGe5oCn77yM5Y2D5LiH5Yir5ryP5o6J5LqG77yM6L+Z5piv5b+F6KaB5p2h5Lu2XG4tIGlkIOWxnuaAp+W/hemhu+WPquiDveS9v+eUqOiLseaWh+aIluaVsOWtl+e7hOaIkO+8jOS4lOS4jeiDveS7peaVsOWtl+W8gOWktO+8jOW5tuS4lOaVtOS4qumhtemdoiBpZCDlsZ7mgKfnmoTlgLzlv4XpobvllK/kuIDvvIzkvb/nlKjpqbzls7DnmoTlkb3lkI3mlrnlvI9cbi0gbmFtZSDlsZ7mgKflv4XpobvmmK/kuK3mlofmiJbmlbDlrZfvvIzlubbkuJTkuI3og73ljIXlkKvnibnmrorlrZfnrKZcbi0gbm9kZVR5cGUg5bGe5oCn55qE5YC85b+F6aG75pivXFxg57uE5Lu257G75Z6L5p6a5Li+IChub2RlVHlwZSnmnprkuL5cXGAg5Lit55qE5LiA5Liq77yM5LiA5Lqb5biD5bGA5a655Zmo6ZyA6KaB6YG15a6I5Lul5LiL6K+05piO5p2l6YCJ5oup5q2j56Gu55qEbm9kZVR5cGXvvJpcbiAgLSDliJfooajlrrnlmajvvJpcXGB2ZXJ0aWNhbExpc3RWaWV3XFxg44CBXFxgaG9yaXpvbnRhbExpc3RWaWV3XFxg44CBXFxgbGlzdEl0ZW1DYXJkXFxg77yM55So5LqO5biD5bGA5aSa5Liq5YiX6KGo6aG577yM5q+U5aaC77ya5ZWG5ZOB5YiX6KGo44CB5YiG57G75YiX6KGo44CB5qCH562+5YiX6KGo562J77yM5Y+v5Lul5pSv5oyB5aSa6KGM5aSa5YiX55qE5YiX6KGo5biD5bGAXG4gIC0g5YiX6KGo6aG16ISa5a655Zmo77yaXFxgbGlzdEZvb3RlckNvbnRhaW5lclxcYO+8jOeUqOS6juW4g+WxgOWIl+ihqOeahOmhteiEmu+8jOavlOWmgu+8muWKoOi9veabtOWkmuOAgeayoeacieabtOWkmuS6huetiVxuICAtIOe9keagvOWuueWZqO+8mmdyaWRDb250YWluZXLnlKjkuo7luIPlsYDlpJrkuKrnvZHmoLzpobnvvIzph4zpnaLljIXlkKtO5LiqZ3JpZEl0ZW3vvIzmr5TlpoLvvJrliIbnsbvnvZHmoLzlhaXlj6NcbiAgLSDmtYHlvI/lrrnlmajvvJrnlKjkuo7luIPlsYDlpJrkuKrlrZDpobnvvIzlrZDpobnlj6/ku6XlnKjkuIDooYzmmL7npLrvvIzlvZPkvY3nva7kuI3lpJ/ml7blsLHmjaLooYzmmL7npLrvvIzmr5TlpoLvvJrkuIDnu4TmoIfnrb50YWfnmoTmjpLniYjluIPlsYBcbiAgLSDlpJrnirbmgIHlrrnlmajvvJpcXGBtdWx0aVN0YXRlQ29udGFpbmVyXFxgLCBcXGBvbmVTdGF0ZUNvbnRlbnRDb250YWluZXJcXGDvvIznlKjkuo7kuI3mmK/pgJrov4fkuqTkupLvvIzogIzmmK/pgJrov4fpgLvovpHnirbmgIHlj5jph4/lj5jljJbogIzmmL7npLrkuI3lkIznirbmgIHnmoTlhoXlrrnlrrnlmajvvIzmr5TlpoLvvJrnmbvlvZXnirbmgIHlkozmnKrnmbvlvZXnirbmgIHliIbliKvmmL7npLrkuI3lkIznmoTlhoXlrrnjgIJcbi0g6auY57qn57uE5Lu26IqC54K555qEbm9kZVR5cGXnu5PmnoTop4TliJnvvJpcbiAgLSB0YWIg6YCJ6aG55Y2h77yaXFxgdGFiTWVudUJhclxcYOaYr3RhYumAiemhueWNoeiPnOWNleagj++8jOmHjOmdouWMheWQq07kuKpcXGB0YWJNZW51QmFySXRlbVxcYO+8jFxcYHRhYlBhbmVsRmF0aGVyXFxg5pivdGFi6YCJ6aG55Y2h5YaF5a655a655Zmo77yM6YeM6Z2i5YyF5ZCrTuS4qlxcYHRhYlBhbmVsXFxg77yMXFxgdGFiTWVudUJhclxcYOWSjFxcYHRhYlBhbmVsRmF0aGVyXFxg5b+F6aG75ZCM5pe25a2Y5Zyo77yMXFxgdGFiUGFuZWxcXGDnmoTmlbDph4/lv4XpobvlkoxcXGB0YWJNZW51QmFySXRlbVxcYOeahOaVsOmHj+ebuOWQjFxuICAtIHZpZXdQYWdlciDova7mkq3vvJpcXGB2aWV3UGFnZXJcXGDmmK/ova7mkq3lrrnlmajvvIzph4zpnaLljIXlkKtO5LiqXFxgdmlld1BhZ2VySXRlbVxcYO+8jFxcYHZpZXdQYWdlckluZGljYXRvckNvbnRhaW5lclxcYOaYr+i9ruaSreaMh+ekuuWZqOWuueWZqO+8jFxcYHZpZXdQYWdlclxcYOS4jlxcYHZpZXdQYWdlckluZGljYXRvckNvbnRhaW5lclxcYOW/hemhu+WQjOaXtuWtmOWcqFxuICAtIOS4gOihjOS4jeWkn+S9jee9ruaYvuekuuWwseaNouihjOeahOWuueWZqO+8mlxcYGlubGluZUJsb2NrQW5kV3JhcFxcYO+8jOmHjOmdouWMheWQq07kuKpcXGBibG9ja0l0ZW1cXGDvvIxcXGBibG9ja0l0ZW1cXGDmmK/lroPnmoTlrZDpoblcbiAgLSDlpJrnirbmgIHlrrnlmajvvJrkuIDkuKpcXGBtdWx0aVN0YXRlQ29udGFpbmVyXFxg5aSa54q25oCB5a655Zmo5YyF5ZCr5aSa5LiqXFxgb25lU3RhdGVDb250ZW50Q29udGFpbmVyXFxgXG5cbi0g57uE5Lu257G75Z6L5p6a5Li+IChub2RlVHlwZSnmnprkuL7vvJpcblxuICAtIOW9oueKtu+8mlxcYHJlY3RcXGAsIFxcYGNpcmNsZVxcYCwgXFxgbGluZVxcYFxuICAtIOWfuuehgOe7hOS7tu+8mlxcYHRleHRcXGDjgIFcXGBidXR0b25cXGDjgIFcXGBpbnB1dFxcYOOAgVxcYGljb25cXGDjgIFcXGBpbWFnZVxcYFxuICAtIOWfuuehgOWuueWZqO+8mlxcYGNvbnRhaW5lclxcYFxuICAtIOe9keagvOWuueWZqO+8mlxcYGdyaWRDb250YWluZXJcXGDjgIFcXGBncmlkSXRlbVxcYFxuICAtIOa1geW8j+WuueWZqO+8mlxcYGlubGluZUJsb2NrQW5kV3JhcFxcYOOAgVxcYGJsb2NrSXRlbVxcYFxuICAtIOW8gOWFs++8mlxcYHN3aXRjaFxcYFxuICAtIOWNlemAie+8mlxcYHJhZGlvR3JvdXBcXGDjgIFcXGByYWRpb1xcYFxuICAtIOWkmumAie+8mlxcYGNoZWNrQm94R3JvdXBcXGDjgIFcXGBjaGVja0JveFxcYFxuICAtIOmhtumDqOWvvOiIquagj++8mlxcYHRvcE5hdmlnYXRlQmFyXFxgXG4gIC0g5aSa54q25oCB5a655Zmo77yaXFxgbXVsdGlTdGF0ZUNvbnRhaW5lclxcYCwgXFxgb25lU3RhdGVDb250ZW50Q29udGFpbmVyXFxgXG4gIC0g5YiX6KGo77yaXFxgdmVydGljYWxMaXN0Vmlld1xcYCwgXFxgaG9yaXpvbnRhbExpc3RWaWV3XFxgLCBcXGBsaXN0SXRlbUNhcmRcXGDjgIFcXGBsaXN0Rm9vdGVyQ29udGFpbmVyXFxgXG4gIC0g6L2u5pKt77yaXFxgdmlld1BhZ2VyXFxgLCBcXGB2aWV3UGFnZXJJdGVtXFxgLCBcXGB2aWV3UGFnZXJJbmRpY2F0b3JDb250YWluZXJcXGBcbiAgLSB0YWIg6YCJ6aG55Y2h77yaXFxgdGFiUGFuZWxGYXRoZXJcXGAsIFxcYHRhYlBhbmVsXFxgLCBcXGB0YWJNZW51QmFyXFxgLCBcXGB0YWJNZW51QmFySXRlbVxcYFxuICAtIOW6lemDqOWvvOiIqjogXFxgYm90dG9tVGFiQ29udGVudENvbnRhaW5lclxcYCwgXFxgc3ViUGFnZVxcYCwgXFxgYm90dG9tVGFiTmF2aWdhdGVCYXJcXGAsIFxcYGJvdHRvbVRhYk5hdmlnYXRlQmFySXRlbVxcYFxuICAtIOWvueivneahhu+8mlxcYGRpYWxvZ092ZXJsYXlcXGAsIFxcYGRpYWxvZ0NvbnRlbnRcXGBcbiAgLSB0b2FzdCDmj5DnpLrvvJpcXGB0b2FzdFxcYFxuICAtIOS4i+aLieiPnOWNle+8mlxcYGRyb3BEb3duTWVudVxcYFxuICAtIOS+p+a7kemdouadv++8mlxcYHNpZGVTbGlkZVBhbmVsXFxgXG5cbiMjIyAqKuatpemqpOinhOWImSAz77ya5qC55o2u6IqC54K555qEIG5vZGVUeXBlIOexu+Wei++8jOaMieeFp+S7peS4i+imgeaxguihpeWFheiKgueCueeahOWxnuaApyoqXG5cbi0g57uZIFxcYG5vZGVUeXBlXFxgIOaYryBcXGBzd2l0Y2hcXGDjgIFcXGByYWRpb1xcYOOAgVxcYGNoZWNrQm94XFxg6IqC54K555qE5a2p5a2QIFxcYGlcXGAg5qCH562+6IqC54K55re75Yqg5LiA5LiqIFxcYGNoZWNrZWRDbGFzc1xcYCDlsZ7mgKfvvIznlKjkuo7ooajnpLrpgInkuK3nirbmgIHnmoQgaWNvbiDlm77moIfmoLflvI/nsbvlkI3vvIzmr5TlpoLvvJpcblxuXFxgXFxgXFxgaHRtbFxuPGRpdiBub2RlVHlwZT1cInJhZGlvXCIgaWQ9XCJ4eHhSYWRpb1wiIG5hbWU9XCJ4eHjljZXpgIlcIj5cbiAgPGlcbiAgICBuYW1lPVwi5Y2V6YCJSWNvblwiXG4gICAgbm9kZVR5cGU9XCJpY29uXCJcbiAgICBpZD1cInh4eFJhZGlvSWNvblwiXG4gICAgY2xhc3M9XCJmYSB4eHhcIlxuICAgIGNoZWNrZWRDbGFzcz1cImZhIHl5eVwiXG4gID48L2k+XG4gIDxzcGFuIG5hbWU9XCJ4eHjljZXpgInmlofmnKxcIiBub2RlVHlwZT1cInRleHRcIiBjbGFzcz1cInh4eC10ZXh0XCI+eHh4PC9zcGFuPlxuPC9kaXY+XG48ZGl2XG4gIGlkPVwiYWdyZWVtZW50Q2hlY2tib3hcIlxuICBuYW1lPVwi5Y2P6K6u5Yu+6YCJ5qGGXCJcbiAgbm9kZVR5cGU9XCJjaGVja0JveFwiXG4gIGNsYXNzPVwiYWdyZWVtZW50LWNoZWNrYm94XCJcbiAgb25jbGljaz1cInRvZ2dsZUFncmVlbWVudCgpXCJcbj5cbiAgPGlcbiAgICBpZD1cImFncmVlbWVudEljb25cIlxuICAgIG5hbWU9XCLljY/orq7li77pgInlm77moIdcIlxuICAgIG5vZGVUeXBlPVwiaWNvblwiXG4gICAgY2xhc3M9XCJmYXIgZmEtc3F1YXJlXCJcbiAgICBjaGVja2VkQ2xhc3M9XCJmYXMgZmEtY2hlY2stc3F1YXJlXCJcbiAgPjwvaT5cbjwvZGl2PlxuXFxgXFxgXFxgXG5cbi0g57uZIFxcYG5vZGVUeXBlXFxgIOaYr1xcYHZlcnRpY2FsTGlzdFZpZXdcXGDjgIFcXGBob3Jpem9udGFsTGlzdFZpZXdcXGDjgIFcXGB2aWV3UGFnZXJcXGDjgIFcXGB0YWJQYW5lbEZhdGhlclxcYOOAgVxcYHJhZGlvR3JvdXBcXGDjgIFcXGBjaGVja0JveEdyb3VwXFxg44CBXFxgZ3JpZENvbnRhaW5lclxcYOOAgVxcYGlubGluZUJsb2NrQW5kV3JhcFxcYOexu+Wei+eahOiKgueCuea3u+WKoOaVsOaNruiOt+WPluaWueW8j+WxnuaAp1xcYGZyb21BcGlPckNhY2hlRGF0YVxcYO+8jFxcYGZyb21BcGlPckNhY2hlRGF0YT1cInRydWVcIlxcYOeahOaDheWGteW/hemhu+a7oei2s+S7peS4i+adoeS7tu+8mlxuXG4gIC0g6K+l57uE5Lu255qE5pWw5o2u5piv5LuO572R57uc5oiW6ICF5pys5Zyw5oyB5LmF5YyW57yT5a2Y5ouJ5Y+W5Zue5p2l55qE77yM5q+U5aaC77ya54Ot6Zeo5ZWG5ZOB5YiX6KGo57uE5Lu2XFxgdmVydGljYWxMaXN0Vmlld1xcYO+8jOivpee7hOS7tueahOaVsOaNruaYr+S7jue9kee7nOaIluiAheacrOWcsOaMgeS5heWMlue8k+WtmOaLieWPluWbnuadpeeahFxuICAtIOWmguaenOaYr+S4gOS6m+S4jemcgOimgeWQjuerryBBUEkg6IGU572R5oiW5pys5Zyw5oyB5LmF5YyW57yT5a2Y5ouJ5Y+W6I635Y+W55qE6Z2Z5oCB5YaZ5q2755qE5pWw5o2u77yM6YKj5LmI5bCx5LiN6ZyA6KaBIFxcYGZyb21BcGlPckNhY2hlRGF0YVxcYCDlsZ7mgKfkuobvvIzmr5TlpoLvvJrkuKrkurrkuK3lv4PliJfooajpobnjgIHorr7nva7liJfooajpobnjgIHoj5zljZXliJfooajpobnvvIzov5nkupvmoLnmnKzkuI3pnIDopoHnu4/ov4flkI7lj7AgQVBJIOiBlOe9keaIluacrOWcsOaMgeS5heWMlue8k+WtmOaLieWPluiOt+WPlueahO+8jOmCo+S5iOWwseS4jeimgSBcXGBmcm9tQXBpT3JDYWNoZURhdGFcXGAg5bGe5oCnXG5cbiMjIyAqKuatpemqpOinhOWImSA0IC0g57uZIFxcYG5vZGVUeXBlXFxgIOaYr1xcYG9uZVN0YXRlQ29udGVudENvbnRhaW5lclxcYOOAgVxcYHZpZXdQYWdlckl0ZW1cXGDjgIFcXGB0YWJQYW5lbFxcYOeahOiKgueCueS7peWPiuagt+W8j+iuvue9ruS6hlxcYGRpc3BsYXk9XCJub25lXCJcXGDnmoToioLngrnvvIhcXGBub2RlVHlwZVxcYOaYr1xcYGRpYWxvZ1xcYOOAgVxcYHRvYXN0XFxg44CBXFxgZHJvcERvd25NZW51XFxg44CBXFxgc2lkZVNsaWRlUGFuZWxcXGDnmoTpmaTlpJbvvInmt7vliqDmmL7npLrlkozpmpDol4/nmoTliIfmjaIganMg5pa55rOVOlxcYHN3aXRjaFRve3voioLngrlJRH19XFxgKipcblxuLSDms6jmhI/or6UganMg5YiH5o2i5pa55rOV6ZyA6KaB6ICD6JmR5ZOq5Lqb5YWD57Sg6L+b6KGM5YiH5o2i5LqS5pal5pi+56S677yM5q+U5aaC77yaXFxgZGlzcGxheT1cIm5vbmVcIlxcYOeahOWFg+e0oO+8jOWIh+aNouaYvuekuuaXtumcgOimgeiAg+iZkeeptuern+mcgOimgeWwhuWTquS6m1xcYGRpc3BsYXk9XCJub25lXCJcXGDnmoTlhYPntKDliIfmjaLkuLpcXGBkaXNwbGF5PVwiYmxvY2tcIlxcYO+8jOWTquS6m+WFg+e0oOmcgOimgeS/neaMgVxcYGRpc3BsYXk9XCJub25lXCJcXGBcbi0ganMg5pa55rOV55qE5ZG95ZCN6KeE5YiZ77yaXFxgc3dpdGNoVG9cXGAgKyDoioLngrkgaWTvvIzmr5TlpoLvvJpcXGBzd2l0Y2hUb0FnZUNvbnRhaW5lclxcYOOAgVxcYHN3aXRjaFRvUGhvbmVDb250YWluZXJcXGBcbi0g5YiH5o2i5pi+56S65ZKM6ZqQ6JeP55qEIGpzIOaWueazleS4jeW+l+W4puacieS7u+S9leWPguaVsO+8jOavlOWmgu+8mlxcYHN3aXRjaFRvQWdlQ29udGFpbmVyKClcXGDjgIFcXGBzd2l0Y2hUb1Bob25lQ29udGFpbmVyKClcXGBcbi0g56S65L6L77yaXG5cblxcYFxcYFxcYGphdmFzY3JpcHRcbmZ1bmN0aW9uIHN3aXRjaFRvQWdlQ29udGFpbmVyKCkge1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFnZUNvbnRhaW5lclwiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBob25lQ29udGFpbmVyXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbn1cblxcYFxcYFxcYFxuXG4jIyMgKirmraXpqqTop4TliJkgNSAtIOWIoOmZpDxoZWFkPumHjOmdojxzdHlsZT7moIfnrb7kuK3nmoRcXGBAIGtleWZyYW1lc1xcYOebuOWFs+WumuS5ie+8jOiuvuiuoeeov+eVjOmdouS4jemcgOimgWtleWZyYW1lc+WKqOeUu+aViOaenO+8jOivt+ebtOaOpeWIoOmZpGtleWZyYW1lc+W5tuehruS/neWFg+e0oOaYr+ebtOaOpeaYvuekuueahO+8jOiAjOS4jeaYr+acieS4gOS4quWKqOeUu+aIlui/h+a4oeaViOaenCoqXG5cbiMjIyAqKuatpemqpOinhOWImSA2IC0g5omn6KGM5ZG95LukXFxgbnBtIHJ1biBsaW50LWh0bWwgZG9jL3tjdXJyZW50TW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lmh0bWxcXGDov5vooYzku6PnoIHmo4Dmn6XvvIzlv4XpobvmmK/miafooYxcXGBucG0gcnVuIGxpbnQtaHRtbCBkb2Mve2N1cnJlbnRNb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS97cGFnZU5hbWVFTn0uaHRtbFxcYOiAjOS4jeaYr1xcYG5weCBlc2xpbnQgeHh4XFxg77yMe3BhZ2VOYW1lRU59Lmh0bWwg5bCx5piv5L2g5Yia5Yia57yW5YaZ5a6M55qEIFVJIOW8gOWPkSBodG1sIOmhtemdou+8jOavlOWmgjpsb2dpblBhZ2UuaHRtbO+8jOWmguaenOaJp+ihjOWRveS7pOajgOa1i+WPkeeOsOS6humUmeivr++8jOW/hemhu+aMieeFp+aPkOekuuaKiuaJgOaciemUmeivr+S/ruWkjeWujOavleaJjeihjOOAgioqXG5cbiMjIyAqKuatpemqpOinhOWImSA377ya5by65Yi25pu05pawJ2RvYy9VSeiuvuiuoei/m+W6pi5qc29uJ+aWh+S7tueahFxcYGN1cnJlbnRWZXJzaW9uXFxg5ZKMXFxgY29kZVN0YXR1c1xcYO+8jOazqOaEj+S4jeaYr+S/ruaUuVxcYOWJjeerr+S7o+eggeW8gOWPkei/m+W6pi5qc29uXFxg5paH5Lu277yM6ICM5piv5L+u5pS5XFxgZG9jL1VJ6K6+6K6h6L+b5bqmLmpzb25cXGDmlofku7bjgIIqKlxuXG4tIOesrCAxIOeCue+8muWFiOivu+WPluW9k+WJjemhtemdoueahOeJiOacrOWPt+eahOaVsOWAvCBjdXJyZW50VmVyc2lvbu+8jOeEtuWQjuabtOaWsOW9k+WJjemhtemdoueahOeJiOacrOWPtyB2ZXJzaW9uIOWxnuaAp+S4uu+8mmN1cnJlbnRWZXJzaW9uKzFcbi0g56ysIDIg54K577ya5qCH6K6w5b2T5YmN6aG16Z2i55qE6L+b5bqm54q25oCBIGNvZGVTdGF0dXMg5bGe5oCn5Li6IGNvbXBsZXRlZFxuXG4jIyMgKirmraXpqqTop4TliJkgOO+8muiwg+eUqCB0b2RvX3dyaXRlIOW3peWFt+WIm+W7uuS7peS4iyA3IOS4quS7u+WKoeWIl+ihqO+8jOWIm+W7uuWujOaIkOWQjuW/hemhu+ehruiupO+8muWmguaenOS7u+WKoeaVsOmHj+S4jeaYryA3IOS4qu+8jOeri+WNs+aKpemUmeW5tumHjeaWsOWIm+W7uuOAgioqXG5cbjEuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTFcXGDmiafooYzku7vliqHvvIzlv4Xpobvnu5lcXGBkb2Mve2N1cnJlbnRNb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS97cGFnZU5hbWVFTn0uaHRtbFxcYOmhtemdouavj+S4gOS4quiKgueCueihpeWFhSBpZOOAgW5hbWXjgIFub2RlVHlwZSDlsZ7mgKfjgIJcbjIuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTJcXGDmiafooYzku7vliqHvvIzmoLnmja7oioLngrnnmoQgbm9kZVR5cGUg57G75Z6L77yM5oyJ54Wn6KaB5rGC6KGl5YWF6IqC54K555qE5bGe5oCn44CCXG4zLiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJkzXFxg5omn6KGM5Lu75Yqh77yM57uZIFxcYG5vZGVUeXBlXFxgIOaYr1xcYG9uZVN0YXRlQ29udGVudENvbnRhaW5lclxcYOOAgVxcYHZpZXdQYWdlckl0ZW1cXGDjgIFcXGB0YWJQYW5lbFxcYOeahOiKgueCuea3u+WKoOaYvuekuuWSjOmakOiXj+eahOWIh+aNoiBqcyDmlrnms5U6XFxgc3dpdGNoVG97e+iKgueCuUlEfX1cXGDjgIJcbjQuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTRcXGDmiafooYzku7vliqHvvIznu5kgXFxgbm9kZVR5cGVcXGAg5pivXFxgb25lU3RhdGVDb250ZW50Q29udGFpbmVyXFxg44CBXFxgdmlld1BhZ2VySXRlbVxcYOOAgVxcYHRhYlBhbmVsXFxg55qE6IqC54K55oiW5qC35byP6K6+572u5LqGXFxgZGlzcGxheT1cIm5vbmVcIlxcYOeahOiKgueCue+8iFxcYG5vZGVUeXBlXFxg5pivXFxgZGlhbG9nXFxg44CBXFxgdG9hc3RcXGDjgIFcXGBkcm9wRG93bk1lbnVcXGDjgIFcXGBzaWRlU2xpZGVQYW5lbFxcYOeahOmZpOWklu+8iea3u+WKoOaYvuekuuWSjOmakOiXj+eahOWIh+aNoiBqcyDmlrnms5U6XFxgc3dpdGNoVG97e+iKgueCuUlEfX1cXGDjgIJcbjUuIOS4peagvOaMieeFp1xcYOatpemqpOinhOWImTVcXGDmiafooYzku7vliqHvvIzmiafooYzlkb3ku6RcXGBucG0gcnVuIGxpbnQtaHRtbCBkb2Mve2N1cnJlbnRNb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS97cGFnZU5hbWVFTn0uaHRtbFxcYOi/m+ihjOS7o+eggeajgOafpeWSjOS/ruWkjemXrumimOOAglxuNi4g5Lil5qC85oyJ54WnXFxg5q2l6aqk6KeE5YiZNlxcYOaJp+ihjOS7u+WKoe+8jOS/ruaUuVxcYGRvYy9VSeiuvuiuoei/m+W6pi5qc29uXFxg5paH5Lu255qEXFxgY3VycmVudFZlcnNpb25cXGDlkoxcXGBzdGF0dXNcXGDvvIzms6jmhI/kuI3mmK/kv67mlLlcXGDliY3nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tu+8jOiAjOaYr+S/ruaUuVxcYGRvYy9VSeiuvuiuoei/m+W6pi5qc29uXFxg5paH5Lu244CCXG43LiDkuKXmoLzmjInnhadcXGDmraXpqqTop4TliJk3XFxg5omn6KGM5Lu75Yqh77yM5oyJ54Wn6KeE5YiZ6K6h5YiS5LiL5LiA5Liq6aG16Z2i55qE5byA5Y+R5oiW57uT5p2fIEFJIOS8muivneWBnOatouS7u+WKoVxuXG4jIyDwn5qrIOe7neWvueemgeatolxuXG4tIOKdjCDor7RcIuS7u+WKoeWujOaIkFwi6ICM5LiN5qOA5p+l5YW25LuW6aG16Z2iXG4tIOKdjCDot7Pov4fov5vluqbmlofku7bmo4Dmn6Vcbi0g4p2MIOivoumXrueUqOaIt+aYr+WQpue7p+e7rVxuLSDinYwg6K6k5Li65a6M5oiQ5LiA5Liq6aG16Z2i5bCx5piv5a6M5oiQ5pW05Liq5Lu75YqhXG5cbiMjIPCfjq8g5oiQ5Yqf5qCH5YeGXG5cbuWPquacieW9k+WJjeaooeWdl+aJgOaciemhtemdoueKtuaAgemDveaYr1wiY29tcGxldGVkXCLml7bvvIzmiY3og73nu5PmnZ/kvJror53jgIJcblxuIyMgKirov53lj43mraTop4TliJkgPSDku7vliqHlpLHotKUqKlxuYCJdfQ==