ng-cw-v12
Version:
Angular UI component library
247 lines (246 loc) • 36.1 kB
JavaScript
import { Directive, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class RibbonDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
this.ncContent = '';
this.ncContentColor = '#fff';
this.ncSize = 0.3; // 修改为百分比值,默认为容器宽高较小值的30%
this.ncRibbonColor = '#ff6547';
this.ncPosition = 'top-left';
// 生成唯一ID
this.uniqueId = `ribbon_${Math.random().toString(36).substring(2, 11)}`;
}
ngOnInit() {
this.createRibbonContainer();
}
createRibbonContainer() {
const elementPosition = this.el.nativeElement.style.position;
if (!elementPosition || elementPosition === 'static') {
this.renderer.setStyle(this.el.nativeElement, 'position', 'relative');
}
// 创建丝带容器
this.ribbonContainer = this.renderer.createElement('div');
this.renderer.addClass(this.ribbonContainer, this.uniqueId);
this.renderer.setStyle(this.ribbonContainer, 'position', 'absolute');
this.renderer.setStyle(this.ribbonContainer, 'overflow', 'hidden');
this.renderer.setStyle(this.ribbonContainer, 'display', 'flex');
this.renderer.setStyle(this.ribbonContainer, 'justify-content', 'center');
this.renderer.setStyle(this.ribbonContainer, 'align-items', 'center');
// 添加到DOM
this.renderer.appendChild(this.el.nativeElement, this.ribbonContainer);
// 初始渲染
this.updateRibbonSize();
// 使用MutationObserver监听父容器尺寸变化
this.observeParentSize();
}
updateRibbonSize() {
// 获取父容器的尺寸
const parentWidth = this.el.nativeElement.offsetWidth;
const parentHeight = this.el.nativeElement.offsetHeight;
// 如果父容器尺寸为0,延迟重试
if (parentWidth === 0 || parentHeight === 0) {
setTimeout(() => this.updateRibbonSize(), 100);
return;
}
this.ribbonSize = Math.min(parentWidth, parentHeight) * this.ncSize;
// 更新丝带容器尺寸
this.renderer.setStyle(this.ribbonContainer, 'width', `${this.ribbonSize}px`);
this.renderer.setStyle(this.ribbonContainer, 'height', `${this.ribbonSize}px`);
// 更新位置
const offset = -(this.ribbonSize * 0.06);
switch (this.ncPosition) {
case 'top-right':
this.renderer.setStyle(this.ribbonContainer, 'top', `${offset}px`);
this.renderer.setStyle(this.ribbonContainer, 'right', `${offset}px`);
break;
case 'bottom-left':
this.renderer.setStyle(this.ribbonContainer, 'bottom', `${offset}px`);
this.renderer.setStyle(this.ribbonContainer, 'left', `${offset}px`);
break;
case 'bottom-right':
this.renderer.setStyle(this.ribbonContainer, 'bottom', `${offset}px`);
this.renderer.setStyle(this.ribbonContainer, 'right', `${offset}px`);
break;
default: //top-left
this.renderer.setStyle(this.ribbonContainer, 'top', `${offset}px`);
this.renderer.setStyle(this.ribbonContainer, 'left', `${offset}px`);
break;
}
// 更新CSS样式
this.updateRibbonStyles();
}
updateRibbonStyles() {
// 根据输入的颜色计算渐变色
const mainColor = this.ncRibbonColor;
const lighterColor = this.adjustColor(this.ncRibbonColor, 45);
const darkerColor = this.adjustColor(this.ncRibbonColor, -10);
const cssText = `
.${this.uniqueId}::before {
content: '${this.ncContent}';
position: absolute;
width: 150%;
height: ${this.ribbonSize * 0.3}px;
background: linear-gradient(45deg, ${mainColor} 0%, ${lighterColor} 51%, ${darkerColor} 100%);
transform: rotate(${this.getRotationDegree()}) translateY(${-this.ribbonSize * 0.16}px) ${this.getTextRotation()};
display: flex;
align-items: center;
justify-content: center;
color: ${this.ncContentColor};
font-weight: 600;
font-size: ${Math.ceil(this.ribbonSize * 0.18)}px;
letter-spacing: 0.1em;
box-shadow: ${this.getRibbonShadow()};
}
.${this.uniqueId}::after {
content: '';
position: absolute;
width: ${this.ribbonSize * 0.1}px;
height: ${this.ribbonSize * 0.1}px;
z-index: -1;
${this.getShadowPosition()}
background: linear-gradient(45deg, ${mainColor} 0%, ${lighterColor} 51%, ${mainColor} 100%);
}
`;
// 移除旧样式(如果存在)
const oldStyle = document.querySelector(`style[data-ribbon-id="${this.uniqueId}"]`);
if (oldStyle) {
oldStyle.remove();
}
// 添加新样式
const styleElement = this.renderer.createElement('style');
this.renderer.setAttribute(styleElement, 'data-ribbon-id', this.uniqueId);
this.renderer.appendChild(styleElement, this.renderer.createText(cssText));
this.renderer.appendChild(document.head, styleElement);
}
// 添加颜色调整方法
adjustColor(color, percent) {
// 确保颜色值格式统一,移除可能存在的 # 号
const hex = color.replace(/^#/, '');
// 验证颜色值格式(6位或8位)
if (!/^[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$/.test(hex)) {
console.warn('Invalid color format. Using default color.');
return '#ff6547';
}
// 分离颜色值和透明度
const colorHex = hex.slice(0, 6);
const alpha = hex.length === 8 ? hex.slice(6, 8) : '';
const r = parseInt(colorHex.substring(0, 2), 16);
const g = parseInt(colorHex.substring(2, 4), 16);
const b = parseInt(colorHex.substring(4, 6), 16);
const adjustValue = (value) => {
const newValue = value + (value * percent / 100);
return Math.min(255, Math.max(0, Math.round(newValue)));
};
const nr = adjustValue(r);
const ng = adjustValue(g);
const nb = adjustValue(b);
// 如果原始颜色包含透明度,则在结果中也包含透明度
return `#${nr.toString(16).padStart(2, '0')}${ng.toString(16).padStart(2, '0')}${nb.toString(16).padStart(2, '0')}${alpha}`;
}
// 添加获取旋转角度的方法
getRotationDegree() {
switch (this.ncPosition) {
case 'top-right':
return '45deg';
case 'bottom-left':
return '-135deg';
case 'bottom-right':
return '135deg';
default: // top-left
return '-45deg';
}
}
// 添加获取文字旋转的方法
getTextRotation() {
switch (this.ncPosition) {
case 'bottom-left':
case 'bottom-right':
return 'rotate(180deg)';
default:
return '';
}
}
// 添加获取丝带阴影的方法
getRibbonShadow() {
switch (this.ncPosition) {
case 'bottom-left':
case 'bottom-right':
return `0 -${this.ribbonSize * 0.05}px ${this.ribbonSize * 0.1}px rgba(0, 0, 0, 0.23)`;
default:
return `0 ${this.ribbonSize * 0.05}px ${this.ribbonSize * 0.1}px rgba(0, 0, 0, 0.23)`;
}
}
// 添加获取阴影位置的方法
getShadowPosition() {
const shadowSize = this.ribbonSize * 0.9 + 'px';
const shadowColor = this.adjustColor(this.ncRibbonColor, -20);
switch (this.ncPosition) {
case 'top-right':
return `bottom: 0; right: 0; box-shadow: -${shadowSize} -${shadowSize} ${shadowColor};`;
case 'bottom-left':
return `top: 0; left: 0; box-shadow: ${shadowSize} ${shadowSize} ${shadowColor};`;
case 'bottom-right':
return `top: 0; right: 0; box-shadow: -${shadowSize} ${shadowSize} ${shadowColor};`;
default: // top-left
return `bottom: 0; left: 0; box-shadow: ${shadowSize} -${shadowSize} ${shadowColor};`;
}
}
// 监听父容器尺寸变化
observeParentSize() {
// 使用ResizeObserver监听尺寸变化(现代浏览器支持)
if (typeof ResizeObserver !== 'undefined') {
const resizeObserver = new ResizeObserver(() => {
this.updateRibbonSize();
});
resizeObserver.observe(this.el.nativeElement);
}
else {
// 降级方案:使用MutationObserver监听DOM变化
const observer = new MutationObserver(() => {
this.updateRibbonSize();
});
observer.observe(this.el.nativeElement, {
childList: true,
subtree: true,
attributes: true
});
// 额外的安全措施:定期检查尺寸变化
let lastWidth = this.el.nativeElement.offsetWidth;
let lastHeight = this.el.nativeElement.offsetHeight;
const checkSizeInterval = setInterval(() => {
const currentWidth = this.el.nativeElement.offsetWidth;
const currentHeight = this.el.nativeElement.offsetHeight;
if (currentWidth !== lastWidth || currentHeight !== lastHeight) {
lastWidth = currentWidth;
lastHeight = currentHeight;
this.updateRibbonSize();
}
}, 500);
// 组件销毁时清除定时器
this.el.nativeElement.addEventListener('DOMNodeRemoved', () => {
clearInterval(checkSizeInterval);
});
}
}
}
RibbonDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RibbonDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
RibbonDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: RibbonDirective, selector: "[ncRibbon]", inputs: { ncContent: "ncContent", ncContentColor: "ncContentColor", ncSize: "ncSize", ncRibbonColor: "ncRibbonColor", ncPosition: "ncPosition" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RibbonDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncRibbon]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncContent: [{
type: Input
}], ncContentColor: [{
type: Input
}], ncSize: [{
type: Input
}], ncRibbonColor: [{
type: Input
}], ncPosition: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmliYm9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvcmliYm9uL3JpYmJvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQUtoRixNQUFNLE9BQU8sZUFBZTtJQVUzQixZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFUdEQsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixtQkFBYyxHQUFXLE1BQU0sQ0FBQztRQUNoQyxXQUFNLEdBQVcsR0FBRyxDQUFDLENBQUMseUJBQXlCO1FBQy9DLGtCQUFhLEdBQVcsU0FBUyxDQUFDO1FBQ2xDLGVBQVUsR0FBOEQsVUFBVSxDQUFDO1FBTTNGLFNBQVM7UUFDVCxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUVELFFBQVE7UUFDUCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8scUJBQXFCO1FBQzVCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDN0QsSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLEtBQUssUUFBUSxFQUFFO1lBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN0RTtRQUVELFNBQVM7UUFDVCxJQUFJLENBQUMsZUFB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QUFlO2tCQUgzQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxZQUFZO2lCQUN0Qjt5SEFFUyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuXHRzZWxlY3RvcjogJ1tuY1JpYmJvbl0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSaWJib25EaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cdEBJbnB1dCgpIG5jQ29udGVudDogc3RyaW5nID0gJyc7XHJcblx0QElucHV0KCkgbmNDb250ZW50Q29sb3I6IHN0cmluZyA9ICcjZmZmJztcclxuXHRASW5wdXQoKSBuY1NpemU6IG51bWJlciA9IDAuMzsgLy8g5L+u5pS55Li655m+5YiG5q+U5YC877yM6buY6K6k5Li65a655Zmo5a696auY6L6D5bCP5YC855qEMzAlXHJcblx0QElucHV0KCkgbmNSaWJib25Db2xvcjogc3RyaW5nID0gJyNmZjY1NDcnO1xyXG5cdEBJbnB1dCgpIG5jUG9zaXRpb246ICd0b3AtbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICdib3R0b20tbGVmdCcgfCAnYm90dG9tLXJpZ2h0JyA9ICd0b3AtbGVmdCc7XHJcblx0cHJpdmF0ZSByaWJib25Db250YWluZXIhOiBIVE1MRWxlbWVudDtcclxuXHRwcml2YXRlIHJpYmJvblNpemUhOiBudW1iZXI7XHJcblx0cHJpdmF0ZSB1bmlxdWVJZDogc3RyaW5nO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuXHRcdC8vIOeUn+aIkOWUr+S4gElEXHJcblx0XHR0aGlzLnVuaXF1ZUlkID0gYHJpYmJvbl8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSl9YDtcclxuXHR9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5jcmVhdGVSaWJib25Db250YWluZXIoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY3JlYXRlUmliYm9uQ29udGFpbmVyKCkge1xyXG5cdFx0Y29uc3QgZWxlbWVudFBvc2l0aW9uID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uO1xyXG5cdFx0aWYgKCFlbGVtZW50UG9zaXRpb24gfHwgZWxlbWVudFBvc2l0aW9uID09PSAnc3RhdGljJykge1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8g5Yib5bu65Lid5bim5a655ZmoXHJcblx0XHR0aGlzLnJpYmJvbkNvbnRhaW5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMucmliYm9uQ29udGFpbmVyLCB0aGlzLnVuaXF1ZUlkKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ292ZXJmbG93JywgJ2hpZGRlbicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ2Rpc3BsYXknLCAnZmxleCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ2p1c3RpZnktY29udGVudCcsICdjZW50ZXInKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICdhbGlnbi1pdGVtcycsICdjZW50ZXInKTtcclxuXHRcdFxyXG5cdFx0Ly8g5re75Yqg5YiwRE9NXHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5yaWJib25Db250YWluZXIpO1xyXG5cdFx0XHJcblx0XHQvLyDliJ3lp4vmuLLmn5NcclxuXHRcdHRoaXMudXBkYXRlUmliYm9uU2l6ZSgpO1xyXG5cdFx0XHJcblx0XHQvLyDkvb/nlKhNdXRhdGlvbk9ic2VydmVy55uR5ZCs54i25a655Zmo5bC65a+45Y+Y5YyWXHJcblx0XHR0aGlzLm9ic2VydmVQYXJlbnRTaXplKCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHVwZGF0ZVJpYmJvblNpemUoKSB7XHJcblx0XHQvLyDojrflj5bniLblrrnlmajnmoTlsLrlr7hcclxuXHRcdGNvbnN0IHBhcmVudFdpZHRoID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG5cdFx0Y29uc3QgcGFyZW50SGVpZ2h0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuXHRcdFxyXG5cdFx0Ly8g5aaC5p6c54i25a655Zmo5bC65a+45Li6MO+8jOW7tui/n+mHjeivlVxyXG5cdFx0aWYgKHBhcmVudFdpZHRoID09PSAwIHx8IHBhcmVudEhlaWdodCA9PT0gMCkge1xyXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlUmliYm9uU2l6ZSgpLCAxMDApO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdHRoaXMucmliYm9uU2l6ZSA9IE1hdGgubWluKHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQpICogdGhpcy5uY1NpemU7XHJcblx0XHRcclxuXHRcdC8vIOabtOaWsOS4neW4puWuueWZqOWwuuWvuFxyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ3dpZHRoJywgYCR7dGhpcy5yaWJib25TaXplfXB4YCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnaGVpZ2h0JywgYCR7dGhpcy5yaWJib25TaXplfXB4YCk7XHJcblx0XHRcclxuXHRcdC8vIOabtOaWsOS9jee9rlxyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gLSh0aGlzLnJpYmJvblNpemUgKiAwLjA2KTtcclxuXHRcdHN3aXRjaCAodGhpcy5uY1Bvc2l0aW9uKSB7XHJcblx0XHRcdGNhc2UgJ3RvcC1yaWdodCc6XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ3RvcCcsIGAke29mZnNldH1weGApO1xyXG5cdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICdyaWdodCcsIGAke29mZnNldH1weGApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdib3R0b20tbGVmdCc6XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ2JvdHRvbScsIGAke29mZnNldH1weGApO1xyXG5cdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICdsZWZ0JywgYCR7b2Zmc2V0fXB4YCk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ2JvdHRvbS1yaWdodCc6XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ2JvdHRvbScsIGAke29mZnNldH1weGApO1xyXG5cdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICdyaWdodCcsIGAke29mZnNldH1weGApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OiAvL3RvcC1sZWZ0XHJcblx0XHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ3RvcCcsIGAke29mZnNldH1weGApO1xyXG5cdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICdsZWZ0JywgYCR7b2Zmc2V0fXB4YCk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdC8vIOabtOaWsENTU+agt+W8j1xyXG5cdFx0dGhpcy51cGRhdGVSaWJib25TdHlsZXMoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdXBkYXRlUmliYm9uU3R5bGVzKCkge1xyXG5cdFx0Ly8g5qC55o2u6L6T5YWl55qE6aKc6Imy6K6h566X5riQ5Y+Y6ImyXHJcblx0XHRjb25zdCBtYWluQ29sb3IgPSB0aGlzLm5jUmliYm9uQ29sb3I7XHJcblx0XHRjb25zdCBsaWdodGVyQ29sb3IgPSB0aGlzLmFkanVzdENvbG9yKHRoaXMubmNSaWJib25Db2xvciwgNDUpO1xyXG5cdFx0Y29uc3QgZGFya2VyQ29sb3IgPSB0aGlzLmFkanVzdENvbG9yKHRoaXMubmNSaWJib25Db2xvciwgLTEwKTtcclxuXHRcdFxyXG5cdFx0Y29uc3QgY3NzVGV4dCA9IGBcclxuXHRcdFx0LiR7dGhpcy51bmlxdWVJZH06OmJlZm9yZSB7XHJcblx0XHRcdFx0Y29udGVudDogJyR7dGhpcy5uY0NvbnRlbnR9JztcclxuXHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0XHRcdFx0d2lkdGg6IDE1MCU7XHJcblx0XHRcdFx0aGVpZ2h0OiAke3RoaXMucmliYm9uU2l6ZSAqIDAuM31weDtcclxuXHRcdFx0XHRiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsICR7bWFpbkNvbG9yfSAwJSwgJHtsaWdodGVyQ29sb3J9IDUxJSwgJHtkYXJrZXJDb2xvcn0gMTAwJSk7XHJcblx0XHRcdFx0dHJhbnNmb3JtOiByb3RhdGUoJHt0aGlzLmdldFJvdGF0aW9uRGVncmVlKCl9KSB0cmFuc2xhdGVZKCR7LXRoaXMucmliYm9uU2l6ZSAqIDAuMTZ9cHgpICR7dGhpcy5nZXRUZXh0Um90YXRpb24oKX07XHJcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcclxuXHRcdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xyXG5cdFx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG5cdFx0XHRcdGNvbG9yOiAke3RoaXMubmNDb250ZW50Q29sb3J9O1xyXG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XHJcblx0XHRcdFx0Zm9udC1zaXplOiAke01hdGguY2VpbCh0aGlzLnJpYmJvblNpemUgKiAwLjE4KX1weDtcclxuXHRcdFx0XHRsZXR0ZXItc3BhY2luZzogMC4xZW07XHJcblx0XHRcdFx0Ym94LXNoYWRvdzogJHt0aGlzLmdldFJpYmJvblNoYWRvdygpfTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LiR7dGhpcy51bmlxdWVJZH06OmFmdGVyIHtcclxuXHRcdFx0XHRjb250ZW50OiAnJztcclxuXHRcdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XHJcblx0XHRcdFx0d2lkdGg6ICR7dGhpcy5yaWJib25TaXplICogMC4xfXB4O1xyXG5cdFx0XHRcdGhlaWdodDogJHt0aGlzLnJpYmJvblNpemUgKiAwLjF9cHg7XHJcblx0XHRcdFx0ei1pbmRleDogLTE7XHJcblx0XHRcdFx0JHt0aGlzLmdldFNoYWRvd1Bvc2l0aW9uKCl9XHJcblx0XHRcdFx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCAke21haW5Db2xvcn0gMCUsICR7bGlnaHRlckNvbG9yfSA1MSUsICR7bWFpbkNvbG9yfSAxMDAlKTtcclxuXHRcdFx0fVxyXG5cdFx0YDtcclxuXHRcdFxyXG5cdFx0Ly8g56e76Zmk5pen5qC35byP77yI5aaC5p6c5a2Y5Zyo77yJXHJcblx0XHRjb25zdCBvbGRTdHlsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHN0eWxlW2RhdGEtcmliYm9uLWlkPVwiJHt0aGlzLnVuaXF1ZUlkfVwiXWApO1xyXG5cdFx0aWYgKG9sZFN0eWxlKSB7XHJcblx0XHRcdG9sZFN0eWxlLnJlbW92ZSgpO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHQvLyDmt7vliqDmlrDmoLflvI9cclxuXHRcdGNvbnN0IHN0eWxlRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN0eWxlRWxlbWVudCwgJ2RhdGEtcmliYm9uLWlkJywgdGhpcy51bmlxdWVJZCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCwgdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KGNzc1RleHQpKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaGVhZCwgc3R5bGVFbGVtZW50KTtcclxuXHR9XHJcblxyXG5cdC8vIOa3u+WKoOminOiJsuiwg+aVtOaWueazlVxyXG5cdHByaXZhdGUgYWRqdXN0Q29sb3IoY29sb3I6IHN0cmluZywgcGVyY2VudDogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRcdC8vIOehruS/neminOiJsuWAvOagvOW8j+e7n+S4gO+8jOenu+mZpOWPr+iDveWtmOWcqOeahCAjIOWPt1xyXG5cdFx0Y29uc3QgaGV4ID0gY29sb3IucmVwbGFjZSgvXiMvLCAnJyk7XHJcblxyXG5cdFx0Ly8g6aqM6K+B6aKc6Imy5YC85qC85byP77yINuS9jeaIljjkvY3vvIlcclxuXHRcdGlmICghL15bMC05QS1GYS1mXXs2fShbMC05QS1GYS1mXXsyfSk/JC8udGVzdChoZXgpKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignSW52YWxpZCBjb2xvciBmb3JtYXQuIFVzaW5nIGRlZmF1bHQgY29sb3IuJyk7XHJcblx0XHRcdHJldHVybiAnI2ZmNjU0Nyc7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8g5YiG56a76aKc6Imy5YC85ZKM6YCP5piO5bqmXHJcblx0XHRjb25zdCBjb2xvckhleCA9IGhleC5zbGljZSgwLCA2KTtcclxuXHRcdGNvbnN0IGFscGhhID0gaGV4Lmxlbmd0aCA9PT0gOCA/IGhleC5zbGljZSg2LCA4KSA6ICcnO1xyXG5cclxuXHRcdGNvbnN0IHIgPSBwYXJzZUludChjb2xvckhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuXHRcdGNvbnN0IGcgPSBwYXJzZUludChjb2xvckhleC5zdWJzdHJpbmcoMiwgNCksIDE2KTtcclxuXHRcdGNvbnN0IGIgPSBwYXJzZUludChjb2xvckhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcblx0XHRjb25zdCBhZGp1c3RWYWx1ZSA9ICh2YWx1ZTogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRcdFx0Y29uc3QgbmV3VmFsdWUgPSB2YWx1ZSArICh2YWx1ZSAqIHBlcmNlbnQgLyAxMDApO1xyXG5cdFx0XHRyZXR1cm4gTWF0aC5taW4oMjU1LCBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKG5ld1ZhbHVlKSkpO1xyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBuciA9IGFkanVzdFZhbHVlKHIpO1xyXG5cdFx0Y29uc3QgbmcgPSBhZGp1c3RWYWx1ZShnKTtcclxuXHRcdGNvbnN0IG5iID0gYWRqdXN0VmFsdWUoYik7XHJcblxyXG5cdFx0Ly8g5aaC5p6c5Y6f5aeL6aKc6Imy5YyF5ZCr6YCP5piO5bqm77yM5YiZ5Zyo57uT5p6c5Lit5Lmf5YyF5ZCr6YCP5piO5bqmXHJcblx0XHRyZXR1cm4gYCMke25yLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7bmcudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtuYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke2FscGhhfWA7XHJcblx0fVxyXG5cclxuXHQvLyDmt7vliqDojrflj5bml4vovazop5LluqbnmoTmlrnms5VcclxuXHRwcml2YXRlIGdldFJvdGF0aW9uRGVncmVlKCk6IHN0cmluZyB7XHJcblx0XHRzd2l0Y2ggKHRoaXMubmNQb3NpdGlvbikge1xyXG5cdFx0XHRjYXNlICd0b3AtcmlnaHQnOlxyXG5cdFx0XHRcdHJldHVybiAnNDVkZWcnO1xyXG5cdFx0XHRjYXNlICdib3R0b20tbGVmdCc6XHJcblx0XHRcdFx0cmV0dXJuICctMTM1ZGVnJztcclxuXHRcdFx0Y2FzZSAnYm90dG9tLXJpZ2h0JzpcclxuXHRcdFx0XHRyZXR1cm4gJzEzNWRlZyc7XHJcblx0XHRcdGRlZmF1bHQ6IC8vIHRvcC1sZWZ0XHJcblx0XHRcdFx0cmV0dXJuICctNDVkZWcnO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8g5re75Yqg6I635Y+W5paH5a2X5peL6L2s55qE5pa55rOVXHJcblx0cHJpdmF0ZSBnZXRUZXh0Um90YXRpb24oKTogc3RyaW5nIHtcclxuXHRcdHN3aXRjaCAodGhpcy5uY1Bvc2l0aW9uKSB7XHJcblx0XHRcdGNhc2UgJ2JvdHRvbS1sZWZ0JzpcclxuXHRcdFx0Y2FzZSAnYm90dG9tLXJpZ2h0JzpcclxuXHRcdFx0XHRyZXR1cm4gJ3JvdGF0ZSgxODBkZWcpJztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRyZXR1cm4gJyc7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyDmt7vliqDojrflj5bkuJ3luKbpmLTlvbHnmoTmlrnms5VcclxuXHRwcml2YXRlIGdldFJpYmJvblNoYWRvdygpOiBzdHJpbmcge1xyXG5cdFx0c3dpdGNoICh0aGlzLm5jUG9zaXRpb24pIHtcclxuXHRcdFx0Y2FzZSAnYm90dG9tLWxlZnQnOlxyXG5cdFx0XHRjYXNlICdib3R0b20tcmlnaHQnOlxyXG5cdFx0XHRcdHJldHVybiBgMCAtJHt0aGlzLnJpYmJvblNpemUgKiAwLjA1fXB4ICR7dGhpcy5yaWJib25TaXplICogMC4xfXB4IHJnYmEoMCwgMCwgMCwgMC4yMylgO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybiBgMCAke3RoaXMucmliYm9uU2l6ZSAqIDAuMDV9cHggJHt0aGlzLnJpYmJvblNpemUgKiAwLjF9cHggcmdiYSgwLCAwLCAwLCAwLjIzKWA7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyDmt7vliqDojrflj5bpmLTlvbHkvY3nva7nmoTmlrnms5VcclxuXHRwcml2YXRlIGdldFNoYWRvd1Bvc2l0aW9uKCk6IHN0cmluZyB7XHJcblx0XHRjb25zdCBzaGFkb3dTaXplID0gdGhpcy5yaWJib25TaXplICogMC45ICsgJ3B4JztcclxuXHRcdGNvbnN0IHNoYWRvd0NvbG9yID0gdGhpcy5hZGp1c3RDb2xvcih0aGlzLm5jUmliYm9uQ29sb3IsIC0yMCk7XHJcblxyXG5cdFx0c3dpdGNoICh0aGlzLm5jUG9zaXRpb24pIHtcclxuXHRcdFx0Y2FzZSAndG9wLXJpZ2h0JzpcclxuXHRcdFx0XHRyZXR1cm4gYGJvdHRvbTogMDsgcmlnaHQ6IDA7IGJveC1zaGFkb3c6IC0ke3NoYWRvd1NpemV9IC0ke3NoYWRvd1NpemV9ICR7c2hhZG93Q29sb3J9O2A7XHJcblx0XHRcdGNhc2UgJ2JvdHRvbS1sZWZ0JzpcclxuXHRcdFx0XHRyZXR1cm4gYHRvcDogMDsgbGVmdDogMDsgYm94LXNoYWRvdzogJHtzaGFkb3dTaXplfSAke3NoYWRvd1NpemV9ICR7c2hhZG93Q29sb3J9O2A7XHJcblx0XHRcdGNhc2UgJ2JvdHRvbS1yaWdodCc6XHJcblx0XHRcdFx0cmV0dXJuIGB0b3A6IDA7IHJpZ2h0OiAwOyBib3gtc2hhZG93OiAtJHtzaGFkb3dTaXplfSAke3NoYWRvd1NpemV9ICR7c2hhZG93Q29sb3J9O2A7XHJcblx0XHRcdGRlZmF1bHQ6IC8vIHRvcC1sZWZ0XHJcblx0XHRcdFx0cmV0dXJuIGBib3R0b206IDA7IGxlZnQ6IDA7IGJveC1zaGFkb3c6ICR7c2hhZG93U2l6ZX0gLSR7c2hhZG93U2l6ZX0gJHtzaGFkb3dDb2xvcn07YDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIOebkeWQrOeItuWuueWZqOWwuuWvuOWPmOWMllxyXG5cdHByaXZhdGUgb2JzZXJ2ZVBhcmVudFNpemUoKSB7XHJcblx0XHQvLyDkvb/nlKhSZXNpemVPYnNlcnZlcuebkeWQrOWwuuWvuOWPmOWMlu+8iOeOsOS7o+a1j+iniOWZqOaUr+aMge+8iVxyXG5cdFx0aWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdFx0Y29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMudXBkYXRlUmliYm9uU2l6ZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0cmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8g6ZmN57qn5pa55qGI77ya5L2/55SoTXV0YXRpb25PYnNlcnZlcuebkeWQrERPTeWPmOWMllxyXG5cdFx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcclxuXHRcdFx0XHR0aGlzLnVwZGF0ZVJpYmJvblNpemUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdG9ic2VydmVyLm9ic2VydmUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB7XHJcblx0XHRcdFx0Y2hpbGRMaXN0OiB0cnVlLFxyXG5cdFx0XHRcdHN1YnRyZWU6IHRydWUsXHJcblx0XHRcdFx0YXR0cmlidXRlczogdHJ1ZVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0XHJcblx0XHRcdC8vIOmineWklueahOWuieWFqOaOquaWve+8muWumuacn+ajgOafpeWwuuWvuOWPmOWMllxyXG5cdFx0XHRsZXQgbGFzdFdpZHRoID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG5cdFx0XHRsZXQgbGFzdEhlaWdodCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcblx0XHRcdFxyXG5cdFx0XHRjb25zdCBjaGVja1NpemVJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuXHRcdFx0XHRjb25zdCBjdXJyZW50V2lkdGggPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcblx0XHRcdFx0Y29uc3QgY3VycmVudEhlaWdodCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0aWYgKGN1cnJlbnRXaWR0aCAhPT0gbGFzdFdpZHRoIHx8IGN1cnJlbnRIZWlnaHQgIT09IGxhc3RIZWlnaHQpIHtcclxuXHRcdFx0XHRcdGxhc3RXaWR0aCA9IGN1cnJlbnRXaWR0aDtcclxuXHRcdFx0XHRcdGxhc3RIZWlnaHQgPSBjdXJyZW50SGVpZ2h0O1xyXG5cdFx0XHRcdFx0dGhpcy51cGRhdGVSaWJib25TaXplKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LCA1MDApO1xyXG5cdFx0XHRcclxuXHRcdFx0Ly8g57uE5Lu26ZSA5q+B5pe25riF6Zmk5a6a5pe25ZmoXHJcblx0XHRcdHRoaXMuZWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsICgpID0+IHtcclxuXHRcdFx0XHRjbGVhckludGVydmFsKGNoZWNrU2l6ZUludGVydmFsKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG59Il19