UNPKG

@vismaux/ngx-nordic-cool

Version:
172 lines 22 kB
import { Directive, HostBinding, HostListener, Input, Optional, } from '@angular/core'; import { takeUntil } from 'rxjs/operators'; import { FormControl, FormGroupDirective, NgControl, } from '@angular/forms'; import { NcTooltipDirective } from '../tooltip'; import { NcErrorTooltipContentComponent } from './error-tooltip-content.component'; import { NcErrorsComponent } from './error-messages'; import { Subscription } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; import * as i2 from "@angular/forms"; // Increasing integer for generating unique ids for error message component. let nextErrorMessageId = 0; export class NcErrorTooltipDirective extends NcTooltipDirective { constructor(elRef, overlay, ngZone, implicitNgControl, ngForm, controlContainer) { super(elRef, overlay, ngZone); this.implicitNgControl = implicitNgControl; this.ngForm = ngForm; this.controlContainer = controlContainer; this.inFocus = false; this.formSubmitted = false; this.contentInstance = null; this._errorMessages = {}; this.errorMessagesSub = new Subscription(); this.errorMessageId = `nc-error-message-${++nextErrorMessageId}`; this.errorMessages = ''; this.customErrors = null; this.disabled = true; this.style = 'error'; this.content = ''; } ngOnInit() { if (!this.ngControl) { throw new Error(`[ncErrorTooltip] only works with angular form controls. Make sure [(ngModel)] or [formControl] is used.`); } this.ngControl.statusChanges .pipe(takeUntil(this.destroyed$)) .subscribe(() => this.checkTooltipState()); this.formContainer?.ngSubmit .pipe(takeUntil(this.destroyed$)) .subscribe(() => { this.formSubmitted = true; this.checkTooltipState(); }); } ngDoCheck() { if (this.formContainer && this.formContainer.submitted !== this.formSubmitted) { // `NgForm` doesn't provide `reset` observable, // so this must be manually checked on every change-detection run ;( this.formSubmitted = this.formContainer.submitted; this.checkTooltipState(); } } ngOnChanges(changes) { this.checkTooltipState(); if (changes['errorMessages']) { this.errorMessagesSub?.unsubscribe(); if (this.errorMessages instanceof NcErrorsComponent) { this.errorMessagesSub = this.errorMessages.errors$ .pipe(takeUntil(this.destroyed$)) .subscribe((errorMessages) => { this._errorMessages = errorMessages; this.updateErrorMessages(); }); } else { this._errorMessages = {}; this.updateErrorMessages(); } } } onFocus() { this.inFocus = true; this.checkTooltipState(); } onBlur() { this.inFocus = false; this.checkTooltipState(); } hide() { // overriding this method to prevent default tooltip closing behaviour } get ngControl() { if (this.explicitNgControl instanceof NgControl || this.explicitNgControl instanceof FormControl) { return this.explicitNgControl; } return this.implicitNgControl; } get formContainer() { if (this.controlContainer && this.controlContainer.formDirective instanceof FormGroupDirective) { return this.controlContainer.formDirective; } return this.ngForm; } checkTooltipState() { const hasCustomError = Object.values(this.customErrors ?? {}).some((e) => e !== null && e !== undefined); this.hasError = (this.ngControl.invalid || hasCustomError) && ((this.ngControl.touched && this.ngControl.dirty) || this.formSubmitted); const shouldBeVisible = this.hasError && this.inFocus; if (shouldBeVisible) { this.show(); this.createContentInstance(); this.updateErrorMessages(); } else { super.hide(); this.contentInstance = null; } } createContentInstance() { if (!this.contentInstance) { this.contentInstance = this.projectComponent(NcErrorTooltipContentComponent); this.contentInstance.errorMessageId = this.errorMessageId; } return this.contentInstance; } updateErrorMessages() { if (!this.contentInstance) { return; } this.contentInstance.errors = this.getErrors(); this.contentInstance.errorMessages = this._errorMessages; this.contentInstance.cd.detectChanges(); } getErrors() { const customErrors = Object.entries(this.customErrors ?? {}).reduce((l, [key, err]) => err !== null && err !== undefined ? { ...l, [key]: err } : l, {}); return { ...this.ngControl.errors, ...customErrors }; } } NcErrorTooltipDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcErrorTooltipDirective, deps: [{ token: i0.ElementRef }, { token: i1.Overlay }, { token: i0.NgZone }, { token: i2.NgControl, optional: true }, { token: i2.NgForm, optional: true }, { token: i2.ControlContainer, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); NcErrorTooltipDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.3", type: NcErrorTooltipDirective, selector: "[ncErrorTooltip]", inputs: { errorMessages: ["ncErrorTooltip", "errorMessages"], explicitNgControl: ["ncErrorTooltipControl", "explicitNgControl"], customErrors: ["ncErrorTooltipCustom", "customErrors"] }, host: { listeners: { "focusin": "onFocus()", "focusout": "onBlur()" }, properties: { "attr.aria-invalid": "this.hasError", "class.has-error": "this.hasError", "attr.aria-errormessage": "this.errorMessageId" } }, exportAs: ["ncErrorTooltip"], usesInheritance: true, usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcErrorTooltipDirective, decorators: [{ type: Directive, args: [{ selector: '[ncErrorTooltip]', exportAs: 'ncErrorTooltip', }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Overlay }, { type: i0.NgZone }, { type: i2.NgControl, decorators: [{ type: Optional }] }, { type: i2.NgForm, decorators: [{ type: Optional }] }, { type: i2.ControlContainer, decorators: [{ type: Optional }] }]; }, propDecorators: { hasError: [{ type: HostBinding, args: ['attr.aria-invalid'] }, { type: HostBinding, args: ['class.has-error'] }], errorMessageId: [{ type: HostBinding, args: ['attr.aria-errormessage'] }], errorMessages: [{ type: Input, args: ['ncErrorTooltip'] }], explicitNgControl: [{ type: Input, args: ['ncErrorTooltipControl'] }], customErrors: [{ type: Input, args: ['ncErrorTooltipCustom'] }], onFocus: [{ type: HostListener, args: ['focusin'] }], onBlur: [{ type: HostListener, args: ['focusout'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItdG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9yZGljLWNvb2wvc3JjL2xpYi9lcnJvci10b29sdGlwL2Vycm9yLXRvb2x0aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBSUwsUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBRUwsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixTQUFTLEdBRVYsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkYsT0FBTyxFQUFtQixpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RFLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFFaEQsNEVBQTRFO0FBQzVFLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBTTNCLE1BQU0sT0FBTyx1QkFDWCxTQUFRLGtCQUFrQjtJQXFCMUIsWUFDRSxLQUE4QixFQUM5QixPQUFnQixFQUNoQixNQUFjLEVBQ00saUJBQTZCLEVBQzdCLE1BQWUsRUFDZixnQkFBbUM7UUFFdkQsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFKVixzQkFBaUIsR0FBakIsaUJBQWlCLENBQVk7UUFDN0IsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNmLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUF4QmpELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsa0JBQWEsR0FBRyxLQUFL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a0I7b0JBQzVCLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOzswQkEyQkksUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUTs0Q0FoQlgsUUFBUTtzQkFGUCxXQUFXO3VCQUFDLG1CQUFtQjs7c0JBQy9CLFdBQVc7dUJBQUMsaUJBQWlCO2dCQUlyQixjQUFjO3NCQUR0QixXQUFXO3VCQUFDLHdCQUF3QjtnQkFHWixhQUFhO3NCQUFyQyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDUyxpQkFBaUI7c0JBQWhELEtBQUs7dUJBQUMsdUJBQXVCO2dCQUNDLFlBQVk7c0JBQTFDLEtBQUs7dUJBQUMsc0JBQXNCO2dCQW9FN0IsT0FBTztzQkFETixZQUFZO3VCQUFDLFNBQVM7Z0JBT3ZCLE1BQU07c0JBREwsWUFBWTt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENvbnRyb2xDb250YWluZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gIE5nQ29udHJvbCxcbiAgTmdGb3JtLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOY1Rvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICcuLi90b29sdGlwJztcbmltcG9ydCB7IE5jRXJyb3JUb29sdGlwQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4vZXJyb3ItdG9vbHRpcC1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOY0Vycm9yTWVzc2FnZXMsIE5jRXJyb3JzQ29tcG9uZW50IH0gZnJvbSAnLi9lcnJvci1tZXNzYWdlcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLy8gSW5jcmVhc2luZyBpbnRlZ2VyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBpZHMgZm9yIGVycm9yIG1lc3NhZ2UgY29tcG9uZW50LlxubGV0IG5leHRFcnJvck1lc3NhZ2VJZCA9IDA7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuY0Vycm9yVG9vbHRpcF0nLFxuICBleHBvcnRBczogJ25jRXJyb3JUb29sdGlwJyxcbn0pXG5leHBvcnQgY2xhc3MgTmNFcnJvclRvb2x0aXBEaXJlY3RpdmVcbiAgZXh0ZW5kcyBOY1Rvb2x0aXBEaXJlY3RpdmVcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlc1xue1xuICBwcml2YXRlIGluRm9jdXMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBmb3JtU3VibWl0dGVkID0gZmFsc2U7XG4gIHByaXZhdGUgY29udGVudEluc3RhbmNlOiBOY0Vycm9yVG9vbHRpcENvbnRlbnRDb21wb25lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlczogTmNFcnJvck1lc3NhZ2VzIHwge30gPSB7fTtcbiAgcHJpdmF0ZSBlcnJvck1lc3NhZ2VzU3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWludmFsaWQnKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhhcy1lcnJvcicpXG4gIGhhc0Vycm9yOiBib29sZWFuO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWVycm9ybWVzc2FnZScpXG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZUlkID0gYG5jLWVycm9yLW1lc3NhZ2UtJHsrK25leHRFcnJvck1lc3NhZ2VJZH1gO1xuXG4gIEBJbnB1dCgnbmNFcnJvclRvb2x0aXAnKSBlcnJvck1lc3NhZ2VzOiBOY0Vycm9yc0NvbXBvbmVudCB8IHN0cmluZyA9ICcnO1xuICBASW5wdXQoJ25jRXJyb3JUb29sdGlwQ29udHJvbCcpIGV4cGxpY2l0TmdDb250cm9sPzogTmdDb250cm9sIHwgRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgnbmNFcnJvclRvb2x0aXBDdXN0b20nKSBjdXN0b21FcnJvcnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9XG4gICAgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBuZ1pvbmU6IE5nWm9uZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGltcGxpY2l0TmdDb250cm9sPzogTmdDb250cm9sLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbmdGb3JtPzogTmdGb3JtLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcj86IENvbnRyb2xDb250YWluZXJcbiAgKSB7XG4gICAgc3VwZXIoZWxSZWYsIG92ZXJsYXksIG5nWm9uZSk7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5zdHlsZSA9ICdlcnJvcic7XG4gICAgdGhpcy5jb250ZW50ID0gJyc7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMubmdDb250cm9sKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbbmNFcnJvclRvb2x0aXBdIG9ubHkgd29ya3Mgd2l0aCBhbmd1bGFyIGZvcm0gY29udHJvbHMuIE1ha2Ugc3VyZSBbKG5nTW9kZWwpXSBvciBbZm9ybUNvbnRyb2xdIGlzIHVzZWQuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAodGhpcy5uZ0NvbnRyb2wuc3RhdHVzQ2hhbmdlcyBhcyBPYnNlcnZhYmxlPHVua25vd24+KVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hlY2tUb29sdGlwU3RhdGUoKSk7XG5cbiAgICB0aGlzLmZvcm1Db250YWluZXI/Lm5nU3VibWl0XG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1TdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoZWNrVG9vbHRpcFN0YXRlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZvcm1Db250YWluZXIgJiZcbiAgICAgIHRoaXMuZm9ybUNvbnRhaW5lci5zdWJtaXR0ZWQgIT09IHRoaXMuZm9ybVN1Ym1pdHRlZFxuICAgICkge1xuICAgICAgLy8gYE5nRm9ybWAgZG9lc24ndCBwcm92aWRlIGByZXNldGAgb2JzZXJ2YWJsZSxcbiAgICAgIC8vIHNvIHRoaXMgbXVzdCBiZSBtYW51YWxseSBjaGVja2VkIG9uIGV2ZXJ5IGNoYW5nZS1kZXRlY3Rpb24gcnVuIDsoXG4gICAgICB0aGlzLmZvcm1TdWJtaXR0ZWQgPSB0aGlzLmZvcm1Db250YWluZXIuc3VibWl0dGVkO1xuICAgICAgdGhpcy5jaGVja1Rvb2x0aXBTdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmNoZWNrVG9vbHRpcFN0YXRlKCk7XG5cbiAgICBpZiAoY2hhbmdlc1snZXJyb3JNZXNzYWdlcyddKSB7XG4gICAgICB0aGlzLmVycm9yTWVzc2FnZXNTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAodGhpcy5lcnJvck1lc3NhZ2VzIGluc3RhbmNlb2YgTmNFcnJvcnNDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzU3ViID0gdGhpcy5lcnJvck1lc3NhZ2VzLmVycm9ycyRcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChlcnJvck1lc3NhZ2VzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvck1lc3NhZ2VzID0gZXJyb3JNZXNzYWdlcztcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRXJyb3JNZXNzYWdlcygpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlcyA9IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZUVycm9yTWVzc2FnZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdmb2N1c2luJylcbiAgb25Gb2N1cygpIHtcbiAgICB0aGlzLmluRm9jdXMgPSB0cnVlO1xuICAgIHRoaXMuY2hlY2tUb29sdGlwU3RhdGUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3Vzb3V0JylcbiAgb25CbHVyKCkge1xuICAgIHRoaXMuaW5Gb2N1cyA9IGZhbHNlO1xuICAgIHRoaXMuY2hlY2tUb29sdGlwU3RhdGUoKTtcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgLy8gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB0byBwcmV2ZW50IGRlZmF1bHQgdG9vbHRpcCBjbG9zaW5nIGJlaGF2aW91clxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbmdDb250cm9sKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuZXhwbGljaXROZ0NvbnRyb2wgaW5zdGFuY2VvZiBOZ0NvbnRyb2wgfHxcbiAgICAgIHRoaXMuZXhwbGljaXROZ0NvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhwbGljaXROZ0NvbnRyb2w7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmltcGxpY2l0TmdDb250cm9sO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZm9ybUNvbnRhaW5lcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbnRyb2xDb250YWluZXIgJiZcbiAgICAgIHRoaXMuY29udHJvbENvbnRhaW5lci5mb3JtRGlyZWN0aXZlIGluc3RhbmNlb2YgRm9ybUdyb3VwRGlyZWN0aXZlXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250cm9sQ29udGFpbmVyLmZvcm1EaXJlY3RpdmU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5nRm9ybTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tUb29sdGlwU3RhdGUoKSB7XG4gICAgY29uc3QgaGFzQ3VzdG9tRXJyb3IgPSBPYmplY3QudmFsdWVzKHRoaXMuY3VzdG9tRXJyb3JzID8/IHt9KS5zb21lKFxuICAgICAgKGUpID0+IGUgIT09IG51bGwgJiYgZSAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgICB0aGlzLmhhc0Vycm9yID1cbiAgICAgICh0aGlzLm5nQ29udHJvbC5pbnZhbGlkIHx8IGhhc0N1c3RvbUVycm9yKSAmJlxuICAgICAgKCh0aGlzLm5nQ29udHJvbC50b3VjaGVkICYmIHRoaXMubmdDb250cm9sLmRpcnR5KSB8fCB0aGlzLmZvcm1TdWJtaXR0ZWQpO1xuXG4gICAgY29uc3Qgc2hvdWxkQmVWaXNpYmxlID0gdGhpcy5oYXNFcnJvciAmJiB0aGlzLmluRm9jdXM7XG4gICAgaWYgKHNob3VsZEJlVmlzaWJsZSkge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB0aGlzLmNyZWF0ZUNvbnRlbnRJbnN0YW5jZSgpO1xuICAgICAgdGhpcy51cGRhdGVFcnJvck1lc3NhZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmhpZGUoKTtcbiAgICAgIHRoaXMuY29udGVudEluc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbnRlbnRJbnN0YW5jZSgpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudEluc3RhbmNlKSB7XG4gICAgICB0aGlzLmNvbnRlbnRJbnN0YW5jZSA9IHRoaXMucHJvamVjdENvbXBvbmVudChcbiAgICAgICAgTmNFcnJvclRvb2x0aXBDb250ZW50Q29tcG9uZW50XG4gICAgICApO1xuICAgICAgdGhpcy5jb250ZW50SW5zdGFuY2UuZXJyb3JNZXNzYWdlSWQgPSB0aGlzLmVycm9yTWVzc2FnZUlkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250ZW50SW5zdGFuY2U7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVycm9yTWVzc2FnZXMoKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRJbnN0YW5jZS5lcnJvcnMgPSB0aGlzLmdldEVycm9ycygpO1xuICAgIHRoaXMuY29udGVudEluc3RhbmNlLmVycm9yTWVzc2FnZXMgPSB0aGlzLl9lcnJvck1lc3NhZ2VzO1xuICAgIHRoaXMuY29udGVudEluc3RhbmNlLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXJyb3JzKCkge1xuICAgIGNvbnN0IGN1c3RvbUVycm9ycyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuY3VzdG9tRXJyb3JzID8/IHt9KS5yZWR1Y2UoXG4gICAgICAobCwgW2tleSwgZXJyXSkgPT5cbiAgICAgICAgZXJyICE9PSBudWxsICYmIGVyciAhPT0gdW5kZWZpbmVkID8geyAuLi5sLCBba2V5XTogZXJyIH0gOiBsLFxuICAgICAge31cbiAgICApO1xuXG4gICAgcmV0dXJuIHsgLi4udGhpcy5uZ0NvbnRyb2wuZXJyb3JzLCAuLi5jdXN0b21FcnJvcnMgfTtcbiAgfVxufVxuIl19