徐景良 2024-05-21 08:35:33 +08:00
commit eb73b3c4eb
17 changed files with 260 additions and 61 deletions

View File

@ -252,7 +252,7 @@ export function AddTable(params) {
dbColumnName: 'geom',
dataType: 'geometry',
length: 0,
columnDescription: 'geom',
columnDescription: '地图组件',
isNullable: 0,
isIdentity: 0,
isPrimarykey: 0,
@ -272,3 +272,34 @@ export function AddColumn(params) {
params,
});
}
// 获取表单分页数据 【先不写】
export function functionGetFormDataPage(params: AccountParams) {
return defHttp.post<FromSchemandAndInfoModel>({
url: Api.GetFormDataPage,
params,
});
}
// 获取表单分页数据【先不写】
export function functionGetFormDataList(params: AccountParams) {
return defHttp.post<FromSchemandAndInfoModel>({
url: Api.GetFormDataList,
params,
});
}
// 获取表单数据【先不写】
export function functionGetFormDataFormScheme(params: AccountParams) {
return defHttp.get<FromSchemandAndInfoModel>({
url: Api.GetFormDataFormScheme,
params,
});
}
// 保存自定表单数据【先不写】
export function functionsaveForm(params: AccountParams) {
return defHttp.post<FromSchemandAndInfoModel>({
url: Api.saveForm,
params,
});
}

View File

@ -16,6 +16,7 @@
formVerison: String,
formRelationId: String,
flowFormData: Object,
instanceInfo: String,
});
props.formConfig.forEach((element) => {
element.componentProps.disabled = !element.disabled;
@ -44,10 +45,11 @@
}
}
async function getFormDetail() {
var instance = JSON.parse(props.instanceInfo);
const querys = {
id: props.formVerison,
key: keyValue.value,
keyValue: props.processId,
keyValue: instance.pkeyValue,
};
const data = await functionGetFormDataFormScheme(querys);
let obj = new Object();

View File

@ -13,25 +13,54 @@
>
<FormItem label="地图宽度">
<a-input-number
v-model:value="formConfig.mapSetData.width"
v-model:value="formConfig.currentItem.mapSetData.width"
placeholder="请输入地图宽度"
:min="1"
:max="100"
defaultValue="100"
>
<template #addonAfter><PercentageOutlined /></template>
</a-input-number>
</FormItem>
<!-- <FormItem label="选择图层">
<a-select
v-model:value="formConfig.currentItem.mapSetData.chooseLayer"
:options="options"
mode="tags"
size="middle"
placeholder="请选择图层"
/>
</FormItem>
<FormItem label="图层字段解析">
<FormItem label="GID字段">
<a-input
v-model:value="formConfig.currentItem.mapSetData.layerFields.gidField"
placeholder="请输入GID字段"
/>
</FormItem> -->
<FormItem label="标注字段">
<a-select
v-model:value="formConfig.currentItem.mapSetData.layerFields.labelField"
:options="formConfig.currentItem.mapSetData.layerFields.labelFieldOptions"
size="middle"
placeholder="请选择标注字段"
/>
</FormItem>
<!--
<FormItem label="geom字段">
<a-input
v-model:value="formConfig.currentItem.mapSetData.layerFields.geomField"
placeholder="请输入geom字段"
/>
</FormItem>
</FormItem> -->
<FormItem label="是否允许添加图斑">
<Switch v-model:checked="formConfig.mapSetData.isAllowAddPolygon" />
<Switch v-model:checked="formConfig.currentItem.mapSetData.isAllowAddPolygon" />
</FormItem>
<FormItem label="是否允许编辑图斑">
<Switch v-model:checked="formConfig.mapSetData.isAllowEditPolygon" />
<Switch v-model:checked="formConfig.currentItem.mapSetData.isAllowEditPolygon" />
</FormItem>
<FormItem label="是否开启位置跳转">
<Switch v-model:checked="formConfig.mapSetData.isEnablePostionJump" />
<Switch v-model:checked="formConfig.currentItem.mapSetData.isEnablePostionJump" />
</FormItem>
</Form>
<Form v-else label-align="left" layout="vertical">
@ -111,6 +140,8 @@
const { formConfig } = useFormDesignState();
const options = [...Array(25)].map((_, i) => ({ value: (i + 10).toString(36) + (i + 1) }));
watch(
() => formConfig.value,
() => {
@ -120,7 +151,15 @@
formConfig.value.currentItem.itemProps.labelCol || {};
formConfig.value.currentItem.itemProps.wrapperCol =
formConfig.value.currentItem.itemProps.wrapperCol || {};
formConfig.value.mapSetData = formConfig.value.mapSetData || {};
if (formConfig.value.currentItem.field == 'MapGeom') {
formConfig.value.currentItem.mapSetData = formConfig.value.currentItem.mapSetData || {
width: 100,
layerFields: {},
isAllowAddPolygon: false,
isAllowEditPolygon: false,
isEnablePostionJump: false,
};
}
}
},
{ deep: true, immediate: true },

View File

@ -13,7 +13,7 @@
<TabPane :key="3" tab="栅格">
<ComponentColumnProps />
</TabPane>
<TabPane :key="4" tab="组件">
<TabPane :key="4" tab="组件" v-if="formType_design < 2">
<slot v-if="slotProps" :name="slotProps.component + 'Props'"></slot>
<ComponentProps v-else />
</TabPane>
@ -21,7 +21,7 @@
</div>
</template>
<script lang="ts">
import { computed, defineComponent } from 'vue';
import { computed, defineComponent, ref, watch, inject } from 'vue';
import FormProps from '../components/FormProps.vue';
import FormItemProps from '../components/FormItemProps.vue';
import ComponentProps from '../components/ComponentProps.vue';
@ -52,7 +52,16 @@
// );
});
// return { formConfig, customComponents, slotProps };
return { formConfig, slotProps };
const thisFormType: any = inject('thisFormType');
const formType_design = ref();
watch(
() => thisFormType,
() => {
formType_design.value = thisFormType.value?.info?.formType | 0;
},
{ deep: true, immediate: true },
);
return { formConfig, slotProps, formType_design };
},
});
</script>

