Zhufu 2024-10-09 15:30:10 +08:00
commit 6eac4affdc
21 changed files with 270 additions and 112 deletions

View File

@ -80,7 +80,7 @@ worldMapContainer1.style.width = "970px";
worldMapContainer1.style.position = "relative";
worldMapContainer1.style.left = "30px";
mapboxgl.accessToken = 'pk.eyJ1Ijoic2hpY2hhbzEyMyIsImEiOiJja3FobnI1aDEwNGF6Mm9vOXVhNnBzZmFhIn0.2fZKiMqCQHxVY74QShMEGQ';
mapboxgl.accessToken = 'pk.eyJ1IjoieHVqaW5nbGlhbmciLCJhIjoiY2w3bzFzZnZqMjdieTN1cG92N2I1d2huOSJ9.aQqMz4S-cTziUYizIH_gNg';
let map = new mapboxgl.Map({
container: 'distribution_map',
style: {

View File

@ -166,25 +166,12 @@
};
//
const preloadImage = (url: string): Promise<string> => {
return new Promise((resolve, reject) => {
const img = new Image();
img.onload = () => {
resolve(url);
};
img.onerror = (error) => {
reject(error);
};
img.src = url;
});
};
const addOnMapChange = (value) => {
setTimeout(async () => {
let url = '';
let fourpoint = '';
if (value) {
let data = {};
let data: any = {};
if (activeKey.value == '1') {
props.data.forEach((item) => {
if (item.name == '土地分类') {
@ -208,7 +195,6 @@
image.crossOrigin = 'anonymous';
image.src = url;
image.onload = () => {
console.log(205, image);
// Canvas
const canvas = document.createElement('canvas');
canvas.width = image.width;
@ -220,7 +206,6 @@
ctx.drawImage(image, 0, 0, image.width, image.height);
// CanvasURL
const dataURL = canvas.toDataURL('image/jpeg');
console.log(216, dataURL);
//
if (map.getSource('radar')) {
@ -228,25 +213,27 @@
map.removeLayer('radar-layer');
}
if(fourpoint[2][0] == fourpoint[3][0]){
fourpoint[3][0] = fourpoint[0][0];
}
//
map.addSource('radar', {
type: 'image',
url: dataURL,
coordinates: fourpoint,
// coordinates: [
// [118.79657110932101, 35.1014168593995],
// [118.79971349626699, 35.1014168593995],
// [118.79971349626699, 35.0976945740112],
// [118.79371349626699, 35.0976945740112],
// ],
paint: {
'raster-opacity': 0,
},
});
// console.log(fourpoint);
map.addLayer({
id: 'radar-layer',
type: 'raster',
source: 'radar',
paint: {
'raster-fade-duration': 0,
'raster-opacity': 0.5,
},
});
@ -260,6 +247,7 @@
x = x / length;
y = y / length;
map.flyTo({
// center: [118.79657110932101, 35.1014168593995],
center: [fourpoint[0][0], fourpoint[0][1]],
zoom: 14,
});

View File

@ -54,8 +54,7 @@
let map: Map;
onMounted(() => {
// mapboxgl.accessToken = "pk.eyJ1IjoieHVqaW5nbGlhbmciLCJhIjoiY2w3bzFzZnZqMjdieTN1cG92N2I1d2huOSJ9.aQqMz4S-cTziUYizIH_gNg"
mapboxgl.accessToken = '123';
mapboxgl.accessToken = "pk.eyJ1IjoieHVqaW5nbGlhbmciLCJhIjoiY2w3bzFzZnZqMjdieTN1cG92N2I1d2huOSJ9.aQqMz4S-cTziUYizIH_gNg"
map = initMap();
map.on('load', function () {
refreshLocation();

View File

@ -1821,7 +1821,7 @@
AddDroneTask({ geomid: geomidStr, caseno: props.caseno }).then((res) => {
if (res) {
message.success('成功提交云查询');
// useCloudQuery.setIdentification(true);
useCloudQuery.setIdentification(true);
} else {
message.error('提交云查询失败');
useCloudQuery.setIdentification(false);

View File

@ -147,6 +147,8 @@ export async function splitPolygonByFill(drawPolygon, outerPolygon) {
// 多面数据分割裁剪
export async function splitPolygonByMultiFill(drawPolygons,outerPolygon){
let tempDrawPolygons = [...drawPolygons]
drawPolygons = handlerMultiPolygonToPolygon(tempDrawPolygons);
return new Promise((resolve,reject)=>{
try{
@ -170,14 +172,24 @@ export async function splitPolygonByMultiFill(drawPolygons,outerPolygon){
console.log("原始数据处理精度后坐标",featuresArray);
// 求交集图斑
drawPolygons.forEach((item,index)=>{
let turfPolygon = turf.truncate(turf.polygon(item.geometry.coordinates),dealOptions);
//
console.log("coordinates",index,item.geometry.coordinates)
try{
let turfPolygon = turf.truncate(turf.polygon(item.geometry.coordinates),dealOptions);
// 取交集
let intersection = turf.intersect(turf.featureCollection([featuresArray[0],turfPolygon]));
if(intersection){
resultArray.push(intersection);
let intersection = turf.intersect(turf.featureCollection([featuresArray[0],turfPolygon]));
if(intersection){
resultArray.push(intersection);
}
console.log("第3步交集"+index+"",intersection)
splitFeaturesArray.push(turfPolygon);
}catch(e){
console.log(e);
}
console.log("第3步交集"+index+"",intersection)
splitFeaturesArray.push(turfPolygon);
})
// 取差集
@ -201,6 +213,29 @@ export async function splitPolygonByMultiFill(drawPolygons,outerPolygon){
})
}
// MultiPolygon转换Polygon
export function handlerMultiPolygonToPolygon(sourcePolygons){
let polygons = [];
sourcePolygons.forEach((item,ndex)=>{
if(item.geometry.type == "MultiPolygon"){
item.geometry.coordinates.forEach((coorItem,idx)=>{
let polygonItem = {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": coorItem
},
"properties": {}
}
polygons.push(polygonItem);
})
}else if(item.geometry.type == "Polygon"){
polygons.push(item);
}
})
return polygons;
}
export function printLngLat(arr){
arr.forEach((item,index)=>{
console.log(item[1]+","+item[0]+"\n");

View File

@ -0,0 +1,12 @@
<template>
<div>
</div>
</template>
<script lang="ts" setup>
import Vue from 'vue'
</script>
<style lang="scss" scoped>
</style>

View File

@ -37,7 +37,7 @@
const [registerTable] = useTable({
api: CaseOffenceMinerals,
columns: columns,
title: '无人机全域巡查图斑情况统计表',
// title: '',
// titleHelpMessage: '',
formConfig: {
labelWidth: 120,

View File

@ -191,6 +191,25 @@
<a-empty :image="simpleImage" />
</div>
</div>
<a-modal
width="100%"
wrap-class-name="full-modal"
v-model:open="auditOpen"
title="填报审核"
footer=""
:destroyOnClose="true"
>
<template #footer> </template>
<Audit
ref="posRef"
:processId="processId"
:taskId="taskId"
:isRead="isRead"
:type="type"
:auditData="auditData"
@closeModel="closeMolder"
/>
</a-modal>
</div>
</template>
@ -201,9 +220,19 @@
import { degrainingPatchSourceOptions } from '@/utils/global';
import { SearchOutlined } from '@ant-design/icons-vue';
import { dataProcessing } from '@/views/demo/tiankongdi/util';
import { LoadTaskDetailList, DeleteCaiKuangTaskCase, AddCaiKuangTaskFavorite } from '@/api/degraining/index';
import {
LoadTaskDetailList,
DeleteCaiKuangTaskCase,
AddCaiKuangTaskFavorite,
} from '@/api/degraining/index';
import { showDrawBack, drawBackSpan } from '@/views/demo/util';
import { Audit } from '@/views/demo/workflow/task/process/page';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { flowStore } from '@/store/modules/flow';
import { useUserStore } from '@/store/modules/user';
const userStore = useUserStore();
const flowWfDataStore = flowStore();
const props = defineProps([
'year',
'batch',
@ -217,6 +246,7 @@
'showInfo',
'openLoading',
'closeLoading',
'getCountList',
]);
const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
@ -241,7 +271,6 @@
emits('openLoading');
LoadTaskDetailList(params)
.then((res) => {
console.log(res);
searchList.value = res.items;
})
.finally(() => {
@ -269,6 +298,29 @@
querysBtn();
});
};
const showDataId = ref();
const auditOpen = ref(false);
const processId = ref('');
const taskId = ref('');
const type = ref('');
const auditData = ref();
const isRead: any = ref(0);
async function goAudit(record) {
showDataId.value = record.Id;
let data = await getDetail({ code: record.processcode });
let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData;
flowWfDataStore.setWfDataAll(wfData);
auditOpen.value = true;
processId.value = record.processid;
taskId.value = record.taskeid;
type.value = record.type;
auditData.value = record;
}
const closeMolder = () => {
querysBtn();
emits('getCountList');
};
</script>
<style lang="less" scoped>

View File

@ -13,6 +13,7 @@
@showInfo="changeShowInfo"
@openLoading="openLoading"
@closeLoading="closeLoading"
@getCountList="getCountList"
/>
<MapList
@changeTask="changeTask"
@ -89,7 +90,6 @@
getCountList();
};
const changeShowInfo = (item) => {
console.log(item);
showParent.value = false;
areaId.value = item.areaid;
level.value = item.level;

View File

@ -262,8 +262,8 @@
const [registerTable] = useTable({
api: getCaseOffence,
columns: columns,
title: '无人机全域巡查图斑情况统计表',
titleHelpMessage: '合法、其他、非粮化、补办手续、拆除复耕均需市级审核通过才可判定为举证类型。',
// title: '',
// titleHelpMessage: '',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,

View File

@ -240,6 +240,25 @@
<a-empty :image="simpleImage" />
</div>
</div>
<a-modal
width="100%"
wrap-class-name="full-modal"
v-model:open="auditOpen"
title="整改审核"
footer=""
:destroyOnClose="true"
>
<template #footer> </template>
<Audit
ref="posRef"
:processId="processId"
:taskId="taskId"
:isRead="isRead"
:type="type"
:auditData="auditData"
@closeModel="closeMolder"
/>
</a-modal>
</div>
</template>
@ -256,7 +275,13 @@
AddCaiKuangTaskFavorite,
} from '@/api/degraining/index';
import { showDrawBack, drawBackSpan } from '@/views/demo/util';
import { Audit } from '@/views/demo/workflow/task/process/page';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { flowStore } from '@/store/modules/flow';
import { useUserStore } from '@/store/modules/user';
const userStore = useUserStore();
const flowWfDataStore = flowStore();
const props = defineProps([
'year',
'batch',
@ -270,6 +295,7 @@
'showInfo',
'openLoading',
'closeLoading',
'getCountList',
]);
const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
@ -294,7 +320,6 @@
emits('openLoading');
LoadTaskIllegalDetailList(params)
.then((res) => {
console.log(res);
searchList.value = res.items;
})
.finally(() => {
@ -322,6 +347,29 @@
querysBtn();
});
};
const showDataId = ref();
const auditOpen = ref(false);
const processId = ref('');
const taskId = ref('');
const type = ref('');
const auditData = ref();
const isRead: any = ref(0);
async function goAudit(record) {
showDataId.value = record.Id;
let data = await getDetail({ code: record.processcode });
let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData;
flowWfDataStore.setWfDataAll(wfData);
auditOpen.value = true;
processId.value = record.processid;
taskId.value = record.taskeid;
type.value = record.type;
auditData.value = record;
}
const closeMolder = () => {
querysBtn();
emits('getCountList');
};
</script>
<style lang="less" scoped>

View File

@ -13,6 +13,7 @@
@showInfo="changeShowInfo"
@openLoading="openLoading"
@closeLoading="closeLoading"
@getCountList="getCountList"
/>
<MapList
@changeTask="changeTask"
@ -89,7 +90,6 @@
getCountList();
};
const changeShowInfo = (item) => {
console.log(item);
showParent.value = false;
areaId.value = item.areaid;
level.value = item.level;

View File

@ -260,8 +260,8 @@
const [registerTable] = useTable({
api: getCaseOffence,
columns: columns,
title: '无人机全域巡查图斑情况统计表',
titleHelpMessage: '合法、其他、非粮化、补办手续、拆除复耕均需市级审核通过才可判定为举证类型。',
// title: '',
// titleHelpMessage: '',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,

View File

@ -284,7 +284,6 @@
...querys,
})
.then((res) => {
console.log(283, res);
if (res.items.length > 0) {
handlerUpdateTaskLayerData(res.items);
} else {

View File

@ -256,11 +256,10 @@
let filter_yingxiang: any = [];
let filter_hangfei: any = [];
console.log(243, checkedKeys);
// console.log(243, checkedKeys);
if (checkedKeys_now.length == 0) {
//
mapboxComponentRef.value.clearTaskLayer('GeoserverManagementRaster');
tableData1?.forEach((data) => {
mapboxComponentRef.value.clearTaskLayer(data.dataTable);
});
@ -268,6 +267,10 @@
mapboxComponentRef.value.clearTaskLayer(data.layerName);
});
mapboxComponentRef.value.clearTaskLayer('AchievementManageRaster');
//
filter_tuceng_old = [];
filter_yingxiang_old = [];
filter_hangfei_old = [];
} else {
let checkedKeys_move = checkedKeys_now.filter(
(item) => !uniqueKeysArray.concat(['1', '2', '3']).includes(item),
@ -293,7 +296,9 @@
if (checkedKey == data.id) {
//
// console.log(endTime, data);
if (
if (dayjs(startTime).format('YYYY-MM-DD') == dayjs(endTime).format('YYYY-MM-DD')) {
filter_yingxiang.push(data);
} else if (
// dayjs(startTime).isBefore(data.createTime) &&
dayjs(endTime).isAfter(dayjs(data.dateDir))
) {

View File

@ -148,7 +148,7 @@ export const items_excel = [
export const servicesColumns: BasicColumn[] = [
{
title: '地址',
dataIndex: 'serverUrl',
dataIndex: 'url',
width: 220,
},
{

View File

@ -119,11 +119,6 @@
}
if (layerName && map.getLayer(layerName)) {
map.moveLayer(layerName, '');
if (layerName == 'GeoserverManagementRaster') {
if (map.getLayer('countyLayer')) {
map.moveLayer('countyLayer', 'GeoserverManagementRaster');
}
}
if (layerName == 'AchievementManageRaster') {
if (map.getLayer('clusters')) {
map.moveLayer('AchievementManageRaster', 'clusters');
@ -191,11 +186,7 @@
}
if (layerName && map.getLayer(layerName)) {
if (layerName == 'GeoserverManagementRaster') {
if (map.getLayer('streetLayer')) {
map.moveLayer('streetLayer', 'GeoserverManagementRaster');
}
} else if (layerName == 'AchievementManageRaster') {
if (layerName == 'AchievementManageRaster') {
if (map.getLayer('clusters')) {
map.moveLayer('AchievementManageRaster', 'clusters');
}
@ -214,40 +205,6 @@
// -
function GeoserverManagementRaster(chooseRows, lngLat, zoom, isMove) {
//
// clearTaskLayer('GeoserverManagementRaster');
// if (isMove) {
// handlerLocation(lngLat, zoom);
// }
// let tiles: any = [];
// chooseRows.forEach((chooseRow) => {
// let tile =
// 'http://192.168.10.131:8080/geoserver/my_workspace/wms?service=WMS&version=1.1.0&request=GetMap&layers=my_workspace:' +
// chooseRow.dataTable +
// '&styles=&bbox={bbox-epsg-3857}&width=256&height=256&srs=EPSG:3857' +
// '&format=image/png&TRANSPARENT=TRUE';
// tiles.push(tile);
// });
// map.addSource('GeoserverManagementRaster' , {
// type: 'raster',
// tiles: tiles,
// tileSize: 256,
// });
// map.addLayer({
// id: 'GeoserverManagementRaster',
// type: 'raster',
// source: 'GeoserverManagementRaster' ,
// layout: {
// visibility: 'visible',
// },
// });
// map.on('click', 'GeoserverManagementRaster', (e) => {
// console.log(e);
// });
// if (map.getLayer('streetLayer')) {
// map.moveLayer('GeoserverManagementRaster', 'streetLayer');
// }
// console.log(chooseRows);
if (isMove) {
handlerLocation(lngLat, zoom);

View File

@ -2,8 +2,8 @@
<div>
<BasicTable @register="servicesTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'serverUrl'">
<span class="content-full">{{ record.serverUrl }}</span>
<template v-if="column.key === 'url'">
<span class="content-full">{{ record.url }}</span>
</template>
<template v-if="column.key === 'action'">
<TableAction
@ -62,7 +62,7 @@
//
const copyToClipboard = async (record) => {
try {
await navigator.clipboard.writeText(record.serverUrl);
await navigator.clipboard.writeText(record.url);
createMessage.success('文本已复制到剪贴板');
} catch (err) {
createMessage.error('无法复制文本');
@ -71,16 +71,15 @@
//
function setServerUrl(chooseRow) {
if (chooseRow.value) {
setTableData(chooseRow.value);
} else if (chooseRow.serverUrl) {
let data: any = [];
data.push({ serverUrl: chooseRow.serverUrl });
services.value = data;
setTableData(services.value);
} else {
setTableData([]);
let data: any = [];
if (chooseRow.serverUrl) {
data.push({ url: chooseRow.serverUrl });
}
if (chooseRow.pbfUrl) {
data.push({ url: chooseRow.pbfUrl });
}
services.value = data;
setTableData(services.value);
}
defineExpose({

View File

@ -281,7 +281,6 @@
.catch((error) => {
options.onError(error);
});
console.log(uploadFrom.value);
}
};
// 1-
@ -304,7 +303,6 @@
const sldContent = e.target.result;
const styles = parseSLD(sldContent);
assemblyPaint(styles);
// uploadFrom.value.style = styles;
};
reader.onerror = (error) => {
console.error('Error reading the file:', error);
@ -318,9 +316,9 @@
const namedLayers = xmlDoc.querySelectorAll('NamedLayer');
const styles: any = [];
namedLayers.forEach((namedLayer) => {
namedLayers?.forEach((namedLayer) => {
const userStyles = namedLayer.querySelectorAll('UserStyle');
userStyles.forEach((userStyle) => {
userStyles?.forEach((userStyle) => {
userStyle.children?.forEach((element) => {
if (element && element.nodeName == 'se:FeatureTypeStyle') {
element.children.forEach((featureTypeStyle) => {
@ -428,7 +426,7 @@
// style
uploadFrom.value.style = JSON.stringify(result);
console.log(uploadFrom.value.style);
// console.log(uploadFrom.value.style);
};
defineExpose({

View File

@ -39,13 +39,13 @@
</template>
<script lang="ts" setup>
import { reactive, h, ref, watch } from 'vue';
import { reactive, h, ref, watch, onMounted } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getRetractPageList } from '@/api/sys/WFTask';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { Tag } from 'ant-design-vue';
import { flowStore } from '@/store/modules/flow';
import { useRoute } from 'vue-router';
import { useRoute, useRouter } from 'vue-router';
import { retract } from '@/api/sys/WFProcess';
import { useMessage } from '@/hooks/web/useMessage';
import { Look } from '@/views/demo/workflow/task/process/page';
@ -70,7 +70,7 @@
const revokeUnitName = ref('');
const auditOpen = ref(false);
const route: any = useRoute();
const code = ref(route.name.split('@')[1]);
const code = ref(route.params.id);
searchInfo.Code = code.value;
const [registerTable, { reload }] = useTable({
api: getRetractPageList,

View File

@ -0,0 +1,66 @@
// vite.config.ts
import { defineApplicationConfig } from "file:///E:/projects/%E8%B4%A2%E6%BA%90%E7%B3%BB%E7%BB%9F/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,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxwcm9qZWN0c1xcXFxcdThEMjJcdTZFOTBcdTdDRkJcdTdFREZcXFxcQ2FpWXVhbllpVGlIdWFcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXHByb2plY3RzXFxcXFx1OEQyMlx1NkU5MFx1N0NGQlx1N0VERlxcXFxDYWlZdWFuWWlUaUh1YVxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovcHJvamVjdHMvJUU4JUI0JUEyJUU2JUJBJTkwJUU3JUIzJUJCJUU3JUJCJTlGL0NhaVl1YW5ZaVRpSHVhL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQXBwbGljYXRpb25Db25maWcgfSBmcm9tICdAdmJlbi92aXRlLWNvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUFwcGxpY2F0aW9uQ29uZmlnKHtcbiAgb3ZlcnJpZGVzOiB7XG4gICAgb3B0aW1pemVEZXBzOiB7XG4gICAgICBpbmNsdWRlOiBbXG4gICAgICAgICdlY2hhcnRzL2NvcmUnLFxuICAgICAgICAnZWNoYXJ0cy9jaGFydHMnLFxuICAgICAgICAnZWNoYXJ0cy9jb21wb25lbnRzJyxcbiAgICAgICAgJ2VjaGFydHMvcmVuZGVyZXJzJyxcbiAgICAgICAgJ3FyY29kZScsXG4gICAgICAgICdAaWNvbmlmeS9pY29uaWZ5JyxcbiAgICAgICAgJ2FudC1kZXNpZ24tdnVlL2VzL2xvY2FsZS96aF9DTicsXG4gICAgICAgICdhbnQtZGVzaWduLXZ1ZS9lcy9sb2NhbGUvZW5fVVMnLFxuICAgICAgICAnQC8uLi9saWIvdmZvcm0vZGVzaWduZXIudW1kLmpzJyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBidWlsZDoge1xuICAgICAgLyogXHU1MTc2XHU0RUQ2YnVpbGRcdTc1MUZcdTRFQTdcdTYyNTNcdTUzMDVcdTkxNERcdTdGNkVcdTc3MDFcdTc1NjUgKi9cbiAgICAgIC8vLi4uXG4gICAgICB0YXJnZXQ6ICdlc25leHQnLFxuICAgICAgY29tbW9uanNPcHRpb25zOiB7XG4gICAgICAgIGluY2x1ZGU6IC9ub2RlX21vZHVsZXN8bGliLywgLy9cdThGRDlcdTkxQ0NcdThCQjBcdTVGOTdcdTYyOEFsaWJcdTc2RUVcdTVGNTVcdTUyQTBcdThGREJcdTY3NjVcdUZGMENcdTU0MjZcdTUyMTlcdTc1MUZcdTRFQTdcdTYyNTNcdTUzMDVcdTRGMUFcdTYyQTVcdTk1MTlcdUZGMDFcdUZGMDFcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIHByb3h5OiB7XG4gICAgICAgICcvYmFzaWMtYXBpJzoge1xuICAgICAgICAgIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcsXG4gICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxuICAgICAgICAgIHdzOiB0cnVlLFxuICAgICAgICAgIHJld3JpdGU6IChwYXRoKSA9PiBwYXRoLnJlcGxhY2UobmV3IFJlZ0V4cChgXi9iYXNpYy1hcGlgKSwgJycpLFxuICAgICAgICAgIC8vIG9ubHkgaHR0cHNcbiAgICAgICAgICAvLyBzZWN1cmU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgICcvdXBsb2FkJzoge1xuICAgICAgICAgIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzMwMC91cGxvYWQnLFxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICB3czogdHJ1ZSxcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYF4vdXBsb2FkYCksICcnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB3YXJtdXA6IHtcbiAgICAgICAgY2xpZW50RmlsZXM6IFsnLi9pbmRleC5odG1sJywgJy4vc3JjL3t2aWV3cyxjb21wb25lbnRzfS8qJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmaW5lOiB7XG4gICAgICAncHJvY2Vzcy5lbnYnOiB7XG4gICAgICAgIEJBU0VfVVJMOiAnLycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3NzOiB7XG4gICAgICBwcmVwcm9jZXNzb3JPcHRpb25zOiB7XG4gICAgICAgIGxlc3M6IHtcbiAgICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwbHVnaW5zOiBbXSxcbiAgfSxcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUF1VCxTQUFTLCtCQUErQjtBQUUvVixJQUFPLHNCQUFRLHdCQUF3QjtBQUFBLEVBQ3JDLFdBQVc7QUFBQSxJQUNULGNBQWM7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUE7QUFBQSxNQUdMLFFBQVE7QUFBQSxNQUNSLGlCQUFpQjtBQUFBLFFBQ2YsU0FBUztBQUFBO0FBQUEsTUFDWDtBQUFBLElBQ0Y7QUFBQSxJQUNBLFFBQVE7QUFBQSxNQUNOLE9BQU87QUFBQSxRQUNMLGNBQWM7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLGNBQWM7QUFBQSxVQUNkLElBQUk7QUFBQSxVQUNKLFNBQVMsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sYUFBYSxHQUFHLEVBQUU7QUFBQTtBQUFBO0FBQUEsUUFHL0Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLGNBQWM7QUFBQSxVQUNkLElBQUk7QUFBQSxVQUNKLFNBQVMsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sVUFBVSxHQUFHLEVBQUU7QUFBQSxRQUM1RDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOLGFBQWEsQ0FBQyxnQkFBZ0IsNEJBQTRCO0FBQUEsTUFDNUQ7QUFBQSxJQUNGO0FBQUEsSUFDQSxRQUFRO0FBQUEsTUFDTixlQUFlO0FBQUEsUUFDYixVQUFVO0FBQUEsTUFDWjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUs7QUFBQSxNQUNILHFCQUFxQjtBQUFBLFFBQ25CLE1BQU07QUFBQSxVQUNKLG1CQUFtQjtBQUFBLFFBQ3JCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVMsQ0FBQztBQUFBLEVBQ1o7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=