UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

207 lines 28.8 kB
import { Directive, ElementRef, HostBinding, inject, Input, Renderer2 } from '@angular/core'; import { ColorService } from '../../services/color/color.service'; import { ThemeColor } from '../../services/color/theme-color'; import { ContrastService } from '../accessibility/contrast-ratio/contrast.service'; import * as i0 from "@angular/core"; export class BadgeDirective { constructor() { this._element = inject(ElementRef); this._renderer = inject(Renderer2); this._colorService = inject(ColorService); this._contrastService = inject(ContrastService); this._className = 'ux-badge'; this._darkColor = ThemeColor.parse('#000'); this._lightColor = ThemeColor.parse('#FFF'); this._badgeContent = null; this._badgeColor = this._darkColor; /** * Set the badge vertical position in relation to the parent element */ this.badgeVerticalPosition = 'above'; /** * Set the badge horizontal position in relation to the parent element */ this.badgeHorizontalPosition = 'after'; /** * Set if the badge overlaps parent content or flows after parent */ this.badgeOverlap = false; /** * Badge size (based on CSS styles) */ this.badgeSize = 'medium'; /** * Hide badge from view */ this.badgeHidden = false; } get badgeContent() { return this._badgeContent; } set badgeContent(badge) { if (typeof badge === 'number') { this._badgeContent = badge; this._isNumber = true; } else if (typeof badge === 'string' && badge.replace(/ /g, '').length > 0) { const subject = badge.trim(); this._isNumber = /^\d+$/.test(subject); this._badgeContent = subject; } else { this._badgeContent = null; } } /** * Define the badge background color */ get badgeColor() { return this._badgeColor.toRgba(); } set badgeColor(color) { this._badgeColor = this.parseThemeColor(color); } /** * Define the badge border color - if unset there is no border */ get badgeBorderColor() { return this._badgeBorderColor.toRgba(); } set badgeBorderColor(color) { this._badgeBorderColor = this.parseThemeColor(color); } ngAfterViewInit() { this._badgeElement = this._renderer.createElement('span'); this._renderer.addClass(this._badgeElement, this._className); this._renderer.setStyle(this._badgeElement, 'display', 'none'); this.setBadgeColor(); this.setBadgeBorderColor(); this.setBadgeSize(); this.setContent(this._badgeContent, this.badgeMaxValue); this._renderer.appendChild(this._element.nativeElement, this._badgeElement); this._renderer.removeStyle(this._badgeElement, 'display'); } ngOnChanges(changes) { // if the badge is visible set changed values if (!this._badgeElement) { return; } // set badge content and get display friendly version of text based on max length and type of val if (changes.badgeContent || changes.badgeMaxValue) { const finalText = (changes.badgeContent && changes.badgeContent.currentValue) || this.badgeContent || null; const maxValue = (changes.badgeMaxValue && changes.badgeMaxValue.currentValue) || this.badgeMaxValue || null; this.setContent(finalText, maxValue); } // set the badge color if (changes.badgeColor && changes.badgeColor.currentValue !== changes.badgeColor.previousValue) { this.setBadgeColor(); } // set the badge border color if (changes.badgeBorderColor && changes.badgeBorderColor.currentValue !== changes.badgeBorderColor.previousValue) { this.setBadgeBorderColor(); } // set badge size if (changes.badgeSize && changes.badgeSize.currentValue !== changes.badgeSize.previousValue) { this.setBadgeSize(changes.badgeSize.previousValue); } } ngOnDestroy() { if (this._renderer.destroyNode) { this._renderer.destroyNode(this._badgeElement); } } setContent(content, maxValue) { if (content && maxValue && maxValue > 0) { if (this._isNumber) { const numericValue = typeof content === 'number' ? content : parseInt(content); if (numericValue > maxValue) { content = `${maxValue}+`; } } else if (typeof content === 'string' && content.length > maxValue) { content = `${content.substr(0, maxValue)}…`; } } this._badgeDisplayContent = content; this._badgeElement.textContent = this._badgeDisplayContent?.toString(); } setBadgeColor() { if (this._badgeColor) { this._renderer.setStyle(this._badgeElement, 'background-color', this._badgeColor.toRgba()); } else { this._renderer.removeStyle(this._badgeElement, 'background-color'); } this._renderer.setStyle(this._badgeElement, 'color', this.determineContentTextColor().toRgba()); } setBadgeBorderColor() { if (this._badgeBorderColor) { this._renderer.setStyle(this._badgeElement, 'border-color', this._badgeBorderColor.toRgba()); } else { this._renderer.removeStyle(this._badgeElement, 'border-color'); } this._renderer.setStyle(this._badgeElement, 'background-clip', this._badgeBorderColor ? 'padding-box' : 'border-box'); } setBadgeSize(previousSize) { if (previousSize) { this._renderer.removeClass(this._badgeElement, `ux-badge-${previousSize}`); } this._renderer.addClass(this._badgeElement, `ux-badge-${this.badgeSize}`); } determineContentTextColor() { return this._badgeColor ? ThemeColor.parse(this._contrastService.getContrastColor(this._badgeColor, this._lightColor, this._darkColor).toRgba()) : this._lightColor; } parseThemeColor(color) { if (!color) { return null; } return this._colorService.colorExists(color) ? ThemeColor.parse(this._colorService.resolve(color)) : ThemeColor.parse(color); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: BadgeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: BadgeDirective, selector: "[uxBadge]", inputs: { badgeContent: ["uxBadge", "badgeContent"], badgeColor: "badgeColor", badgeBorderColor: "badgeBorderColor", badgeVerticalPosition: "badgeVerticalPosition", badgeHorizontalPosition: "badgeHorizontalPosition", badgeOverlap: "badgeOverlap", badgeMaxValue: "badgeMaxValue", badgeSize: "badgeSize", badgeHidden: "badgeHidden" }, host: { properties: { "class.ux-badge-above": "badgeVerticalPosition === \"above\"", "class.ux-badge-below": "badgeVerticalPosition === \"below\"", "class.ux-badge-after": "badgeHorizontalPosition === \"after\"", "class.ux-badge-before": "badgeHorizontalPosition === \"before\"", "class.ux-badge-overlap": "this.badgeOverlap", "class.ux-badge-hidden": "this.badgeHidden" }, classAttribute: "ux-badge-container" }, exportAs: ["ux-badge"], usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: BadgeDirective, decorators: [{ type: Directive, args: [{ selector: '[uxBadge]', exportAs: 'ux-badge', host: { class: 'ux-badge-container', '[class.ux-badge-above]': 'badgeVerticalPosition === "above"', '[class.ux-badge-below]': 'badgeVerticalPosition === "below"', '[class.ux-badge-after]': 'badgeHorizontalPosition === "after"', '[class.ux-badge-before]': 'badgeHorizontalPosition === "before"' }, }] }], propDecorators: { badgeContent: [{ type: Input, args: ['uxBadge'] }], badgeColor: [{ type: Input }], badgeBorderColor: [{ type: Input }], badgeVerticalPosition: [{ type: Input }], badgeHorizontalPosition: [{ type: Input }], badgeOverlap: [{ type: HostBinding, args: ['class.ux-badge-overlap'] }, { type: Input }], badgeMaxValue: [{ type: Input }], badgeSize: [{ type: Input }], badgeHidden: [{ type: HostBinding, args: ['class.ux-badge-hidden'] }, { type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFkZ2UuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RpcmVjdGl2ZXMvYmFkZ2UvYmFkZ2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBd0IsU0FBUyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNqSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7QUFtQm5GLE1BQU0sT0FBTyxjQUFjO0lBWDNCO1FBWXFCLGFBQVEsR0FBRyxNQUFNLENBQTBCLFVBQVUsQ0FBQyxDQUFDO1FBRXZELGNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFOUIsa0JBQWEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFckMscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTNDLGVBQVUsR0FBRyxVQUFVLENBQUM7UUFFeEIsZUFBVSxHQUFlLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEQsZ0JBQVcsR0FBZSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBNEI1RCxrQkFBYSxHQUFvQixJQUFJLENBQUM7UUFZdEMsZ0JBQVcsR0FBZSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBY2xEOztXQUVHO1FBRUgsMEJBQXFCLEdBQTBCLE9BQU8sQ0FBQztRQUV2RDs7V0FFRztRQUVILDRCQUF1QixHQUE0QixPQUFPLENBQUM7UUFFM0Q7O1dBRUc7UUFHSCxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQVE5Qjs7V0FFRztRQUVILGNB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QUFlLENBQUMsS0FBYTtRQUNqQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDVCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JELFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQzsrR0F0TlEsY0FBYzttR0FBZCxjQUFjOzs0RkFBZCxjQUFjO2tCQVgxQixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxXQUFXO29CQUNyQixRQUFRLEVBQUUsVUFBVTtvQkFDcEIsSUFBSSxFQUFFO3dCQUNGLEtBQUssRUFBRSxvQkFBb0I7d0JBQzNCLHdCQUF3QixFQUFFLG1DQUFtQzt3QkFDN0Qsd0JBQXdCLEVBQUUsbUNBQW1DO3dCQUM3RCx3QkFBd0IsRUFBRSxxQ0FBcUM7d0JBQy9ELHlCQUF5QixFQUFFLHNDQUFzQztxQkFDcEU7aUJBQ0o7OEJBMEJPLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxTQUFTO2dCQXVCWixVQUFVO3NCQURiLEtBQUs7Z0JBYUYsZ0JBQWdCO3NCQURuQixLQUFLO2dCQWFOLHFCQUFxQjtzQkFEcEIsS0FBSztnQkFPTix1QkFBdUI7c0JBRHRCLEtBQUs7Z0JBUU4sWUFBWTtzQkFGWCxXQUFXO3VCQUFDLHdCQUF3Qjs7c0JBQ3BDLEtBQUs7Z0JBT0csYUFBYTtzQkFBckIsS0FBSztnQkFNTixTQUFTO3NCQURSLEtBQUs7Z0JBUU4sV0FBVztzQkFGVixXQUFXO3VCQUFDLHVCQUF1Qjs7c0JBQ25DLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBpbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2xvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb2xvci9jb2xvci5zZXJ2aWNlJztcbmltcG9ydCB7IFRoZW1lQ29sb3IgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb2xvci90aGVtZS1jb2xvcic7XG5pbXBvcnQgeyBDb250cmFzdFNlcnZpY2UgfSBmcm9tICcuLi9hY2Nlc3NpYmlsaXR5L2NvbnRyYXN0LXJhdGlvL2NvbnRyYXN0LnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBCYWRnZVZlcnRpY2FsUG9zaXRpb24gPSAnYWJvdmUnIHwgJ2JlbG93JztcblxuZXhwb3J0IHR5cGUgQmFkZ2VIb3Jpem9udGFsUG9zaXRpb24gPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cbmV4cG9ydCB0eXBlIEJhZGdlU2l6ZSA9ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3V4QmFkZ2VdJyxcbiAgICBleHBvcnRBczogJ3V4LWJhZGdlJyxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAndXgtYmFkZ2UtY29udGFpbmVyJyxcbiAgICAgICAgJ1tjbGFzcy51eC1iYWRnZS1hYm92ZV0nOiAnYmFkZ2VWZXJ0aWNhbFBvc2l0aW9uID09PSBcImFib3ZlXCInLFxuICAgICAgICAnW2NsYXNzLnV4LWJhZGdlLWJlbG93XSc6ICdiYWRnZVZlcnRpY2FsUG9zaXRpb24gPT09IFwiYmVsb3dcIicsXG4gICAgICAgICdbY2xhc3MudXgtYmFkZ2UtYWZ0ZXJdJzogJ2JhZGdlSG9yaXpvbnRhbFBvc2l0aW9uID09PSBcImFmdGVyXCInLFxuICAgICAgICAnW2NsYXNzLnV4LWJhZGdlLWJlZm9yZV0nOiAnYmFkZ2VIb3Jpem9udGFsUG9zaXRpb24gPT09IFwiYmVmb3JlXCInXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQmFkZ2VEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudCA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29sb3JTZXJ2aWNlID0gaW5qZWN0KENvbG9yU2VydmljZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250cmFzdFNlcnZpY2UgPSBpbmplY3QoQ29udHJhc3RTZXJ2aWNlKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NsYXNzTmFtZSA9ICd1eC1iYWRnZSc7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kYXJrQ29sb3I6IFRoZW1lQ29sb3IgPSBUaGVtZUNvbG9yLnBhcnNlKCcjMDAwJyk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9saWdodENvbG9yOiBUaGVtZUNvbG9yID0gVGhlbWVDb2xvci5wYXJzZSgnI0ZGRicpO1xuXG4gICAgcHJpdmF0ZSBfYmFkZ2VFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuICAgIHByaXZhdGUgX2lzTnVtYmVyOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogRGlyZWN0aXZlIHBhcmFtZXRlciB0aGF0IHNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGJhZGdlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYmFkZ2VEaXNwbGF5Q29udGVudDogc3RyaW5nIHwgbnVtYmVyO1xuXG4gICAgQElucHV0KCd1eEJhZGdlJylcbiAgICBnZXQgYmFkZ2VDb250ZW50KCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYWRnZUNvbnRlbnQ7XG4gICAgfVxuICAgIHNldCBiYWRnZUNvbnRlbnQoYmFkZ2U6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mIGJhZGdlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5fYmFkZ2VDb250ZW50ID0gYmFkZ2U7XG4gICAgICAgICAgICB0aGlzLl9pc051bWJlciA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJhZGdlID09PSAnc3RyaW5nJyAmJiBiYWRnZS5yZXBsYWNlKC8gL2csICcnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gYmFkZ2UudHJpbSgpO1xuICAgICAgICAgICAgdGhpcy5faXNOdW1iZXIgPSAvXlxcZCskLy50ZXN0KHN1YmplY3QpO1xuICAgICAgICAgICAgdGhpcy5fYmFkZ2VDb250ZW50ID0gc3ViamVjdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2JhZGdlQ29udGVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9iYWRnZUNvbnRlbnQ6IHN0cmluZyB8IG51bWJlciA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgdGhlIGJhZGdlIGJhY2tncm91bmQgY29sb3JcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBiYWRnZUNvbG9yKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYWRnZUNvbG9yLnRvUmdiYSgpO1xuICAgIH1cbiAgICBzZXQgYmFkZ2VDb2xvcihjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2JhZGdlQ29sb3IgPSB0aGlzLnBhcnNlVGhlbWVDb2xvcihjb2xvcik7XG4gICAgfVxuICAgIHByaXZhdGUgX2JhZGdlQ29sb3I6IFRoZW1lQ29sb3IgPSB0aGlzLl9kYXJrQ29sb3I7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgdGhlIGJhZGdlIGJvcmRlciBjb2xvciAtIGlmIHVuc2V0IHRoZXJlIGlzIG5vIGJvcmRlclxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGJhZGdlQm9yZGVyQ29sb3IoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JhZGdlQm9yZGVyQ29sb3IudG9SZ2JhKCk7XG4gICAgfVxuICAgIHNldCBiYWRnZUJvcmRlckNvbG9yKGNvbG9yOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fYmFkZ2VCb3JkZXJDb2xvciA9IHRoaXMucGFyc2VUaGVtZUNvbG9yKGNvbG9yKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfYmFkZ2VCb3JkZXJDb2xvcjogVGhlbWVDb2xvcjtcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgYmFkZ2UgdmVydGljYWwgcG9zaXRpb24gaW4gcmVsYXRpb24gdG8gdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBiYWRnZVZlcnRpY2FsUG9zaXRpb246IEJhZGdlVmVydGljYWxQb3NpdGlvbiA9ICdhYm92ZSc7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGJhZGdlIGhvcml6b250YWwgcG9zaXRpb24gaW4gcmVsYXRpb24gdG8gdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBiYWRnZUhvcml6b250YWxQb3NpdGlvbjogQmFkZ2VIb3Jpem9udGFsUG9zaXRpb24gPSAnYWZ0ZXInO1xuXG4gICAgLyoqXG4gICAgICogU2V0IGlmIHRoZSBiYWRnZSBvdmVybGFwcyBwYXJlbnQgY29udGVudCBvciBmbG93cyBhZnRlciBwYXJlbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnV4LWJhZGdlLW92ZXJsYXAnKVxuICAgIEBJbnB1dCgpXG4gICAgYmFkZ2VPdmVybGFwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBNYXggdmFsdWUgdGhhdCBjYW4gYmUgZGlzcGxheWVkIC0gaWYgc3RyaW5nIG1lYXN1cmVzIG5vLiBvZiBjaGFyYWN0ZXJzLFxuICAgICAqIGlmIG51bWJlciBjaGVja3MgYWdhaW5zdCBleGFjdCBudW1iZXIgbm90IG5vLiBvZiBjaGFyYWN0ZXJzXG4gICAgICovXG4gICAgQElucHV0KCkgYmFkZ2VNYXhWYWx1ZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQmFkZ2Ugc2l6ZSAoYmFzZWQgb24gQ1NTIHN0eWxlcylcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGJhZGdlU2l6ZTogQmFkZ2VTaXplID0gJ21lZGl1bSc7XG5cbiAgICAvKipcbiAgICAgKiBIaWRlIGJhZGdlIGZyb20gdmlld1xuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MudXgtYmFkZ2UtaGlkZGVuJylcbiAgICBASW5wdXQoKVxuICAgIGJhZGdlSGlkZGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2JhZGdlRWxlbWVudCA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fYmFkZ2VFbGVtZW50LCB0aGlzLl9jbGFzc05hbWUpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9iYWRnZUVsZW1lbnQsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgdGhpcy5zZXRCYWRnZUNvbG9yKCk7XG4gICAgICAgIHRoaXMuc2V0QmFkZ2VCb3JkZXJDb2xvcigpO1xuICAgICAgICB0aGlzLnNldEJhZGdlU2l6ZSgpO1xuICAgICAgICB0aGlzLnNldENvbnRlbnQodGhpcy5fYmFkZ2VDb250ZW50LCB0aGlzLmJhZGdlTWF4VmFsdWUpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuX2JhZGdlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZVN0eWxlKHRoaXMuX2JhZGdlRWxlbWVudCwgJ2Rpc3BsYXknKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIC8vIGlmIHRoZSBiYWRnZSBpcyB2aXNpYmxlIHNldCBjaGFuZ2VkIHZhbHVlc1xuICAgICAgICBpZiAoIXRoaXMuX2JhZGdlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0IGJhZGdlIGNvbnRlbnQgYW5kIGdldCBkaXNwbGF5IGZyaWVuZGx5IHZlcnNpb24gb2YgdGV4dCBiYXNlZCBvbiBtYXggbGVuZ3RoIGFuZCB0eXBlIG9mIHZhbFxuICAgICAgICBpZiAoY2hhbmdlcy5iYWRnZUNvbnRlbnQgfHwgY2hhbmdlcy5iYWRnZU1heFZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBmaW5hbFRleHQ6IHN0cmluZyA9IChjaGFuZ2VzLmJhZGdlQ29udGVudCAmJiBjaGFuZ2VzLmJhZGdlQ29udGVudC5jdXJyZW50VmFsdWUpIHx8IHRoaXMuYmFkZ2VDb250ZW50IHx8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBtYXhWYWx1ZTogbnVtYmVyID0gKGNoYW5nZXMuYmFkZ2VNYXhWYWx1ZSAmJiBjaGFuZ2VzLmJhZGdlTWF4VmFsdWUuY3VycmVudFZhbHVlKSB8fCB0aGlzLmJhZGdlTWF4VmFsdWUgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudChmaW5hbFRleHQsIG1heFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCB0aGUgYmFkZ2UgY29sb3JcbiAgICAgICAgaWYgKGNoYW5nZXMuYmFkZ2VDb2xvciAmJiBjaGFuZ2VzLmJhZGdlQ29sb3IuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzLmJhZGdlQ29sb3IucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRCYWRnZUNvbG9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgdGhlIGJhZGdlIGJvcmRlciBjb2xvclxuICAgICAgICBpZiAoY2hhbmdlcy5iYWRnZUJvcmRlckNvbG9yICYmIGNoYW5nZXMuYmFkZ2VCb3JkZXJDb2xvci5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuYmFkZ2VCb3JkZXJDb2xvci5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEJhZGdlQm9yZGVyQ29sb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldCBiYWRnZSBzaXplXG4gICAgICAgIGlmIChjaGFuZ2VzLmJhZGdlU2l6ZSAmJiBjaGFuZ2VzLmJhZGdlU2l6ZS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuYmFkZ2VTaXplLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmFkZ2VTaXplKGNoYW5nZXMuYmFkZ2VTaXplLnByZXZpb3VzVmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJlci5kZXN0cm95Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuZGVzdHJveU5vZGUodGhpcy5fYmFkZ2VFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Q29udGVudChjb250ZW50OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLCBtYXhWYWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChjb250ZW50ICYmIG1heFZhbHVlICYmIG1heFZhbHVlID4gMCkge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5faXNOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1lcmljVmFsdWUgPSB0eXBlb2YgY29udGVudCA9PT0gJ251bWJlcicgPyBjb250ZW50IDogcGFyc2VJbnQoY29udGVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobnVtZXJpY1ZhbHVlID4gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGAke21heFZhbHVlfStgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnICYmIGNvbnRlbnQubGVuZ3RoID4gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYCR7Y29udGVudC5zdWJzdHIoMCwgbWF4VmFsdWUpfeKApmA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9iYWRnZURpc3BsYXlDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5fYmFkZ2VFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5fYmFkZ2VEaXNwbGF5Q29udGVudD8udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEJhZGdlQ29sb3IoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9iYWRnZUNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9iYWRnZUVsZW1lbnQsICdiYWNrZ3JvdW5kLWNvbG9yJywgdGhpcy5fYmFkZ2VDb2xvci50b1JnYmEoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLl9iYWRnZUVsZW1lbnQsICdiYWNrZ3JvdW5kLWNvbG9yJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9iYWRnZUVsZW1lbnQsICdjb2xvcicsIHRoaXMuZGV0ZXJtaW5lQ29udGVudFRleHRDb2xvcigpLnRvUmdiYSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEJhZGdlQm9yZGVyQ29sb3IoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9iYWRnZUJvcmRlckNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZSh0aGlzLl9iYWRnZUVsZW1lbnQsICdib3JkZXItY29sb3InLCB0aGlzLl9iYWRnZUJvcmRlckNvbG9yLnRvUmdiYSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZVN0eWxlKHRoaXMuX2JhZGdlRWxlbWVudCwgJ2JvcmRlci1jb2xvcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUodGhpcy5fYmFkZ2VFbGVtZW50LCAnYmFja2dyb3VuZC1jbGlwJywgdGhpcy5fYmFkZ2VCb3JkZXJDb2xvciA/ICdwYWRkaW5nLWJveCcgOiAnYm9yZGVyLWJveCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0QmFkZ2VTaXplKHByZXZpb3VzU2l6ZT86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAocHJldmlvdXNTaXplKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLl9iYWRnZUVsZW1lbnQsIGB1eC1iYWRnZS0ke3ByZXZpb3VzU2l6ZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHRoaXMuX2JhZGdlRWxlbWVudCwgYHV4LWJhZGdlLSR7dGhpcy5iYWRnZVNpemV9YCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXRlcm1pbmVDb250ZW50VGV4dENvbG9yKCk6IFRoZW1lQ29sb3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFkZ2VDb2xvclxuICAgICAgICAgICAgPyBUaGVtZUNvbG9yLnBhcnNlKFxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRyYXN0U2VydmljZS5nZXRDb250cmFzdENvbG9yKHRoaXMuX2JhZGdlQ29sb3IsIHRoaXMuX2xpZ2h0Q29sb3IsIHRoaXMuX2RhcmtDb2xvcikudG9SZ2JhKClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy5fbGlnaHRDb2xvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlVGhlbWVDb2xvcihjb2xvcjogc3RyaW5nKTogVGhlbWVDb2xvciB7XG4gICAgICAgIGlmICghY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbG9yU2VydmljZS5jb2xvckV4aXN0cyhjb2xvcikgP1xuICAgICAgICAgICAgVGhlbWVDb2xvci5wYXJzZSh0aGlzLl9jb2xvclNlcnZpY2UucmVzb2x2ZShjb2xvcikpIDpcbiAgICAgICAgICAgIFRoZW1lQ29sb3IucGFyc2UoY29sb3IpO1xuICAgIH1cbn1cbiJdfQ==