UNPKG

ngx-jodit

Version:

Angular wrapper for jodit WYSIWYG editor

224 lines 28.6 kB
import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, } from '@angular/core'; import { FormsModule, NG_VALUE_ACCESSOR, } from '@angular/forms'; import { Jodit } from 'jodit'; import { BehaviorSubject, combineLatest, delay, distinctUntilChanged, filter, withLatestFrom, } from 'rxjs'; import * as i0 from "@angular/core"; export class NgxJoditComponent { set options(value) { this._options = value; if (value) { this.initJoditContainer(); } } set value(value) { const sanitizedText = this.prepareText(value); if (!this.internValueChange) { this.valueSubject.next(sanitizedText); } else { this.internValueChange = false; } this.onChange(sanitizedText); } get value() { return this.valueSubject.getValue(); } constructor(cdr) { this.cdr = cdr; // value property (subject) this.valueSubject = new BehaviorSubject(''); this.valueChange = new EventEmitter(); //events this.joditChange = new EventEmitter(); this.joditKeyDown = new EventEmitter(); this.joditKeyUp = new EventEmitter(); this.joditMousedown = new EventEmitter(); this.joditMouseup = new EventEmitter(); this.joditClick = new EventEmitter(); this.joditFocus = new EventEmitter(); this.joditPaste = new EventEmitter(); this.joditResize = new EventEmitter(); this.joditBeforeEnter = new EventEmitter(); this.joditBeforeCommand = new EventEmitter(); this.joditAfterExec = new EventEmitter(); this.joditAfterPaste = new EventEmitter(); this.joditChangeSelection = new EventEmitter(); // Used for delay value assignment to wait for jodit to be initialized this.joditInitializedSubject = new BehaviorSubject(false); this.internValueChange = false; /* FUNCTIONS RELEVANT FOR ANGULAR FORMS */ this.onChange = (text) => { // implemented by user }; this.onTouched = () => { // implemented by user }; this.valueSubscription = combineLatest([ // Handle value changes ... this.valueSubject.asObservable().pipe(distinctUntilChanged()), // ...additionally ensuring that the value is reapplied if the editor was not initialized when value was set this.joditInitializedSubject.pipe(distinctUntilChanged(), filter((initialized) => initialized)), ]) .pipe( // Pass through the latest value in case of editor initialization withLatestFrom(this.valueSubject), // Prevent ExpressionChangedAfterItHasBeenCheckedError delay(0)) .subscribe(([[_, initialized], text]) => { if (this.jodit && initialized) { this.jodit.value = text; } }); } isHTML(text) { const elem = document.createElement('div'); elem.innerHTML = text; return (text && elem.childNodes.length > 0 && elem.childNodes.item(0).nodeType !== 3); } ngAfterViewInit() { this.initJoditContainer(); } ngOnDestroy() { this.valueSubscription?.unsubscribe(); this.jodit?.destruct(); } initJoditContainer() { if (this.joditContainer) { if (this.jodit) { this.jodit.destruct(); this.joditInitializedSubject.next(false); } this.jodit = Jodit.make(this.joditContainer.nativeElement, this._options); this.jodit.value = this.valueSubject.getValue(); this.jodit.events.on('change', (text) => { this.internValueChange = true; this.changeValue(text); this.joditChange.emit(text); this.onChange(text); }); this.jodit.events.on('keydown', (a) => { this.joditKeyDown.emit(a); }); this.jodit.events.on('keyup', (a) => { this.joditKeyUp.emit(a); }); this.jodit.events.on('mousedown', (a) => { this.joditMousedown.emit(a); }); this.jodit.events.on('mouseup', (a) => { this.joditMouseup.emit(a); }); this.jodit.events.on('click', (a) => { this.joditClick.emit(a); this.onTouched(); }); this.jodit.events.on('focus', (a) => { this.joditFocus.emit(a); }); this.jodit.events.on('paste', (a) => { this.joditPaste.emit(a); }); this.jodit.events.on('resize', () => { this.joditResize.emit(); }); this.jodit.events.on('beforeEnter', (a) => { this.joditBeforeEnter.emit(a); }); this.jodit.events.on('beforeCommand', (a) => { this.joditBeforeCommand.emit(a); }); this.jodit.events.on('afterExec', () => { this.joditAfterExec.emit(); }); this.jodit.events.on('afterPaste', (a) => { this.joditAfterPaste.emit(a); }); this.jodit.events.on('changeSelection', () => { this.joditChangeSelection.emit(); }); this.joditInitializedSubject.next(true); } } changeValue(value) { this.valueChange.emit(value); } writeValue(text) { this.valueSubject.next(this.prepareText(text)); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.options = { ...this._options, disabled: isDisabled, }; } prepareText(text) { return this.isHTML(text) ? text : `<p>${text}</p>`; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: NgxJoditComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: NgxJoditComponent, isStandalone: true, selector: "ngx-jodit", inputs: { options: "options", value: "value" }, outputs: { valueChange: "valueChange", joditChange: "joditChange", joditKeyDown: "joditKeyDown", joditKeyUp: "joditKeyUp", joditMousedown: "joditMousedown", joditMouseup: "joditMouseup", joditClick: "joditClick", joditFocus: "joditFocus", joditPaste: "joditPaste", joditResize: "joditResize", joditBeforeEnter: "joditBeforeEnter", joditBeforeCommand: "joditBeforeCommand", joditAfterExec: "joditAfterExec", joditAfterPaste: "joditAfterPaste", joditChangeSelection: "joditChangeSelection" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxJoditComponent), multi: true, }, ], viewQueries: [{ propertyName: "joditContainer", first: true, predicate: ["joditContainer"], descendants: true }], ngImport: i0, template: "<textarea class=\"ngx-jodit-container\" #joditContainer></textarea>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: NgxJoditComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-jodit', standalone: true, imports: [CommonModule, FormsModule], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxJoditComponent), multi: true, }, ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<textarea class=\"ngx-jodit-container\" #joditContainer></textarea>\n" }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { joditContainer: [{ type: ViewChild, args: ['joditContainer'] }], options: [{ type: Input }], value: [{ type: Input }], valueChange: [{ type: Output }], joditChange: [{ type: Output }], joditKeyDown: [{ type: Output }], joditKeyUp: [{ type: Output }], joditMousedown: [{ type: Output }], joditMouseup: [{ type: Output }], joditClick: [{ type: Output }], joditFocus: [{ type: Output }], joditPaste: [{ type: Output }], joditResize: [{ type: Output }], joditBeforeEnter: [{ type: Output }], joditBeforeCommand: [{ type: Output }], joditAfterExec: [{ type: Output }], joditAfterPaste: [{ type: Output }], joditChangeSelection: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWpvZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWpvZGl0L3NyYy9saWIvbmd4LWpvZGl0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWpvZGl0L3NyYy9saWIvbmd4LWpvZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF1QixXQUFXLEVBQUUsaUJBQWlCLEdBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzVCLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQWdCLGNBQWMsR0FBRSxNQUFNLE1BQU0sQ0FBQzs7QUFtQnhILE1BQU0sT0FBTyxpQkFBaUI7SUFXNUIsSUFBYSxPQUFPLENBQUMsS0FBa0I7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBT0QsSUFBYSxLQUFLLENBQUMsS0FBYTtRQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFD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QkFDaEQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDRJQy9CSCx1RUFDQSx5RERzQlksWUFBWSw4QkFBRSxXQUFXOzsyRkFZeEIsaUJBQWlCO2tCQWY3QixTQUFTOytCQUNFLFdBQVcsY0FDVCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLGFBRXpCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixtQkFFZ0IsdUJBQXVCLENBQUMsTUFBTTtzRkFJbEIsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBU2QsT0FBTztzQkFBbkIsS0FBSztnQkFhTyxLQUFLO3NCQUFqQixLQUFLO2dCQWNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBR0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IsfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0pvZGl0fSBmcm9tICdqb2RpdCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZGVsYXksIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIFN1YnNjcmlwdGlvbiwgd2l0aExhdGVzdEZyb20sfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtKb2RpdENvbmZpZ30gZnJvbSAnLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1qb2RpdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1qb2RpdC5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4Sm9kaXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LWpvZGl0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hKb2RpdENvbXBvbmVudFxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdqb2RpdENvbnRhaW5lcicpIGpvZGl0Q29udGFpbmVyITogRWxlbWVudFJlZjtcbiAgam9kaXQ/OiBKb2RpdDtcblxuICAvKipcbiAgICogb3B0aW9ucyBmb3Igam9kaXQuXG4gICAqIFlvdSBjYW4gYWRkIG1vcmUgc3VwcG9ydGVkIG9wdGlvbnMgZXZlbiBUeXBlc2NyaXB0IGRvZXNuJ3Qgc3VnZ2VzdCB0aGUgb3B0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgX29wdGlvbnM/OiBKb2RpdENvbmZpZztcblxuICBASW5wdXQoKSBzZXQgb3B0aW9ucyh2YWx1ZTogSm9kaXRDb25maWcpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuaW5pdEpvZGl0Q29udGFpbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gdmFsdWUgcHJvcGVydHkgKHN1YmplY3QpXG4gIHByaXZhdGUgdmFsdWVTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcbiAgICAnJ1xuICApO1xuXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2FuaXRpemVkVGV4dCA9IHRoaXMucHJlcGFyZVRleHQodmFsdWUpO1xuICAgIGlmICghdGhpcy5pbnRlcm5WYWx1ZUNoYW5nZSkge1xuICAgICAgdGhpcy52YWx1ZVN1YmplY3QubmV4dChzYW5pdGl6ZWRUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnRlcm5WYWx1ZUNoYW5nZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlKHNhbml0aXplZFRleHQpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVTdWJqZWN0LmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvL2V2ZW50c1xuICBAT3V0cHV0KCkgam9kaXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGpvZGl0S2V5RG93biA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0S2V5VXAgPSBuZXcgRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdE1vdXNlZG93biA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0TW91c2V1cCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFBvaW50ZXJFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0Rm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdFBhc3RlID0gbmV3IEV2ZW50RW1pdHRlcjxDbGlwYm9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0UmVzaXplID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgam9kaXRCZWZvcmVFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0QmVmb3JlQ29tbWFuZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgam9kaXRBZnRlckV4ZWMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdEFmdGVyUGFzdGUgPSBuZXcgRXZlbnRFbWl0dGVyPENsaXBib2FyZEV2ZW50PigpO1xuICBAT3V0cHV0KCkgam9kaXRDaGFuZ2VTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLy8gVXNlZCBmb3IgZGVsYXkgdmFsdWUgYXNzaWdubWVudCB0byB3YWl0IGZvciBqb2RpdCB0byBiZSBpbml0aWFsaXplZFxuICBwcml2YXRlIGpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPVxuICAgIG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIHZhbHVlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGludGVyblZhbHVlQ2hhbmdlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgLy8gSGFuZGxlIHZhbHVlIGNoYW5nZXMgLi4uXG4gICAgICB0aGlzLnZhbHVlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICAgICAgLy8gLi4uYWRkaXRpb25hbGx5IGVuc3VyaW5nIHRoYXQgdGhlIHZhbHVlIGlzIHJlYXBwbGllZCBpZiB0aGUgZWRpdG9yIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2hlbiB2YWx1ZSB3YXMgc2V0XG4gICAgICB0aGlzLmpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0LnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIGZpbHRlcigoaW5pdGlhbGl6ZWQpID0+IGluaXRpYWxpemVkKVxuICAgICAgKSxcbiAgICBdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIC8vIFBhc3MgdGhyb3VnaCB0aGUgbGF0ZXN0IHZhbHVlIGluIGNhc2Ugb2YgZWRpdG9yIGluaXRpYWxpemF0aW9uXG4gICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMudmFsdWVTdWJqZWN0KSxcbiAgICAgICAgLy8gUHJldmVudCBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXG4gICAgICAgIGRlbGF5KDApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbW18sIGluaXRpYWxpemVkXSwgdGV4dF0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuam9kaXQgJiYgaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICB0aGlzLmpvZGl0LnZhbHVlID0gdGV4dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBpc0hUTUwodGV4dDogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW0uaW5uZXJIVE1MID0gdGV4dDtcblxuICAgIHJldHVybiAoXG4gICAgICB0ZXh0ICYmXG4gICAgICBlbGVtLmNoaWxkTm9kZXMubGVuZ3RoID4gMCAmJlxuICAgICAgZWxlbS5jaGlsZE5vZGVzLml0ZW0oMCkubm9kZVR5cGUgIT09IDNcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW5pdEpvZGl0Q29udGFpbmVyKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnZhbHVlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuam9kaXQ/LmRlc3RydWN0KCk7XG4gIH1cblxuICBpbml0Sm9kaXRDb250YWluZXIoKSB7XG4gICAgaWYgKHRoaXMuam9kaXRDb250YWluZXIpIHtcbiAgICAgIGlmICh0aGlzLmpvZGl0KSB7XG4gICAgICAgIHRoaXMuam9kaXQuZGVzdHJ1Y3QoKTtcbiAgICAgICAgdGhpcy5qb2RpdEluaXRpYWxpemVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuam9kaXQgPSBKb2RpdC5tYWtlKFxuICAgICAgICB0aGlzLmpvZGl0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMuX29wdGlvbnMgYXMgYW55XG4gICAgICApO1xuICAgICAgdGhpcy5qb2RpdC52YWx1ZSA9IHRoaXMudmFsdWVTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignY2hhbmdlJywgKHRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmludGVyblZhbHVlQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VWYWx1ZSh0ZXh0KTtcbiAgICAgICAgdGhpcy5qb2RpdENoYW5nZS5lbWl0KHRleHQpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRleHQpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbigna2V5ZG93bicsIChhOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRLZXlEb3duLmVtaXQoYSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdrZXl1cCcsIChhOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRLZXlVcC5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignbW91c2Vkb3duJywgKGE6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdE1vdXNlZG93bi5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignbW91c2V1cCcsIChhOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRNb3VzZXVwLmVtaXQoYSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdjbGljaycsIChhOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdENsaWNrLmVtaXQoYSk7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdmb2N1cycsIChhOiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRGb2N1cy5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbigncGFzdGUnLCAoYTogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdFBhc3RlLmVtaXQoYSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdyZXNpemUnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRSZXNpemUuZW1pdCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignYmVmb3JlRW50ZXInLCAoYTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0QmVmb3JlRW50ZXIuZW1pdChhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2JlZm9yZUNvbW1hbmQnLCAoYTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRCZWZvcmVDb21tYW5kLmVtaXQoYSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdhZnRlckV4ZWMnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRBZnRlckV4ZWMuZW1pdCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignYWZ0ZXJQYXN0ZScsIChhOiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0QWZ0ZXJQYXN0ZS5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignY2hhbmdlU2VsZWN0aW9uJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0Q2hhbmdlU2VsZWN0aW9uLmVtaXQoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKlxuICBGVU5DVElPTlMgUkVMRVZBTlQgRk9SIEFOR1VMQVIgRk9STVNcbiAgICovXG5cbiAgb25DaGFuZ2UgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgLy8gaW1wbGVtZW50ZWQgYnkgdXNlclxuICB9O1xuXG4gIG9uVG91Y2hlZCA9ICgpID0+IHtcbiAgICAvLyBpbXBsZW1lbnRlZCBieSB1c2VyXG4gIH07XG5cbiAgd3JpdGVWYWx1ZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlU3ViamVjdC5uZXh0KHRoaXMucHJlcGFyZVRleHQodGV4dCkpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHRleHQ6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi50aGlzLl9vcHRpb25zLFxuICAgICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNIVE1MKHRleHQpID8gdGV4dCA6IGA8cD4ke3RleHR9PC9wPmA7XG4gIH1cbn1cbiIsIjx0ZXh0YXJlYSBjbGFzcz1cIm5neC1qb2RpdC1jb250YWluZXJcIiAjam9kaXRDb250YWluZXI+PC90ZXh0YXJlYT5cbiJdfQ==