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
JavaScript
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==