View File

@ -26,8 +26,7 @@
<!-- 部分控件需要一个空div -->
<div>
<img
src="/mars/img/onlineform/map.png"
<Divider
v-if="schema.field == 'MapGeom'"
class="v-form-item-wrapper"
:defaultValue="schema.defaultValue"
@ -36,7 +35,9 @@
style="width: 100%; height: 10%"
@change="handleChange"
@click="handleClick(schema)"
/>
>
地图组件
</Divider>
<component
v-else
class="v-form-item-wrapper"

View File

@ -15,6 +15,38 @@ export type PropsTabKey = 1 | 2 | 3;
type ColSpanType = number | string;
declare type Value = [number, number] | number;
/**
*
*/
export interface LayerFields {
// GID字段
gidField?: string;
// 标注字段
labelField?: string;
// geom字段
geomField?: string;
// 标注字段options
labelFieldOptions?: any[];
}
/**
*
*/
export interface MapComponent {
// 地图宽度
width?: number;
// 选择图层
chooseLayer?: any[];
// 图层字段解析
layerFields: LayerFields;
// 是否允许添加图斑
isAllowAddPolygon?: boolean;
// 是否允许编辑图斑
isAllowEditPolygon?: boolean;
// 是否开启位置跳转
isEnablePostionJump?: boolean;
}
/**
*
*/
@ -70,37 +102,8 @@ export interface IVFormComponent {
wrapperCol?: IAnyObject;
// 子控件
columns?: Array<{ span: number; children: any[] }>;
}
/**
*
*/
export interface LayerFields {
// GID字段
gidField?: string;
// 标注字段
labelField?: string;
// geom字段
geomField?: string;
// 标注字段options
labelFieldOptions?: any[];
}
/**
*
*/
export interface MapComponent {
// 地图宽度
width?: string;
// 选择图层
chooseLayer: string;
// 图层字段解析
layerFields?: LayerFields;
// 是否允许添加图斑
isAllowAddPolygon?: boolean;
// 是否允许编辑图斑
isAllowEditPolygon?: boolean;
// 是否开启位置跳转
isEnablePostionJump?: boolean;
// 地图数据
mapSetData?: MapComponent;
}
declare type namesType = string | string[];
@ -129,7 +132,6 @@ export interface IFormConfig extends PickAntFormConfig {
activeKey?: PropsTabKey;
status?: string;
defaultValue?: string;
mapSetData?: MapComponent;
}
export interface AForm {

View File

@ -180,7 +180,6 @@
schemeId: designerData.formCurrentNode.formVerison,
isUpdate: props.isUpdate,
pkey: keyValue.value,
pkeyValue: processId,
};
//
if (formVisble.value) {
@ -190,19 +189,31 @@
formBoxRef.value
.getForm()
.then(async (res) => {
res[designerData.formCurrentNode.formRelationId] = processId;
if (!props.isUpdate) {
res[designerData.formCurrentNode.formRelationId] = processId;
querys.pkeyValue = processId;
}
for (var item in res) {
console.log(res[item]);
if (res[item] == undefined) {
res[item] = '';
if (item.search('_input_guid') != -1) {
if (item.search('_input_guid') != -1 && !props.isUpdate) {
res[item] = buildGUID();
}
} else {
if (props.isUpdate) {
if (item.search('_input_guid') != -1) {
console.log(res[item]);
querys.pkeyValue = res[item];
}
}
}
}
querys.data = JSON.stringify(res);
console.log(querys);
const formValue = await functionsaveForm(querys);
if (formValue) {
handleCreateFlow(processId);
handleCreateFlow(processId, querys.pkeyValue);
}
})
.catch((error) => {
@ -214,12 +225,18 @@
handleCreateFlow(processId);
}
}
async function handleCreateFlow(processId) {
async function handleCreateFlow(processId, pkeyValue) {
var commit = {
schemeId: designerData.formCurrentNode.formVerison,
pkey: keyValue.value,
pkeyValue: pkeyValue ? pkeyValue : processId,
};
var querys = {
schemeCode: designerData.isDraft ? '' : props.code,
userId: formData.userId,
title: formData.title,
processId: processId,
InstanceInfo: JSON.stringify(commit),
};
if (!designerData.isDraft) {
await saveDraft(querys);

View File

@ -317,6 +317,7 @@
btnList: btnList.value,
});
} else {
flowFormData.value = {};
previewOpen.value = true;
isUpdate.value = false;
}

View File

@ -50,6 +50,7 @@
ref="modalDesign_config"
:modalFormVerison="modalFormVerison"
:editData="editData"
:isEdit="isEdit"
/>
</div>
</div>

View File

@ -39,13 +39,19 @@
type: Object,
default: () => ({}),
},
isEdit: {
type: Boolean,
default: () => false,
},
});
watch(
() => props.modalFormVerison,
(newVal, oldVal) => {
if (newVal != oldVal) {
validateSteps(newVal);
if (typeof newVal == 'string') {
validateSteps(newVal);
}
}
},
);
@ -236,9 +242,14 @@
}
//
if (props.editData.formEdit) {
if (props.editData.record.formVerison === formVerison) {
if (props.isEdit) {
if (
(typeof props.editData.record.formVerison == 'string'
? props.editData.record.formVerison
: props.editData.record.formVerison.value) === formVerison
) {
const editDataScheme = JSON.parse(props.editData.record.scheme);
//
config.value.layoutType = editDataScheme.layoutType;
// -

View File

@ -4,7 +4,6 @@
@ok="modalSubmit"
title="选择表单"
width="60%"
height="750"
useWrapper="false"
>
<div>

View File

@ -56,7 +56,7 @@
<AutomaticModal
@register="automaticModal"
:isAddVisible="isAddVisible"
@automaticModalSubmitsuccess="automaticModalSubmitsuccess"
@automatic-modal-submitsuccess="automaticModalSubmitsuccess"
/>
</BasicModal>
</template>
@ -81,7 +81,7 @@
const emit = defineEmits(['submitsuccess']);
let isAddVisible = ref();
let formScheme = ref();
let formScheme: any = ref({ info: {}, scheme: {} });
let saveFormDatas: any = ref({});
const primaryKey: any = ref();
@ -89,6 +89,10 @@
'handleNextStepsData',
computed(() => saveFormDatas.value),
);
provide(
'thisFormType',
computed(() => saveFormDatas.value),
);
function designSendGrandson(value) {
let designTab = JSON.parse(value);

View File

@ -85,7 +85,7 @@
},
});
const emit = defineEmits(['automaticModalSubmitsuccess']);
const emit = defineEmits(['automatic-modal-submitsuccess']);
let saveFormDatas;
const labelCol = { span: 7 };
@ -129,7 +129,7 @@
// db
if (!props.isAddVisible) {
let query: any = { id: data.saveFormDatas.info.id };
let result = await functionGetForm(query);
let result: any = await functionGetForm(query);
let result_json = JSON.parse(result.scheme.scheme);
let data_json = JSON.parse(data.saveFormDatas.scheme.scheme);
data_json.db = result_json.db;
@ -213,7 +213,7 @@
});
saveFormDatas.scheme.scheme = JSON.stringify(schems);
emit('automaticModalSubmitsuccess', saveFormDatas);
emit('automatic-modal-submitsuccess', saveFormDatas);
closeModal();
}
</script>

