ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
253 lines • 36.7 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { DOCUMENT } from '@angular/common';
import { ChangeDetectionStrategy, Component, Input, inject, numberAttribute } from '@angular/core';
import { getPixelRatio, getStyleStr, reRendering, rotateWatermark } from './util';
import * as i0 from "@angular/core";
/**
* Base size of the canvas, 1 for parallel layout and 2 for alternate layout
* Only alternate layout is currently supported
*/
const BaseSize = 2;
const FontGap = 3;
export class NzWaterMarkComponent {
constructor(el, cdr) {
this.el = el;
this.cdr = cdr;
this.nzWidth = 120;
this.nzHeight = 64;
this.nzRotate = -22;
this.nzZIndex = 9;
this.nzImage = '';
this.nzContent = '';
this.nzFont = {};
this.nzGap = [100, 100];
this.nzOffset = [this.nzGap[0] / 2, this.nzGap[1] / 2];
this.document = inject(DOCUMENT);
this.waterMarkElement = this.document.createElement('div');
this.stopObservation = false;
this.observer = new MutationObserver(mutations => {
if (this.stopObservation) {
return;
}
mutations.forEach(mutation => {
if (reRendering(mutation, this.waterMarkElement)) {
this.destroyWatermark();
this.renderWatermark();
}
});
});
}
ngOnInit() {
this.observer.observe(this.el.nativeElement, {
subtree: true,
childList: true,
attributeFilter: ['style', 'class']
});
}
ngAfterViewInit() {
this.renderWatermark();
}
ngOnChanges(changes) {
const { nzRotate, nzZIndex, nzWidth, nzHeight, nzImage, nzContent, nzFont, gapX, gapY, offsetLeft, offsetTop } = changes;
if (nzRotate ||
nzZIndex ||
nzWidth ||
nzHeight ||
nzImage ||
nzContent ||
nzFont ||
gapX ||
gapY ||
offsetLeft ||
offsetTop) {
this.renderWatermark();
}
}
getFont() {
const font = {
color: 'rgba(0,0,0,.15)',
fontSize: 16,
fontWeight: 'normal',
fontFamily: 'sans-serif',
fontStyle: 'normal'
};
this.nzFont = { ...font, ...this.nzFont };
this.cdr.markForCheck();
}
getMarkStyle() {
const markStyle = {
zIndex: this.nzZIndex,
position: 'absolute',
left: 0,
top: 0,
width: '100%',
height: '100%',
pointerEvents: 'none',
backgroundRepeat: 'repeat',
visibility: 'visible'
};
/** Calculate the style of the nzOffset */
let positionLeft = (this.nzOffset?.[0] ?? this.nzGap[0] / 2) - this.nzGap[0] / 2;
let positionTop = (this.nzOffset?.[1] ?? this.nzGap[1] / 2) - this.nzGap[1] / 2;
if (positionLeft > 0) {
markStyle.left = `${positionLeft}px`;
markStyle.width = `calc(100% - ${positionLeft}px)`;
positionLeft = 0;
}
if (positionTop > 0) {
markStyle.top = `${positionTop}px`;
markStyle.height = `calc(100% - ${positionTop}px)`;
positionTop = 0;
}
markStyle.backgroundPosition = `${positionLeft}px ${positionTop}px`;
return markStyle;
}
destroyWatermark() {
if (this.waterMarkElement) {
this.waterMarkElement.remove();
}
}
appendWatermark(base64Url, markWidth) {
this.stopObservation = true;
this.waterMarkElement.setAttribute('style', getStyleStr({
...this.getMarkStyle(),
backgroundImage: `url('${base64Url}')`,
backgroundSize: `${(this.nzGap[0] + markWidth) * BaseSize}px`
}));
this.el.nativeElement.append(this.waterMarkElement);
this.cdr.markForCheck();
// Delayed execution
setTimeout(() => {
this.stopObservation = false;
this.cdr.markForCheck();
});
}
getMarkSize(ctx) {
let defaultWidth = 120;
let defaultHeight = 64;
if (!this.nzImage && ctx.measureText) {
ctx.font = `${Number(this.nzFont.fontSize)}px ${this.nzFont.fontFamily}`;
const contents = Array.isArray(this.nzContent) ? this.nzContent : [this.nzContent];
const widths = contents.map(item => ctx.measureText(item).width);
defaultWidth = Math.ceil(Math.max(...widths));
defaultHeight = Number(this.nzFont.fontSize) * contents.length + (contents.length - 1) * FontGap;
}
return [this.nzWidth ?? defaultWidth, this.nzHeight ?? defaultHeight];
}
fillTexts(ctx, drawX, drawY, drawWidth, drawHeight) {
const ratio = getPixelRatio();
const mergedFontSize = Number(this.nzFont.fontSize) * ratio;
ctx.font = `${this.nzFont.fontStyle} normal ${this.nzFont.fontWeight} ${mergedFontSize}px/${drawHeight}px ${this.nzFont.fontFamily}`;
if (this.nzFont.color)
ctx.fillStyle = this.nzFont.color;
ctx.textAlign = 'center';
ctx.textBaseline = 'top';
ctx.translate(drawWidth / 2, 0);
const contents = Array.isArray(this.nzContent) ? this.nzContent : [this.nzContent];
contents?.forEach((item, index) => {
ctx.fillText(item ?? '', drawX, drawY + index * (mergedFontSize + FontGap * ratio));
});
}
drawText(canvas, ctx, drawX, drawY, drawWidth, drawHeight, alternateRotateX, alternateRotateY, alternateDrawX, alternateDrawY, markWidth) {
this.fillTexts(ctx, drawX, drawY, drawWidth, drawHeight);
/** Fill the interleaved text after rotation */
ctx.restore();
rotateWatermark(ctx, alternateRotateX, alternateRotateY, this.nzRotate);
this.fillTexts(ctx, alternateDrawX, alternateDrawY, drawWidth, drawHeight);
this.appendWatermark(canvas.toDataURL(), markWidth);
}
renderWatermark() {
if (!this.nzContent && !this.nzImage) {
return;
}
const canvas = this.document.createElement('canvas');
const ctx = canvas.getContext('2d');
if (ctx) {
if (!this.waterMarkElement) {
this.waterMarkElement = this.document.createElement('div');
}
this.getFont();
const ratio = getPixelRatio();
const [markWidth, markHeight] = this.getMarkSize(ctx);
const canvasWidth = (this.nzGap[0] + markWidth) * ratio;
const canvasHeight = (this.nzGap[1] + markHeight) * ratio;
canvas.setAttribute('width', `${canvasWidth * BaseSize}px`);
canvas.setAttribute('height', `${canvasHeight * BaseSize}px`);
const drawX = (this.nzGap[0] * ratio) / 2;
const drawY = (this.nzGap[1] * ratio) / 2;
const drawWidth = markWidth * ratio;
const drawHeight = markHeight * ratio;
const rotateX = (drawWidth + this.nzGap[0] * ratio) / 2;
const rotateY = (drawHeight + this.nzGap[1] * ratio) / 2;
/** Alternate drawing parameters */
const alternateDrawX = drawX + canvasWidth;
const alternateDrawY = drawY + canvasHeight;
const alternateRotateX = rotateX + canvasWidth;
const alternateRotateY = rotateY + canvasHeight;
ctx.save();
rotateWatermark(ctx, rotateX, rotateY, this.nzRotate);
if (this.nzImage) {
const img = new Image();
img.onload = () => {
ctx.drawImage(img, drawX, drawY, drawWidth, drawHeight);
/** Draw interleaved pictures after rotation */
ctx.restore();
rotateWatermark(ctx, alternateRotateX, alternateRotateY, this.nzRotate);
ctx.drawImage(img, alternateDrawX, alternateDrawY, drawWidth, drawHeight);
this.appendWatermark(canvas.toDataURL(), markWidth);
};
img.onerror = () => this.drawText(canvas, ctx, drawX, drawY, drawWidth, drawHeight, alternateRotateX, alternateRotateY, alternateDrawX, alternateDrawY, markWidth);
img.crossOrigin = 'anonymous';
img.referrerPolicy = 'no-referrer';
img.src = this.nzImage;
}
else {
this.drawText(canvas, ctx, drawX, drawY, drawWidth, drawHeight, alternateRotateX, alternateRotateY, alternateDrawX, alternateDrawY, markWidth);
}
}
}
ngOnDestroy() {
this.observer.disconnect();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzWaterMarkComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.1.2", type: NzWaterMarkComponent, isStandalone: true, selector: "nz-water-mark", inputs: { nzWidth: ["nzWidth", "nzWidth", numberAttribute], nzHeight: ["nzHeight", "nzHeight", numberAttribute], nzRotate: ["nzRotate", "nzRotate", numberAttribute], nzZIndex: ["nzZIndex", "nzZIndex", numberAttribute], nzImage: "nzImage", nzContent: "nzContent", nzFont: "nzFont", nzGap: "nzGap", nzOffset: "nzOffset" }, host: { classAttribute: "ant-water-mark" }, exportAs: ["NzWaterMark"], usesOnChanges: true, ngImport: i0, template: ` <ng-content></ng-content> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzWaterMarkComponent, decorators: [{
type: Component,
args: [{
selector: 'nz-water-mark',
standalone: true,
exportAs: 'NzWaterMark',
changeDetection: ChangeDetectionStrategy.OnPush,
template: ` <ng-content></ng-content> `,
host: {
class: 'ant-water-mark'
}
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { nzWidth: [{
type: Input,
args: [{ transform: numberAttribute }]
}], nzHeight: [{
type: Input,
args: [{ transform: numberAttribute }]
}], nzRotate: [{
type: Input,
args: [{ transform: numberAttribute }]
}], nzZIndex: [{
type: Input,
args: [{ transform: numberAttribute }]
}], nzImage: [{
type: Input
}], nzContent: [{
type: Input
}], nzFont: [{
type: Input
}], nzGap: [{
type: Input
}], nzOffset: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXItbWFyay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL3dhdGVyLW1hcmsvd2F0ZXItbWFyay5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULEtBQUssRUFLTCxNQUFNLEVBQ04sZUFBZSxFQUNoQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sUUFBUSxDQUFDOztBQUVsRjs7O0dBR0c7QUFDSCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDbkIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBWWxCLE1BQU0sT0FBTyxvQkFBb0I7SUE0Qi9CLFlBQ1UsRUFBYyxFQUNkLEdBQXNCO1FBRHRCLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTdCTyxZQUFPLEdBQVcsR0FBRyxDQUFDO1FBQ3RCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsYUFBUSxHQUFXLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFDbkQsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUNyQixjQUFTLEdBQXNCLEVBQUUsQ0FBQztRQUNsQyxXQUFNLEdBQWEsRUFBRSxDQUFDO1FBQ3RCLFVBQUssR0FBcUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDckMsYUFBUSxHQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFckUs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LFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBQ0UsUUFBUTtzQkFBOUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBQ0UsUUFBUTtzQkFBOUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBQ0UsUUFBUTtzQkFBOUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBQzVCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgaW5qZWN0LFxuICBudW1iZXJBdHRyaWJ1dGVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZvbnRUeXBlLCBNYXJrU3R5bGVUeXBlIH0gZnJvbSAnLi90eXBpbmdzJztcbmltcG9ydCB7IGdldFBpeGVsUmF0aW8sIGdldFN0eWxlU3RyLCByZVJlbmRlcmluZywgcm90YXRlV2F0ZXJtYXJrIH0gZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBCYXNlIHNpemUgb2YgdGhlIGNhbnZhcywgMSBmb3IgcGFyYWxsZWwgbGF5b3V0IGFuZCAyIGZvciBhbHRlcm5hdGUgbGF5b3V0XG4gKiBPbmx5IGFsdGVybmF0ZSBsYXlvdXQgaXMgY3VycmVudGx5IHN1cHBvcnRlZFxuICovXG5jb25zdCBCYXNlU2l6ZSA9IDI7XG5jb25zdCBGb250R2FwID0gMztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotd2F0ZXItbWFyaycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGV4cG9ydEFzOiAnTnpXYXRlck1hcmsnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PiBgLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdhbnQtd2F0ZXItbWFyaydcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBOeldhdGVyTWFya0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBueldpZHRoOiBudW1iZXIgPSAxMjA7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIG56SGVpZ2h0OiBudW1iZXIgPSA2NDtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgbnpSb3RhdGU6IG51bWJlciA9IC0yMjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgbnpaSW5kZXg6IG51bWJlciA9IDk7XG4gIEBJbnB1dCgpIG56SW1hZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBuekNvbnRlbnQ6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG4gIEBJbnB1dCgpIG56Rm9udDogRm9udFR5cGUgPSB7fTtcbiAgQElucHV0KCkgbnpHYXA6IFtudW1iZXIsIG51bWJlcl0gPSBbMTAwLCAxMDBdO1xuICBASW5wdXQoKSBuek9mZnNldDogW251bWJlciwgbnVtYmVyXSA9IFt0aGlzLm56R2FwWzBdIC8gMiwgdGhpcy5uekdhcFsxXSAvIDJdO1xuXG4gIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICB3YXRlck1hcmtFbGVtZW50OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHN0b3BPYnNlcnZhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+IHtcbiAgICBpZiAodGhpcy5zdG9wT2JzZXJ2YXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbXV0YXRpb25zLmZvckVhY2gobXV0YXRpb24gPT4ge1xuICAgICAgaWYgKHJlUmVuZGVyaW5nKG11dGF0aW9uLCB0aGlzLndhdGVyTWFya0VsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveVdhdGVybWFyaygpO1xuICAgICAgICB0aGlzLnJlbmRlcldhdGVybWFyaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwge1xuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZScsICdjbGFzcyddXG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJXYXRlcm1hcmsoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56Um90YXRlLCBuelpJbmRleCwgbnpXaWR0aCwgbnpIZWlnaHQsIG56SW1hZ2UsIG56Q29udGVudCwgbnpGb250LCBnYXBYLCBnYXBZLCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3AgfSA9XG4gICAgICBjaGFuZ2VzO1xuXG4gICAgaWYgKFxuICAgICAgbnpSb3RhdGUgfHxcbiAgICAgIG56WkluZGV4IHx8XG4gICAgICBueldpZHRoIHx8XG4gICAgICBuekhlaWdodCB8fFxuICAgICAgbnpJbWFnZSB8fFxuICAgICAgbnpDb250ZW50IHx8XG4gICAgICBuekZvbnQgfHxcbiAgICAgIGdhcFggfHxcbiAgICAgIGdhcFkgfHxcbiAgICAgIG9mZnNldExlZnQgfHxcbiAgICAgIG9mZnNldFRvcFxuICAgICkge1xuICAgICAgdGhpcy5yZW5kZXJXYXRlcm1hcmsoKTtcbiAgICB9XG4gIH1cblxuICBnZXRGb250KCk6IHZvaWQge1xuICAgIGNvbnN0IGZvbnQ6IEZvbnRUeXBlID0ge1xuICAgICAgY29sb3I6ICdyZ2JhKDAsMCwwLC4xNSknLFxuICAgICAgZm9udFNpemU6IDE2LFxuICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcsXG4gICAgICBmb250RmFtaWx5OiAnc2Fucy1zZXJpZicsXG4gICAgICBmb250U3R5bGU6ICdub3JtYWwnXG4gICAgfTtcblxuICAgIHRoaXMubnpGb250ID0geyAuLi5mb250LCAuLi50aGlzLm56Rm9udCB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0TWFya1N0eWxlKCk6IE1hcmtTdHlsZVR5cGUge1xuICAgIGNvbnN0IG1hcmtTdHlsZTogTWFya1N0eWxlVHlwZSA9IHtcbiAgICAgIHpJbmRleDogdGhpcy5uelpJbmRleCxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIGJhY2tncm91bmRSZXBlYXQ6ICdyZXBlYXQnLFxuICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnXG4gICAgfTtcblxuICAgIC8qKiBDYWxjdWxhdGUgdGhlIHN0eWxlIG9mIHRoZSBuek9mZnNldCAqL1xuICAgIGxldCBwb3NpdGlvbkxlZnQgPSAodGhpcy5uek9mZnNldD8uWzBdID8/IHRoaXMubnpHYXBbMF0gLyAyKSAtIHRoaXMubnpHYXBbMF0gLyAyO1xuICAgIGxldCBwb3NpdGlvblRvcCA9ICh0aGlzLm56T2Zmc2V0Py5bMV0gPz8gdGhpcy5uekdhcFsxXSAvIDIpIC0gdGhpcy5uekdhcFsxXSAvIDI7XG4gICAgaWYgKHBvc2l0aW9uTGVmdCA+IDApIHtcbiAgICAgIG1hcmtTdHlsZS5sZWZ0ID0gYCR7cG9zaXRpb25MZWZ0fXB4YDtcbiAgICAgIG1hcmtTdHlsZS53aWR0aCA9IGBjYWxjKDEwMCUgLSAke3Bvc2l0aW9uTGVmdH1weClgO1xuICAgICAgcG9zaXRpb25MZWZ0ID0gMDtcbiAgICB9XG4gICAgaWYgKHBvc2l0aW9uVG9wID4gMCkge1xuICAgICAgbWFya1N0eWxlLnRvcCA9IGAke3Bvc2l0aW9uVG9wfXB4YDtcbiAgICAgIG1hcmtTdHlsZS5oZWlnaHQgPSBgY2FsYygxMDAlIC0gJHtwb3NpdGlvblRvcH1weClgO1xuICAgICAgcG9zaXRpb25Ub3AgPSAwO1xuICAgIH1cbiAgICBtYXJrU3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gYCR7cG9zaXRpb25MZWZ0fXB4ICR7cG9zaXRpb25Ub3B9cHhgO1xuXG4gICAgcmV0dXJuIG1hcmtTdHlsZTtcbiAgfVxuXG4gIGRlc3Ryb3lXYXRlcm1hcmsoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2F0ZXJNYXJrRWxlbWVudCkge1xuICAgICAgdGhpcy53YXRlck1hcmtFbGVtZW50LnJlbW92ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGVuZFdhdGVybWFyayhiYXNlNjRVcmw6IHN0cmluZywgbWFya1dpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BPYnNlcnZhdGlvbiA9IHRydWU7XG4gICAgdGhpcy53YXRlck1hcmtFbGVtZW50LnNldEF0dHJpYnV0ZShcbiAgICAgICdzdHlsZScsXG4gICAgICBnZXRTdHlsZVN0cih7XG4gICAgICAgIC4uLnRoaXMuZ2V0TWFya1N0eWxlKCksXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogYHVybCgnJHtiYXNlNjRVcmx9JylgLFxuICAgICAgICBiYWNrZ3JvdW5kU2l6ZTogYCR7KHRoaXMubnpHYXBbMF0gKyBtYXJrV2lkdGgpICogQmFzZVNpemV9cHhgXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmFwcGVuZCh0aGlzLndhdGVyTWFya0VsZW1lbnQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gRGVsYXllZCBleGVjdXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3RvcE9ic2VydmF0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldE1hcmtTaXplKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgbGV0IGRlZmF1bHRXaWR0aCA9IDEyMDtcbiAgICBsZXQgZGVmYXVsdEhlaWdodCA9IDY0O1xuICAgIGlmICghdGhpcy5uekltYWdlICYmIGN0eC5tZWFzdXJlVGV4dCkge1xuICAgICAgY3R4LmZvbnQgPSBgJHtOdW1iZXIodGhpcy5uekZvbnQuZm9udFNpemUpfXB4ICR7dGhpcy5uekZvbnQuZm9udEZhbWlseX1gO1xuICAgICAgY29uc3QgY29udGVudHMgPSBBcnJheS5pc0FycmF5KHRoaXMubnpDb250ZW50KSA/IHRoaXMubnpDb250ZW50IDogW3RoaXMubnpDb250ZW50XTtcbiAgICAgIGNvbnN0IHdpZHRocyA9IGNvbnRlbnRzLm1hcChpdGVtID0+IGN0eC5tZWFzdXJlVGV4dChpdGVtISkud2lkdGgpO1xuICAgICAgZGVmYXVsdFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KC4uLndpZHRocykpO1xuICAgICAgZGVmYXVsdEhlaWdodCA9IE51bWJlcih0aGlzLm56Rm9udC5mb250U2l6ZSkgKiBjb250ZW50cy5sZW5ndGggKyAoY29udGVudHMubGVuZ3RoIC0gMSkgKiBGb250R2FwO1xuICAgIH1cbiAgICByZXR1cm4gW3RoaXMubnpXaWR0aCA/PyBkZWZhdWx0V2lkdGgsIHRoaXMubnpIZWlnaHQgPz8gZGVmYXVsdEhlaWdodF07XG4gIH1cblxuICBmaWxsVGV4dHMoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGRyYXdYOiBudW1iZXIsIGRyYXdZOiBudW1iZXIsIGRyYXdXaWR0aDogbnVtYmVyLCBkcmF3SGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCByYXRpbyA9IGdldFBpeGVsUmF0aW8oKTtcbiAgICBjb25zdCBtZXJnZWRGb250U2l6ZSA9IE51bWJlcih0aGlzLm56Rm9udC5mb250U2l6ZSkgKiByYXRpbztcbiAgICBjdHguZm9udCA9IGAke3RoaXMubnpGb250LmZvbnRTdHlsZX0gbm9ybWFsICR7dGhpcy5uekZvbnQuZm9udFdlaWdodH0gJHttZXJnZWRGb250U2l6ZX1weC8ke2RyYXdIZWlnaHR9cHggJHt0aGlzLm56Rm9udC5mb250RmFtaWx5fWA7XG4gICAgaWYgKHRoaXMubnpGb250LmNvbG9yKSBjdHguZmlsbFN0eWxlID0gdGhpcy5uekZvbnQuY29sb3I7XG4gICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcbiAgICBjdHgudHJhbnNsYXRlKGRyYXdXaWR0aCAvIDIsIDApO1xuICAgIGNvbnN0IGNvbnRlbnRzID0gQXJyYXkuaXNBcnJheSh0aGlzLm56Q29udGVudCkgPyB0aGlzLm56Q29udGVudCA6IFt0aGlzLm56Q29udGVudF07XG4gICAgY29udGVudHM/LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjdHguZmlsbFRleHQoaXRlbSA/PyAnJywgZHJhd1gsIGRyYXdZICsgaW5kZXggKiAobWVyZ2VkRm9udFNpemUgKyBGb250R2FwICogcmF0aW8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRyYXdUZXh0KFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgZHJhd1g6IG51bWJlcixcbiAgICBkcmF3WTogbnVtYmVyLFxuICAgIGRyYXdXaWR0aDogbnVtYmVyLFxuICAgIGRyYXdIZWlnaHQ6IG51bWJlcixcbiAgICBhbHRlcm5hdGVSb3RhdGVYOiBudW1iZXIsXG4gICAgYWx0ZXJuYXRlUm90YXRlWTogbnVtYmVyLFxuICAgIGFsdGVybmF0ZURyYXdYOiBudW1iZXIsXG4gICAgYWx0ZXJuYXRlRHJhd1k6IG51bWJlcixcbiAgICBtYXJrV2lkdGg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICB0aGlzLmZpbGxUZXh0cyhjdHgsIGRyYXdYLCBkcmF3WSwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTtcblxuICAgIC8qKiBGaWxsIHRoZSBpbnRlcmxlYXZlZCB0ZXh0IGFmdGVyIHJvdGF0aW9uICovXG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICByb3RhdGVXYXRlcm1hcmsoY3R4LCBhbHRlcm5hdGVSb3RhdGVYLCBhbHRlcm5hdGVSb3RhdGVZLCB0aGlzLm56Um90YXRlKTtcbiAgICB0aGlzLmZpbGxUZXh0cyhjdHgsIGFsdGVybmF0ZURyYXdYLCBhbHRlcm5hdGVEcmF3WSwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTtcbiAgICB0aGlzLmFwcGVuZFdhdGVybWFyayhjYW52YXMudG9EYXRhVVJMKCksIG1hcmtXaWR0aCk7XG4gIH1cblxuICByZW5kZXJXYXRlcm1hcmsoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm56Q29udGVudCAmJiAhdGhpcy5uekltYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGlmICghdGhpcy53YXRlck1hcmtFbGVtZW50KSB7XG4gICAgICAgIHRoaXMud2F0ZXJNYXJrRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB9XG4gICAgICB0aGlzLmdldEZvbnQoKTtcbiAgICAgIGNvbnN0IHJhdGlvID0gZ2V0UGl4ZWxSYXRpbygpO1xuICAgICAgY29uc3QgW21hcmtXaWR0aCwgbWFya0hlaWdodF0gPSB0aGlzLmdldE1hcmtTaXplKGN0eCk7XG4gICAgICBjb25zdCBjYW52YXNXaWR0aCA9ICh0aGlzLm56R2FwWzBdICsgbWFya1dpZHRoKSAqIHJhdGlvO1xuICAgICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gKHRoaXMubnpHYXBbMV0gKyBtYXJrSGVpZ2h0KSAqIHJhdGlvO1xuICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHtjYW52YXNXaWR0aCAqIEJhc2VTaXplfXB4YCk7XG4gICAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHtjYW52YXNIZWlnaHQgKiBCYXNlU2l6ZX1weGApO1xuXG4gICAgICBjb25zdCBkcmF3WCA9ICh0aGlzLm56R2FwWzBdICogcmF0aW8pIC8gMjtcbiAgICAgIGNvbnN0IGRyYXdZID0gKHRoaXMubnpHYXBbMV0gKiByYXRpbykgLyAyO1xuICAgICAgY29uc3QgZHJhd1dpZHRoID0gbWFya1dpZHRoICogcmF0aW87XG4gICAgICBjb25zdCBkcmF3SGVpZ2h0ID0gbWFya0hlaWdodCAqIHJhdGlvO1xuICAgICAgY29uc3Qgcm90YXRlWCA9IChkcmF3V2lkdGggKyB0aGlzLm56R2FwWzBdICogcmF0aW8pIC8gMjtcbiAgICAgIGNvbnN0IHJvdGF0ZVkgPSAoZHJhd0hlaWdodCArIHRoaXMubnpHYXBbMV0gKiByYXRpbykgLyAyO1xuXG4gICAgICAvKiogQWx0ZXJuYXRlIGRyYXdpbmcgcGFyYW1ldGVycyAqL1xuICAgICAgY29uc3QgYWx0ZXJuYXRlRHJhd1ggPSBkcmF3WCArIGNhbnZhc1dpZHRoO1xuICAgICAgY29uc3QgYWx0ZXJuYXRlRHJhd1kgPSBkcmF3WSArIGNhbnZhc0hlaWdodDtcbiAgICAgIGNvbnN0IGFsdGVybmF0ZVJvdGF0ZVggPSByb3RhdGVYICsgY2FudmFzV2lkdGg7XG4gICAgICBjb25zdCBhbHRlcm5hdGVSb3RhdGVZID0gcm90YXRlWSArIGNhbnZhc0hlaWdodDtcblxuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIHJvdGF0ZVdhdGVybWFyayhjdHgsIHJvdGF0ZVgsIHJvdGF0ZVksIHRoaXMubnpSb3RhdGUpO1xuXG4gICAgICBpZiAodGhpcy5uekltYWdlKSB7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCBkcmF3WCwgZHJhd1ksIGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7XG5cbiAgICAgICAgICAvKiogRHJhdyBpbnRlcmxlYXZlZCBwaWN0dXJlcyBhZnRlciByb3RhdGlvbiAqL1xuICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgcm90YXRlV2F0ZXJtYXJrKGN0eCwgYWx0ZXJuYXRlUm90YXRlWCwgYWx0ZXJuYXRlUm90YXRlWSwgdGhpcy5uelJvdGF0ZSk7XG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIGFsdGVybmF0ZURyYXdYLCBhbHRlcm5hdGVEcmF3WSwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLmFwcGVuZFdhdGVybWFyayhjYW52YXMudG9EYXRhVVJMKCksIG1hcmtXaWR0aCk7XG4gICAgICAgIH07XG4gICAgICAgIGltZy5vbmVycm9yID0gKCkgPT5cbiAgICAgICAgICB0aGlzLmRyYXdUZXh0KFxuICAgICAgICAgICAgY2FudmFzLFxuICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgZHJhd1gsXG4gICAgICAgICAgICBkcmF3WSxcbiAgICAgICAgICAgIGRyYXdXaWR0aCxcbiAgICAgICAgICAgIGRyYXdIZWlnaHQsXG4gICAgICAgICAgICBhbHRlcm5hdGVSb3RhdGVYLFxuICAgICAgICAgICAgYWx0ZXJuYXRlUm90YXRlWSxcbiAgICAgICAgICAgIGFsdGVybmF0ZURyYXdYLFxuICAgICAgICAgICAgYWx0ZXJuYXRlRHJhd1ksXG4gICAgICAgICAgICBtYXJrV2lkdGhcbiAgICAgICAgICApO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgICAgaW1nLnJlZmVycmVyUG9saWN5ID0gJ25vLXJlZmVycmVyJztcbiAgICAgICAgaW1nLnNyYyA9IHRoaXMubnpJbWFnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZHJhd1RleHQoXG4gICAgICAgICAgY2FudmFzLFxuICAgICAgICAgIGN0eCxcbiAgICAgICAgICBkcmF3WCxcbiAgICAgICAgICBkcmF3WSxcbiAgICAgICAgICBkcmF3V2lkdGgsXG4gICAgICAgICAgZHJhd0hlaWdodCxcbiAgICAgICAgICBhbHRlcm5hdGVSb3RhdGVYLFxuICAgICAgICAgIGFsdGVybmF0ZVJvdGF0ZVksXG4gICAgICAgICAgYWx0ZXJuYXRlRHJhd1gsXG4gICAgICAgICAgYWx0ZXJuYXRlRHJhd1ksXG4gICAgICAgICAgbWFya1dpZHRoXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbn1cbiJdfQ==