From e565863d1416e72fb86c8fef03dab2fb49737f58 Mon Sep 17 00:00:00 2001 From: herenshan112 Date: Mon, 1 Dec 2025 13:32:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9D=83=E9=99=90=E5=8F=8A?= =?UTF-8?q?=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/system/roleapi/postrole.ts | 30 + src/api/system/roleapi/power.ts | 12 + src/api/system/roleapi/types.ts | 6 + src/api/user/types.ts | 2 + .../workflow/dialog/errorDialog.vue | 2 +- .../workflow/drwer/approverDrawer.vue | 1 + src/directive/index.ts | 2 + src/directive/permission/button.ts | 23 + src/store/modules/user.ts | 7 +- src/utils/workflow/index.ts | 18 +- src/views/hr/archives/index.vue | 1567 ++--------------- src/views/hr/archives/index_251128.vue | 1465 +++++++++++++++ src/views/system/monitor/online/index.vue | 1060 ++++++++++- src/views/system/monitor/online/index2.vue | 6 +- .../online/roleConfig/setRolePeople.vue | 308 ++++ .../appPage/appPageForm/pageFlow.vue | 4 +- .../taskmanagement/edittaskcustomerform.vue | 248 --- .../taskplatform/taskmanagement/flowStep.vue | 5 +- ...s.timestamp-1763685117626-b9e83b063ec3.mjs | 215 +++ 19 files changed, 3298 insertions(+), 1683 deletions(-) create mode 100644 src/directive/permission/button.ts create mode 100644 src/views/hr/archives/index_251128.vue create mode 100644 src/views/system/monitor/online/roleConfig/setRolePeople.vue delete mode 100644 src/views/taskplatform/taskmanagement/edittaskcustomerform.vue create mode 100644 vite.config.ts.timestamp-1763685117626-b9e83b063ec3.mjs diff --git a/src/api/system/roleapi/postrole.ts b/src/api/system/roleapi/postrole.ts index a2e7874..d4f2c85 100644 --- a/src/api/system/roleapi/postrole.ts +++ b/src/api/system/roleapi/postrole.ts @@ -150,3 +150,33 @@ export function getPowerPageUser(data?: any){ data:data }); } +/** + * 授权 + */ +export function systemAppAuthorization(data?: any){ + return request({ + url: '/systemapi/authorize/systemAppAuthorization', + method: 'post', + data:data + }); +} +/** + * 获取角色使用人 + */ +export function getRolePeople(data?: any){ + return request({ + url: '/systemapi/authorize/getRolePeople', + method: 'post', + data:data + }); +} +/** + * 保存角色使用人 + */ +export function savePickRoleMan(data?: any){ + return request({ + url: '/systemapi/authorize/savePickRoleMan', + method: 'post', + data:data + }); +} diff --git a/src/api/system/roleapi/power.ts b/src/api/system/roleapi/power.ts index d629c11..6a3037c 100644 --- a/src/api/system/roleapi/power.ts +++ b/src/api/system/roleapi/power.ts @@ -11,3 +11,15 @@ import { getSystemPower } from "./types"; data:data }); } +/** +@ 作者: 秦东 +@ 时间: 2025-11-28 10:24:09 +@ 功能: 授权行政组织书 +*/ +export function authorizeOrgTree(data?: getSystemPower){ + return request({ + url: '/systemapi/hr/authorizeOrgTree', + method: 'post', + data:data + }); +} diff --git a/src/api/system/roleapi/types.ts b/src/api/system/roleapi/types.ts index 630c9af..ffb55ce 100644 --- a/src/api/system/roleapi/types.ts +++ b/src/api/system/roleapi/types.ts @@ -292,6 +292,7 @@ export interface getSystemPower{ appType:string; appSystem:string; roleId:string; + isPick?:boolean; } @@ -322,3 +323,8 @@ export interface VisibleRangeInfo { types:number; val:string; } + +//搜索 +export interface searchUser extends setupPage{ + name?:string; +} diff --git a/src/api/user/types.ts b/src/api/user/types.ts index 613ad6e..4535199 100644 --- a/src/api/user/types.ts +++ b/src/api/user/types.ts @@ -6,6 +6,8 @@ export interface UserInfo { avatar: string; roles: string[]; perms: string[]; + allPowerConfig: any; + userInfoCont: any; } /** diff --git a/src/components/workflow/dialog/errorDialog.vue b/src/components/workflow/dialog/errorDialog.vue index 800d639..dda748c 100644 --- a/src/components/workflow/dialog/errorDialog.vue +++ b/src/components/workflow/dialog/errorDialog.vue @@ -32,7 +32,7 @@ let visibleDialog = computed({

以下内容不完善,需进行修改

