UNPKG

@acrodata/watermark

Version:
177 lines 25 kB
/** 用于标记是否需要保护 */ export const attributeNameTag = 'data-watermark-tag'; export const observeOptions = { childList: true, subtree: true, attributeFilter: ['style', 'class', attributeNameTag], }; /** 获取 DataSetKey */ export function getDataSetKey(attributeName) { return attributeName .split('-') .slice(1) .reduce((prev, cur, index) => { if (index === 0) { return cur; } return `${prev}${cur[0].toUpperCase() + cur.slice(1)}`; }); } /** 将样式对象转换为字符串 */ export const getStyleStr = (style) => { let str = ''; Object.keys(style).forEach(key => { const k = key.replace(/([A-Z])/g, '-$1').toLowerCase(); if (style[key] !== '' && style[key] != null) { str += `${k}:${style[key]};`; } }); return str; }; /** 创建随机 ID */ export const getRandomId = (prefix = '') => { const uid = window.btoa(decodeURI(encodeURIComponent(prefix))); return `${uid}-${new Date().getTime()}-${Math.floor(Math.random() * Math.pow(10, 8))}`; }; /** 获取水印挂载节点 */ export const getContainer = (container) => { let dom; if (typeof container === 'string') { dom = document.querySelector(container); if (!dom) { throw new Error(`The watermark container element '${container}' not found!`); } } else { dom = container ?? document.body; } return dom; }; /** 盲水印解密 */ export const decrypt = (ctx) => { const originalData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height); const data = originalData.data; for (let i = 0; i < data.length; i++) { // 筛选每个像素点的R值 if (i % 4 == 0) { if (data[i] % 2 == 0) { // 如果 R 值为偶数,说明这个点是没有水印信息的,将其 R 值设为0 data[i] = 0; } else { // 如果 R 值为奇数,说明这个点是有水印信息的,将其 R 值设为255 data[i] = 255; } } else if (i % 4 == 3) { // 透明度不作处理 continue; } else { // G、B 值设置为 0,不影响 data[i] = 0; } } // 至此,带有水印信息的点都将展示为 `255,0,0`,而没有水印信息的点将展示为 `0,0,0`,将结果绘制到画布 ctx.putImageData(originalData, 0, 0); }; export const createHost = (watermarkTag) => { const dom = document.createElement('div'); // 可以隐藏元素的 CSS 属性 const hiddenCSS = { 'display': 'block !important', 'position': 'static !important', 'opacity': '1 !important', 'visibility': 'visible !important', 'transform': 'none !important', 'clip-path': 'none !important', }; dom.setAttribute('style', getStyleStr(hiddenCSS)); dom.setAttribute(attributeNameTag, watermarkTag); return dom; }; export function getDrawPattern(opts) { const { text, gapX, gapY, offsetY, offsetX, width, height, rotate, opacity, fontSize, fontStyle, fontVariant, fontWeight, fontFamily, fontColor, textAlign, textBaseline, image, blindText, blindFontSize, blindOpacity, } = opts; return new Promise((resolve, reject) => { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const ratio = 1; const canvasWidth = (Number(gapX) + Number(width)) * ratio; const canvasHeight = (Number(gapY) + Number(height)) * ratio; const canvasOffsetLeft = Number(offsetX) || Number(gapX) / 2; const canvasOffsetTop = Number(offsetY) || Number(gapY) / 2; canvas.setAttribute('width', `${canvasWidth}px`); canvas.setAttribute('height', `${canvasHeight}px`); if (ctx) { const markWidth = width * ratio; const markHeight = height * ratio; // 1. 根据元素中心点旋转 ctx.translate(canvasOffsetLeft * ratio, canvasOffsetTop * ratio); ctx.translate(markWidth / 2, markHeight / 2); // 1 ctx.rotate((Math.PI / 180) * Number(rotate)); ctx.translate(-markWidth / 2, -markHeight / 2); // 1 // 是否需要增加盲水印文字 if (blindText) { // 盲水印需要低透明度 ctx.globalAlpha = blindOpacity; ctx.font = `${blindFontSize}px normal`; ctx.fillText(blindText, 0, 0); } // 设置透明度 ctx.globalAlpha = opacity; // 优先使用图片 if (image) { const img = new Image(); img.crossOrigin = 'anonymous'; img.referrerPolicy = 'no-referrer'; img.src = image; img.onload = () => { ctx.drawImage(img, 0, 0, markWidth, markHeight); resolve({ url: ctx.canvas.toDataURL(), width: canvasWidth, height: canvasHeight, }); }; return; } // 获取文本的最大宽度 const texts = typeof text === 'string' ? text.split('\n') : text; const widths = texts.map(item => ctx.measureText(item).width); const maxWidth = Math.max(...widths); const markSize = Number(fontSize) * ratio; // 设置文本对齐方式 ctx.textAlign = textAlign; // 设置文本位置 ctx.textBaseline = textBaseline; // 设置字体颜色 ctx.fillStyle = fontColor; // 设置字体 ctx.font = getFont(`${markSize}px`); // 文案宽度大于画板宽度 if (maxWidth > width) { ctx.font = getFont(`${markSize / 2}px`); } // 多行文本的上下间距 const textGap = 4; // 获取行高 const lineHeight = markSize; // 计算水印在 y 轴上的初始位置 let initY = (markHeight - (fontSize + 4) * texts.length - textGap * (texts.length - 1)) / 2; initY = initY < 0 ? 0 : initY; for (let i = 0; i < texts.length; i++) { ctx.fillText(texts[i] || '', markWidth / 2, initY + lineHeight * (i + 1) + textGap * i); } resolve({ url: ctx.canvas.toDataURL(), width: canvasWidth, height: canvasHeight, }); } function getFont(fontSize) { return `${fontStyle} ${fontVariant} ${fontWeight} ${fontSize} ${fontFamily}`; } return reject(); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy93YXRlcm1hcmsvc3JjL2xpYi91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxpQkFBaUI7QUFDakIsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHO0lBQzVCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsT0FBTyxFQUFFLElBQUk7SUFDYixlQUFlLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDO0NBQ3RELENBQUM7QUFFRixvQkFBb0I7QUFDcEIsTUFBTSxVQUFVLGFBQWEsQ0FBQyxhQUFxQjtJQUNqRCxPQUFPLGFBQWE7U0FDakIsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDUixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzNCLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUVELE9BQU8sR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxrQkFBa0I7QUFDbEIsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBc0MsRUFBRSxFQUFFO0lBQ3BFLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUViLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxF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RyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3RDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFDRCxPQUFPLENBQUM7Z0JBQ04sR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUMzQixLQUFLLEVBQUUsV0FBVztnQkFDbEIsTUFBTSxFQUFFLFlBQVk7YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELFNBQVMsT0FBTyxDQUFDLFFBQWdCO1lBQy9CLE9BQU8sR0FBRyxTQUFTLElBQUksV0FBVyxJQUFJLFVBQVUsSUFBSSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7UUFDL0UsQ0FBQztRQUVELE9BQU8sTUFBTSxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2F0ZXJtYXJrT3B0aW9ucywgRHJhd1BhdHRlcm5SZXN1bHQgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqIOeUqOS6juagh+iusOaYr+WQpumcgOimgeS/neaKpCAqL1xuZXhwb3J0IGNvbnN0IGF0dHJpYnV0ZU5hbWVUYWcgPSAnZGF0YS13YXRlcm1hcmstdGFnJztcblxuZXhwb3J0IGNvbnN0IG9ic2VydmVPcHRpb25zID0ge1xuICBjaGlsZExpc3Q6IHRydWUsXG4gIHN1YnRyZWU6IHRydWUsXG4gIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZScsICdjbGFzcycsIGF0dHJpYnV0ZU5hbWVUYWddLFxufTtcblxuLyoqIOiOt+WPliBEYXRhU2V0S2V5ICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YVNldEtleShhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGF0dHJpYnV0ZU5hbWVcbiAgICAuc3BsaXQoJy0nKVxuICAgIC5zbGljZSgxKVxuICAgIC5yZWR1Y2UoKHByZXYsIGN1ciwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gY3VyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYCR7cHJldn0ke2N1clswXS50b1VwcGVyQ2FzZSgpICsgY3VyLnNsaWNlKDEpfWA7XG4gICAgfSk7XG59XG5cbi8qKiDlsIbmoLflvI/lr7nosaHovazmjaLkuLrlrZfnrKbkuLIgKi9cbmV4cG9ydCBjb25zdCBnZXRTdHlsZVN0ciA9IChzdHlsZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPikgPT4ge1xuICBsZXQgc3RyID0gJyc7XG5cbiAgT2JqZWN0LmtleXMoc3R5bGUpLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCBrID0ga2V5LnJlcGxhY2UoLyhbQS1aXSkvZywgJy0kMScpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHN0eWxlW2tleV0gIT09ICcnICYmIHN0eWxlW2tleV0gIT0gbnVsbCkge1xuICAgICAgc3RyICs9IGAke2t9OiR7c3R5bGVba2V5XX07YDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBzdHI7XG59O1xuXG4vKiog5Yib5bu66ZqP5py6IElEICovXG5leHBvcnQgY29uc3QgZ2V0UmFuZG9tSWQgPSAocHJlZml4ID0gJycpID0+IHtcbiAgY29uc3QgdWlkID0gd2luZG93LmJ0b2EoZGVjb2RlVVJJKGVuY29kZVVSSUNvbXBvbmVudChwcmVmaXgpKSk7XG4gIHJldHVybiBgJHt1aWR9LSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTWF0aC5wb3coMTAsIDgpKX1gO1xufTtcblxuLyoqIOiOt+WPluawtOWNsOaMgui9veiKgueCuSAqL1xuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lciA9IChjb250YWluZXI6IFdhdGVybWFya09wdGlvbnNbJ2NvbnRhaW5lciddKSA9PiB7XG4gIGxldCBkb206IEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICBpZiAodHlwZW9mIGNvbnRhaW5lciA9PT0gJ3N0cmluZycpIHtcbiAgICBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lcik7XG4gICAgaWYgKCFkb20pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHdhdGVybWFyayBjb250YWluZXIgZWxlbWVudCAnJHtjb250YWluZXJ9JyBub3QgZm91bmQhYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRvbSA9IGNvbnRhaW5lciA/PyBkb2N1bWVudC5ib2R5O1xuICB9XG5cbiAgcmV0dXJuIGRvbTtcbn07XG5cbi8qKiDnm7LmsLTljbDop6Plr4YgKi9cbmV4cG9ydCBjb25zdCBkZWNyeXB0ID0gKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpO1xuICBjb25zdCBkYXRhID0gb3JpZ2luYWxEYXRhLmRhdGE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIC8vIOetm+mAieavj+S4quWDj+e0oOeCueeahFLlgLxcbiAgICBpZiAoaSAlIDQgPT0gMCkge1xuICAgICAgaWYgKGRhdGFbaV0gJSAyID09IDApIHtcbiAgICAgICAgLy8g5aaC5p6cIFIg5YC85Li65YG25pWw77yM6K+05piO6L+Z5Liq54K55piv5rKh5pyJ5rC05Y2w5L+h5oGv55qE77yM5bCG5YW2IFIg5YC86K6+5Li6MFxuICAgICAgICBkYXRhW2ldID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOWmguaenCBSIOWAvOS4uuWlh+aVsO+8jOivtOaYjui/meS4queCueaYr+acieawtOWNsOS/oeaBr+eahO+8jOWwhuWFtiBSIOWAvOiuvuS4ujI1NVxuICAgICAgICBkYXRhW2ldID0gMjU1O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaSAlIDQgPT0gMykge1xuICAgICAgLy8g6YCP5piO5bqm5LiN5L2c5aSE55CGXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR+OAgUIg5YC86K6+572u5Li6IDDvvIzkuI3lvbHlk41cbiAgICAgIGRhdGFbaV0gPSAwO1xuICAgIH1cbiAgfVxuICAvLyDoh7PmraTvvIzluKbmnInmsLTljbDkv6Hmga/nmoTngrnpg73lsIblsZXnpLrkuLogYDI1NSwwLDBg77yM6ICM5rKh5pyJ5rC05Y2w5L+h5oGv55qE54K55bCG5bGV56S65Li6IGAwLDAsMGDvvIzlsIbnu5Pmnpznu5jliLbliLDnlLvluINcbiAgY3R4LnB1dEltYWdlRGF0YShvcmlnaW5hbERhdGEsIDAsIDApO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUhvc3QgPSAod2F0ZXJtYXJrVGFnOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIC8vIOWPr+S7pemakOiXj+WFg+e0oOeahCBDU1Mg5bGe5oCnXG4gIGNvbnN0IGhpZGRlbkNTUyA9IHtcbiAgICAnZGlzcGxheSc6ICdibG9jayAhaW1wb3J0YW50JyxcbiAgICAncG9zaXRpb24nOiAnc3RhdGljICFpbXBvcnRhbnQnLFxuICAgICdvcGFjaXR5JzogJzEgIWltcG9ydGFudCcsXG4gICAgJ3Zpc2liaWxpdHknOiAndmlzaWJsZSAhaW1wb3J0YW50JyxcbiAgICAndHJhbnNmb3JtJzogJ25vbmUgIWltcG9ydGFudCcsXG4gICAgJ2NsaXAtcGF0aCc6ICdub25lICFpbXBvcnRhbnQnLFxuICB9O1xuICBkb20uc2V0QXR0cmlidXRlKCdzdHlsZScsIGdldFN0eWxlU3RyKGhpZGRlbkNTUykpO1xuICBkb20uc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWVUYWcsIHdhdGVybWFya1RhZyk7XG4gIHJldHVybiBkb207XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHJhd1BhdHRlcm4ob3B0czogV2F0ZXJtYXJrT3B0aW9ucyk6IFByb21pc2U8RHJhd1BhdHRlcm5SZXN1bHQ+IHtcbiAgY29uc3Qge1xuICAgIHRleHQsXG4gICAgZ2FwWCxcbiAgICBnYXBZLFxuICAgIG9mZnNldFksXG4gICAgb2Zmc2V0WCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgcm90YXRlLFxuICAgIG9wYWNpdHksXG4gICAgZm9udFNpemUsXG4gICAgZm9udFN0eWxlLFxuICAgIGZvbnRWYXJpYW50LFxuICAgIGZvbnRXZWlnaHQsXG4gICAgZm9udEZhbWlseSxcbiAgICBmb250Q29sb3IsXG4gICAgdGV4dEFsaWduLFxuICAgIHRleHRCYXNlbGluZSxcbiAgICBpbWFnZSxcbiAgICBibGluZFRleHQsXG4gICAgYmxpbmRGb250U2l6ZSxcbiAgICBibGluZE9wYWNpdHksXG4gIH0gPSBvcHRzIGFzIFJlcXVpcmVkPFdhdGVybWFya09wdGlvbnM+O1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY29uc3QgcmF0aW8gPSAxO1xuXG4gICAgY29uc3QgY2FudmFzV2lkdGggPSAoTnVtYmVyKGdhcFgpICsgTnVtYmVyKHdpZHRoKSkgKiByYXRpbztcbiAgICBjb25zdCBjYW52YXNIZWlnaHQgPSAoTnVtYmVyKGdhcFkpICsgTnVtYmVyKGhlaWdodCkpICogcmF0aW87XG4gICAgY29uc3QgY2FudmFzT2Zmc2V0TGVmdCA9IE51bWJlcihvZmZzZXRYKSB8fCBOdW1iZXIoZ2FwWCkgLyAyO1xuICAgIGNvbnN0IGNhbnZhc09mZnNldFRvcCA9IE51bWJlcihvZmZzZXRZKSB8fCBOdW1iZXIoZ2FwWSkgLyAyO1xuXG4gICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHtjYW52YXNXaWR0aH1weGApO1xuICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGAke2NhbnZhc0hlaWdodH1weGApO1xuXG4gICAgaWYgKGN0eCkge1xuICAgICAgY29uc3QgbWFya1dpZHRoID0gd2lkdGggKiByYXRpbztcbiAgICAgIGNvbnN0IG1hcmtIZWlnaHQgPSBoZWlnaHQgKiByYXRpbztcblxuICAgICAgLy8gMS4g5qC55o2u5YWD57Sg5Lit5b+D54K55peL6L2sXG4gICAgICBjdHgudHJhbnNsYXRlKGNhbnZhc09mZnNldExlZnQgKiByYXRpbywgY2FudmFzT2Zmc2V0VG9wICogcmF0aW8pO1xuICAgICAgY3R4LnRyYW5zbGF0ZShtYXJrV2lkdGggLyAyLCBtYXJrSGVpZ2h0IC8gMik7IC8vIDFcbiAgICAgIGN0eC5yb3RhdGUoKE1hdGguUEkgLyAxODApICogTnVtYmVyKHJvdGF0ZSkpO1xuICAgICAgY3R4LnRyYW5zbGF0ZSgtbWFya1dpZHRoIC8gMiwgLW1hcmtIZWlnaHQgLyAyKTsgLy8gMVxuXG4gICAgICAvLyDmmK/lkKbpnIDopoHlop7liqDnm7LmsLTljbDmloflrZdcbiAgICAgIGlmIChibGluZFRleHQpIHtcbiAgICAgICAgLy8g55uy5rC05Y2w6ZyA6KaB5L2O6YCP5piO5bqmXG4gICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IGJsaW5kT3BhY2l0eTtcbiAgICAgICAgY3R4LmZvbnQgPSBgJHtibGluZEZvbnRTaXplfXB4IG5vcm1hbGA7XG4gICAgICAgIGN0eC5maWxsVGV4dChibGluZFRleHQsIDAsIDApO1xuICAgICAgfVxuXG4gICAgICAvLyDorr7nva7pgI/mmI7luqZcbiAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG5cbiAgICAgIC8vIOS8mOWFiOS9v+eUqOWbvueJh1xuICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgICAgaW1nLnJlZmVycmVyUG9saWN5ID0gJ25vLXJlZmVycmVyJztcbiAgICAgICAgaW1nLnNyYyA9IGltYWdlO1xuICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBtYXJrV2lkdGgsIG1hcmtIZWlnaHQpO1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgdXJsOiBjdHguY2FudmFzLnRvRGF0YVVSTCgpLFxuICAgICAgICAgICAgd2lkdGg6IGNhbnZhc1dpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBjYW52YXNIZWlnaHQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8g6I635Y+W5paH5pys55qE5pyA5aSn5a695bqmXG4gICAgICBjb25zdCB0ZXh0cyA9IHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyA/IHRleHQuc3BsaXQoJ1xcbicpIDogdGV4dDtcbiAgICAgIGNvbnN0IHdpZHRocyA9IHRleHRzLm1hcChpdGVtID0+IGN0eC5tZWFzdXJlVGV4dChpdGVtKS53aWR0aCk7XG4gICAgICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWF4KC4uLndpZHRocyk7XG5cbiAgICAgIGNvbnN0IG1hcmtTaXplID0gTnVtYmVyKGZvbnRTaXplKSAqIHJhdGlvO1xuXG4gICAgICAvLyDorr7nva7mlofmnKzlr7npvZDmlrnlvI9cbiAgICAgIGN0eC50ZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG4gICAgICAvLyDorr7nva7mlofmnKzkvY3nva5cbiAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSB0ZXh0QmFzZWxpbmU7XG4gICAgICAvLyDorr7nva7lrZfkvZPpopzoibJcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBmb250Q29sb3I7XG4gICAgICAvLyDorr7nva7lrZfkvZNcbiAgICAgIGN0eC5mb250ID0gZ2V0Rm9udChgJHttYXJrU2l6ZX1weGApO1xuXG4gICAgICAvLyDmlofmoYjlrr3luqblpKfkuo7nlLvmnb/lrr3luqZcbiAgICAgIGlmIChtYXhXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgIGN0eC5mb250ID0gZ2V0Rm9udChgJHttYXJrU2l6ZSAvIDJ9cHhgKTtcbiAgICAgIH1cblxuICAgICAgLy8g5aSa6KGM5paH5pys55qE5LiK5LiL6Ze06LedXG4gICAgICBjb25zdCB0ZXh0R2FwID0gNDtcblxuICAgICAgLy8g6I635Y+W6KGM6auYXG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gbWFya1NpemU7XG5cbiAgICAgIC8vIOiuoeeul+awtOWNsOWcqCB5IOi9tOS4iueahOWIneWni+S9jee9rlxuICAgICAgbGV0IGluaXRZID0gKG1hcmtIZWlnaHQgLSAoZm9udFNpemUgKyA0KSAqIHRleHRzLmxlbmd0aCAtIHRleHRHYXAgKiAodGV4dHMubGVuZ3RoIC0gMSkpIC8gMjtcbiAgICAgIGluaXRZID0gaW5pdFkgPCAwID8gMCA6IGluaXRZO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGN0eC5maWxsVGV4dCh0ZXh0c1tpXSB8fCAnJywgbWFya1dpZHRoIC8gMiwgaW5pdFkgKyBsaW5lSGVpZ2h0ICogKGkgKyAxKSArIHRleHRHYXAgKiBpKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoe1xuICAgICAgICB1cmw6IGN0eC5jYW52YXMudG9EYXRhVVJMKCksXG4gICAgICAgIHdpZHRoOiBjYW52YXNXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjYW52YXNIZWlnaHQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRGb250KGZvbnRTaXplOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBgJHtmb250U3R5bGV9ICR7Zm9udFZhcmlhbnR9ICR7Zm9udFdlaWdodH0gJHtmb250U2l6ZX0gJHtmb250RmFtaWx5fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlamVjdCgpO1xuICB9KTtcbn1cbiJdfQ==