View File

@ -166,11 +166,18 @@
designerData.delegateUsers = data;
}
async function handleSaveDraft() {
var processId = buildGUID();
var commit = {
schemeId: designerData.formCurrentNode.formVerison,
pkey: keyValue.value,
pkeyValue: processId,
};
var querys = {
schemeCode: designerData.isDraft ? '' : props.code,
userId: formData.userId,
title: formData.title,
processId: buildGUID(),
processId: processId,
InstanceInfo: JSON.stringify(commit),
};
const data = await saveDraft(querys);
querys.schemeCode = '';
@ -184,6 +191,7 @@
}
function handleSubmit() {
var processId = buildGUID();
var querys = {
schemeId: designerData.formCurrentNode.formVerison,
isUpdate: false,
@ -223,11 +231,17 @@
}
}
async function handleCreateFlow(processId) {
var commit = {
schemeId: designerData.formCurrentNode.formVerison,
pkey: keyValue.value,
pkeyValue: processId,
};
var querys = {
schemeCode: designerData.isDraft ? '' : props.code,
userId: formData.userId,
title: formData.title,
processId: processId,
InstanceInfo: JSON.stringify(commit),
};
if (!designerData.isDraft) {
await saveDraft(querys);

View File

@ -17,6 +17,7 @@
:processId="designerData.process.id"
:formVerison="designerData.formCurrentNode.formVerison"
:formRelationId="designerData.formCurrentNode.formRelationId"
:instanceInfo="designerData.process.instanceInfo"
v-if="formVisble"
/>
</a-tab-pane>

View File

@ -20,6 +20,7 @@
:processId="designerData.process.id"
:formVerison="designerData.formCurrentNode.formVerison"
:formRelationId="designerData.formCurrentNode.formRelationId"
:instanceInfo="designerData.process.instanceInfo"
v-if="formVisble"
/>
</a-tab-pane>

View File

@ -0,0 +1,66 @@
// vite.config.ts
import { defineApplicationConfig } from "file:///E:/%E6%96%B0%E6%9E%B6%E6%9E%84%E9%A1%B9%E7%9B%AE/%E8%B4%A2%E6%BA%90%E4%B8%80%E4%BD%93%E5%8C%96/mian/CaiYuanYiTiHua/internal/vite-config/dist/index.mjs";
var vite_config_default = defineApplicationConfig({
overrides: {
optimizeDeps: {
include: [
"echarts/core",
"echarts/charts",
"echarts/components",
"echarts/renderers",
"qrcode",
"@iconify/iconify",
"ant-design-vue/es/locale/zh_CN",
"ant-design-vue/es/locale/en_US",
"@/../lib/vform/designer.umd.js"
]
},
build: {
/* 其他build生产打包配置省略 */
//...
target: "esnext",
commonjsOptions: {
include: /node_modules|lib/
//这里记得把lib目录加进来否则生产打包会报错
}
},
server: {
proxy: {
"/basic-api": {
target: "http://localhost:3000",
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(new RegExp(`^/basic-api`), "")
// only https
// secure: false
},
"/upload": {
target: "http://localhost:3300/upload",
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(new RegExp(`^/upload`), "")
}
},
warmup: {
clientFiles: ["./index.html", "./src/{views,components}/*"]
}
},
define: {
"process.env": {
BASE_URL: "/"
}
},
css: {
preprocessorOptions: {
less: {
javascriptEnabled: true
}
}
},
plugins: []
}
});
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxcdTY1QjBcdTY3QjZcdTY3ODRcdTk4NzlcdTc2RUVcXFxcXHU4RDIyXHU2RTkwXHU0RTAwXHU0RjUzXHU1MzE2XFxcXG1pYW5cXFxcQ2FpWXVhbllpVGlIdWFcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFx1NjVCMFx1NjdCNlx1Njc4NFx1OTg3OVx1NzZFRVxcXFxcdThEMjJcdTZFOTBcdTRFMDBcdTRGNTNcdTUzMTZcXFxcbWlhblxcXFxDYWlZdWFuWWlUaUh1YVxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovJUU2JTk2JUIwJUU2JTlFJUI2JUU2JTlFJTg0JUU5JUExJUI5JUU3JTlCJUFFLyVFOCVCNCVBMiVFNiVCQSU5MCVFNCVCOCU4MCVFNCVCRCU5MyVFNSU4QyU5Ni9taWFuL0NhaVl1YW5ZaVRpSHVhL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQXBwbGljYXRpb25Db25maWcgfSBmcm9tICdAdmJlbi92aXRlLWNvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUFwcGxpY2F0aW9uQ29uZmlnKHtcbiAgb3ZlcnJpZGVzOiB7XG4gICAgb3B0aW1pemVEZXBzOiB7XG4gICAgICBpbmNsdWRlOiBbXG4gICAgICAgICdlY2hhcnRzL2NvcmUnLFxuICAgICAgICAnZWNoYXJ0cy9jaGFydHMnLFxuICAgICAgICAnZWNoYXJ0cy9jb21wb25lbnRzJyxcbiAgICAgICAgJ2VjaGFydHMvcmVuZGVyZXJzJyxcbiAgICAgICAgJ3FyY29kZScsXG4gICAgICAgICdAaWNvbmlmeS9pY29uaWZ5JyxcbiAgICAgICAgJ2FudC1kZXNpZ24tdnVlL2VzL2xvY2FsZS96aF9DTicsXG4gICAgICAgICdhbnQtZGVzaWduLXZ1ZS9lcy9sb2NhbGUvZW5fVVMnLFxuICAgICAgICAnQC8uLi9saWIvdmZvcm0vZGVzaWduZXIudW1kLmpzJyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBidWlsZDoge1xuICAgICAgLyogXHU1MTc2XHU0RUQ2YnVpbGRcdTc1MUZcdTRFQTdcdTYyNTNcdTUzMDVcdTkxNERcdTdGNkVcdTc3MDFcdTc1NjUgKi9cbiAgICAgIC8vLi4uXG4gICAgICB0YXJnZXQ6ICdlc25leHQnLFxuICAgICAgY29tbW9uanNPcHRpb25zOiB7XG4gICAgICAgIGluY2x1ZGU6IC9ub2RlX21vZHVsZXN8bGliLywgLy9cdThGRDlcdTkxQ0NcdThCQjBcdTVGOTdcdTYyOEFsaWJcdTc2RUVcdTVGNTVcdTUyQTBcdThGREJcdTY3NjVcdUZGMENcdTU0MjZcdTUyMTlcdTc1MUZcdTRFQTdcdTYyNTNcdTUzMDVcdTRGMUFcdTYyQTVcdTk1MTlcdUZGMDFcdUZGMDFcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIHByb3h5OiB7XG4gICAgICAgICcvYmFzaWMtYXBpJzoge1xuICAgICAgICAgIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcsXG4gICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxuICAgICAgICAgIHdzOiB0cnVlLFxuICAgICAgICAgIHJld3JpdGU6IChwYXRoKSA9PiBwYXRoLnJlcGxhY2UobmV3IFJlZ0V4cChgXi9iYXNpYy1hcGlgKSwgJycpLFxuICAgICAgICAgIC8vIG9ubHkgaHR0cHNcbiAgICAgICAgICAvLyBzZWN1cmU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgICcvdXBsb2FkJzoge1xuICAgICAgICAgIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzMwMC91cGxvYWQnLFxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICB3czogdHJ1ZSxcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYF4vdXBsb2FkYCksICcnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB3YXJtdXA6IHtcbiAgICAgICAgY2xpZW50RmlsZXM6IFsnLi9pbmRleC5odG1sJywgJy4vc3JjL3t2aWV3cyxjb21wb25lbnRzfS8qJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmaW5lOiB7XG4gICAgICAncHJvY2Vzcy5lbnYnOiB7XG4gICAgICAgIEJBU0VfVVJMOiAnLycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3NzOiB7XG4gICAgICBwcmVwcm9jZXNzb3JPcHRpb25zOiB7XG4gICAgICAgIGxlc3M6IHtcbiAgICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwbHVnaW5zOiBbXSxcbiAgfSxcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFrWCxTQUFTLCtCQUErQjtBQUUxWixJQUFPLHNCQUFRLHdCQUF3QjtBQUFBLEVBQ3JDLFdBQVc7QUFBQSxJQUNULGNBQWM7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUE7QUFBQSxNQUdMLFFBQVE7QUFBQSxNQUNSLGlCQUFpQjtBQUFBLFFBQ2YsU0FBUztBQUFBO0FBQUEsTUFDWDtBQUFBLElBQ0Y7QUFBQSxJQUNBLFFBQVE7QUFBQSxNQUNOLE9BQU87QUFBQSxRQUNMLGNBQWM7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLGNBQWM7QUFBQSxVQUNkLElBQUk7QUFBQSxVQUNKLFNBQVMsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sYUFBYSxHQUFHLEVBQUU7QUFBQTtBQUFBO0FBQUEsUUFHL0Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLGNBQWM7QUFBQSxVQUNkLElBQUk7QUFBQSxVQUNKLFNBQVMsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sVUFBVSxHQUFHLEVBQUU7QUFBQSxRQUM1RDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOLGFBQWEsQ0FBQyxnQkFBZ0IsNEJBQTRCO0FBQUEsTUFDNUQ7QUFBQSxJQUNGO0FBQUEsSUFDQSxRQUFRO0FBQUEsTUFDTixlQUFlO0FBQUEsUUFDYixVQUFVO0FBQUEsTUFDWjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUs7QUFBQSxNQUNILHFCQUFxQjtBQUFBLFFBQ25CLE1BQU07QUFBQSxVQUNKLG1CQUFtQjtBQUFBLFFBQ3JCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVMsQ0FBQztBQUFBLEVBQ1o7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=