UNPKG

ngx-line-truncation

Version:

Ngx Line Truncation is line truncation implementation for Angular that truncate text by user defined line number.

171 lines 20.6 kB
import { Directive, ElementRef, EventEmitter, Input, Output, Renderer2, HostListener } from "@angular/core"; import { getContentHeight, getLineHeight, truncate } from "line-truncation"; import { Subject, BehaviorSubject } from "rxjs"; import { debounceTime, skip } from "rxjs/operators"; import * as i0 from "@angular/core"; export class LineTruncationDirective { constructor(elementRef, renderer) { this.elementRef = elementRef; this.renderer = renderer; this.lines = 1; this.options = { ellipsis: "\u2026" }; this.watchChanges = false; this.hasTruncated = new EventEmitter(); this.MAX_TRIES = 10; this.observerFlag = true; this._disabled$ = new BehaviorSubject(false); this.element = this.elementRef.nativeElement; this.windowResize$ = new Subject(); } set disabled(val) { this._disabled$.next(val); } handleClick(event) { this.windowResize$.next(event); } /** * Hide the original text content until we've finished the truncation */ ngOnInit() { this._disabled$.pipe(skip(1)).subscribe(disable => { // If there is elementClone, then recover if (!!this.elementClone) { this.putbackElement(); } if (disable) { // shut down listener, observer this.disconnectMutationObserver(); this.disconnectWindowLisener(); } else { // re-register this.truncationInit(); // re-execute truncation this.truncateWhenNecessary(this.element); } }); // first emit handling if (!this._disabled$.getValue()) { this.truncationInit(); } } ngAfterViewInit() { this.truncateWhenNecessary(this.element); } truncateWhenNecessary(element, tries = 1, maxTries = this.MAX_TRIES) { if (this._disabled$.getValue()) { return; } // backup original element before truncation this.elementClone = element.cloneNode(true); if (tries > maxTries) { return; } // Allows buffer period for DOM to be ready setTimeout(() => { // Recursively call the truncate itself if Client Height is not ready if (element.clientHeight > 0) { const contentHeight = getContentHeight(element); const lineHeight = getLineHeight(element); const targetHeight = this.lines * lineHeight; if (contentHeight > targetHeight) { try { truncate(element, this.lines, this.options.ellipsis, this.handler.bind(this)); } catch (e) { this.handler(true); } } else { // when there is no need, simply show the element, emit false and unsubscribe from MutationObserver if `watchChanges` prop was falsy this.handler(false); } } }, 100); } handler(e) { this.isTruncated = e; this.hasTruncated.emit(this.isTruncated); if (!this.watchChanges) { this.observerFlag = false; this.disconnectMutationObserver(); } this.renderer.removeStyle(this.element, "visibility"); } truncationInit() { this.renderer.setStyle(this.element, "visibility", "hidden"); this.initWindowResizeListener(this.element); this.initMutationObserver(this.element); } putbackElement() { // grab old child nodes const childNodes = Array.from(this.elementClone.childNodes); // clean element while (this.element.firstChild) { this.element.removeChild(this.element.firstChild); } // push child node to element shell childNodes.forEach(node => { this.element.appendChild(node); }); this.elementClone = null; } initWindowResizeListener(element) { this.windowListener = this.windowResize$ .pipe(debounceTime(500)) .subscribe(() => { this.renderer.setStyle(element, "visibility", "hidden"); this.putbackElement(); this.truncateWhenNecessary(element); }); } initMutationObserver(element) { this.mutationObserver = new MutationObserver(() => { if (this.observerFlag) { this.truncateWhenNecessary(element); } }); this.mutationObserver.observe(element, { childList: true }); } disconnectMutationObserver() { if (this.mutationObserver) { this.mutationObserver.disconnect(); } } disconnectWindowLisener() { if (this.windowListener) { this.windowListener.unsubscribe(); } } ngOnDestroy() { this._disabled$.complete(); this.disconnectMutationObserver(); this.disconnectWindowLisener(); } } LineTruncationDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: LineTruncationDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); LineTruncationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.0", type: LineTruncationDirective, selector: "[line-truncation]", inputs: { lines: ["line-truncation", "lines"], options: "options", disabled: "disabled", watchChanges: "watchChanges" }, outputs: { hasTruncated: "hasTruncated" }, host: { listeners: { "window:resize": "handleClick($event)" } }, exportAs: ["lineTruncation"], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: LineTruncationDirective, decorators: [{ type: Directive, args: [{ selector: "[line-truncation]", exportAs: "lineTruncation" }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { lines: [{ type: Input, args: ["line-truncation"] }], options: [{ type: Input }], disabled: [{ type: Input }], watchChanges: [{ type: Input }], hasTruncated: [{ type: Output }], handleClick: [{ type: HostListener, args: ["window:resize", ["$event"]] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS10cnVuY2F0aW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2xpbmUtdHJ1bmNhdGlvbi1saWIvc3JjL2xpYi9saW5lLXRydW5jYXRpb24uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFFVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFnQixlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUF3QnBELE1BQU0sT0FBTyx1QkFBdUI7SUFrQ2xDLFlBQW9CLFVBQW1DLEVBQVUsUUFBbUI7UUFBaEUsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBL0JwRixVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBR1YsWUFBTyxHQUFZLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBTzFDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBR3JCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUczQyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFFcEIsZUFBVSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ2pELFlBQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUN4QyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFTLENBQUM7SUFVa0QsQ0FBQztJQTFCeEYsSUFBYSxR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S0FBSztzQkFESixLQUFLO3VCQUFDLGlCQUFpQjtnQkFJeEIsT0FBTztzQkFETixLQUFLO2dCQUdPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBS04sWUFBWTtzQkFEWCxLQUFLO2dCQUlOLFlBQVk7c0JBRFgsTUFBTTtnQkFlUCxXQUFXO3NCQURWLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBPbkRlc3Ryb3ksXG4gIEhvc3RMaXN0ZW5lclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgZ2V0Q29udGVudEhlaWdodCwgZ2V0TGluZUhlaWdodCwgdHJ1bmNhdGUgfSBmcm9tIFwibGluZS10cnVuY2F0aW9uXCI7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHNraXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuLyoqXG4gKiBUaGlzIERpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBsaW5lcyB0aGF0IHlvdSB3YW50IHRvIHRydW5jYXRlIGEgdGV4dCBieS5cbiAqXG4gKiBAZXhhbXBsZVxuICogPCEtLSB3aXRoIDxwPiAtLT5cbiAqICAgPHAgW2lubmVySFRNTF09XCJkZXNjcmlwdGlvblwiXG4gKiAgICAgIFtsaW5lLXRydW5jYXRpb25dPVwiNVwiXG4gKiAgICAgIChoYXNUcnVuY2F0ZWQpPVwib25UcnVuY2F0aW9uRmluaXNoKGUpXCI+XG4gKiAgIDwvcD5cbiAqIDwhLS0gd2l0aCBkaXYgLS0+XG4gKiAgPGRpdiBbbGluZS10cnVuY2F0aW9uXT1cIjVcIj55b3VyIHRleHQ8L2Rpdj5cbiAqXG4gKi9cblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBlbGxpcHNpczogc3RyaW5nO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2xpbmUtdHJ1bmNhdGlvbl1cIixcbiAgZXhwb3J0QXM6IFwibGluZVRydW5jYXRpb25cIlxufSlcbmV4cG9ydCBjbGFzcyBMaW5lVHJ1bmNhdGlvbkRpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KFwibGluZS10cnVuY2F0aW9uXCIpXG4gIGxpbmVzID0gMTtcblxuICBASW5wdXQoKVxuICBvcHRpb25zOiBPcHRpb25zID0geyBlbGxpcHNpczogXCJcXHUyMDI2XCIgfTtcblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQkLm5leHQodmFsKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHdhdGNoQ2hhbmdlcyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBoYXNUcnVuY2F0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgZWxlbWVudENsb25lOiBOb2RlO1xuICBNQVhfVFJJRVMgPSAxMDtcbiAgb2JzZXJ2ZXJGbGFnID0gdHJ1ZTtcblxuICBfZGlzYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgd2luZG93UmVzaXplJCA9IG5ldyBTdWJqZWN0PEV2ZW50PigpO1xuICB3aW5kb3dMaXN0ZW5lcjogU3Vic2NyaXB0aW9uO1xuICBtdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBpc1RydW5jYXRlZDogYm9vbGVhbjtcblxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiLCBbXCIkZXZlbnRcIl0pXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMud2luZG93UmVzaXplJC5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cbiAgLyoqXG4gICAqIEhpZGUgdGhlIG9yaWdpbmFsIHRleHQgY29udGVudCB1bnRpbCB3ZSd2ZSBmaW5pc2hlZCB0aGUgdHJ1bmNhdGlvblxuICAgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQkLnBpcGUoc2tpcCgxKSkuc3Vic2NyaWJlKGRpc2FibGUgPT4ge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgZWxlbWVudENsb25lLCB0aGVuIHJlY292ZXJcbiAgICAgIGlmICghIXRoaXMuZWxlbWVudENsb25lKSB7XG4gICAgICAgIHRoaXMucHV0YmFja0VsZW1lbnQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpc2FibGUpIHtcbiAgICAgICAgLy8gc2h1dCBkb3duIGxpc3RlbmVyLCBvYnNlcnZlclxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RNdXRhdGlvbk9ic2VydmVyKCk7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdFdpbmRvd0xpc2VuZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlLXJlZ2lzdGVyXG4gICAgICAgIHRoaXMudHJ1bmNhdGlvbkluaXQoKTtcbiAgICAgICAgLy8gcmUtZXhlY3V0ZSB0cnVuY2F0aW9uXG4gICAgICAgIHRoaXMudHJ1bmNhdGVXaGVuTmVjZXNzYXJ5KHRoaXMuZWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gZmlyc3QgZW1pdCBoYW5kbGluZ1xuICAgIGlmICghdGhpcy5fZGlzYWJsZWQkLmdldFZhbHVlKCkpIHtcbiAgICAgIHRoaXMudHJ1bmNhdGlvbkluaXQoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy50cnVuY2F0ZVdoZW5OZWNlc3NhcnkodGhpcy5lbGVtZW50KTtcbiAgfVxuXG4gIHRydW5jYXRlV2hlbk5lY2Vzc2FyeShcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICB0cmllczogbnVtYmVyID0gMSxcbiAgICBtYXhUcmllcyA9IHRoaXMuTUFYX1RSSUVTXG4gICkge1xuICAgIGlmICh0aGlzLl9kaXNhYmxlZCQuZ2V0VmFsdWUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBiYWNrdXAgb3JpZ2luYWwgZWxlbWVudCBiZWZvcmUgdHJ1bmNhdGlvblxuICAgIHRoaXMuZWxlbWVudENsb25lID0gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICBpZiAodHJpZXMgPiBtYXhUcmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFsbG93cyBidWZmZXIgcGVyaW9kIGZvciBET00gdG8gYmUgcmVhZHlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNhbGwgdGhlIHRydW5jYXRlIGl0c2VsZiBpZiBDbGllbnQgSGVpZ2h0IGlzIG5vdCByZWFkeVxuICAgICAgaWYgKGVsZW1lbnQuY2xpZW50SGVpZ2h0ID4gMCkge1xuICAgICAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gZ2V0Q29udGVudEhlaWdodChlbGVtZW50KTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IGdldExpbmVIZWlnaHQoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHRhcmdldEhlaWdodCA9IHRoaXMubGluZXMgKiBsaW5lSGVpZ2h0O1xuXG4gICAgICAgIGlmIChjb250ZW50SGVpZ2h0ID4gdGFyZ2V0SGVpZ2h0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRydW5jYXRlKFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICB0aGlzLmxpbmVzLFxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZWxsaXBzaXMsXG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlci5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcih0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gd2hlbiB0aGVyZSBpcyBubyBuZWVkLCBzaW1wbHkgc2hvdyB0aGUgZWxlbWVudCwgZW1pdCBmYWxzZSBhbmQgdW5zdWJzY3JpYmUgZnJvbSBNdXRhdGlvbk9ic2VydmVyIGlmIGB3YXRjaENoYW5nZXNgIHByb3Agd2FzIGZhbHN5XG4gICAgICAgICAgdGhpcy5oYW5kbGVyKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBoYW5kbGVyKGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzVHJ1bmNhdGVkID0gZTtcbiAgICB0aGlzLmhhc1RydW5jYXRlZC5lbWl0KHRoaXMuaXNUcnVuY2F0ZWQpO1xuXG4gICAgaWYgKCF0aGlzLndhdGNoQ2hhbmdlcykge1xuICAgICAgdGhpcy5vYnNlcnZlckZsYWcgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlzY29ubmVjdE11dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLmVsZW1lbnQsIFwidmlzaWJpbGl0eVwiKTtcbiAgfVxuXG4gIHRydW5jYXRpb25Jbml0KCkge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50LCBcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIik7XG4gICAgdGhpcy5pbml0V2luZG93UmVzaXplTGlzdGVuZXIodGhpcy5lbGVtZW50KTtcbiAgICB0aGlzLmluaXRNdXRhdGlvbk9ic2VydmVyKHRoaXMuZWxlbWVudCk7XG4gIH1cblxuICBwdXRiYWNrRWxlbWVudCgpIHtcbiAgICAvLyBncmFiIG9sZCBjaGlsZCBub2Rlc1xuICAgIGNvbnN0IGNoaWxkTm9kZXM6IE5vZGVbXSA9IEFycmF5LmZyb20odGhpcy5lbGVtZW50Q2xvbmUuY2hpbGROb2Rlcyk7XG4gICAgLy8gY2xlYW4gZWxlbWVudFxuICAgIHdoaWxlICh0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBwdXNoIGNoaWxkIG5vZGUgdG8gZWxlbWVudCBzaGVsbFxuICAgIGNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudENsb25lID0gbnVsbDtcbiAgfVxuXG4gIGluaXRXaW5kb3dSZXNpemVMaXN0ZW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMud2luZG93TGlzdGVuZXIgPSB0aGlzLndpbmRvd1Jlc2l6ZSRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xuICAgICAgICB0aGlzLnB1dGJhY2tFbGVtZW50KCk7XG4gICAgICAgIHRoaXMudHJ1bmNhdGVXaGVuTmVjZXNzYXJ5KGVsZW1lbnQpO1xuICAgICAgfSk7XG4gIH1cblxuICBpbml0TXV0YXRpb25PYnNlcnZlcihlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9ic2VydmVyRmxhZykge1xuICAgICAgICB0aGlzLnRydW5jYXRlV2hlbk5lY2Vzc2FyeShlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHtcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgZGlzY29ubmVjdE11dGF0aW9uT2JzZXJ2ZXIoKSB7XG4gICAgaWYgKHRoaXMubXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0V2luZG93TGlzZW5lcigpIHtcbiAgICBpZiAodGhpcy53aW5kb3dMaXN0ZW5lcikge1xuICAgICAgdGhpcy53aW5kb3dMaXN0ZW5lci51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rpc2FibGVkJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZGlzY29ubmVjdE11dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICB0aGlzLmRpc2Nvbm5lY3RXaW5kb3dMaXNlbmVyKCk7XG4gIH1cbn1cbiJdfQ==