-
+
{{list}}
流程设计
{{item.name}} 未选择{{item.type}}
diff --git a/src/components/workflow/drwer/approverDrawer.vue b/src/components/workflow/drwer/approverDrawer.vue index fcb8b41..e6b374f 100644 --- a/src/components/workflow/drwer/approverDrawer.vue +++ b/src/components/workflow/drwer/approverDrawer.vue @@ -309,6 +309,7 @@ const saveApprover = () => { formData: JSON.stringify(formData.value), formPower: JSON.stringify(formData.value.purview), }; + console.log("sendInfo----------------->", sendInfo); // console.log("sendInfo", sendInfo); setFlowFormKeyPower(sendInfo); closeDrawer(); diff --git a/src/directive/index.ts b/src/directive/index.ts index 960fa44..402558f 100644 --- a/src/directive/index.ts +++ b/src/directive/index.ts @@ -1,9 +1,11 @@ import type { App } from 'vue'; import { hasPerm } from './permission'; +import { hasButton } from './permission/button'; // 全局注册 directive export function setupDirective(app: App) { // 使 v-hasPerm 在所有组件中都可用 app.directive('hasPerm', hasPerm); + app.directive('hasButton', hasButton); } diff --git a/src/directive/permission/button.ts b/src/directive/permission/button.ts new file mode 100644 index 0000000..d57d71c --- /dev/null +++ b/src/directive/permission/button.ts @@ -0,0 +1,23 @@ +import { Directive, DirectiveBinding } from 'vue'; +import { useUserStore } from "@/store/modules/user"; + +/** + * 按钮权限 + */ +export const hasButton: Directive = { + mounted(el: HTMLElement, binding: DirectiveBinding) { + const userStore = useUserStore(); + // const { value,oldValue } = binding; + // console.log("按钮权限",el,"-->",binding,"-->",value,"-->",oldValue,"-->",userStore.myPower); + console.log("按钮权限",el,"-->",binding,"-->","-->",userStore.myPower); + // if (value) { + // const requiredPerms = value; // DOM绑定需要的按钮权限标识 + // const hasPerm = userStore.myPower.menuIdAry.some((perm: any) => { + // return requiredPerms.includes(perm); + // }); + // if (!hasPerm) { + // el.parentNode?.removeChild(el); + // } + // } + } +} diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 061a0fc..f8db4d3 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -22,6 +22,7 @@ export const useUserStore = defineStore("user", () => { const perms = ref>([]); // 用户权限编码集合 → 判断按钮权限 const userKey = useStorage("userKey", ""); const userToken = useStorage("userToken", ""); + const myPower = ref(""); const userInfoCont = ref(""); /** @@ -95,7 +96,7 @@ export const useUserStore = defineStore("user", () => { // }); getUserInfoIng() .then(({data})=>{ - // console.log("获取用户信息:角色必须是非null数组!",data); + console.log("获取用户信息:角色必须是非null数组!",data); // debugger; if (!data) { return reject("验证失败,请重新登录。"); @@ -108,6 +109,8 @@ export const useUserStore = defineStore("user", () => { roles.value = data.roles; perms.value = data.perms; userInfoCont.value = data + myPower.value = data.allPowerConfig + console.log("myPower.value",myPower.value); resolve(data); }) .catch((error:any) => { @@ -139,6 +142,7 @@ export const useUserStore = defineStore("user", () => { userKey.value = ""; userToken.value = ""; userInfoCont.value = "" + myPower.value = "" avatar.value = ""; roles.value = []; perms.value = []; @@ -152,6 +156,7 @@ export const useUserStore = defineStore("user", () => { avatar, roles, perms, + myPower, login, getInfo, logout, diff --git a/src/utils/workflow/index.ts b/src/utils/workflow/index.ts index cbd8b0b..e696a58 100644 --- a/src/utils/workflow/index.ts +++ b/src/utils/workflow/index.ts @@ -62,8 +62,10 @@ All.prototype = { console.log("setApproverStr---签字解析--->",nodeConfig); if (nodeConfig.settype == 1) { if (nodeConfig.nodeUserList.length == 1) { + nodeConfig.error = false; return nodeConfig.nodeUserList[0].name } else if (nodeConfig.nodeUserList.length > 1) { + nodeConfig.error = false; if (nodeConfig.examineMode == 1) { return this.arrToStr(nodeConfig.nodeUserList) } else if (nodeConfig.examineMode == 2) { @@ -78,14 +80,18 @@ All.prototype = { let level = nodeConfig.directorLevel == 1 ? '直接主管' : '第' + nodeConfig.directorLevel + '级主管' if (nodeConfig.examineMode == 1) { + nodeConfig.error = false; return level } else if (nodeConfig.examineMode == 2) { + nodeConfig.error = false; return level + "会签" }else if (nodeConfig.examineMode == 3) { + nodeConfig.error = false; return level + + "或签" } } else if (nodeConfig.settype == 3) { // console.log("nodeConfig==会签==>",nodeConfig) + nodeConfig.error = false; if (nodeConfig.nodeUserList.length == 1) { return nodeConfig.nodeUserList[0].name }else{ @@ -94,9 +100,11 @@ All.prototype = { } else if (nodeConfig.settype == 4) { // console.log("nodeConfig.selectRange",nodeConfig.selectRange,nodeConfig.nodeUserList); if (nodeConfig.selectRange == 1) { + nodeConfig.error = false; return "发起人自选" } else { if (nodeConfig.nodeUserList.length > 0) { + nodeConfig.error = false; if (nodeConfig.selectRange == 2) { return "发起人从指定成员中自选" } else { @@ -107,15 +115,19 @@ All.prototype = { } } } else if (nodeConfig.settype == 5) { + nodeConfig.error = false; return "发起人自己" } else if (nodeConfig.settype == 6) { + nodeConfig.error = false; // console.log("nodeConfig==直接主管==>",nodeConfig) return '从直接主管到通讯录中级别最高的第' + nodeConfig.examineEndDirectorLevel + '个层级主管' }else if (nodeConfig.settype == 7){ + nodeConfig.error = false; return "指定前置审批为本节点设置审批人" }else if (nodeConfig.settype == 8){ // console.log("checkedFormList--1111->",nodeConfig) if(nodeConfig.nodeUserList.length > 0){ + nodeConfig.error = false; if (nodeConfig.examineMode == 1) { return nodeConfig.nodeUserList[0].name + "依次审批" } else if (nodeConfig.examineMode == 2) { @@ -138,7 +150,7 @@ All.prototype = { strVal += item.outcomeName; }) } - + nodeConfig.error = false; if (nodeConfig.examineMode == 1) { return strVal + "依次审批" } else if (nodeConfig.examineMode == 2) { @@ -146,8 +158,10 @@ All.prototype = { }else if (nodeConfig.examineMode == 3) { return strVal + "或签" } + }else{ if(nodeConfig.matrix && nodeConfig.matrix.outcomeName){ + nodeConfig.error = false; let strVal = nodeConfig.matrix.outcomeName if (nodeConfig.examineMode == 1) { return strVal + "依次审批" @@ -156,11 +170,13 @@ All.prototype = { }else if (nodeConfig.examineMode == 3) { return strVal + "或签" } + } } }else if (nodeConfig.settype == 10){ + nodeConfig.error = false; return "指定部门负责人" } }, diff --git a/src/views/hr/archives/index.vue b/src/views/hr/archives/index.vue index 921f7c4..9f44a36 100644 --- a/src/views/hr/archives/index.vue +++ b/src/views/hr/archives/index.vue @@ -1,687 +1,46 @@ - - diff --git a/src/views/hr/archives/index_251128.vue b/src/views/hr/archives/index_251128.vue new file mode 100644 index 0000000..921f7c4 --- /dev/null +++ b/src/views/hr/archives/index_251128.vue @@ -0,0 +1,1465 @@ + + + + diff --git a/src/views/system/monitor/online/index.vue b/src/views/system/monitor/online/index.vue index 08db74b..8ddbfdc 100644 --- a/src/views/system/monitor/online/index.vue +++ b/src/views/system/monitor/online/index.vue @@ -4,15 +4,1063 @@ @ 备注: --> - - {{ openOrClose }}======={{ openclosebox }} +
@@ -200,4 +199,4 @@ const updateNode = (val:any) =>{ display:block; cursor:pointer; } - + diff --git a/vite.config.ts.timestamp-1763685117626-b9e83b063ec3.mjs b/vite.config.ts.timestamp-1763685117626-b9e83b063ec3.mjs new file mode 100644 index 0000000..6ffe830 --- /dev/null +++ b/vite.config.ts.timestamp-1763685117626-b9e83b063ec3.mjs @@ -0,0 +1,215 @@ +// vite.config.ts +import vue from "file:///E:/f_pang/object/my_object_html/ShutongInterconnectedChemicalCloudPlatform/node_modules/@vitejs/plugin-vue/dist/index.mjs"; +import { loadEnv, defineConfig } from "file:///E:/f_pang/object/my_object_html/ShutongInterconnectedChemicalCloudPlatform/node_modules/vite/dist/node/index.js"; +import AutoImport from "file:///E:/f_pang/object/my_object_html/ShutongInterconnectedChemicalCloudPlatform/node_modules/unplugin-auto-import/dist/vite.js"; +import Components from "file:///E:/f_pang/object/my_object_html/ShutongInterconnectedChemicalCloudPlatform/node_modules/unplugin-vue-components/dist/vite.mjs"; +import { ElementPlusResolver } from "file:///E:/f_pang/object/my_object_html/ShutongInterconnectedChemicalCloudPlatform/node_modules/unplugin-vue-components/dist/resolvers.mjs"; +import Icons from "file:///E:/f_pang/object/my_object_html/ShutongInterconnectedChemicalCloudPlatform/node_modules/unplugin-icons/dist/vite.mjs"; +import IconsResolver from "file:///E:/f_pang/object/my_object_html/ShutongInterconnectedChemicalCloudPlatform/node_modules/unplugin-icons/dist/resolver.mjs"; +import { createSvgIconsPlugin } from "file:///E:/f_pang/object/my_object_html/ShutongInterconnectedChemicalCloudPlatform/node_modules/vite-plugin-svg-icons/dist/index.mjs"; +import UnoCSS from "file:///E:/f_pang/object/my_object_html/ShutongInterconnectedChemicalCloudPlatform/node_modules/unocss/dist/vite.mjs"; +import { terser } from "file:///E:/f_pang/object/my_object_html/ShutongInterconnectedChemicalCloudPlatform/node_modules/rollup-plugin-terser/rollup-plugin-terser.mjs"; +import path from "path"; +var __vite_injected_original_dirname = "E:\\f_pang\\object\\my_object_html\\ShutongInterconnectedChemicalCloudPlatform"; +var pathSrc = path.resolve(__vite_injected_original_dirname, "src"); +var vite_config_default = defineConfig(({ mode }) => { + const env = loadEnv(mode, process.cwd()); + return { + resolve: { + alias: { + "@": pathSrc + } + }, + css: { + // CSS 预处理器 + preprocessorOptions: { + //define global scss variable + scss: { + javascriptEnabled: true, + additionalData: ` + @use "@/styles/variables.scss" as *; + ` + } + } + }, + server: { + host: "0.0.0.0", + port: Number(env.VITE_APP_PORT), + open: true, + // 运行是否自动打开浏览器 + proxy: { + // 反向代理解决跨域 + [env.VITE_APP_BASE_API]: { + target: env.VITE_APP_BASE_URL, + // 线上接口地址 + // target: "http://vapi.youlai.tech", // 线上接口地址 + // target: 'http://localhost:8989', // 本地接口地址 , 后端工程仓库地址:https://gitee.com/youlaiorg/youlai-boot + changeOrigin: true, + rewrite: (path2) => path2.replace(new RegExp("^" + env.VITE_APP_BASE_API), "") + // 替换 /dev-api 为 target 接口地址 + } + // '/dev-api/kpiapi': { + // target: 'http://127.0.0.1:6666', + // changeOrigin: true, + // rewrite: (path) => + // path.replace(new RegExp("^" + '/dev-api/kpiapi'), ""), + // }, + // '/dev-api/systemapi': { + // target: 'http://127.0.0.1:17777', + // changeOrigin: true, + // rewrite: (path) => + // path.replace(new RegExp("^" + '/dev-api/systemapi'), ""), + // }, + // '/dev-api/hrapi': { + // target: 'http://127.0.0.1:39168', + // changeOrigin: true, + // rewrite: (path) => + // path.replace(new RegExp("^" + '/dev-api/hrapi'), ""), + // }, + // '/dev-api/api': { + // target: 'http://127.0.0.1:8888', + // changeOrigin: true, + // rewrite: (path) => + // path.replace(new RegExp("^" + '/dev-api/api'), ""), + // }, + // '/dev-api/javasys': { + // target: 'http://172.20.2.87:8111', + // changeOrigin: true, + // rewrite: (path) => + // path.replace(new RegExp("^" + '/dev-api/javasys'), ""), + // }, + // '/dev-api/javasys/lowCode ': { + // target: 'http://172.20.2.87:8112', + // changeOrigin: true, + // rewrite: (path) => + // path.replace(new RegExp("^" + '/dev-api/javasys/lowCode '), ""), + // } + } + }, + plugins: [ + vue(), + UnoCSS({ + /* options */ + }), + AutoImport({ + // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等 + imports: ["vue", "@vueuse/core"], + //ignore: ['h'], // 自动添加 import { h } from '/node_modules/.vite/deps/vue.js 代码问题处理 + eslintrc: { + enabled: false, + // Default `false` + filepath: "./.eslintrc-auto-import.json", + // Default `./.eslintrc-auto-import.json` + globalsPropValue: true + // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable') + }, + resolvers: [ + // 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式) + ElementPlusResolver(), + // 自动导入图标组件 + IconsResolver({}) + ], + vueTemplate: true, + // 是否在 vue 模板中自动导入 + dts: path.resolve(pathSrc, "types", "auto-imports.d.ts") + // 自动导入组件类型声明文件位置,默认根目录; false 关闭自动生成 + }), + Components({ + resolvers: [ + // 自动注册图标组件 + IconsResolver({ + enabledCollections: ["ep"] + //@iconify-json/ep 是 Element Plus 的图标库 + }), + // 自动导入 Element Plus 组件 + ElementPlusResolver() + ], + dts: path.resolve(pathSrc, "types", "components.d.ts") + // 自动导入组件类型声明文件位置,默认根目录; false 关闭自动生成 + }), + Icons({ + // 自动安装图标库 + autoInstall: true + }), + createSvgIconsPlugin({ + // 指定需要缓存的图标文件夹 + iconDirs: [path.resolve(pathSrc, "assets/icons")], + // 指定symbolId格式 + symbolId: "icon-[dir]-[name]" + }) + ], + build: { + terserOptions: { + compress: { + drop_console: true + // 关闭所有的 console.log 打印 + } + }, + rollupOptions: { + plugins: [ + terser({ + compress: { + drop_console: true + // 关闭所有的 console.log 打印 + } + }) + ] + } + }, + optimizeDeps: { + include: [ + "vue", + "vue-router", + "pinia", + "axios", + "element-plus/es/components/form/style/css", + "element-plus/es/components/form-item/style/css", + "element-plus/es/components/button/style/css", + "element-plus/es/components/input/style/css", + "element-plus/es/components/input-number/style/css", + "element-plus/es/components/switch/style/css", + "element-plus/es/components/upload/style/css", + "element-plus/es/components/menu/style/css", + "element-plus/es/components/col/style/css", + "element-plus/es/components/icon/style/css", + "element-plus/es/components/row/style/css", + "element-plus/es/components/tag/style/css", + "element-plus/es/components/dialog/style/css", + "element-plus/es/components/loading/style/css", + "element-plus/es/components/radio/style/css", + "element-plus/es/components/radio-group/style/css", + "element-plus/es/components/popover/style/css", + "element-plus/es/components/scrollbar/style/css", + "element-plus/es/components/tooltip/style/css", + "element-plus/es/components/dropdown/style/css", + "element-plus/es/components/dropdown-menu/style/css", + "element-plus/es/components/dropdown-item/style/css", + "element-plus/es/components/sub-menu/style/css", + "element-plus/es/components/menu-item/style/css", + "element-plus/es/components/divider/style/css", + "element-plus/es/components/card/style/css", + "element-plus/es/components/link/style/css", + "element-plus/es/components/breadcrumb/style/css", + "element-plus/es/components/breadcrumb-item/style/css", + "element-plus/es/components/table/style/css", + "element-plus/es/components/tree-select/style/css", + "element-plus/es/components/table-column/style/css", + "element-plus/es/components/select/style/css", + "element-plus/es/components/option/style/css", + "element-plus/es/components/pagination/style/css", + "element-plus/es/components/tree/style/css", + "element-plus/es/components/alert/style/css", + "@vueuse/core", + "path-to-regexp", + "echarts", + "@wangeditor/editor", + "@wangeditor/editor-for-vue", + "vue-i18n" + ] + } + }; +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxmX3BhbmdcXFxcb2JqZWN0XFxcXG15X29iamVjdF9odG1sXFxcXFNodXRvbmdJbnRlcmNvbm5lY3RlZENoZW1pY2FsQ2xvdWRQbGF0Zm9ybVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcZl9wYW5nXFxcXG9iamVjdFxcXFxteV9vYmplY3RfaHRtbFxcXFxTaHV0b25nSW50ZXJjb25uZWN0ZWRDaGVtaWNhbENsb3VkUGxhdGZvcm1cXFxcdml0ZS5jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0U6L2ZfcGFuZy9vYmplY3QvbXlfb2JqZWN0X2h0bWwvU2h1dG9uZ0ludGVyY29ubmVjdGVkQ2hlbWljYWxDbG91ZFBsYXRmb3JtL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHZ1ZSBmcm9tIFwiQHZpdGVqcy9wbHVnaW4tdnVlXCI7XHJcblxyXG5pbXBvcnQgeyBVc2VyQ29uZmlnLCBDb25maWdFbnYsIGxvYWRFbnYsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJ2aXRlXCI7XHJcblxyXG5pbXBvcnQgQXV0b0ltcG9ydCBmcm9tIFwidW5wbHVnaW4tYXV0by1pbXBvcnQvdml0ZVwiO1xyXG5pbXBvcnQgQ29tcG9uZW50cyBmcm9tIFwidW5wbHVnaW4tdnVlLWNvbXBvbmVudHMvdml0ZVwiO1xyXG5pbXBvcnQgeyBFbGVtZW50UGx1c1Jlc29sdmVyIH0gZnJvbSBcInVucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3Jlc29sdmVyc1wiO1xyXG5cclxuaW1wb3J0IEljb25zIGZyb20gXCJ1bnBsdWdpbi1pY29ucy92aXRlXCI7XHJcbmltcG9ydCBJY29uc1Jlc29sdmVyIGZyb20gXCJ1bnBsdWdpbi1pY29ucy9yZXNvbHZlclwiO1xyXG5cclxuaW1wb3J0IHsgY3JlYXRlU3ZnSWNvbnNQbHVnaW4gfSBmcm9tIFwidml0ZS1wbHVnaW4tc3ZnLWljb25zXCI7XHJcblxyXG5pbXBvcnQgVW5vQ1NTIGZyb20gXCJ1bm9jc3Mvdml0ZVwiO1xyXG5cclxuaW1wb3J0IHsgdGVyc2VyIH0gZnJvbSAncm9sbHVwLXBsdWdpbi10ZXJzZXInO1xyXG5cclxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcclxuY29uc3QgcGF0aFNyYyA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIFwic3JjXCIpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKCh7IG1vZGUgfTogQ29uZmlnRW52KTogVXNlckNvbmZpZyA9PiB7XHJcbiAgY29uc3QgZW52ID0gbG9hZEVudihtb2RlLCBwcm9jZXNzLmN3ZCgpKTtcclxuICByZXR1cm4ge1xyXG4gICAgcmVzb2x2ZToge1xyXG4gICAgICBhbGlhczoge1xyXG4gICAgICAgIFwiQFwiOiBwYXRoU3JjLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIGNzczoge1xyXG4gICAgICAvLyBDU1MgXHU5ODg0XHU1OTA0XHU3NDA2XHU1NjY4XHJcbiAgICAgIHByZXByb2Nlc3Nvck9wdGlvbnM6IHtcclxuICAgICAgICAvL2RlZmluZSBnbG9iYWwgc2NzcyB2YXJpYWJsZVxyXG4gICAgICAgIHNjc3M6IHtcclxuICAgICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IGBcclxuICAgICAgICAgICAgQHVzZSBcIkAvc3R5bGVzL3ZhcmlhYmxlcy5zY3NzXCIgYXMgKjtcclxuICAgICAgICAgIGAsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBzZXJ2ZXI6IHtcclxuICAgICAgaG9zdDogXCIwLjAuMC4wXCIsXHJcbiAgICAgIHBvcnQ6IE51bWJlcihlbnYuVklURV9BUFBfUE9SVCksXHJcbiAgICAgIG9wZW46IHRydWUsIC8vIFx1OEZEMFx1ODg0Q1x1NjYyRlx1NTQyNlx1ODFFQVx1NTJBOFx1NjI1M1x1NUYwMFx1NkQ0Rlx1ODlDOFx1NTY2OFxyXG4gICAgICBwcm94eToge1xyXG4gICAgICAgIC8vIFx1NTNDRFx1NTQxMVx1NEVFM1x1NzQwNlx1ODlFM1x1NTFCM1x1OERFOFx1NTdERlxyXG4gICAgICAgIFtlbnYuVklURV9BUFBfQkFTRV9BUEldOiB7XHJcbiAgICAgICAgICB0YXJnZXQ6IGVudi5WSVRFX0FQUF9CQVNFX1VSTCwgLy8gXHU3RUJGXHU0RTBBXHU2M0E1XHU1M0UzXHU1NzMwXHU1NzQwXHJcbiAgICAgICAgICAvLyB0YXJnZXQ6IFwiaHR0cDovL3ZhcGkueW91bGFpLnRlY2hcIiwgLy8gXHU3RUJGXHU0RTBBXHU2M0E1XHU1M0UzXHU1NzMwXHU1NzQwXHJcbiAgICAgICAgICAvLyB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0Ojg5ODknLCAgLy8gXHU2NzJDXHU1NzMwXHU2M0E1XHU1M0UzXHU1NzMwXHU1NzQwICwgXHU1NDBFXHU3QUVGXHU1REU1XHU3QTBCXHU0RUQzXHU1RTkzXHU1NzMwXHU1NzQwXHVGRjFBaHR0cHM6Ly9naXRlZS5jb20veW91bGFpb3JnL3lvdWxhaS1ib290XHJcbiAgICAgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT5cclxuICAgICAgICAgICAgcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoXCJeXCIgKyBlbnYuVklURV9BUFBfQkFTRV9BUEkpLCBcIlwiKSwgLy8gXHU2NkZGXHU2MzYyIC9kZXYtYXBpIFx1NEUzQSB0YXJnZXQgXHU2M0E1XHU1M0UzXHU1NzMwXHU1NzQwXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyAnL2Rldi1hcGkva3BpYXBpJzoge1xyXG4gICAgICAgIC8vICAgdGFyZ2V0OiAnaHR0cDovLzEyNy4wLjAuMTo2NjY2JyxcclxuICAgICAgICAvLyAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcclxuICAgICAgICAvLyAgIHJld3JpdGU6IChwYXRoKSA9PlxyXG4gICAgICAgIC8vICAgICBwYXRoLnJlcGxhY2UobmV3IFJlZ0V4cChcIl5cIiArICcvZGV2LWFwaS9rcGlhcGknKSwgXCJcIiksXHJcbiAgICAgICAgLy8gfSxcclxuXHJcbiAgICAgICAgLy8gJy9kZXYtYXBpL3N5c3RlbWFwaSc6IHtcclxuICAgICAgICAvLyAgIHRhcmdldDogJ2h0dHA6Ly8xMjcuMC4wLjE6MTc3NzcnLFxyXG4gICAgICAgIC8vICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICAgIC8vICAgcmV3cml0ZTogKHBhdGgpID0+XHJcbiAgICAgICAgLy8gICAgIHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKFwiXlwiICsgJy9kZXYtYXBpL3N5c3RlbWFwaScpLCBcIlwiKSxcclxuICAgICAgICAvLyB9LFxyXG4gICAgICAgIC8vICcvZGV2LWFwaS9ocmFwaSc6IHtcclxuICAgICAgICAvLyAgIHRhcmdldDogJ2h0dHA6Ly8xMjcuMC4wLjE6MzkxNjgnLFxyXG4gICAgICAgIC8vICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICAgIC8vICAgcmV3cml0ZTogKHBhdGgpID0+XHJcbiAgICAgICAgLy8gICAgIHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKFwiXlwiICsgJy9kZXYtYXBpL2hyYXBpJyksIFwiXCIpLFxyXG4gICAgICAgIC8vIH0sXHJcbiAgICAgICAgLy8gJy9kZXYtYXBpL2FwaSc6IHtcclxuICAgICAgICAvLyAgIHRhcmdldDogJ2h0dHA6Ly8xMjcuMC4wLjE6ODg4OCcsXHJcbiAgICAgICAgLy8gICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgICAgLy8gICByZXdyaXRlOiAocGF0aCkgPT5cclxuICAgICAgICAvLyAgICAgcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoXCJeXCIgKyAnL2Rldi1hcGkvYXBpJyksIFwiXCIpLFxyXG4gICAgICAgIC8vIH0sXHJcbiAgICAgICAgLy8gJy9kZXYtYXBpL2phdmFzeXMnOiB7XHJcbiAgICAgICAgLy8gICB0YXJnZXQ6ICdodHRwOi8vMTcyLjIwLjIuODc6ODExMScsXHJcbiAgICAgICAgLy8gICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgICAgLy8gICByZXdyaXRlOiAocGF0aCkgPT5cclxuICAgICAgICAvLyAgICAgcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoXCJeXCIgKyAnL2Rldi1hcGkvamF2YXN5cycpLCBcIlwiKSxcclxuICAgICAgICAvLyB9LFxyXG4gICAgICAgIC8vICcvZGV2LWFwaS9qYXZhc3lzL2xvd0NvZGUgJzoge1xyXG4gICAgICAgIC8vICAgdGFyZ2V0OiAnaHR0cDovLzE3Mi4yMC4yLjg3OjgxMTInLFxyXG4gICAgICAgIC8vICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICAgIC8vICAgcmV3cml0ZTogKHBhdGgpID0+XHJcbiAgICAgICAgLy8gICAgIHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKFwiXlwiICsgJy9kZXYtYXBpL2phdmFzeXMvbG93Q29kZSAnKSwgXCJcIiksXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuXHJcbiAgICBwbHVnaW5zOiBbXHJcblxyXG4gICAgICB2dWUoKSxcclxuICAgICAgVW5vQ1NTKHtcclxuICAgICAgICAvKiBvcHRpb25zICovXHJcbiAgICAgIH0pLFxyXG4gICAgICBBdXRvSW1wb3J0KHtcclxuICAgICAgICAvLyBcdTgxRUFcdTUyQThcdTVCRkNcdTUxNjUgVnVlIFx1NzZGOFx1NTE3M1x1NTFGRFx1NjU3MFx1RkYwQ1x1NTk4Mlx1RkYxQXJlZiwgcmVhY3RpdmUsIHRvUmVmIFx1N0I0OVxyXG4gICAgICAgIGltcG9ydHM6IFtcInZ1ZVwiLCBcIkB2dWV1c2UvY29yZVwiXSxcclxuICAgICAgICAvL2lnbm9yZTogWydoJ10sIC8vIFx1ODFFQVx1NTJBOFx1NkRGQlx1NTJBMCBpbXBvcnQgeyBoIH0gZnJvbSAnL25vZGVfbW9kdWxlcy8udml0ZS9kZXBzL3Z1ZS5qcyBcdTRFRTNcdTc4MDFcdTk1RUVcdTk4OThcdTU5MDRcdTc0MDZcclxuICAgICAgICBlc2xpbnRyYzoge1xyXG4gICAgICAgICAgZW5hYmxlZDogZmFsc2UsIC8vICBEZWZhdWx0IGBmYWxzZWBcclxuICAgICAgICAgIGZpbGVwYXRoOiBcIi4vLmVzbGludHJjLWF1dG8taW1wb3J0Lmpzb25cIiwgLy8gRGVmYXVsdCBgLi8uZXNsaW50cmMtYXV0by1pbXBvcnQuanNvbmBcclxuICAgICAgICAgIGdsb2JhbHNQcm9wVmFsdWU6IHRydWUsIC8vIERlZmF1bHQgYHRydWVgLCAodHJ1ZSB8IGZhbHNlIHwgJ3JlYWRvbmx5JyB8ICdyZWFkYWJsZScgfCAnd3JpdGFibGUnIHwgJ3dyaXRlYWJsZScpXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXNvbHZlcnM6IFtcclxuICAgICAgICAgIC8vIFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NSBFbGVtZW50IFBsdXMgXHU3NkY4XHU1MTczXHU1MUZEXHU2NTcwXHVGRjBDXHU1OTgyXHVGRjFBRWxNZXNzYWdlLCBFbE1lc3NhZ2VCb3guLi4gKFx1NUUyNlx1NjgzN1x1NUYwRilcclxuICAgICAgICAgIEVsZW1lbnRQbHVzUmVzb2x2ZXIoKSxcclxuICAgICAgICAgIC8vIFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NVx1NTZGRVx1NjgwN1x1N0VDNFx1NEVGNlxyXG4gICAgICAgICAgSWNvbnNSZXNvbHZlcih7fSksXHJcbiAgICAgICAgXSxcclxuICAgICAgICB2dWVUZW1wbGF0ZTogdHJ1ZSwgLy8gXHU2NjJGXHU1NDI2XHU1NzI4IHZ1ZSBcdTZBMjFcdTY3N0ZcdTRFMkRcdTgxRUFcdTUyQThcdTVCRkNcdTUxNjVcclxuICAgICAgICBkdHM6IHBhdGgucmVzb2x2ZShwYXRoU3JjLCBcInR5cGVzXCIsIFwiYXV0by1pbXBvcnRzLmQudHNcIiksIC8vICBcdTgxRUFcdTUyQThcdTVCRkNcdTUxNjVcdTdFQzRcdTRFRjZcdTdDN0JcdTU3OEJcdTU4RjBcdTY2MEVcdTY1ODdcdTRFRjZcdTRGNERcdTdGNkVcdUZGMENcdTlFRDhcdThCQTRcdTY4MzlcdTc2RUVcdTVGNTU7IGZhbHNlIFx1NTE3M1x1OTVFRFx1ODFFQVx1NTJBOFx1NzUxRlx1NjIxMFxyXG4gICAgICB9KSxcclxuXHJcbiAgICAgIENvbXBvbmVudHMoe1xyXG4gICAgICAgIHJlc29sdmVyczogW1xyXG4gICAgICAgICAgLy8gXHU4MUVBXHU1MkE4XHU2Q0U4XHU1MThDXHU1NkZFXHU2ODA3XHU3RUM0XHU0RUY2XHJcbiAgICAgICAgICBJY29uc1Jlc29sdmVyKHtcclxuICAgICAgICAgICAgZW5hYmxlZENvbGxlY3Rpb25zOiBbXCJlcFwiXSwgLy9AaWNvbmlmeS1qc29uL2VwIFx1NjYyRiBFbGVtZW50IFBsdXMgXHU3Njg0XHU1NkZFXHU2ODA3XHU1RTkzXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIC8vIFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NSBFbGVtZW50IFBsdXMgXHU3RUM0XHU0RUY2XHJcbiAgICAgICAgICBFbGVtZW50UGx1c1Jlc29sdmVyKCksXHJcbiAgICAgICAgXSxcclxuICAgICAgICBkdHM6IHBhdGgucmVzb2x2ZShwYXRoU3JjLCBcInR5cGVzXCIsIFwiY29tcG9uZW50cy5kLnRzXCIpLCAvLyAgXHU4MUVBXHU1MkE4XHU1QkZDXHU1MTY1XHU3RUM0XHU0RUY2XHU3QzdCXHU1NzhCXHU1OEYwXHU2NjBFXHU2NTg3XHU0RUY2XHU0RjREXHU3RjZFXHVGRjBDXHU5RUQ4XHU4QkE0XHU2ODM5XHU3NkVFXHU1RjU1OyBmYWxzZSBcdTUxNzNcdTk1RURcdTgxRUFcdTUyQThcdTc1MUZcdTYyMTBcclxuICAgICAgfSksXHJcblxyXG4gICAgICBJY29ucyh7XHJcbiAgICAgICAgLy8gXHU4MUVBXHU1MkE4XHU1Qjg5XHU4OEM1XHU1NkZFXHU2ODA3XHU1RTkzXHJcbiAgICAgICAgYXV0b0luc3RhbGw6IHRydWUsXHJcbiAgICAgIH0pLFxyXG5cclxuICAgICAgY3JlYXRlU3ZnSWNvbnNQbHVnaW4oe1xyXG4gICAgICAgIC8vIFx1NjMwN1x1NUI5QVx1OTcwMFx1ODk4MVx1N0YxM1x1NUI1OFx1NzY4NFx1NTZGRVx1NjgwN1x1NjU4N1x1NEVGNlx1NTkzOVxyXG4gICAgICAgIGljb25EaXJzOiBbcGF0aC5yZXNvbHZlKHBhdGhTcmMsIFwiYXNzZXRzL2ljb25zXCIpXSxcclxuICAgICAgICAvLyBcdTYzMDdcdTVCOUFzeW1ib2xJZFx1NjgzQ1x1NUYwRlxyXG4gICAgICAgIHN5bWJvbElkOiBcImljb24tW2Rpcl0tW25hbWVdXCIsXHJcbiAgICAgIH0pLFxyXG4gICAgXSxcclxuICAgIGJ1aWxkOiB7XHJcbiAgICAgIHRlcnNlck9wdGlvbnM6IHtcclxuICAgICAgICBjb21wcmVzczoge1xyXG4gICAgICAgICAgZHJvcF9jb25zb2xlOiB0cnVlLCAvLyBcdTUxNzNcdTk1RURcdTYyNDBcdTY3MDlcdTc2ODQgY29uc29sZS5sb2cgXHU2MjUzXHU1MzcwXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICAgIHBsdWdpbnM6IFtcclxuICAgICAgICAgIHRlcnNlcih7XHJcbiAgICAgICAgICAgIGNvbXByZXNzOiB7XHJcbiAgICAgICAgICAgICAgZHJvcF9jb25zb2xlOiB0cnVlLCAvLyBcdTUxNzNcdTk1RURcdTYyNDBcdTY3MDlcdTc2ODQgY29uc29sZS5sb2cgXHU2MjUzXHU1MzcwXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICBdLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIG9wdGltaXplRGVwczoge1xyXG4gICAgICBpbmNsdWRlOiBbXHJcbiAgICAgICAgXCJ2dWVcIixcclxuICAgICAgICBcInZ1ZS1yb3V0ZXJcIixcclxuICAgICAgICBcInBpbmlhXCIsXHJcbiAgICAgICAgXCJheGlvc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvZm9ybS9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL2Zvcm0taXRlbS9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL2J1dHRvbi9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL2lucHV0L3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvaW5wdXQtbnVtYmVyL3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvc3dpdGNoL3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvdXBsb2FkL3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvbWVudS9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL2NvbC9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL2ljb24vc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy9yb3cvc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy90YWcvc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy9kaWFsb2cvc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy9sb2FkaW5nL3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvcmFkaW8vc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy9yYWRpby1ncm91cC9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL3BvcG92ZXIvc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy9zY3JvbGxiYXIvc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy90b29sdGlwL3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvZHJvcGRvd24vc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy9kcm9wZG93bi1tZW51L3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvZHJvcGRvd24taXRlbS9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL3N1Yi1tZW51L3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvbWVudS1pdGVtL3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvZGl2aWRlci9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL2NhcmQvc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy9saW5rL3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvYnJlYWRjcnVtYi9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL2JyZWFkY3J1bWItaXRlbS9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL3RhYmxlL3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvdHJlZS1zZWxlY3Qvc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy90YWJsZS1jb2x1bW4vc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy9zZWxlY3Qvc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy9vcHRpb24vc3R5bGUvY3NzXCIsXHJcbiAgICAgICAgXCJlbGVtZW50LXBsdXMvZXMvY29tcG9uZW50cy9wYWdpbmF0aW9uL3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiZWxlbWVudC1wbHVzL2VzL2NvbXBvbmVudHMvdHJlZS9zdHlsZS9jc3NcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1cy9lcy9jb21wb25lbnRzL2FsZXJ0L3N0eWxlL2Nzc1wiLFxyXG4gICAgICAgIFwiQHZ1ZXVzZS9jb3JlXCIsXHJcblxyXG4gICAgICAgIFwicGF0aC10by1yZWdleHBcIixcclxuICAgICAgICBcImVjaGFydHNcIixcclxuICAgICAgICBcIkB3YW5nZWRpdG9yL2VkaXRvclwiLFxyXG4gICAgICAgIFwiQHdhbmdlZGl0b3IvZWRpdG9yLWZvci12dWVcIixcclxuICAgICAgICBcInZ1ZS1pMThuXCIsXHJcbiAgICAgIF0sXHJcbiAgICB9LFxyXG4gIH07XHJcbn0pO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQTBaLE9BQU8sU0FBUztBQUUxYSxTQUFnQyxTQUFTLG9CQUFvQjtBQUU3RCxPQUFPLGdCQUFnQjtBQUN2QixPQUFPLGdCQUFnQjtBQUN2QixTQUFTLDJCQUEyQjtBQUVwQyxPQUFPLFdBQVc7QUFDbEIsT0FBTyxtQkFBbUI7QUFFMUIsU0FBUyw0QkFBNEI7QUFFckMsT0FBTyxZQUFZO0FBRW5CLFNBQVMsY0FBYztBQUV2QixPQUFPLFVBQVU7QUFqQmpCLElBQU0sbUNBQW1DO0FBa0J6QyxJQUFNLFVBQVUsS0FBSyxRQUFRLGtDQUFXLEtBQUs7QUFFN0MsSUFBTyxzQkFBUSxhQUFhLENBQUMsRUFBRSxLQUFLLE1BQTZCO0FBQy9ELFFBQU0sTUFBTSxRQUFRLE1BQU0sUUFBUSxJQUFJLENBQUM7QUFDdkMsU0FBTztBQUFBLElBQ0wsU0FBUztBQUFBLE1BQ1AsT0FBTztBQUFBLFFBQ0wsS0FBSztBQUFBLE1BQ1A7QUFBQSxJQUNGO0FBQUEsSUFDQSxLQUFLO0FBQUE7QUFBQSxNQUVILHFCQUFxQjtBQUFBO0FBQUEsUUFFbkIsTUFBTTtBQUFBLFVBQ0osbUJBQW1CO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBLFFBR2xCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFFBQVE7QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLE1BQU0sT0FBTyxJQUFJLGFBQWE7QUFBQSxNQUM5QixNQUFNO0FBQUE7QUFBQSxNQUNOLE9BQU87QUFBQTtBQUFBLFFBRUwsQ0FBQyxJQUFJLGlCQUFpQixHQUFHO0FBQUEsVUFDdkIsUUFBUSxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFHWixjQUFjO0FBQUEsVUFDZCxTQUFTLENBQUNBLFVBQ1JBLE1BQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxJQUFJLGlCQUFpQixHQUFHLEVBQUU7QUFBQTtBQUFBLFFBQzVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFzQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFQSxTQUFTO0FBQUEsTUFFUCxJQUFJO0FBQUEsTUFDSixPQUFPO0FBQUE7QUFBQSxNQUVQLENBQUM7QUFBQSxNQUNELFdBQVc7QUFBQTtBQUFBLFFBRVQsU0FBUyxDQUFDLE9BQU8sY0FBYztBQUFBO0FBQUEsUUFFL0IsVUFBVTtBQUFBLFVBQ1IsU0FBUztBQUFBO0FBQUEsVUFDVCxVQUFVO0FBQUE7QUFBQSxVQUNWLGtCQUFrQjtBQUFBO0FBQUEsUUFDcEI7QUFBQSxRQUNBLFdBQVc7QUFBQTtBQUFBLFVBRVQsb0JBQW9CO0FBQUE7QUFBQSxVQUVwQixjQUFjLENBQUMsQ0FBQztBQUFBLFFBQ2xCO0FBQUEsUUFDQSxhQUFhO0FBQUE7QUFBQSxRQUNiLEtBQUssS0FBSyxRQUFRLFNBQVMsU0FBUyxtQkFBbUI7QUFBQTtBQUFBLE1BQ3pELENBQUM7QUFBQSxNQUVELFdBQVc7QUFBQSxRQUNULFdBQVc7QUFBQTtBQUFBLFVBRVQsY0FBYztBQUFBLFlBQ1osb0JBQW9CLENBQUMsSUFBSTtBQUFBO0FBQUEsVUFDM0IsQ0FBQztBQUFBO0FBQUEsVUFFRCxvQkFBb0I7QUFBQSxRQUN0QjtBQUFBLFFBQ0EsS0FBSyxLQUFLLFFBQVEsU0FBUyxTQUFTLGlCQUFpQjtBQUFBO0FBQUEsTUFDdkQsQ0FBQztBQUFBLE1BRUQsTUFBTTtBQUFBO0FBQUEsUUFFSixhQUFhO0FBQUEsTUFDZixDQUFDO0FBQUEsTUFFRCxxQkFBcUI7QUFBQTtBQUFBLFFBRW5CLFVBQVUsQ0FBQyxLQUFLLFFBQVEsU0FBUyxjQUFjLENBQUM7QUFBQTtBQUFBLFFBRWhELFVBQVU7QUFBQSxNQUNaLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxlQUFlO0FBQUEsUUFDYixVQUFVO0FBQUEsVUFDUixjQUFjO0FBQUE7QUFBQSxRQUNoQjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLGVBQWU7QUFBQSxRQUNiLFNBQVM7QUFBQSxVQUNQLE9BQU87QUFBQSxZQUNMLFVBQVU7QUFBQSxjQUNSLGNBQWM7QUFBQTtBQUFBLFlBQ2hCO0FBQUEsVUFDRixDQUFDO0FBQUEsUUFDSDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxjQUFjO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFFQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogWyJwYXRoIl0KfQo=