UNPKG

cfc-ds

Version:

Design System do Conselho Federal de Contabilidade baseado no govbr-ds

132 lines 25 kB
import { Component, EventEmitter, forwardRef, Input, Output } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/flex-layout/extended"; export class TextareaComponent { label = ''; labelPosition = 'top'; placeholder = ''; helperText = ''; maxLength = null; required = false; isDisabled = false; resize = 'both'; density = 'medium'; state = 'default'; stateMessage = ''; showCharCount = false; limitType = 'max'; rows = 3; cols = 50; textChange = new EventEmitter(); value = ''; focused = false; touched = false; // Para o contador de caracteres get remainingChars() { if (!this.maxLength) return 0; return this.maxLength - (this.value ? this.value.length : 0); } get charCount() { return this.value ? this.value.length : 0; } // Configuração de acessibilidade get ariaDescribedBy() { const ids = []; if (this.helperText) ids.push('helper-text'); if (this.stateMessage) ids.push('state-message'); if (this.showCharCount) ids.push('char-count'); return ids.join(' '); } ngOnInit() { if (this.limitType === 'max' && !this.maxLength) { console.warn('Máximo de caracteres não definido com limitType="max"'); } } // Implementação de ControlValueAccessor onChange = () => { }; onTouched = () => { }; writeValue(value) { this.value = value || ''; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.isDisabled = isDisabled; } onInput(event) { this.value = event.target.value; this.onChange(this.value); this.textChange.emit(this.value); } onBlur() { this.focused = false; if (!this.touched) { this.touched = true; this.onTouched(); } } onFocus() { this.focused = true; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TextareaComponent, selector: "cfc-textarea", inputs: { label: "label", labelPosition: "labelPosition", placeholder: "placeholder", helperText: "helperText", maxLength: "maxLength", required: "required", isDisabled: "isDisabled", resize: "resize", density: "density", state: "state", stateMessage: "stateMessage", showCharCount: "showCharCount", limitType: "limitType", rows: "rows", cols: "cols" }, outputs: { textChange: "textChange" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TextareaComponent), multi: true } ], ngImport: i0, template: "<!-- textarea.component.html -->\r\n<div\r\n class=\"textarea-container\"\r\n [class.label-left]=\"labelPosition === 'left'\"\r\n [ngClass]=\"['density-' + density, 'state-' + state]\">\r\n\r\n <label *ngIf=\"label\" [for]=\"'textarea-' + label\" class=\"textarea-label\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"required-indicator\">*</span>\r\n <span *ngIf=\"!required\" class=\"optional-indicator\">(opcional)</span>\r\n </label>\r\n\r\n <div class=\"textarea-wrapper\" [class.focused]=\"focused\">\r\n <textarea\r\n [id]=\"'textarea-' + label\"\r\n [placeholder]=\"placeholder\"\r\n [attr.rows]=\"rows\"\r\n [attr.cols]=\"cols\"\r\n [disabled]=\"isDisabled\"\r\n [style.resize]=\"resize\"\r\n [attr.maxlength]=\"maxLength ? maxLength : null\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n [attr.aria-required]=\"required\"\r\n [attr.aria-invalid]=\"state === 'error'\"\r\n (input)=\"onInput($event)\"\r\n (blur)=\"onBlur()\"\r\n (focus)=\"onFocus()\"\r\n [value]=\"value\">\r\n </textarea>\r\n <div *ngIf=\"resize !== 'none'\" class=\"resize-icon\"></div>\r\n </div>\r\n\r\n <div class=\"textarea-footer\">\r\n <div *ngIf=\"stateMessage\" [id]=\"'state-message'\" class=\"state-message\">\r\n <span *ngIf=\"state === 'error'\" class=\"icon error-icon\">\u26A0</span>\r\n <span *ngIf=\"state === 'success'\" class=\"icon success-icon\">\u2713</span>\r\n <span *ngIf=\"state === 'warning'\" class=\"icon warning-icon\">\u26A0</span>\r\n <span *ngIf=\"state === 'info'\" class=\"icon info-icon\">\u2139</span>\r\n {{ stateMessage }}\r\n </div>\r\n <div *ngIf=\"helperText\" [id]=\"'helper-text'\" class=\"helper-text\">{{ helperText }}</div>\r\n\r\n <div *ngIf=\"showCharCount\" [id]=\"'char-count'\" class=\"char-counter\">\r\n <ng-container *ngIf=\"limitType === 'max'\">\r\n Restam {{ remainingChars }} caracteres\r\n </ng-container>\r\n <ng-container *ngIf=\"limitType === 'counter'\">\r\n {{ charCount }} caracteres\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;font-family:sans-serif}.textarea-container{position:relative;margin-bottom:16px;width:100%}.textarea-container.label-left{display:flex;align-items:flex-start}.textarea-container.label-left .textarea-label{margin-right:16px;padding-top:8px;min-width:120px}.textarea-label{display:block;margin-bottom:8px;font-size:14px;font-weight:500}.textarea-label .required-indicator{color:red;margin-left:4px}.textarea-label .optional-indicator{margin-left:4px;color:#666;font-weight:400;font-style:italic;font-size:12px}.textarea-wrapper{position:relative;width:100%}.textarea-wrapper.focused{outline:2px solid #1976d2}.textarea-wrapper textarea{width:100%;border:1px solid #ccc;border-radius:4px;font-family:inherit;font-size:14px;background-color:#fff;transition:border-color .3s,box-shadow .3s}.textarea-wrapper textarea:focus{outline:none}.textarea-wrapper textarea:disabled{background-color:#f5f5f5;cursor:not-allowed}.textarea-wrapper textarea::placeholder{color:#999}.textarea-wrapper .resize-icon{position:absolute;right:4px;bottom:4px;pointer-events:none}.textarea-footer{display:flex;flex-wrap:wrap;margin-top:6px;font-size:12px;color:#666}.textarea-footer .state-message{display:flex;align-items:center;margin-right:auto}.textarea-footer .state-message .icon{margin-right:4px;display:inline-flex;align-items:center;justify-content:center}.textarea-footer .char-counter{margin-left:auto}.density-low textarea{padding:12px}.density-medium textarea{padding:8px}.density-high textarea{padding:4px}.state-error .textarea-wrapper textarea{border-color:#d32f2f}.state-error .state-message{color:#d32f2f}.state-success .textarea-wrapper textarea{border-color:#388e3c}.state-success .state-message{color:#388e3c}.state-warning .textarea-wrapper textarea{border-color:#f57c00}.state-warning .state-message{color:#f57c00}.state-info .textarea-wrapper textarea{border-color:#0288d1}.state-info .state-message{color:#0288d1}@media (max-width: 768px){.textarea-container.label-left{flex-direction:column}.textarea-container.label-left .textarea-label{margin-right:0;margin-bottom:8px}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextareaComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-textarea', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TextareaComponent), multi: true } ], template: "<!-- textarea.component.html -->\r\n<div\r\n class=\"textarea-container\"\r\n [class.label-left]=\"labelPosition === 'left'\"\r\n [ngClass]=\"['density-' + density, 'state-' + state]\">\r\n\r\n <label *ngIf=\"label\" [for]=\"'textarea-' + label\" class=\"textarea-label\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"required-indicator\">*</span>\r\n <span *ngIf=\"!required\" class=\"optional-indicator\">(opcional)</span>\r\n </label>\r\n\r\n <div class=\"textarea-wrapper\" [class.focused]=\"focused\">\r\n <textarea\r\n [id]=\"'textarea-' + label\"\r\n [placeholder]=\"placeholder\"\r\n [attr.rows]=\"rows\"\r\n [attr.cols]=\"cols\"\r\n [disabled]=\"isDisabled\"\r\n [style.resize]=\"resize\"\r\n [attr.maxlength]=\"maxLength ? maxLength : null\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n [attr.aria-required]=\"required\"\r\n [attr.aria-invalid]=\"state === 'error'\"\r\n (input)=\"onInput($event)\"\r\n (blur)=\"onBlur()\"\r\n (focus)=\"onFocus()\"\r\n [value]=\"value\">\r\n </textarea>\r\n <div *ngIf=\"resize !== 'none'\" class=\"resize-icon\"></div>\r\n </div>\r\n\r\n <div class=\"textarea-footer\">\r\n <div *ngIf=\"stateMessage\" [id]=\"'state-message'\" class=\"state-message\">\r\n <span *ngIf=\"state === 'error'\" class=\"icon error-icon\">\u26A0</span>\r\n <span *ngIf=\"state === 'success'\" class=\"icon success-icon\">\u2713</span>\r\n <span *ngIf=\"state === 'warning'\" class=\"icon warning-icon\">\u26A0</span>\r\n <span *ngIf=\"state === 'info'\" class=\"icon info-icon\">\u2139</span>\r\n {{ stateMessage }}\r\n </div>\r\n <div *ngIf=\"helperText\" [id]=\"'helper-text'\" class=\"helper-text\">{{ helperText }}</div>\r\n\r\n <div *ngIf=\"showCharCount\" [id]=\"'char-count'\" class=\"char-counter\">\r\n <ng-container *ngIf=\"limitType === 'max'\">\r\n Restam {{ remainingChars }} caracteres\r\n </ng-container>\r\n <ng-container *ngIf=\"limitType === 'counter'\">\r\n {{ charCount }} caracteres\r\n </ng-container>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;font-family:sans-serif}.textarea-container{position:relative;margin-bottom:16px;width:100%}.textarea-container.label-left{display:flex;align-items:flex-start}.textarea-container.label-left .textarea-label{margin-right:16px;padding-top:8px;min-width:120px}.textarea-label{display:block;margin-bottom:8px;font-size:14px;font-weight:500}.textarea-label .required-indicator{color:red;margin-left:4px}.textarea-label .optional-indicator{margin-left:4px;color:#666;font-weight:400;font-style:italic;font-size:12px}.textarea-wrapper{position:relative;width:100%}.textarea-wrapper.focused{outline:2px solid #1976d2}.textarea-wrapper textarea{width:100%;border:1px solid #ccc;border-radius:4px;font-family:inherit;font-size:14px;background-color:#fff;transition:border-color .3s,box-shadow .3s}.textarea-wrapper textarea:focus{outline:none}.textarea-wrapper textarea:disabled{background-color:#f5f5f5;cursor:not-allowed}.textarea-wrapper textarea::placeholder{color:#999}.textarea-wrapper .resize-icon{position:absolute;right:4px;bottom:4px;pointer-events:none}.textarea-footer{display:flex;flex-wrap:wrap;margin-top:6px;font-size:12px;color:#666}.textarea-footer .state-message{display:flex;align-items:center;margin-right:auto}.textarea-footer .state-message .icon{margin-right:4px;display:inline-flex;align-items:center;justify-content:center}.textarea-footer .char-counter{margin-left:auto}.density-low textarea{padding:12px}.density-medium textarea{padding:8px}.density-high textarea{padding:4px}.state-error .textarea-wrapper textarea{border-color:#d32f2f}.state-error .state-message{color:#d32f2f}.state-success .textarea-wrapper textarea{border-color:#388e3c}.state-success .state-message{color:#388e3c}.state-warning .textarea-wrapper textarea{border-color:#f57c00}.state-warning .state-message{color:#f57c00}.state-info .textarea-wrapper textarea{border-color:#0288d1}.state-info .state-message{color:#0288d1}@media (max-width: 768px){.textarea-container.label-left{flex-direction:column}.textarea-container.label-left .textarea-label{margin-right:0;margin-bottom:8px}}\n"] }] }], propDecorators: { label: [{ type: Input }], labelPosition: [{ type: Input }], placeholder: [{ type: Input }], helperText: [{ type: Input }], maxLength: [{ type: Input }], required: [{ type: Input }], isDisabled: [{ type: Input }], resize: [{ type: Input }], density: [{ type: Input }], state: [{ type: Input }], stateMessage: [{ type: Input }], showCharCount: [{ type: Input }], limitType: [{ type: Input }], rows: [{ type: Input }], cols: [{ type: Input }], textChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2ZjLWRzL3NyYy9saWIvY29tcG9uZW50cy90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL3RleHRhcmVhL3RleHRhcmVhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQWN2RSxNQUFNLE9BQU8saUJBQWlCO0lBQ25CLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxhQUFhLEdBQW1CLEtBQUssQ0FBQztJQUN0QyxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDaEIsU0FBUyxHQUFrQixJQUFJLENBQUM7SUFDaEMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLE1BQU0sR0FBZ0QsTUFBTSxDQUFDO0lBQzdELE9BQU8sR0FBOEIsUUFBUSxDQUFDO0lBQzlDLEtBQUssR0FBeUQsU0FBUyxDQUFDO0lBQ3hFLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDbEIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0QixTQUFTLEdBQXNCLEtBQUssQ0FBQztJQUNyQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVULFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRWxELEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxPQUFPLEdBQUcsS0FBSyxDQUFD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a0JBWjdCLFNBQVM7K0JBQ0UsY0FBYyxhQUdiO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjs4QkFHUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2ZjLXRleHRhcmVhJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dGFyZWEuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90ZXh0YXJlYS5jb21wb25lbnQuc2NzcycsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUZXh0YXJlYUNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGV4dGFyZWFDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0ICB7XHJcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcclxuICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uOiAndG9wJyB8ICdsZWZ0JyA9ICd0b3AnO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XHJcbiAgQElucHV0KCkgaGVscGVyVGV4dCA9ICcnO1xyXG4gIEBJbnB1dCgpIG1heExlbmd0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBpc0Rpc2FibGVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcmVzaXplOiAnYm90aCcgfCAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnIHwgJ25vbmUnID0gJ2JvdGgnO1xyXG4gIEBJbnB1dCgpIGRlbnNpdHk6ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgPSAnbWVkaXVtJztcclxuICBASW5wdXQoKSBzdGF0ZTogJ2RlZmF1bHQnIHwgJ2Vycm9yJyB8ICdzdWNjZXNzJyB8ICd3YXJuaW5nJyB8ICdpbmZvJyA9ICdkZWZhdWx0JztcclxuICBASW5wdXQoKSBzdGF0ZU1lc3NhZ2UgPSAnJztcclxuICBASW5wdXQoKSBzaG93Q2hhckNvdW50ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbGltaXRUeXBlOiAnbWF4JyB8ICdjb3VudGVyJyA9ICdtYXgnO1xyXG4gIEBJbnB1dCgpIHJvd3MgPSAzO1xyXG4gIEBJbnB1dCgpIGNvbHMgPSA1MDtcclxuXHJcbiAgQE91dHB1dCgpIHRleHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgdmFsdWUgPSAnJztcclxuICBmb2N1c2VkID0gZmFsc2U7XHJcbiAgdG91Y2hlZCA9IGZhbHNlO1xyXG5cclxuICAvLyBQYXJhIG8gY29udGFkb3IgZGUgY2FyYWN0ZXJlc1xyXG4gIGdldCByZW1haW5pbmdDaGFycygpOiBudW1iZXIge1xyXG4gICAgaWYgKCF0aGlzLm1heExlbmd0aCkgcmV0dXJuIDA7XHJcbiAgICByZXR1cm4gdGhpcy5tYXhMZW5ndGggLSAodGhpcy52YWx1ZSA/IHRoaXMudmFsdWUubGVuZ3RoIDogMCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2hhckNvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUubGVuZ3RoIDogMDtcclxuICB9XHJcblxyXG4gIC8vIENvbmZpZ3VyYcOnw6NvIGRlIGFjZXNzaWJpbGlkYWRlXHJcbiAgZ2V0IGFyaWFEZXNjcmliZWRCeSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuaGVscGVyVGV4dCkgaWRzLnB1c2goJ2hlbHBlci10ZXh0Jyk7XHJcbiAgICBpZiAodGhpcy5zdGF0ZU1lc3NhZ2UpIGlkcy5wdXNoKCdzdGF0ZS1tZXNzYWdlJyk7XHJcbiAgICBpZiAodGhpcy5zaG93Q2hhckNvdW50KSBpZHMucHVzaCgnY2hhci1jb3VudCcpO1xyXG4gICAgcmV0dXJuIGlkcy5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmxpbWl0VHlwZSA9PT0gJ21heCcgJiYgIXRoaXMubWF4TGVuZ3RoKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTcOheGltbyBkZSBjYXJhY3RlcmVzIG7Do28gZGVmaW5pZG8gY29tIGxpbWl0VHlwZT1cIm1heFwiJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBJbXBsZW1lbnRhw6fDo28gZGUgQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XHJcbiAgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7fTtcclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUgfHwgJyc7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBvbklucHV0KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xyXG4gICAgdGhpcy50ZXh0Q2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvbkJsdXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIGlmICghdGhpcy50b3VjaGVkKSB7XHJcbiAgICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZvY3VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICB9XHJcbn1cclxuIiwiPCEtLSB0ZXh0YXJlYS5jb21wb25lbnQuaHRtbCAtLT5cclxuPGRpdlxyXG4gIGNsYXNzPVwidGV4dGFyZWEtY29udGFpbmVyXCJcclxuICBbY2xhc3MubGFiZWwtbGVmdF09XCJsYWJlbFBvc2l0aW9uID09PSAnbGVmdCdcIlxyXG4gIFtuZ0NsYXNzXT1cIlsnZGVuc2l0eS0nICsgZGVuc2l0eSwgJ3N0YXRlLScgKyBzdGF0ZV1cIj5cclxuXHJcbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9yXT1cIid0ZXh0YXJlYS0nICsgbGFiZWxcIiBjbGFzcz1cInRleHRhcmVhLWxhYmVsXCI+XHJcbiAgICB7eyBsYWJlbCB9fVxyXG4gICAgPHNwYW4gKm5nSWY9XCJyZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWQtaW5kaWNhdG9yXCI+Kjwvc3Bhbj5cclxuICAgIDxzcGFuICpuZ0lmPVwiIXJlcXVpcmVkXCIgY2xhc3M9XCJvcHRpb25hbC1pbmRpY2F0b3JcIj4ob3BjaW9uYWwpPC9zcGFuPlxyXG4gIDwvbGFiZWw+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ0ZXh0YXJlYS13cmFwcGVyXCIgW2NsYXNzLmZvY3VzZWRdPVwiZm9jdXNlZFwiPlxyXG4gICAgPHRleHRhcmVhXHJcbiAgICAgIFtpZF09XCIndGV4dGFyZWEtJyArIGxhYmVsXCJcclxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgW2F0dHIucm93c109XCJyb3dzXCJcclxuICAgICAgW2F0dHIuY29sc109XCJjb2xzXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgICBbc3R5bGUucmVzaXplXT1cInJlc2l6ZVwiXHJcbiAgICAgIFthdHRyLm1heGxlbmd0aF09XCJtYXhMZW5ndGggPyBtYXhMZW5ndGggOiBudWxsXCJcclxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJhcmlhRGVzY3JpYmVkQnlcIlxyXG4gICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInN0YXRlID09PSAnZXJyb3InXCJcclxuICAgICAgKGlucHV0KT1cIm9uSW5wdXQoJGV2ZW50KVwiXHJcbiAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcclxuICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiPlxyXG4gICAgPC90ZXh0YXJlYT5cclxuICAgIDxkaXYgKm5nSWY9XCJyZXNpemUgIT09ICdub25lJ1wiIGNsYXNzPVwicmVzaXplLWljb25cIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInRleHRhcmVhLWZvb3RlclwiPlxyXG4gICAgPGRpdiAqbmdJZj1cInN0YXRlTWVzc2FnZVwiIFtpZF09XCInc3RhdGUtbWVzc2FnZSdcIiBjbGFzcz1cInN0YXRlLW1lc3NhZ2VcIj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJzdGF0ZSA9PT0gJ2Vycm9yJ1wiIGNsYXNzPVwiaWNvbiBlcnJvci1pY29uXCI+4pqgPC9zcGFuPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInN0YXRlID09PSAnc3VjY2VzcydcIiBjbGFzcz1cImljb24gc3VjY2Vzcy1pY29uXCI+4pyTPC9zcGFuPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInN0YXRlID09PSAnd2FybmluZydcIiBjbGFzcz1cImljb24gd2FybmluZy1pY29uXCI+4pqgPC9zcGFuPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInN0YXRlID09PSAnaW5mbydcIiBjbGFzcz1cImljb24gaW5mby1pY29uXCI+4oS5PC9zcGFuPlxyXG4gICAgICB7eyBzdGF0ZU1lc3NhZ2UgfX1cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cImhlbHBlclRleHRcIiBbaWRdPVwiJ2hlbHBlci10ZXh0J1wiIGNsYXNzPVwiaGVscGVyLXRleHRcIj57eyBoZWxwZXJUZXh0IH19PC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cInNob3dDaGFyQ291bnRcIiBbaWRdPVwiJ2NoYXItY291bnQnXCIgY2xhc3M9XCJjaGFyLWNvdW50ZXJcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpbWl0VHlwZSA9PT0gJ21heCdcIj5cclxuICAgICAgICBSZXN0YW0ge3sgcmVtYWluaW5nQ2hhcnMgfX0gY2FyYWN0ZXJlc1xyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpbWl0VHlwZSA9PT0gJ2NvdW50ZXInXCI+XHJcbiAgICAgICAge3sgY2hhckNvdW50IH19IGNhcmFjdGVyZXNcclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==