UNPKG

ngx-jodit-pro

Version:

Angular wrapper for Jodit Pro WYSIWYG editor

223 lines 29.6 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms'; import { BehaviorSubject, combineLatest, delay, distinctUntilChanged, filter, withLatestFrom } from 'rxjs'; import * as i0 from "@angular/core"; export class NgxJoditProComponent { set options(value) { this._options = value; if (value) { this.initJoditContainer().then(); } } 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; /** * options for jodit pro. It's of type partial because Config is imported from jodit packge and doesn't contain jodit-pro options. * You can add more supported options even Typescript doesn't suggest the options. */ this._options = {}; // 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.setEditorValue(text); } }); } isHTML(text) { const elem = document.createElement('div'); elem.innerHTML = text; return (text && elem.childNodes.length > 0 && elem.childNodes.item(0).nodeType !== 3); } async ngAfterViewInit() { await this.initJoditContainer(); } ngOnDestroy() { this.valueSubscription?.unsubscribe(); this.jodit?.events.destruct(); } async initJoditContainer() { if (this.joditContainer?.nativeElement) { if (this.jodit) { this.jodit.destruct(); this.joditInitializedSubject.next(false); } this.jodit = Jodit.make(this.joditContainer.nativeElement, this._options); await this.jodit.waitForReady(); this.jodit.setEditorValue(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: NgxJoditProComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: NgxJoditProComponent, isStandalone: true, selector: "ngx-jodit-pro", 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(() => NgxJoditProComponent), 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: NgxJoditProComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-jodit-pro', standalone: true, imports: [CommonModule, FormsModule], providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxJoditProComponent), multi: true }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<textarea class=\"ngx-jodit-container\" #joditContainer></textarea>\n" }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { joditContainer: [{ type: ViewChild, args: ['joditContainer', { static: false }] }], 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWpvZGl0LXByby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25neC1qb2RpdC1wcm8vc3JjL2xpYi9uZ3gtam9kaXQtcHJvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWpvZGl0LXByby9zcmMvbGliL25neC1qb2RpdC1wcm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUk3QyxPQUFPLEVBQXVCLFdBQVcsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQWdCLGNBQWMsRUFBQyxNQUFNLE1BQU0sQ0FBQzs7QUFrQnZILE1BQU0sT0FBTyxvQkFBb0I7SUFTL0IsSUFBYSxPQUFPLENBQUMsS0FBcUI7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBS0QsSUFBYSxLQUFLLENBQUMsS0FBYTtRQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUks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IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0lWaWV3T3B0aW9uc1Byb30gZnJvbSAnam9kaXQtcHJvL3R5cGVzL3R5cGVzL3ZpZXcnO1xuaW1wb3J0IHtJVmlld09wdGlvbnN9IGZyb20gJ2pvZGl0L3R5cGVzL3R5cGVzJztcbmltcG9ydCB7SUpvZGl0fSBmcm9tICdqb2RpdC90eXBlcy90eXBlcy9qb2RpdCc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBkZWxheSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgU3Vic2NyaXB0aW9uLCB3aXRoTGF0ZXN0RnJvbX0gZnJvbSAncnhqcyc7XG5cbmRlY2xhcmUgY29uc3QgSm9kaXQ6IGFueTtcbmV4cG9ydCB0eXBlIEpvZGl0UHJvQ29uZmlnID0gUGFydGlhbDxJVmlld09wdGlvbnMgJiBJVmlld09wdGlvbnNQcm8gJiBSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWpvZGl0LXBybycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1qb2RpdC1wcm8uY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4Sm9kaXRQcm9Db21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG4gIH1dLFxuICBzdHlsZVVybHM6IFsnLi9uZ3gtam9kaXQtcHJvLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE5neEpvZGl0UHJvQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2pvZGl0Q29udGFpbmVyJywge3N0YXRpYzogZmFsc2V9KSBqb2RpdENvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIGpvZGl0PzogSUpvZGl0O1xuXG4gIC8qKlxuICAgKiBvcHRpb25zIGZvciBqb2RpdCBwcm8uIEl0J3Mgb2YgdHlwZSBwYXJ0aWFsIGJlY2F1c2UgQ29uZmlnIGlzIGltcG9ydGVkIGZyb20gam9kaXQgcGFja2dlIGFuZCBkb2Vzbid0IGNvbnRhaW4gam9kaXQtcHJvIG9wdGlvbnMuXG4gICAqIFlvdSBjYW4gYWRkIG1vcmUgc3VwcG9ydGVkIG9wdGlvbnMgZXZlbiBUeXBlc2NyaXB0IGRvZXNuJ3Qgc3VnZ2VzdCB0aGUgb3B0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgX29wdGlvbnM/OiBKb2RpdFByb0NvbmZpZyA9IHt9O1xuICBASW5wdXQoKSBzZXQgb3B0aW9ucyh2YWx1ZTogSm9kaXRQcm9Db25maWcpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuaW5pdEpvZGl0Q29udGFpbmVyKCkudGhlbigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHZhbHVlIHByb3BlcnR5IChzdWJqZWN0KVxuICBwcml2YXRlIHZhbHVlU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2FuaXRpemVkVGV4dCA9IHRoaXMucHJlcGFyZVRleHQodmFsdWUpO1xuICAgIGlmICghdGhpcy5pbnRlcm5WYWx1ZUNoYW5nZSkge1xuICAgICAgdGhpcy52YWx1ZVN1YmplY3QubmV4dChzYW5pdGl6ZWRUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnRlcm5WYWx1ZUNoYW5nZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlKHNhbml0aXplZFRleHQpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVTdWJqZWN0LmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvL2V2ZW50c1xuICBAT3V0cHV0KCkgam9kaXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGpvZGl0S2V5RG93biA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0S2V5VXAgPSBuZXcgRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdE1vdXNlZG93biA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0TW91c2V1cCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFBvaW50ZXJFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0Rm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdFBhc3RlID0gbmV3IEV2ZW50RW1pdHRlcjxDbGlwYm9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0UmVzaXplID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgam9kaXRCZWZvcmVFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0QmVmb3JlQ29tbWFuZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgam9kaXRBZnRlckV4ZWMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdEFmdGVyUGFzdGUgPSBuZXcgRXZlbnRFbWl0dGVyPENsaXBib2FyZEV2ZW50PigpO1xuICBAT3V0cHV0KCkgam9kaXRDaGFuZ2VTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLy8gVXNlZCBmb3IgZGVsYXkgdmFsdWUgYXNzaWdubWVudCB0byB3YWl0IGZvciBqb2RpdCB0byBiZSBpbml0aWFsaXplZFxuICBwcml2YXRlIGpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSB2YWx1ZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBpbnRlcm5WYWx1ZUNoYW5nZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7XG4gICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgLy8gSGFuZGxlIHZhbHVlIGNoYW5nZXMgLi4uXG4gICAgICB0aGlzLnZhbHVlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICAgICAgLy8gLi4uYWRkaXRpb25hbGx5IGVuc3VyaW5nIHRoYXQgdGhlIHZhbHVlIGlzIHJlYXBwbGllZCBpZiB0aGUgZWRpdG9yIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2hlbiB2YWx1ZSB3YXMgc2V0XG4gICAgICB0aGlzLmpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0LnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZmlsdGVyKGluaXRpYWxpemVkID0+IGluaXRpYWxpemVkKSlcbiAgICBdKS5waXBlKFxuICAgICAgLy8gUGFzcyB0aHJvdWdoIHRoZSBsYXRlc3QgdmFsdWUgaW4gY2FzZSBvZiBlZGl0b3IgaW5pdGlhbGl6YXRpb25cbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMudmFsdWVTdWJqZWN0KSxcbiAgICAgIC8vIFByZXZlbnQgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvclxuICAgICAgZGVsYXkoMClcbiAgICApLnN1YnNjcmliZSgoW1tfLCBpbml0aWFsaXplZF0sIHRleHRdKSA9PiB7XG4gICAgICBpZiAodGhpcy5qb2RpdCAmJiBpbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLmpvZGl0LnNldEVkaXRvclZhbHVlKHRleHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaXNIVE1MKHRleHQ6IHN0cmluZykge1xuICAgIGNvbnN0IGVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtLmlubmVySFRNTCA9IHRleHQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGV4dCAmJlxuICAgICAgZWxlbS5jaGlsZE5vZGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGVsZW0uY2hpbGROb2Rlcy5pdGVtKDApLm5vZGVUeXBlICE9PSAzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBhd2FpdCB0aGlzLmluaXRKb2RpdENvbnRhaW5lcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmpvZGl0Py5ldmVudHMuZGVzdHJ1Y3QoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRKb2RpdENvbnRhaW5lcigpIHtcbiAgICBpZiAodGhpcy5qb2RpdENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKHRoaXMuam9kaXQpIHtcbiAgICAgICAgdGhpcy5qb2RpdC5kZXN0cnVjdCgpO1xuICAgICAgICB0aGlzLmpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5qb2RpdCA9IEpvZGl0Lm1ha2UodGhpcy5qb2RpdENvbnRhaW5lci5uYXRpdmVFbGVtZW50LCB0aGlzLl9vcHRpb25zKSBhcyBJSm9kaXQ7XG4gICAgICBhd2FpdCB0aGlzLmpvZGl0LndhaXRGb3JSZWFkeSgpO1xuICAgICAgdGhpcy5qb2RpdC5zZXRFZGl0b3JWYWx1ZSh0aGlzLnZhbHVlU3ViamVjdC5nZXRWYWx1ZSgpKTtcblxuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2NoYW5nZScsICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5pbnRlcm5WYWx1ZUNoYW5nZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2hhbmdlVmFsdWUodGV4dCk7XG4gICAgICAgIHRoaXMuam9kaXRDaGFuZ2UuZW1pdCh0ZXh0KTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0ZXh0KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2tleWRvd24nLCAoYTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0S2V5RG93bi5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbigna2V5dXAnLCAoYTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0S2V5VXAuZW1pdChhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ21vdXNlZG93bicsIChhOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRNb3VzZWRvd24uZW1pdChhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ21vdXNldXAnLCAoYTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0TW91c2V1cC5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignY2xpY2snLCAoYTogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRDbGljay5lbWl0KGEpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignZm9jdXMnLCAoYTogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0Rm9jdXMuZW1pdChhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ3Bhc3RlJywgKGE6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRQYXN0ZS5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbigncmVzaXplJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0UmVzaXplLmVtaXQoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2JlZm9yZUVudGVyJywgKGE6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdEJlZm9yZUVudGVyLmVtaXQoYSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdiZWZvcmVDb21tYW5kJywgKGE6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0QmVmb3JlQ29tbWFuZC5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignYWZ0ZXJFeGVjJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0QWZ0ZXJFeGVjLmVtaXQoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2FmdGVyUGFzdGUnLCAoYTogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdEFmdGVyUGFzdGUuZW1pdChhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2NoYW5nZVNlbGVjdGlvbicsICgpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdENoYW5nZVNlbGVjdGlvbi5lbWl0KCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5qb2RpdEluaXRpYWxpemVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLypcbiAgRlVOQ1RJT05TIFJFTEVWQU5UIEZPUiBBTkdVTEFSIEZPUk1TXG4gICAqL1xuXG4gIG9uQ2hhbmdlID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICAgIC8vIGltcGxlbWVudGVkIGJ5IHVzZXJcbiAgfTtcblxuICBvblRvdWNoZWQgPSAoKSA9PiB7XG4gICAgLy8gaW1wbGVtZW50ZWQgYnkgdXNlclxuICB9O1xuXG4gIHdyaXRlVmFsdWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZVN1YmplY3QubmV4dCh0aGlzLnByZXBhcmVUZXh0KHRleHQpKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4udGhpcy5fb3B0aW9ucyxcbiAgICAgIGRpc2FibGVkOiBpc0Rpc2FibGVkXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNIVE1MKHRleHQpID8gdGV4dCA6IGA8cD4ke3RleHR9PC9wPmA7XG4gIH1cbn1cbiIsIjx0ZXh0YXJlYSBjbGFzcz1cIm5neC1qb2RpdC1jb250YWluZXJcIiAjam9kaXRDb250YWluZXI+PC90ZXh0YXJlYT5cbiJdfQ==