877fd278c2
统一门户 JSON 契约:新增 GET /templates/{id},模板/云文件/保存/打开走虚拟 key;
layer 保存弹层替代 prompt,本地 .soon 已登录后台 POST 登记;修复保存静默失败与 design2 全宽布局。
Co-authored-by: Cursor <cursoragent@cursor.com>
1571 lines
117 KiB
JavaScript
1571 lines
117 KiB
JavaScript
window.display_func = function display_func(img1, img2, img3) {
|
||
$('#base_control').hide()
|
||
$('#line_control').hide()
|
||
$('#pic_control').hide()
|
||
$("#set_bg").hide();
|
||
$('#out_pic_control').hide()
|
||
$('#text_control').hide()
|
||
$('#circle_text_control').hide()
|
||
$('#out_text_control').hide()
|
||
$('#rect_control').hide()
|
||
$('#circle_control').hide()
|
||
$('#counter_control').hide()
|
||
$('#qrcode_Controll').hide()
|
||
$('#barcode_controll').hide()
|
||
$('#component_type').text(language_str('bg')) //"背景"
|
||
canvas1.discardActiveObject().renderAll()
|
||
canvas2.discardActiveObject().renderAll()
|
||
|
||
// 保存所有对象的 selectable 和 evented 状态,确保预览后能恢复
|
||
const objStates1 = [];
|
||
const objStates2 = [];
|
||
canvas1.getObjects().forEach((obj, index) => {
|
||
if (!obj.isGuideLine) {
|
||
objStates1[index] = {
|
||
selectable: obj.selectable,
|
||
evented: obj.evented
|
||
};
|
||
}
|
||
});
|
||
canvas2.getObjects().forEach((obj, index) => {
|
||
if (!obj.isGuideLine) {
|
||
objStates2[index] = {
|
||
selectable: obj.selectable,
|
||
evented: obj.evented
|
||
};
|
||
}
|
||
});
|
||
|
||
// 过滤掉辅助线
|
||
let _objs1 = canvas1.getObjects().filter(obj => !obj.isGuideLine)
|
||
let g1 = []
|
||
let g3 = []
|
||
let g5 = []
|
||
let left = 0 //左裁剪
|
||
let top = 0 //顶裁剪
|
||
let black_left = 0 //黑色左裁剪
|
||
let black_top = 0 //黑色顶裁剪
|
||
let all_left = 0 //预览图左裁剪
|
||
let all_top = 0 //预览图顶裁剪
|
||
// 过滤掉辅助线
|
||
let list1 = _objs1.filter(obj => !obj.isGuideLine)
|
||
for (let item of list1) {
|
||
let idx = getIndex(item, canvas1)
|
||
|
||
// 安全检查:确保 objs1[idx - 1] 存在且有 type 属性
|
||
if (idx != 0 && (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined')) {
|
||
continue
|
||
}
|
||
//console.log("------");
|
||
//console.log(item.getCoords());
|
||
//console.log(getCoordsMinX(background_image.getCoords()));
|
||
//console.log(getCoordsMinX(item.getCoords()));
|
||
//console.log(getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()));
|
||
//console.log("------");
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) {
|
||
all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) {
|
||
all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g3.push(fabric.util.object.clone(item))
|
||
if (idx != 0 && (objs1[idx - 1].type == 10 || objs1[idx - 1].type == 4)) {
|
||
continue //计数器 或 合成文字
|
||
}
|
||
if (idx != 0 && (objs1[idx - 1].type == 8 || objs1[idx - 1].type == 9)) {
|
||
continue //二维码 条形码
|
||
}
|
||
if (idx != 0 && objs1[idx - 1].type == 2) {
|
||
continue //合成图片
|
||
}
|
||
if (
|
||
idx != 0 &&
|
||
((objs1[idx - 1].type == 3 && (item.get('fill') == '#000000' || (item.get('fill') == '#ffffff' && false))) ||
|
||
(
|
||
objs1[idx - 1].type == 11
|
||
&&
|
||
(item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false))
|
||
//圆形文字 && 黑色
|
||
) ||
|
||
//文字 && 黑色
|
||
(objs1[idx - 1].type == 5 && //矩形
|
||
(((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框
|
||
(item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框
|
||
(objs1[idx - 1].type == 6 && //圆形
|
||
(((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框
|
||
(item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框
|
||
(objs1[idx - 1].type == 7 && //直线
|
||
(item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) ||
|
||
objs1[idx - 1].black == true) //勾选并入黑色图层
|
||
// (
|
||
// objs1[idx-1].type == 1//固定图片
|
||
// &&
|
||
// objs1[idx-1].black == true //勾选并入黑色图层
|
||
// )
|
||
) {
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) {
|
||
black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) {
|
||
black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g5.push(fabric.util.object.clone(item))
|
||
continue //黑色文字 黑色矩形 黑色线条 黑色圆形
|
||
} else if (idx == 0) {
|
||
g5.push(fabric.util.object.clone(item))
|
||
}
|
||
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) {
|
||
left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) {
|
||
top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g1.push(fabric.util.object.clone(item))
|
||
}
|
||
let url1 = new fabric.Group(g1).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: top / zoom,
|
||
left: left / zoom
|
||
})
|
||
|
||
// g3.push(img1)
|
||
let url3 = new fabric.Group(g3).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: all_top / zoom,
|
||
left: all_left / zoom
|
||
})
|
||
let url5 = new fabric.Group(g5).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: black_top / zoom,
|
||
left: black_left / zoom
|
||
})
|
||
// 过滤掉辅助线
|
||
let _objs2 = canvas2.getObjects().filter(obj => !obj.isGuideLine)
|
||
let g2 = []
|
||
let g4 = []
|
||
let g6 = []
|
||
left = 0
|
||
top = 0
|
||
black_top = 0
|
||
black_left = 0
|
||
all_top = 0
|
||
all_left = 0
|
||
// 过滤掉辅助线
|
||
let filteredObjs2 = _objs2.filter(obj => !obj.isGuideLine)
|
||
for (let item of filteredObjs2) {
|
||
let idx = getIndex(item, canvas2)
|
||
|
||
// 安全检查:确保 objs2[idx - 1] 存在且有 type 属性
|
||
if (idx != 0 && (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined')) {
|
||
continue
|
||
}
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) {
|
||
all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) {
|
||
all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g4.push(fabric.util.object.clone(item))
|
||
if (idx != 0 && (objs2[idx - 1].type == 10 || objs2[idx - 1].type == 4)) {
|
||
continue //黑色字或计数器 或 合成文字
|
||
}
|
||
if (idx != 0 && (objs2[idx - 1].type == 8 || objs2[idx - 1].type == 9)) {
|
||
continue //二维码 条形码
|
||
}
|
||
if (idx != 0 && objs2[idx - 1].type == 2) {
|
||
continue //合成图片
|
||
}
|
||
if (idx != 0 && objs2[idx - 1].type == 10) {
|
||
continue //合成图片
|
||
}
|
||
if (
|
||
idx != 0 &&
|
||
((objs2[idx - 1].type == 3 && (item.get('fill') == '#000000' || (item.get('fill') == '#ffffff' && false))) ||
|
||
(
|
||
objs2[idx - 1].type == 11
|
||
&&
|
||
(item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false))
|
||
//圆形文字 && 黑色
|
||
) ||
|
||
//文字 && 黑色
|
||
(objs2[idx - 1].type == 5 && //矩形
|
||
(((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框
|
||
(item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框
|
||
(objs2[idx - 1].type == 6 && //圆形
|
||
(((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框
|
||
(item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框
|
||
(objs2[idx - 1].type == 7 && //直线
|
||
(item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) ||
|
||
objs2[idx - 1].black == true) //勾选并入黑色图层
|
||
// (
|
||
// objs2[idx-1].type == 1//固定图片
|
||
// &&
|
||
// objs2[idx-1].black == true //勾选并入黑色图层
|
||
// )
|
||
) {
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) {
|
||
black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) {
|
||
black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g6.push(fabric.util.object.clone(item))
|
||
continue //黑色文字 黑色矩形 黑色线条 黑色圆形
|
||
} else if (idx == 0) {
|
||
g6.push(fabric.util.object.clone(item))
|
||
}
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) {
|
||
left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) {
|
||
top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g2.push(fabric.util.object.clone(item))
|
||
}
|
||
let url2 = new fabric.Group(g2).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: top / zoom,
|
||
left: left / zoom
|
||
})
|
||
let white_url1 = canvas1.getObjects()[0].toDataURL({
|
||
height: 648,
|
||
width: 1012
|
||
})
|
||
// g4.push(img2)
|
||
let url4 = new fabric.Group(g4).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: all_top / zoom,
|
||
left: all_left / zoom
|
||
})
|
||
let url6 = new fabric.Group(g6).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: black_top / zoom,
|
||
left: black_left / zoom
|
||
})
|
||
let white_url2 = canvas2.getObjects()[0].toDataURL({
|
||
height: 648,
|
||
width: 1012
|
||
})
|
||
//console.log(canvas.getObjects())
|
||
let w = document.body.clientWidth * 0.7 + 'px'
|
||
let h = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + 150 + 'px'
|
||
let h1 = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + 'px'
|
||
|
||
if ((document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 > document.body.clientHeight) {
|
||
//高度超出,则按高度计算
|
||
h = document.body.clientHeight * 0.8 + 'px'
|
||
h1 = document.body.clientHeight * 0.8 - 150 + 'px'
|
||
w = ((document.body.clientHeight * 0.8 - 150) / 0.62548 + 40) / 0.94
|
||
}
|
||
var printPath3, printPath4;
|
||
try {
|
||
if (typeof require !== 'undefined' && typeof path !== 'undefined' && path && exePath) {
|
||
var fs = require('fs');
|
||
var Buffer = require('buffer').Buffer;
|
||
var buffer3 = Buffer.from(url3.replace(/^data:image\/\w+;base64,/, ""), 'base64');
|
||
printPath3 = path.join(exePath, 'print3.png');
|
||
fs.writeFileSync(printPath3, buffer3);
|
||
var buffer4 = Buffer.from(url4.replace(/^data:image\/\w+;base64,/, ""), 'base64');
|
||
printPath4 = path.join(exePath, 'print4.png');
|
||
fs.writeFileSync(printPath4, buffer4);
|
||
} else {
|
||
printPath3 = url3;
|
||
printPath4 = url4;
|
||
}
|
||
} catch (e) {
|
||
printPath3 = url3;
|
||
printPath4 = url4;
|
||
}
|
||
if (typeof printPath3 === 'undefined') printPath3 = url3;
|
||
if (typeof printPath4 === 'undefined') printPath4 = url4;
|
||
// 创建 PDF 实例
|
||
const pdf = new jspdf.jsPDF({
|
||
orientation: 'landscape',
|
||
unit: 'px',
|
||
format: [1012, 648]
|
||
});
|
||
let btns = [language_str('output')]
|
||
if ((objs1.length != 0) & (objs2.length == 0)) {
|
||
//只有正面
|
||
let img = new Image()
|
||
img.src = printPath3
|
||
|
||
pdf.addImage(img, 'JPEG', 0, 0, 1012, 648)
|
||
btns.push('打印正面')
|
||
} else if ((objs1.length == 0) & (objs2.length != 0)) {
|
||
//只有背面
|
||
let img = new Image()
|
||
img.src = printPath4
|
||
|
||
pdf.addImage(img, 'JPEG', 0, 0, 1012, 648)
|
||
btns.push('打印背面')
|
||
} else {
|
||
let img = new Image()
|
||
img.src = printPath3
|
||
|
||
pdf.addImage(img, 'JPEG', 0, 0, 1012, 648)
|
||
|
||
pdf.addPage()
|
||
let img2 = new Image()
|
||
img2.src = printPath4
|
||
pdf.addImage(img2, 'JPEG', 0, 0, 1012, 648)
|
||
btns.push('打印正面')
|
||
btns.push('打印背面')
|
||
}
|
||
|
||
var pdfBlob = pdf.output('blob')
|
||
var pdfBuffer = pdf.output('arraybuffer')
|
||
|
||
layer.open({
|
||
type: 1,
|
||
skin: 'soon-layer',
|
||
area: [w, h],
|
||
title: language_str('display'), //不显示标题栏"预览"
|
||
shadeClose: true, //点击遮罩关闭
|
||
content: `
|
||
<div style="padding:20px;background-color:#1E252D;height:${h1};display:flex;align-items: center;overflow:hidden;">
|
||
<div style="/*position: relative;top: 50%;transform: translateY(-50%);*/display: flex;justify-content: space-between;">
|
||
<div class="rotate-div" id="displayImg1" angle="0">
|
||
<img src="${printPath3}" style="width:95%"/>
|
||
<div class="rotate-wrap" onclick="window.rotate('displayImg1')">
|
||
<img src="${soonAsset("rotate.png")}" style="height: 64px;width: 64px"/>
|
||
</div>
|
||
</div>
|
||
<div class="rotate-div" id="displayImg2" angle="0">
|
||
<img style="width:95%;/*margin-left:6%*/" src="${printPath4}"/>
|
||
<div class="rotate-wrap" onclick="window.rotate('displayImg2')">
|
||
<img src="${soonAsset("rotate.png")}" style="height: 64px;width: 64px"/>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>`,
|
||
btn: btns, //'导出'
|
||
btn1: function () {
|
||
if (typeof window.soonGuardPreviewDeliver === 'function') {
|
||
window.soonGuardPreviewDeliver('导出', function () {
|
||
if (typeof window.savePdf === 'function') window.savePdf(pdfBlob);
|
||
});
|
||
} else if (typeof window.savePdf === 'function') {
|
||
window.savePdf(pdfBlob);
|
||
}
|
||
return false;
|
||
},
|
||
btn2: function () {
|
||
if (typeof window.soonGuardPreviewDeliver === 'function') {
|
||
window.soonGuardPreviewDeliver('打印', function () {
|
||
if (window.platformBridge && window.platformBridge.printPdf && (printPath3.indexOf('data:') === 0 || printPath4.indexOf('data:') === 0)) {
|
||
if (btns[1] === '打印正面') window.platformBridge.printPdf(pdfBlob);
|
||
else if (btns[1] === '打印背面') window.platformBridge.printPdf(pdfBlob);
|
||
return;
|
||
}
|
||
if (btns[1] === '打印正面') {
|
||
printJS({ printable: printPath3, type: 'image', style: 'img { width: 100%; height: auto; }' });
|
||
} else if (btns[1] === '打印背面') {
|
||
printJS({ printable: printPath4, type: 'image', style: 'img { width: 100%; height: auto; }' });
|
||
}
|
||
});
|
||
} else if (window.platformBridge && window.platformBridge.printPdf && (printPath3.indexOf('data:') === 0 || printPath4.indexOf('data:') === 0)) {
|
||
if (btns[1] === '打印正面') window.platformBridge.printPdf(pdfBlob);
|
||
else if (btns[1] === '打印背面') window.platformBridge.printPdf(pdfBlob);
|
||
} else if (btns[1] === '打印正面') {
|
||
printJS({ printable: printPath3, type: 'image', style: 'img { width: 100%; height: auto; }' });
|
||
} else if (btns[1] === '打印背面') {
|
||
printJS({ printable: printPath4, type: 'image', style: 'img { width: 100%; height: auto; }' });
|
||
}
|
||
return false;
|
||
},
|
||
btn3: function () {
|
||
if (typeof window.soonGuardPreviewDeliver === 'function') {
|
||
window.soonGuardPreviewDeliver('打印', function () {
|
||
if (window.platformBridge && window.platformBridge.printPdf) {
|
||
window.platformBridge.printPdf(pdfBlob);
|
||
return;
|
||
}
|
||
printJS({ printable: printPath4, type: 'image', style: 'img { width: 100%; height: auto; }' });
|
||
});
|
||
} else if (window.platformBridge && window.platformBridge.printPdf) {
|
||
window.platformBridge.printPdf(pdfBlob);
|
||
} else {
|
||
printJS({ printable: printPath4, type: 'image', style: 'img { width: 100%; height: auto; }' });
|
||
}
|
||
return false;
|
||
},
|
||
end: function () {
|
||
// 预览窗口关闭后,恢复所有对象的 selectable 和 evented 状态
|
||
canvas1.getObjects().forEach((obj, index) => {
|
||
if (!obj.isGuideLine && objStates1[index]) {
|
||
obj.set({
|
||
selectable: objStates1[index].selectable,
|
||
evented: objStates1[index].evented
|
||
});
|
||
}
|
||
});
|
||
canvas2.getObjects().forEach((obj, index) => {
|
||
if (!obj.isGuideLine && objStates2[index]) {
|
||
obj.set({
|
||
selectable: objStates2[index].selectable,
|
||
evented: objStates2[index].evented
|
||
});
|
||
}
|
||
});
|
||
canvas1.renderAll();
|
||
canvas2.renderAll();
|
||
}
|
||
})
|
||
}
|
||
|
||
// 将 output 附加到 window 对象,确保全局可访问
|
||
window.output = function output(callback = null, _save = save) {
|
||
// 类型改变
|
||
fabric.Image.fromURL(soonAsset('op_2.png'), function (i1) {
|
||
i1.left = background_image.left
|
||
i1.top = background_image.top
|
||
let img1 = i1
|
||
fabric.Image.fromURL(soonAsset('op_2.png'), function (i2) {
|
||
i2.left = background_image.left
|
||
i2.top = background_image.top
|
||
let img2 = i2
|
||
|
||
$('#base_control').hide()
|
||
$('#line_control').hide()
|
||
$('#pic_control').hide()
|
||
$("#set_bg").hide();
|
||
$('#out_pic_control').hide()
|
||
$('#text_control').hide()
|
||
$("#circle_text_control").hide();
|
||
$('#out_text_control').hide()
|
||
$('#rect_control').hide()
|
||
$('#circle_control').hide()
|
||
$('#counter_control').hide()
|
||
$('#qrcode_Controll').hide()
|
||
$('#barcode_controll').hide()
|
||
$('#component_type').text(language_str('bg')) //"背景"
|
||
canvas1.discardActiveObject().renderAll()
|
||
canvas2.discardActiveObject().renderAll()
|
||
// 过滤掉辅助线
|
||
let _objs1 = canvas1.getObjects().filter(obj => !obj.isGuideLine)
|
||
let g1 = []
|
||
let g3 = []
|
||
let g5 = [] //黑色图层
|
||
let left = 0 //左裁剪
|
||
let top = 0 //顶裁剪
|
||
let black_left = 0 //黑色左裁剪
|
||
let black_top = 0 //黑色顶裁剪
|
||
let all_left = 0 //预览图左裁剪
|
||
let all_top = 0 //预览图顶裁剪
|
||
// _objs1 已经在上面过滤过辅助线了,直接使用
|
||
for (let item of _objs1) {
|
||
let idx = getIndex(item, canvas1)
|
||
|
||
// 安全检查:确保 objs1[idx - 1] 存在且有 type 属性
|
||
if (idx != 0 && (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined')) {
|
||
continue
|
||
}
|
||
//console.log("------");
|
||
//console.log(item.getCoords());
|
||
//console.log(getCoordsMinX(background_image.getCoords()));
|
||
//console.log(getCoordsMinX(item.getCoords()));
|
||
//console.log(getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()));
|
||
//console.log("------");
|
||
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) {
|
||
all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) {
|
||
all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g3.push(fabric.util.object.clone(item))
|
||
if (idx != 0 && (objs1[idx - 1].type == 10 || objs1[idx - 1].type == 4)) {
|
||
continue //计数器 或 合成文字
|
||
}
|
||
if (idx != 0 && (objs1[idx - 1].type == 8 || objs1[idx - 1].type == 9)) {
|
||
continue //二维码 条形码
|
||
}
|
||
if (idx != 0 && objs1[idx - 1].type == 2) {
|
||
continue //合成图片
|
||
}
|
||
if (
|
||
idx != 0 &&
|
||
((objs1[idx - 1].type == 3 && item.get('fill') == '#000000') ||
|
||
(
|
||
objs1[idx - 1].type == 11
|
||
&&
|
||
item.get("fill") == "#000000"
|
||
//圆形文字 && 黑色
|
||
) ||
|
||
//文字 && 黑色
|
||
(objs1[idx - 1].type == 5 && //矩形
|
||
(((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框
|
||
(item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框
|
||
(objs1[idx - 1].type == 6 && //圆形
|
||
(((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框
|
||
(item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框
|
||
(objs1[idx - 1].type == 7 && //直线
|
||
(item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) ||
|
||
objs1[idx - 1].black == true) //勾选并入黑色图层
|
||
// ||
|
||
// (
|
||
// objs1[idx-1].type == 1//固定图片
|
||
// &&
|
||
// objs1[idx-1].black == true //勾选并入黑色图层
|
||
// )
|
||
) {
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) {
|
||
black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) {
|
||
black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g5.push(fabric.util.object.clone(item))
|
||
continue //黑色文字 黑色矩形 黑色线条 黑色圆形
|
||
} else if (idx == 0) {
|
||
g5.push(fabric.util.object.clone(item))
|
||
}
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) {
|
||
left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) {
|
||
top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g1.push(fabric.util.object.clone(item))
|
||
}
|
||
let url1 = new fabric.Group(g1).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: top / zoom,
|
||
left: left / zoom
|
||
})
|
||
g3.push(img1)
|
||
let url3 = new fabric.Group(g3).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: all_top / zoom,
|
||
left: all_left / zoom
|
||
})
|
||
let url5 = new fabric.Group(g5).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: black_top / zoom,
|
||
left: black_left / zoom
|
||
})
|
||
// 过滤掉辅助线
|
||
let _objs2 = canvas2.getObjects().filter(obj => !obj.isGuideLine)
|
||
let g2 = []
|
||
let g4 = []
|
||
let g6 = [] //黑色图层
|
||
left = 0
|
||
top = 0
|
||
black_left = 0 //黑色左裁剪
|
||
black_top = 0 //黑色顶裁剪
|
||
all_left = 0 //黑色左裁剪
|
||
all_top = 0 //黑色顶裁剪
|
||
// _objs2 已经在上面过滤过辅助线了,直接使用
|
||
for (let item of _objs2) {
|
||
let idx = getIndex(item, canvas2)
|
||
|
||
// 安全检查:确保 objs2[idx - 1] 存在且有 type 属性
|
||
if (idx != 0 && (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined')) {
|
||
continue
|
||
}
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > all_left) {
|
||
all_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > all_top) {
|
||
all_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g4.push(fabric.util.object.clone(item))
|
||
if (idx != 0 && (objs2[idx - 1].type == 10 || objs2[idx - 1].type == 4)) {
|
||
continue //计数器 或 合成文字
|
||
}
|
||
if (idx != 0 && (objs2[idx - 1].type == 8 || objs2[idx - 1].type == 9)) {
|
||
continue //二维码 条形码
|
||
}
|
||
if (idx != 0 && objs2[idx - 1].type == 2) {
|
||
continue //合成图片
|
||
}
|
||
if (
|
||
idx != 0 &&
|
||
((objs2[idx - 1].type == 3 && (item.get('fill') == '#000000' || (item.get('fill') == '#ffffff' && false))) ||
|
||
(
|
||
objs2[idx - 1].type == 11
|
||
&&
|
||
(item.get("fill") == "#000000" || (item.get("fill") == "#ffffff" && false))
|
||
//圆形文字 && 黑色
|
||
) ||
|
||
//文字 && 黑色
|
||
(objs2[idx - 1].type == 5 && //矩形
|
||
(((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框
|
||
(item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框
|
||
(objs2[idx - 1].type == 6 && //圆形
|
||
(((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('stroke') == '') || //黑填充 透明边框
|
||
(item.get('fill') == '' && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //透明填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && (item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) || //黑填充 黑边框
|
||
((item.get('fill') == '#000000' || item.get('fill') == '#ffffff') && item.get('strokeWidth') == 0))) || //黑填充 0边框
|
||
(objs2[idx - 1].type == 7 && //直线
|
||
(item.get('stroke') == '#000000' || item.get('stroke') == '#ffffff')) ||
|
||
objs2[idx - 1].black == true) //勾选并入黑色图层
|
||
// (
|
||
// objs2[idx-1].type == 1//固定图片
|
||
// &&
|
||
// objs2[idx-1].black == true //勾选并入黑色图层
|
||
// )
|
||
) {
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > black_left) {
|
||
black_left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > black_top) {
|
||
black_top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g6.push(fabric.util.object.clone(item))
|
||
continue //黑色文字 黑色矩形 黑色线条 黑色圆形
|
||
} else if (idx == 0) {
|
||
g6.push(fabric.util.object.clone(item))
|
||
}
|
||
if (getCoordsMinX(background_image.getCoords()) - getCoordsMinX(item.getCoords()) > left) {
|
||
left = -(getCoordsMinX(item.getCoords()) - getCoordsMinX(background_image.getCoords()))
|
||
}
|
||
if (getCoordsMinY(background_image.getCoords()) - getCoordsMinY(item.getCoords()) > top) {
|
||
top = -(getCoordsMinY(item.getCoords()) - getCoordsMinY(background_image.getCoords()))
|
||
}
|
||
g2.push(fabric.util.object.clone(item))
|
||
}
|
||
let url2 = new fabric.Group(g2).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: top / zoom,
|
||
left: left / zoom
|
||
})
|
||
let white_url1 = canvas1.getObjects()[0].toDataURL({
|
||
height: 648,
|
||
width: 1012
|
||
})
|
||
g4.push(img2)
|
||
let url4 = new fabric.Group(g4).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: all_top / zoom,
|
||
left: all_left / zoom
|
||
})
|
||
let url6 = new fabric.Group(g6).toDataURL({
|
||
height: 648,
|
||
width: 1012,
|
||
top: black_top / zoom,
|
||
left: black_left / zoom
|
||
})
|
||
let white_url2 = canvas2.getObjects()[0].toDataURL({
|
||
height: 648,
|
||
width: 1012
|
||
})
|
||
//console.log(canvas.getObjects())
|
||
let w = document.body.clientWidth * 0.7 + 'px'
|
||
let h = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + 150 + 'px'
|
||
let h1 = (document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 + 'px'
|
||
|
||
if ((document.body.clientWidth * 0.7 - 40 - 0.06 * document.body.clientWidth * 0.7) * 0.62548 > document.body.clientHeight) {
|
||
//高度超出,则按高度计算
|
||
h = document.body.clientHeight * 0.8 + 'px'
|
||
h1 = document.body.clientHeight * 0.8 - 150 + 'px'
|
||
w = ((document.body.clientHeight * 0.8 - 150) / 0.62548 + 40) / 0.94
|
||
}
|
||
|
||
let op = { frontColorPic: '', backColorPic: '', frontBlackPic: '', backBlackPic: '', frontData: [], backData: [], flag: 1, frontDisplayPic: url3, backDisplayPic: url4 }
|
||
if ((objs1.length != 0) & (objs2.length == 0)) {
|
||
op.flag = 2
|
||
} else if ((objs1.length == 0) & (objs2.length != 0)) {
|
||
op.flag = 3
|
||
}
|
||
op.frontColorPic = desEncrypt(url1)
|
||
op.backColorPic = desEncrypt(url2)
|
||
//op.frontBlPic = url5;
|
||
//op.backBlPic = url6;
|
||
op.frontBlackPic = desEncrypt(url5)
|
||
op.backBlackPic = desEncrypt(url6)
|
||
// _objs1 已经在上面过滤过辅助线了,直接使用
|
||
for (let item of _objs1) {
|
||
let idx = getIndex(item, canvas1)
|
||
|
||
// 安全检查:确保 objs1[idx - 1] 存在且有 type 属性
|
||
if (idx != 0 && (!objs1[idx - 1] || typeof objs1[idx - 1].type === 'undefined')) {
|
||
continue
|
||
}
|
||
if (idx == 0) continue //background-image
|
||
let type = objs1[idx - 1].type
|
||
if (type == 2) {
|
||
//out_pic
|
||
let xy = getAbsoluteXY(item)
|
||
op.frontData.push({
|
||
type: 1,
|
||
name: objs1[idx - 1].name,
|
||
FontColor: objs1[idx - 1].black ? '#000000' : '@',
|
||
transparency: item.get('opacity'),
|
||
x: parseInt((xy[0] - background_image1.left).toFixed(0)),
|
||
y: parseInt((xy[1] - background_image1.top).toFixed(0)),
|
||
h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)),
|
||
w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)),
|
||
rotate: parseInt(item.get('angle').toFixed(0))
|
||
})
|
||
} else if (type == 3) {
|
||
//text
|
||
/*2022-07-26 黑色并入黑色图层
|
||
if(item.get("fill") == "#000000"){
|
||
//纯黑
|
||
op.frontData.push({
|
||
"type" : 2,
|
||
"Text" : item.get("text"),
|
||
"FontFamily" : item.get("fontFamily"),
|
||
"FontSize" : parseInt(item.get("fontSize")),
|
||
"FontColor" : "#000000",
|
||
"FontBackgroudColor" : item.get("textBackgroundColor"),
|
||
"Bold" : item.get("fontWeight") == "bold",
|
||
"Underline" : item.get("underline"),
|
||
"Italic" : item.get("fontStyle") == "italic",
|
||
"Strikeout" : item.get("linethrough"),
|
||
"x" : parseInt((item.get("left") - background_image1.left).toFixed(0)),
|
||
"y" : parseInt((item.get("top") - background_image1.top).toFixed(0)),
|
||
"h" : parseInt((item.get("scaleY") * item.get("height")).toFixed(0)),
|
||
"w" : parseInt((item.get("scaleX") * item.get("width")).toFixed(0)),
|
||
"rotate" : parseInt(item.get("angle").toFixed(0))
|
||
});
|
||
}
|
||
*/
|
||
} else if (type == 11) {
|
||
//circle_text
|
||
op.frontData.push({
|
||
"type": 2,
|
||
"Text": item.get("text"),
|
||
"FontFamily": item.get("fontFamily"),
|
||
"FontSize": parseInt(item.get("fontSize")),
|
||
"FontColor": "#000000",
|
||
"FontBackgroudColor": item.get("textBackgroundColor"),
|
||
"Bold": item.get("fontWeight") == "bold",
|
||
"Underline": item.get("underline"),
|
||
"Italic": item.get("fontStyle") == "italic",
|
||
"Strikeout": item.get("linethrough"),
|
||
"x": parseInt((item.get("left") - background_image1.left).toFixed(0)),
|
||
"y": parseInt((item.get("top") - background_image1.top).toFixed(0)),
|
||
"h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)),
|
||
"w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)),
|
||
"rotate": parseInt(item.get("angle").toFixed(0)),
|
||
"circleCenter": objs1[idx - 1].circleCenter || 0
|
||
});
|
||
} else if (type == 4) {
|
||
//out_text
|
||
let xy = getAbsoluteXY(item)
|
||
op.frontData.push({
|
||
type: 3,
|
||
name: objs1[idx - 1].name,
|
||
FontFamily: item.get('fontFamily'),
|
||
DefaultText: item.get('text'),
|
||
FontBackgroudColor: item.get('textBackgroundColor'),
|
||
FontSize: parseInt(item.get('fontSize')),
|
||
FontColor: item.get('fill'),
|
||
Exceed: objs1[idx - 1].exceed,
|
||
AutoWrap: objs1[idx - 1].autoWrap,
|
||
FixSize: objs1[idx - 1].fixSize,
|
||
Bold: item.get('fontWeight') == 'bold',
|
||
Underline: item.get('underline'),
|
||
Italic: item.get('fontStyle') == 'italic',
|
||
Strikeout: item.get('linethrough'),
|
||
x: parseInt((xy[0] - background_image1.left).toFixed(0)),
|
||
y: parseInt((xy[1] - background_image1.top).toFixed(0)),
|
||
h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)),
|
||
w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)),
|
||
rotate: parseInt(item.get('angle').toFixed(0)),
|
||
align: objs1[idx - 1].align
|
||
})
|
||
} else if (type == 8) {
|
||
//二维码
|
||
let xy = getAbsoluteXY(item)
|
||
op.frontData.push({
|
||
type: 4,
|
||
name: objs1[idx - 1].name,
|
||
FontColor: objs1[idx - 1].color,
|
||
DefaultText: objs1[idx - 1].val,
|
||
x: parseInt((xy[0] - background_image1.left).toFixed(0)),
|
||
y: parseInt((xy[1] - background_image1.top).toFixed(0)),
|
||
h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)),
|
||
w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)),
|
||
rotate: parseInt(item.get('angle').toFixed(0))
|
||
})
|
||
} else if (type == 9) {
|
||
//条形码
|
||
let xy = getAbsoluteXY(item)
|
||
op.frontData.push({
|
||
type: 5,
|
||
name: objs1[idx - 1].name,
|
||
FontSize: parseInt(objs1[idx - 1].fontSize),
|
||
DefaultText: objs1[idx - 1].val,
|
||
HideText: objs1[idx - 1].show,
|
||
FontFamily: objs1[idx - 1].font,
|
||
FontColor: objs1[idx - 1].color,
|
||
x: parseInt((xy[0] - background_image1.left).toFixed(0)),
|
||
y: parseInt((xy[1] - background_image1.top).toFixed(0)),
|
||
h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)),
|
||
w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)),
|
||
rotate: parseInt(item.get('angle').toFixed(0))
|
||
})
|
||
} else if (type == 10) {
|
||
let xy = getAbsoluteXY(item)
|
||
op.frontData.push({
|
||
type: 6,
|
||
name: objs1[idx - 1].name,
|
||
FontFamily: item.get('fontFamily'),
|
||
FontSize: parseInt(item.get('fontSize')),
|
||
FontColor: item.get('fill'),
|
||
start: objs1[idx - 1].start,
|
||
add: parseInt(objs1[idx - 1].add),
|
||
x: parseInt((xy[0] - background_image1.left).toFixed(0)),
|
||
y: parseInt((xy[1] - background_image1.top).toFixed(0)),
|
||
h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)),
|
||
w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)),
|
||
rotate: parseInt(item.get('angle').toFixed(0))
|
||
})
|
||
}
|
||
}
|
||
//obj2
|
||
// _objs2 已经在上面过滤过辅助线了,直接使用
|
||
for (let item of _objs2) {
|
||
let idx = getIndex(item, canvas2)
|
||
|
||
// 安全检查:确保 objs2[idx - 1] 存在且有 type 属性
|
||
if (idx != 0 && (!objs2[idx - 1] || typeof objs2[idx - 1].type === 'undefined')) {
|
||
continue
|
||
}
|
||
if (idx == 0) continue //background-image
|
||
let type = objs2[idx - 1].type
|
||
if (type == 2) {
|
||
//out_pic
|
||
let xy = getAbsoluteXY(item)
|
||
op.backData.push({
|
||
type: 1,
|
||
name: objs2[idx - 1].name,
|
||
FontColor: objs2[idx - 1].black ? '#000000' : '@',
|
||
transparency: item.get('opacity'),
|
||
x: parseInt((xy[0] - background_image2.left).toFixed(0)),
|
||
y: parseInt((xy[1] - background_image2.top).toFixed(0)),
|
||
h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)),
|
||
w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)),
|
||
rotate: parseInt(item.get('angle').toFixed(0))
|
||
})
|
||
} else if (type == 3) {
|
||
//text
|
||
/*2022-07-26 黑色并入黑色图层
|
||
if(item.get("fill") == "#000000"){
|
||
//纯黑
|
||
op.backData.push({
|
||
"type" : 2,
|
||
"Text" : item.get("text"),
|
||
"FontFamily" : item.get("fontFamily"),
|
||
"FontSize" : parseInt(item.get("fontSize")),
|
||
"FontColor" : "#000000",
|
||
"FontBackgroudColor" : item.get("textBackgroundColor"),
|
||
"Bold" : item.get("fontWeight") == "bold",
|
||
"Underline" : item.get("underline"),
|
||
"Italic" : item.get("fontStyle") == "italic",
|
||
"Strikeout" : item.get("linethrough"),
|
||
"x" : parseInt((item.get("left") - background_image2.left).toFixed(0)),
|
||
"y" : parseInt((item.get("top") - background_image2.top).toFixed(0)),
|
||
"h" : parseInt((item.get("scaleY") * item.get("height")).toFixed(0)),
|
||
"w" : parseInt((item.get("scaleX") * item.get("width")).toFixed(0)),
|
||
"rotate" : parseInt(item.get("angle").toFixed(0))
|
||
});
|
||
}
|
||
*/
|
||
} else if (type == 11) {
|
||
//circle_text
|
||
op.backData.push({
|
||
"type": 2,
|
||
"Text": item.get("text"),
|
||
"FontFamily": item.get("fontFamily"),
|
||
"FontSize": parseInt(item.get("fontSize")),
|
||
"FontColor": "#000000",
|
||
"FontBackgroudColor": item.get("textBackgroundColor"),
|
||
"Bold": item.get("fontWeight") == "bold",
|
||
"Underline": item.get("underline"),
|
||
"Italic": item.get("fontStyle") == "italic",
|
||
"Strikeout": item.get("linethrough"),
|
||
"x": parseInt((item.get("left") - background_image2.left).toFixed(0)),
|
||
"y": parseInt((item.get("top") - background_image2.top).toFixed(0)),
|
||
"h": parseInt((item.get("scaleY") * item.get("height")).toFixed(0)),
|
||
"w": parseInt((item.get("scaleX") * item.get("width")).toFixed(0)),
|
||
"rotate": parseInt(item.get("angle").toFixed(0)),
|
||
"circleCenter": objs2[idx - 1].circleCenter || 0
|
||
});
|
||
} else if (type == 4) {
|
||
let xy = getAbsoluteXY(item)
|
||
op.backData.push({
|
||
type: 3,
|
||
name: objs2[idx - 1].name,
|
||
FontFamily: item.get('fontFamily'),
|
||
DefaultText: item.get('text'),
|
||
FontSize: parseInt(item.get('fontSize')),
|
||
FontBackgroudColor: item.get('textBackgroundColor'),
|
||
FontColor: item.get('fill'),
|
||
Exceed: objs2[idx - 1].exceed,
|
||
AutoWrap: objs2[idx - 1].autoWrap,
|
||
FixSize: objs2[idx - 1].fixSize,
|
||
Bold: item.get('fontWeight') == 'bold',
|
||
Underline: item.get('underline'),
|
||
Italic: item.get('fontStyle') == 'italic',
|
||
Strikeout: item.get('linethrough'),
|
||
x: parseInt((xy[0] - background_image2.left).toFixed(0)),
|
||
y: parseInt((xy[1] - background_image2.top).toFixed(0)),
|
||
h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)),
|
||
w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)),
|
||
rotate: parseInt(item.get('angle').toFixed(0)),
|
||
align: objs2[idx - 1].align
|
||
})
|
||
} else if (type == 8) {
|
||
//二维码
|
||
let xy = getAbsoluteXY(item)
|
||
op.backData.push({
|
||
type: 4,
|
||
name: objs2[idx - 1].name,
|
||
FontColor: objs2[idx - 1].color,
|
||
DefaultText: objs2[idx - 1].val,
|
||
x: parseInt((xy[0] - background_image2.left).toFixed(0)),
|
||
y: parseInt((xy[1] - background_image2.top).toFixed(0)),
|
||
h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)),
|
||
w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)),
|
||
rotate: parseInt(item.get('angle').toFixed(0))
|
||
})
|
||
} else if (type == 9) {
|
||
let xy = getAbsoluteXY(item)
|
||
op.backData.push({
|
||
type: 5,
|
||
name: objs2[idx - 1].name,
|
||
DefaultText: objs2[idx - 1].val,
|
||
HideText: objs1[idx - 1].show,
|
||
FontSize: parseInt(objs2[idx - 1].fontSize),
|
||
FontFamily: objs2[idx - 1].font,
|
||
FontColor: objs2[idx - 1].color,
|
||
x: parseInt((xy[0] - background_image2.left).toFixed(0)),
|
||
y: parseInt((xy[1] - background_image2.top).toFixed(0)),
|
||
h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)),
|
||
w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)),
|
||
rotate: parseInt(item.get('angle').toFixed(0))
|
||
})
|
||
} else if (type == 10) {
|
||
let xy = getAbsoluteXY(item)
|
||
op.backData.push({
|
||
type: 6,
|
||
name: objs2[idx - 1].name,
|
||
FontFamily: item.get('fontFamily'),
|
||
FontSize: parseInt(item.get('fontSize')),
|
||
FontColor: item.get('fill'),
|
||
start: parseInt(objs2[idx - 1].start),
|
||
add: parseInt(objs2[idx - 1].add),
|
||
x: parseInt((xy[0] - background_image2.left).toFixed(0)),
|
||
y: parseInt((xy[1] - background_image2.top).toFixed(0)),
|
||
h: parseInt((item.get('scaleY') * item.get('height')).toFixed(0)),
|
||
w: parseInt((item.get('scaleX') * item.get('width')).toFixed(0)),
|
||
rotate: parseInt(item.get('angle').toFixed(0))
|
||
})
|
||
}
|
||
}
|
||
_save(op, callback)
|
||
//return false 开启该代码可禁止点击该按钮关闭
|
||
})
|
||
})
|
||
}
|
||
|
||
// 重新生成二维码和条形码(加载文件后调用)
|
||
// 将 regenerateQrCodesAndBarcodes 附加到 window 对象,确保全局可访问
|
||
window.regenerateQrCodesAndBarcodes = function regenerateQrCodesAndBarcodes(canvas, objsArray) {
|
||
if (!canvas || !objsArray || !Array.isArray(objsArray)) return
|
||
|
||
const objects = canvas.getObjects()
|
||
|
||
// 遍历对象(跳过背景图片,索引 0)
|
||
for (let i = 1; i < objects.length; i++) {
|
||
const obj = objects[i]
|
||
if (!obj || obj.type !== 'image') continue
|
||
|
||
const objIndex = i - 1
|
||
if (objIndex >= objsArray.length) continue
|
||
|
||
const objMeta = objsArray[objIndex]
|
||
if (!objMeta || (objMeta.type !== 8 && objMeta.type !== 9)) continue
|
||
|
||
// type == 8: 二维码 - 复用 ui.js 中的生成逻辑
|
||
if (objMeta.type === 8) {
|
||
const qr = jrQrcode.getQrBase64(objMeta.val || 'https://www.cardsoon.com', {
|
||
padding: 0,
|
||
foreground: objMeta.color || '#000000'
|
||
})
|
||
obj.setSrc(qr, function (img) {
|
||
canvas.renderAll()
|
||
})
|
||
}
|
||
// type == 9: 条形码 - 复用 ui.js 中的生成逻辑
|
||
else if (objMeta.type === 9) {
|
||
JsBarcode("#barcode", objMeta.val || '123456789', {
|
||
margin: 0,
|
||
lineColor: objMeta.color || '#000000',
|
||
fontSize: objMeta.fontSize || 18,
|
||
font: objMeta.font || 'Arial',
|
||
displayValue: !objMeta.show
|
||
});
|
||
const barcode = document.getElementById('barcode')
|
||
const bar = barcode.toDataURL("image/png")
|
||
obj.setSrc(bar, function (img) {
|
||
canvas.renderAll()
|
||
})
|
||
}
|
||
}
|
||
}
|
||
|
||
// 清理不需要的 src 字段(保留自定义图片的 src)
|
||
// 将 cleanupSrcFields 附加到 window 对象,确保在 ui.js 中的 saveAs 函数也能访问
|
||
window.cleanupSrcFields = function cleanupSrcFields(jsonObjects, objsArray) {
|
||
if (!jsonObjects || !Array.isArray(jsonObjects)) return;
|
||
if (!objsArray || !Array.isArray(objsArray)) return;
|
||
|
||
for (let i = 0; i < jsonObjects.length; i++) {
|
||
let obj = jsonObjects[i];
|
||
// 只处理 fabric.Image 对象且有 src 字段的
|
||
if (obj && obj.type === 'image' && obj.src) {
|
||
// 背景图片(索引 0)- 删除 src
|
||
if (i === 0) {
|
||
delete obj.src;
|
||
}
|
||
// 其他对象,通过 objs 数组判断类型
|
||
else if (i - 1 < objsArray.length) {
|
||
let objMeta = objsArray[i - 1];
|
||
// type == 2: 合成图片 - 删除 src
|
||
// type == 8: 二维码 - 删除 src
|
||
// type == 9: 条形码 - 删除 src
|
||
// type == 1: 自定义图片 - 必须保留 src
|
||
if (objMeta && (objMeta.type === 2 || objMeta.type === 8 || objMeta.type === 9)) {
|
||
delete obj.src;
|
||
}
|
||
// type == 1 不处理,保留 src
|
||
}
|
||
}
|
||
}
|
||
};
|
||
// 向后兼容
|
||
function cleanupSrcFields(jsonObjects, objsArray) {
|
||
return window.cleanupSrcFields(jsonObjects, objsArray);
|
||
}
|
||
|
||
function applyCloudWriteResult(result, fallbackName) {
|
||
if (result && result.fileKey) {
|
||
openAs.name = result.fileKey;
|
||
return result.fileKey;
|
||
}
|
||
return fallbackName;
|
||
}
|
||
|
||
function cloudSaveSuccessLabel(res, fallback) {
|
||
if (res && res.name) return res.name;
|
||
if (typeof window.soonDisplayFileName === 'function') {
|
||
return window.soonDisplayFileName(openAs.name || fallback);
|
||
}
|
||
return fallback || '';
|
||
}
|
||
|
||
function onCloudWriteDone(res, fallback, callback) {
|
||
applyCloudWriteResult(res, fallback);
|
||
if (res && res.fileKey && typeof window.soonClearPendingImport === 'function') {
|
||
window.soonClearPendingImport();
|
||
}
|
||
layer.msg(language_str('saveSucc') + cloudSaveSuccessLabel(res, fallback));
|
||
if (callback && typeof callback === 'function') callback();
|
||
}
|
||
|
||
function guardWebSave() {
|
||
return typeof window.soonGuardCloudSave === 'function' ? window.soonGuardCloudSave() : true;
|
||
}
|
||
|
||
function reportSaveError(err) {
|
||
if (err && err.status) return;
|
||
if (typeof window.soonShowApiError === 'function') {
|
||
window.soonShowApiError({ status: err && err.status, message: (err && err.message) || '保存失败' });
|
||
} else if (typeof window.soonToast === 'function') {
|
||
window.soonToast('保存失败', 'error');
|
||
}
|
||
}
|
||
|
||
function saveAs(op1, callback) {
|
||
// 临时移除辅助线,保存后再恢复
|
||
let guideLines1 = []
|
||
let guideLines2 = []
|
||
canvas1.getObjects().forEach((obj, index) => {
|
||
if (obj.isGuideLine) {
|
||
guideLines1.push(obj)
|
||
canvas1.remove(obj)
|
||
}
|
||
})
|
||
canvas2.getObjects().forEach((obj, index) => {
|
||
if (obj.isGuideLine) {
|
||
guideLines2.push(obj)
|
||
canvas2.remove(obj)
|
||
}
|
||
})
|
||
|
||
const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented'];
|
||
let j = canvas1.toJSON(props)
|
||
let b = canvas2.toJSON(props)
|
||
|
||
// 恢复辅助线
|
||
guideLines1.forEach(obj => canvas1.add(obj))
|
||
guideLines2.forEach(obj => canvas2.add(obj))
|
||
canvas1.renderAll()
|
||
canvas2.renderAll()
|
||
|
||
// 清理不需要的 src 字段
|
||
cleanupSrcFields(j.objects, objs1);
|
||
cleanupSrcFields(b.objects, objs2);
|
||
|
||
let o = { f: j, b: b, fo: objs1, bo: objs2 }
|
||
let con_o = Object.assign(o, op1)
|
||
if (!guardWebSave()) return;
|
||
var dialogApi = (typeof dialog !== 'undefined' && dialog) ? dialog : (window.platformBridge && window.platformBridge.showSaveDialog ? { showSaveDialog: function(opts) { return window.platformBridge.showSaveDialog(opts); } } : null);
|
||
if (!dialogApi) return;
|
||
dialogApi.showSaveDialog({ title: language_str('saveFile'), filters: [{ name: 'Soon File Type', extensions: ['soon'] }], defaultPath: openAs.name || undefined })
|
||
.then(function(result) {
|
||
if (result.canceled) return;
|
||
var fp = result.filePath || (result.fileHandle && result.fileHandle.name);
|
||
if (!fp) return;
|
||
var ext = (typeof path !== 'undefined' && path && path.extname) ? path.extname(fp) : (fp.indexOf('.') >= 0 ? fp.slice(fp.lastIndexOf('.')) : '');
|
||
if (ext !== '.soon') fp = (fp || 'design').replace(/\.soon$/i, '') + '.soon';
|
||
con_o.soonType = 2;
|
||
var content = JSON.stringify(con_o);
|
||
if (window.platformBridge && window.platformBridge.writeFile) {
|
||
window.platformBridge.writeFile(fp, content).then(function (res) {
|
||
onCloudWriteDone(res, fp, callback);
|
||
}).catch(reportSaveError);
|
||
return;
|
||
}
|
||
var fs = typeof require !== 'undefined' ? require('fs') : null;
|
||
if (fs) {
|
||
fs.writeFileSync(fp, content, 'utf8');
|
||
openAs.name = fp;
|
||
layer.msg(language_str('saveSucc') + openAs.name);
|
||
saveHistory();
|
||
if (callback && typeof callback === 'function') callback();
|
||
}
|
||
})
|
||
.catch(reportSaveError);
|
||
}
|
||
|
||
function save(op1, callback) {
|
||
// 临时移除辅助线,保存后再恢复
|
||
let guideLines1 = []
|
||
let guideLines2 = []
|
||
canvas1.getObjects().forEach((obj, index) => {
|
||
if (obj.isGuideLine) {
|
||
guideLines1.push(obj)
|
||
canvas1.remove(obj)
|
||
}
|
||
})
|
||
canvas2.getObjects().forEach((obj, index) => {
|
||
if (obj.isGuideLine) {
|
||
guideLines2.push(obj)
|
||
canvas2.remove(obj)
|
||
}
|
||
})
|
||
|
||
const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented'];
|
||
let j = canvas1.toJSON(props)
|
||
let b = canvas2.toJSON(props)
|
||
|
||
// 恢复辅助线
|
||
guideLines1.forEach(obj => canvas1.add(obj))
|
||
guideLines2.forEach(obj => canvas2.add(obj))
|
||
canvas1.renderAll()
|
||
canvas2.renderAll()
|
||
|
||
// 清理不需要的 src 字段
|
||
cleanupSrcFields(j.objects, objs1);
|
||
cleanupSrcFields(b.objects, objs2);
|
||
|
||
let o = { f: j, b: b, fo: objs1, bo: objs2 }
|
||
let con_o = Object.assign(o, op1)
|
||
con_o.soonType = 2
|
||
var content = JSON.stringify(con_o)
|
||
if (!guardWebSave()) return;
|
||
if (openAs.name != '') {
|
||
if (window.platformBridge && window.platformBridge.writeFile) {
|
||
window.platformBridge.writeFile(openAs.name, content).then(function (res) {
|
||
onCloudWriteDone(res, openAs.name, callback);
|
||
}).catch(reportSaveError);
|
||
return;
|
||
}
|
||
var fs = typeof require !== 'undefined' ? require('fs') : null;
|
||
if (fs) {
|
||
fs.writeFileSync(openAs.name, content, 'utf8');
|
||
layer.msg(language_str('saveSucc') + openAs.name);
|
||
saveHistory();
|
||
if (callback && typeof callback === 'function') callback();
|
||
}
|
||
return;
|
||
}
|
||
var dialogApi = (typeof dialog !== 'undefined' && dialog) ? dialog : (window.platformBridge && window.platformBridge.showSaveDialog ? { showSaveDialog: function(opts) { return window.platformBridge.showSaveDialog(opts); } } : null);
|
||
if (!dialogApi) return;
|
||
dialogApi.showSaveDialog({ title: language_str('saveFile'), filters: [{ name: 'Soon File Type', extensions: ['soon'] }], defaultPath: openAs.name || undefined })
|
||
.then(function(result) {
|
||
if (result.canceled) return;
|
||
var fp = result.filePath || (result.fileHandle && result.fileHandle.name);
|
||
if (!fp) return;
|
||
var ext = (typeof path !== 'undefined' && path && path.extname) ? path.extname(fp) : (fp.indexOf('.') >= 0 ? fp.slice(fp.lastIndexOf('.')) : '');
|
||
if (ext !== '.soon') fp = (fp || 'design').replace(/\.soon$/i, '') + '.soon';
|
||
if (window.platformBridge && window.platformBridge.writeFile) {
|
||
window.platformBridge.writeFile(fp, content).then(function (res) {
|
||
onCloudWriteDone(res, fp, callback);
|
||
}).catch(reportSaveError);
|
||
return;
|
||
}
|
||
var fs = typeof require !== 'undefined' ? require('fs') : null;
|
||
if (fs) {
|
||
fs.writeFileSync(fp, content, 'utf8');
|
||
openAs.name = fp;
|
||
layer.msg(language_str('saveSucc') + openAs.name);
|
||
saveHistory();
|
||
if (callback && typeof callback === 'function') callback();
|
||
}
|
||
})
|
||
.catch(reportSaveError);
|
||
}
|
||
|
||
window.saveHistory = function saveHistory() {
|
||
function doWrite(j) {
|
||
var currentPath = openAs.name;
|
||
if (!currentPath) return;
|
||
var pathForHistory = currentPath;
|
||
if (window.platformBridge && currentPath.indexOf('soondesign_session:') !== 0 && currentPath.indexOf('soondesign_file:') !== 0) {
|
||
pathForHistory = 'soondesign_session:' + (currentPath || 'design.soon');
|
||
}
|
||
var list = Array.isArray(j.history) ? j.history : [];
|
||
var newList = list.filter(function(item) { return item.path !== pathForHistory && item.path !== currentPath; });
|
||
newList.unshift({ time: getDate(), path: pathForHistory, type: 2 });
|
||
if (newList.length > 20) newList = newList.slice(0, 20);
|
||
j.history = newList;
|
||
if (window.platformBridge && window.platformBridge.writeHistory) {
|
||
window.platformBridge.writeHistory(j);
|
||
return;
|
||
}
|
||
var fs = typeof require !== 'undefined' ? require('fs') : null;
|
||
if (fs && typeof fullPath !== 'undefined' && fullPath) {
|
||
try { fs.writeFileSync(fullPath, JSON.stringify(j), 'utf8'); } catch (e) {}
|
||
}
|
||
}
|
||
if (window.platformBridge && window.platformBridge.readHistory) {
|
||
window.platformBridge.readHistory().then(function(j) {
|
||
if (!j || !Array.isArray(j.history)) j = { history: [] };
|
||
doWrite(j);
|
||
}).catch(function() { doWrite({ history: [] }); });
|
||
return;
|
||
}
|
||
var fs = typeof require !== 'undefined' ? require('fs') : null;
|
||
var j = { history: [] };
|
||
if (fs && typeof fullPath !== 'undefined' && fullPath) {
|
||
try {
|
||
var fsData = fs.readFileSync(fullPath);
|
||
if (fsData && fsData.toString) j = JSON.parse(fsData.toString());
|
||
} catch (e) { j = { history: [] }; }
|
||
if (!Array.isArray(j.history)) j.history = [];
|
||
}
|
||
doWrite(j);
|
||
};
|
||
// 向后兼容
|
||
function saveHistory() {
|
||
return window.saveHistory();
|
||
}
|
||
|
||
// 使用 window.openFile 避免与浏览器原生的 window.open 冲突
|
||
window.openFile = function open(file, jAlready) {
|
||
if (!file) return;
|
||
if (typeof window.soonBindFileMeta === 'function') window.soonBindFileMeta(file);
|
||
function doOpenWithJson(j) {
|
||
if (!j || !background_image) {
|
||
if (typeof window.soonReportOpenLoadError === 'function') window.soonReportOpenLoadError('模板/文件加载失败');
|
||
return;
|
||
}
|
||
openAs.name = file;
|
||
var left = background_image.left
|
||
let top = background_image.top
|
||
let new_left = j.f.objects[0].left
|
||
let new_top = j.f.objects[0].top
|
||
for (let o of j.f.objects) {
|
||
o.left = o.left - new_left + left
|
||
o.top = o.top - new_top + top
|
||
}
|
||
for (let o of j.b.objects) {
|
||
o.left = o.left - new_left + left
|
||
o.top = o.top - new_top + top
|
||
}
|
||
// 如果背景图片没有src,从路径恢复(因为保存时删除了src以减小文件大小)
|
||
if (j.f.objects[0] && !j.f.objects[0].src) {
|
||
j.f.objects[0].src = soonAsset('bg_front_2.png')
|
||
}
|
||
if (j.b.objects[0] && !j.b.objects[0].src) {
|
||
j.b.objects[0].src = soonAsset('bg_back_2.png')
|
||
}
|
||
|
||
// 为二维码和条形码对象创建临时的 src(Fabric.js 需要 src 来创建 Image 对象)
|
||
// 加载完成后会重新生成,所以这里只需要一个占位符
|
||
const fo = j.fo || []
|
||
const bo = j.bo || []
|
||
const placeholder = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=='
|
||
|
||
// 为正面二维码、条形码和合成图片创建临时 src
|
||
fo.forEach((objMeta, idx) => {
|
||
if ((objMeta.type === 8 || objMeta.type === 9) && j.f.objects[idx + 1] && !j.f.objects[idx + 1].src) {
|
||
j.f.objects[idx + 1].src = placeholder
|
||
} else if (objMeta.type === 2 && j.f.objects[idx + 1] && !j.f.objects[idx + 1].src) {
|
||
// 合成图片类型,恢复默认图片
|
||
j.f.objects[idx + 1].src = soonAsset('outpic_extra.png')
|
||
}
|
||
})
|
||
|
||
// 为背面二维码、条形码和合成图片创建临时 src
|
||
bo.forEach((objMeta, idx) => {
|
||
if ((objMeta.type === 8 || objMeta.type === 9) && j.b.objects && j.b.objects[idx + 1] && !j.b.objects[idx + 1].src) {
|
||
j.b.objects[idx + 1].src = placeholder
|
||
} else if (objMeta.type === 2 && j.b.objects && j.b.objects[idx + 1] && !j.b.objects[idx + 1].src) {
|
||
// 合成图片类型,恢复默认图片
|
||
j.b.objects[idx + 1].src = soonAsset('outpic_extra.png')
|
||
}
|
||
})
|
||
|
||
// 先清空历史记录和重置 step
|
||
objs2 = j.bo || []
|
||
objs1 = j.fo || []
|
||
step1.val = 0
|
||
step2.val = 0
|
||
recordJson1 = []
|
||
recordJson2 = []
|
||
recordObjs1 = []
|
||
recordObjs2 = []
|
||
|
||
// 同步更新 window 变量
|
||
window.objs1 = objs1
|
||
window.objs2 = objs2
|
||
window.step1 = step1
|
||
window.step2 = step2
|
||
window.recordJson1 = recordJson1
|
||
window.recordJson2 = recordJson2
|
||
window.recordObjs1 = recordObjs1
|
||
window.recordObjs2 = recordObjs2
|
||
|
||
if ($('#front_side').hasClass('ui-button-active')) {
|
||
objs = objs1
|
||
recordObjs = recordObjs1
|
||
recordJson = recordJson1
|
||
step = step1
|
||
window.objs = objs1
|
||
window.recordObjs = recordObjs1
|
||
window.recordJson = recordJson1
|
||
window.step = step1
|
||
} else if ($('#back_side').hasClass('ui-button-active')) {
|
||
objs = objs2
|
||
recordObjs = recordObjs2
|
||
recordJson = recordJson2
|
||
background_image = background_image2
|
||
step = step2
|
||
window.objs = objs2
|
||
window.recordObjs = recordObjs2
|
||
window.recordJson = recordJson2
|
||
window.step = step2
|
||
}
|
||
|
||
// 加载 JSON,并在回调中重新生成二维码和条形码
|
||
// 使用 Promise 确保两个画布都加载完成后再保存初始状态
|
||
let canvas1Loaded = false
|
||
let canvas2Loaded = false
|
||
|
||
function saveInitialState() {
|
||
// 两个画布都加载完成后才保存初始状态
|
||
if (!canvas1Loaded || !canvas2Loaded) return
|
||
|
||
// 确保使用正确的 objs1 和 objs2(从文件加载的 fo 和 bo)
|
||
// 注意:必须使用 fo 和 bo,因为它们是直接从文件 JSON 中读取的
|
||
// 同时确保 objs1 和 objs2 也被正确设置
|
||
objs1 = fo || []
|
||
objs2 = bo || []
|
||
window.objs1 = objs1
|
||
window.objs2 = objs2
|
||
|
||
// 更新背景图引用
|
||
background_image1 = canvas1.getObjects()[0]
|
||
background_image2 = canvas2.getObjects()[0]
|
||
window.background_image1 = background_image1
|
||
window.background_image2 = background_image2
|
||
|
||
if ($('#front_side').hasClass('ui-button-active')) {
|
||
background_image = background_image1
|
||
window.background_image = background_image1
|
||
objs = objs1
|
||
window.objs = objs1
|
||
} else if ($('#back_side').hasClass('ui-button-active')) {
|
||
background_image = background_image2 || background_image1
|
||
window.background_image = background_image
|
||
objs = objs2
|
||
window.objs = objs2
|
||
}
|
||
|
||
// 保存初始状态(使用从文件加载的 objs 数组)
|
||
recordObjs1.push(JSON.stringify(objs1))
|
||
const props = window.TO_JSON_PROPERTIES || ['selectable', 'hoverable', 'hoverCursor', 'text', 'fontStyle', 'fontWeight', 'underline', 'evented', 'linethrough', 'textBackgroundColor', 'diameter', 'flipped'];
|
||
let j1 = canvas1.toJSON(props)
|
||
j1.objects[0].hoverCursor = 'default'
|
||
recordJson1.push(j1)
|
||
|
||
recordObjs2.push(JSON.stringify(objs2))
|
||
let j2 = canvas2.toJSON(props)
|
||
j2.objects[0].hoverCursor = 'default'
|
||
recordJson2.push(j2)
|
||
|
||
// 同步更新 window 变量和局部变量
|
||
window.recordObjs1 = recordObjs1
|
||
window.recordJson1 = recordJson1
|
||
window.recordObjs2 = recordObjs2
|
||
window.recordJson2 = recordJson2
|
||
// 确保局部变量也同步
|
||
if ($('#front_side').hasClass('ui-button-active')) {
|
||
recordObjs = recordObjs1
|
||
recordJson = recordJson1
|
||
step = step1
|
||
} else if ($('#back_side').hasClass('ui-button-active')) {
|
||
recordObjs = recordObjs2
|
||
recordJson = recordJson2
|
||
step = step2
|
||
}
|
||
if (typeof window.soonTryConsumeCloudImport === 'function') window.soonTryConsumeCloudImport(file);
|
||
}
|
||
|
||
canvas1.loadFromJSON(j.f, function () {
|
||
// 加载后解锁所有对象(背景除外)
|
||
if (typeof window.unlockAllObjects === 'function') {
|
||
window.unlockAllObjects(canvas1);
|
||
}
|
||
if (typeof window.regenerateQrCodesAndBarcodes === 'function') {
|
||
window.regenerateQrCodesAndBarcodes(canvas1, fo);
|
||
}
|
||
// 加载后更新列表和图标显示
|
||
if (typeof window.updateList === 'function') {
|
||
window.updateList();
|
||
}
|
||
canvas1.renderAll()
|
||
canvas1Loaded = true
|
||
saveInitialState()
|
||
})
|
||
canvas2.loadFromJSON(j.b, function () {
|
||
// 加载后解锁所有对象(背景除外)
|
||
if (typeof window.unlockAllObjects === 'function') {
|
||
window.unlockAllObjects(canvas2);
|
||
}
|
||
if (typeof window.regenerateQrCodesAndBarcodes === 'function') {
|
||
window.regenerateQrCodesAndBarcodes(canvas2, bo);
|
||
}
|
||
// 加载后更新列表和图标显示
|
||
if (typeof window.updateList === 'function') {
|
||
window.updateList();
|
||
}
|
||
canvas2.renderAll()
|
||
canvas2Loaded = true
|
||
saveInitialState()
|
||
})
|
||
}
|
||
if (arguments.length >= 2 && jAlready) {
|
||
doOpenWithJson(jAlready);
|
||
return;
|
||
}
|
||
if (window.platformBridge && window.platformBridge.readJsonFile) {
|
||
return window.platformBridge.readJsonFile(file).then(function(j) {
|
||
if (j) {
|
||
doOpenWithJson(j);
|
||
openAs.name = file;
|
||
} else if (typeof window.soonReportOpenLoadError === 'function') {
|
||
window.soonReportOpenLoadError('模板/文件加载失败');
|
||
}
|
||
}).catch(function () {
|
||
if (typeof window.soonReportOpenLoadError === 'function') window.soonReportOpenLoadError('模板/文件加载失败');
|
||
});
|
||
}
|
||
try {
|
||
var fs = typeof require !== 'undefined' ? require('fs') : null;
|
||
if (!fs || file.indexOf('soondesign_session:') === 0) return;
|
||
var fsData = fs.readFileSync(file);
|
||
var j = JSON.parse(fsData.toString());
|
||
doOpenWithJson(j);
|
||
} catch (e) {}
|
||
};
|
||
|
||
function clearAll() {
|
||
//let blank = "{\"f\":{\"version\":\"4.6.0\",\"objects\":[{\"type\":\"image\",\"version\":\"4.6.0\",\"originX\":\"left\",\"originY\":\"top\",\"left\":253.5,\"top\":121.5,\"width\":1012,\"height\":648,\"fill\":\"#000000\",\"stroke\":null,\"strokeWidth\":0,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeDashOffset\":0,\"strokeLineJoin\":\"miter\",\"strokeUniform\":false,\"strokeMiterLimit\":4,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"backgroundColor\":\"\",\"fillRule\":\"nonzero\",\"paintFirst\":\"fill\",\"globalCompositeOperation\":\"source-over\",\"skewX\":0,\"skewY\":0,\"cropX\":0,\"cropY\":0,\"selectable\":false,\"hoverable\":false,\"hoverCursor\":\"default\",\"src\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAwAAAKICAYAAAD0EmiCAAAAAXNSR0IArs4c6QAAIABJREFUeF7t3W3I5Xldx/HvT3SLdk0ljFyN0t1IEjN2TMEHZXcoKEjmQ9HKUkgURQtv8pGlVN6UlqBJN+Kzwhuo0MjKHhi27pJJUbG7IesNJOUurt2s6T/+cmYZd3bmc12zM7M783kd2Acy3+uc831954lvzpxrzX3w2LbtATPz+Jm5bmYeNzPXzszVM/NtM3Pl4b+r7oO35iUJECBAgAABAgQIECBAgMDFFrhjZr58+O8/ZuZzM3PTzPzTzNw4M/+w1vraxX5T62K94LZtj56ZZ8zMj87MDx3iwMV6ea9DgAABAgQIECBAgAABAgQuVYH/nJmPzsxfzsyfrrX+7WIsckGDwbZtD5mZ587M82bmSRdjIa9BgAABAgQIECBAgAABAgQuc4G/m5n3zMx711q3X6hdL0gw2LbtETPzypl54cz4pwUX6nqelwABAgQIECBAgAABAgSaBfZ/yvCumXnTWuvz5xvivAaDQyh43cz8zMx88/l+s56PAAECBAgQIECAAAECBAgQOE3gf2bm92fm9eczHJyXYLBt24MOnyh4jU8U+KtLgAABAgQIECBAgAABAgTuE4H9EwdvOHzi4Cv39h3c62CwbduJQ8nYf+uBBwECBAgQIECAAAECBAgQIHDfCnxqZn56rbX/hoVzfpxzMNi2bf/ZV8zMr87MFef8DvwgAQIECBAgQIAAAQIECBAgcL4F7pyZ187Mm9da27k8+TkFg23bHjwzfzAzzz6XF/UzBAgQIECAAAECBAgQIECAwEUReP/MPH+t9aXjvtqxg8G2bY+cmT+ZmR847ouZJ0CAAAECBAgQIECAAAECBC66wN/PzDPXWp89zisfKxhs23bNzPzFzHz3cV7ELAECBAgQIECAAAECBAgQIHCfCnx6Zn5srXXzUd/FkYPBtm2Pnpm/mZlHHfXJzREgQIAAAQIECBAgQIAAAQL3G4HPzMwPr7VuOco7OlIw2Lbt4TPzsZm59ihPaoYAAQIECBAgQIAAAQIECBC4XwrcNDNPWWt9Ib27GAy2bbtyZj4yM09OT+bPCRAgQIAAAQIECBAgQIAAgfu9wMdn5ifSFyGeNRgcfnXiH83MT93v1/UGCRAgQIAAAQIECBAgQIAAgaMKvG9mnnO2X7mYgsErZ+Y3jvpq5ggQIECAAAECBAgQIECAAIFLRuCX1lpn/P/8ZwwG27ZdNzN/OzNXXDKreqMECBAgQIAAAQIECBAgQIDAUQXuPHyfwQ339AP3GAy2bXvQzHxiZr7/qK9ijgABAgQIECBAgAABAgQIELjkBD41MyfWWl+5+zs/UzB41cy88ZJb0xsmQIAAAQIECBAgQIAAAQIEjivwmrXWaQ3gtGCwbdvVM/MvM3PVcV/BPAECBAgQIECAAAECBAgQIHDJCdwxM49da3321Hd+T8HgnTPzwktuPW+YAAECBAgQIECAAAECBAgQOFeBd621XnTGYLBt26MPny7Yv8PAgwABAgQIECBAgAABAgQIEOgQ2L/DYP+UwS0n1/2GTxhs2/a2mXlJh4UtCRAgQIAAAQIECBAgQIAAgVME3r7WeulpwWDbtofOzGdm5kpcBAgQIECAAAECBAgQIECAQJ3Af83MI9dat+2b3/UJg23bfmFmfqeOw8IECBAgQIAAAQIECBAgQIDASYEXr7XecfdgcP3MPJERAQIECBAgQIAAAQIECBAgUCtw/VrrSXcFg23brpmZm2o5LE6AAAECBAgQIECAAAECBAicFLhm//LDr/+ThG3bXjYzb2VDgAABAgQIECBAgAABAgQI1Au8bK31WyeDwYdm5mn1JAAIECBAgAABAgQIECBAgACBD6+1nr62bXvgzHxxZq5iQoAAAQIECBAgQIAAAQIECNQL3DEzD9uDwXUzc0M9BwACBAgQIECAAAECBAgQIEDgpMCJPRi8YGbezYQAAQIECBAgQIAAAQIECBAgcBB4wR4M3jIzL0dCgAABAgQIECBAgAABAgQIEDgIvHUPBh+YmWchIUCAAAECBAgQIECAAAECBAgcBD64B4P9+wv27zHwIECAAAECBAgQIECAAAECBAjsAjfuweBfZ+Z7eBAgQIAAAQIECBAgQIAAAQIEDgK37sHg8zPzHUgIECBAgAABAgQIECBAgAABAgeB2/dgsP9+xSuRECBAgAABAgQIECBAgAABAgQOAl/dg8GGgwABAgQIECBAgAABAgQIECBwqoBg4O8DAQIECBAgQIAAAQIECBAgcJqAYOAvBQECBAgQIECAAAECBAgQICAY+DtAgAABAgQIECBAgAABAgQIZAGfMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIEDpfCiFAAAcY0lEQVSAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMT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\",\"crossOrigin\":null,\"filters\":[]}],\"hoverCursor\":\"move\"},\"b\":{\"version\":\"4.6.0\",\"objects\":[{\"type\":\"image\",\"version\":\"4.6.0\",\"originX\":\"left\",\"originY\":\"top\",\"left\":253.5,\"top\":121.5,\"width\":1012,\"height\":648,\"fill\":\"rgb(0,0,0)\",\"stroke\":null,\"strokeWidth\":0,\"strokeDashArray\":null,\"strokeLineCap\":\"butt\",\"strokeDashOffset\":0,\"strokeLineJoin\":\"miter\",\"strokeUniform\":false,\"strokeMiterLimit\":4,\"scaleX\":1,\"scaleY\":1,\"angle\":0,\"flipX\":false,\"flipY\":false,\"opacity\":1,\"shadow\":null,\"visible\":true,\"backgroundColor\":\"\",\"fillRule\":\"nonzero\",\"paintFirst\":\"fill\",\"globalCompositeOperation\":\"source-over\",\"skewX\":0,\"skewY\":0,\"cropX\":0,\"cropY\":0,\"selectable\":false,\"hoverable\":false,\"hoverCursor\":\"default\",\"src\":\"data:image/png;base64,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YFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIEDpfCiFAAAcY0lEQVSAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMTBAgQIECAAAECBAgQIECgTkAwqDu5hQkQIECAAAECBAgQIECAQBYQDLKRCQIECBAgQIAAAQIECBAgUCcgGNSd3MIECBAgQIAAAQIECBAgQCALCAbZyAQBAgQIECBAgAABAgQIEKgTEAzqTm5hAgQIECBAgAABAgQIECCQBQSDbGSCAAECBAgQIECAAAECBAjUCQgGdSe3MAECBAgQIECAAAECBAgQyAKCQTYyQYAAAQIECBAgQIAAAQIE6gQEg7qTW5gAAQIECBAgQIAAAQIECGQBwSAbmSBAgAABAgQIECBAgAABAnUCgkHdyS1MgAABAgQIECBAgAABAgSygGCQjUwQIECAAAECBAgQIECAAIE6AcGg7uQWJkCAAAECBAgQIECAAAECWUAwyEYmCBAgQIAAAQIECBAgQIBAnYBgUHdyCxMgQIAAAQIECBAgQIAAgSwgGGQjEwQIECBAgAABAgQIECBAoE5AMKg7uYUJECBAgAABAgQIECBAgEAWEAyykQkCBAgQIECAAAECBAgQIFAnIBjUndzCBAgQIECAAAECBAgQIEAgCwgG2cgEAQIECBAgQIAAAQIECBCoExAM6k5uYQIECBAgQIAAAQIECBAgkAUEg2xkggABAgQIECBAgAABAgQI1AkIBnUntzABAgQIECBAgAABAgQIEMgCgkE2MkGAAAECBAgQIECAAAECBOoEBIO6k1uYAAECBAgQIECAAAECBAhkAcEgG5kgQIAAAQIECBAgQIAAAQJ1AoJB3cktTIAAAQIECBAgQIAAAQIEsoBgkI1MECBAgAABAgQIECBAgACBOgHBoO7kFiZAgAABAgQIECBAgAABAllAMMhGJggQIECAAAECBAgQIECAQJ2AYFB3cgsTIECAAAECBAgQIECAAIEsIBhkIxMECBAgQIAAAQIECBAgQKBOQDCoO7mFCRAgQIAAAQIECBAgQIBAFhAMspEJAgQIECBAgAABAgQIECBQJyAY1J3cwgQIECBAgAABAgQIECBAIAsIBtnIBAECBAgQIECAAAECBAgQqBMQDOpObmECBAgQIECAAAECBAgQIJAFBINsZIIAAQIECBAgQIAAAQIECNQJCAZ1J7cwAQIECBAgQIAAAQIECBDIAoJBNjJBgAABAgQIECBAgAABAgTqBASDupNbmAABAgQIECBAgAABAgQIZAHBIBuZIECAAAECBAgQIECAAAECdQKCQd3JLUyAAAECBAgQIECAAAECBLKAYJCNTBAgQIAAAQIECBAgQIAAgToBwaDu5BYmQIAAAQIECBAgQIAAAQJZQDDIRiYIECBAgAABAgQIECBAgECdgGBQd3ILEyBAgAABAgQIECBAgACBLCAYZCMT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\",\"crossOrigin\":null,\"filters\":[]}],\"hoverCursor\":\"move\"},\"fo\":[],\"bo\":[]}";
|
||
//let j = JSON.parse(blank);
|
||
//canvas1.setZoom(1);
|
||
//canvas2.setZoom(1);
|
||
//canvas1.loadFromJSON(j.f);
|
||
//canvas2.loadFromJSON(j.b);
|
||
let t_objs1 = canvas1.getObjects()
|
||
let t_objs2 = canvas2.getObjects()
|
||
for (let i = 1; i < t_objs1.length; i++) {
|
||
canvas1.remove(t_objs1[i])
|
||
}
|
||
for (let i = 1; i < t_objs2.length; i++) {
|
||
canvas2.remove(t_objs2[i])
|
||
}
|
||
objs2 = []
|
||
objs1 = []
|
||
step1.val = 0
|
||
step2.val = 0
|
||
recordJson1 = []
|
||
recordJson2 = []
|
||
recordObjs1 = []
|
||
recordObjs2 = []
|
||
if ($('#front_side').hasClass('ui-button-active')) {
|
||
objs = objs1
|
||
recordObjs = recordObjs1
|
||
recordJson = recordJson1
|
||
step = step1
|
||
} else if ($('#back_side').hasClass('ui-button-active')) {
|
||
objs = objs2
|
||
recordObjs = recordObjs2
|
||
recordJson = recordJson2
|
||
step = step2
|
||
}
|
||
openAs.name = ''
|
||
canvas1.renderAll()
|
||
canvas2.renderAll()
|
||
// 调用 updateList,现在它已附加到 window 对象
|
||
if (typeof window.updateList === 'function') {
|
||
window.updateList();
|
||
} else {
|
||
// 延迟检查,确保 core.js 已加载
|
||
setTimeout(() => {
|
||
if (typeof window.updateList === 'function') {
|
||
window.updateList();
|
||
}
|
||
}, 100);
|
||
}
|
||
}
|
||
|
||
// 将 clearAll 附加到 window 对象,确保全局可访问
|
||
window.clearAll = clearAll;
|
||
|