@nova-ui/bits
Version:
SolarWinds Nova Framework
136 lines • 21.5 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { EventEmitter, Injectable, NgZone, } from "@angular/core";
import { ChipComponent } from "./chip/chip.component";
import * as i0 from "@angular/core";
export class ChipsOverflowService {
constructor(zone) {
this.zone = zone;
this.chipsOverflowed = new EventEmitter();
}
init() {
this.initChipResizeObserver();
this.initChipsMutationObserver();
}
handleOverflow() {
this.overflowedChips = {
flatItems: [],
groupedItems: [],
};
this.processChipsOverflow();
this.chipsOverflowed.emit(this.overflowedChips);
}
onDestroy() {
this.chipResizeObserver?.disconnect();
this.chipsMutationObserver?.disconnect();
}
initChipResizeObserver() {
if (!this.allChips.first) {
return;
}
this.chipResizeObserver = new ResizeObserver(() => {
this.zone.run(() => this.handleOverflow());
});
// Rendering occurs gradually, so we tracking every dimension change, to calculate overflow items correctly
// to avoid case when Overflow Counter renders on the next line. Observing occurs only on first item, but it
// also indicates that other items on the same level of DOM is also rendered
this.chipResizeObserver.observe(this.getNativeElement(this.allChips.first));
}
initChipsMutationObserver() {
const config = { childList: true };
this.chipsMutationObserver = new MutationObserver(() => this.handleOverflow());
this.chipsMutationObserver.observe(this.mainCell.nativeElement, config);
}
processChipsOverflow() {
let acc = 0;
let renderedLines = 1;
let chipsOverflow = false;
const rowMaxWidth = this.getRowWidth();
const counterWidth = this.overflowCounter?.nativeElement.getBoundingClientRect().width ||
0;
this.allChips.toArray().forEach((item) => {
const chipElement = this.getNativeElement(item);
chipElement.style.display = "inline";
const chipElementWidth = chipElement.getBoundingClientRect().width;
const isLastLine = () => renderedLines === this.overflowLinesNumber;
if (!isLastLine() && acc + chipElementWidth > rowMaxWidth) {
renderedLines++;
acc = 0;
}
if (isLastLine() &&
acc + chipElementWidth + counterWidth > rowMaxWidth) {
acc = 0;
chipsOverflow = true;
if (!chipsOverflow) {
renderedLines++;
}
}
acc += chipElementWidth;
if (isLastLine() && chipsOverflow) {
chipElement.style.display = "none";
this.updateOverflowChips(item);
}
});
}
updateOverflowChips(item) {
const chip = this.findChipItem(item);
if (chip?.inFlat) {
this.overflowedChips.flatItems?.push(item.item);
}
if (chip?.inGroup) {
const groupId = this.itemsSource.groupedItems?.indexOf(chip.inGroup);
const existingGroup = this.overflowedChips.groupedItems?.find((group) => group.id === `group${groupId}`);
if (existingGroup) {
existingGroup.items.push(item.item);
return;
}
this.overflowedChips.groupedItems?.push({
id: `group${groupId}`,
items: [item.item],
label: chip.inGroup.label,
});
}
}
findChipItem(item) {
if (!(item instanceof ChipComponent)) {
return;
}
const inFlat = this.itemsSource.flatItems?.find((i) => i === item.item);
const inGroup = this.itemsSource.groupedItems?.find((group) => group.items.find((i) => i === item.item));
return { inFlat, inGroup };
}
getNativeElement(item) {
return item instanceof ChipComponent
? item.host.nativeElement
: item.nativeElement;
}
getRowWidth() {
return (this.nuiChips?.nativeElement.getBoundingClientRect().width -
this.clearAll?.nativeElement.getBoundingClientRect().width -
parseFloat(getComputedStyle(this.nuiChips?.nativeElement).paddingLeft) -
parseFloat(getComputedStyle(this.nuiChips?.nativeElement).paddingRight));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChipsOverflowService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChipsOverflowService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChipsOverflowService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i0.NgZone }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcHMtb3ZlcmZsb3cuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2hpcHMvY2hpcHMtb3ZlcmZsb3cuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUVILFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFJdEQsTUFBTSxPQUFPLG9CQUFvQjtJQWU3QixZQUFvQixJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtRQVB6QixvQkFBZSxHQUNsQixJQUFJLFlBQVksRUFBcUIsQ0FBQztJQU1QLENBQUM7SUFFN0IsSUFBSTtRQUNQLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxjQUFjO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDbkIsU0FBUyxFQUFFLEVBQUU7WUFDYixZQUFZLEVBQUUsRUFBRTtTQUNuQixDQUFDO1FBRUYsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTSxTQUFTO1FB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QUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDMUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQzNDLENBQUM7UUFDRixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFnQztRQUNyRCxPQUFPLElBQUksWUFBWSxhQUFhO1lBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFDekIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDN0IsQ0FBQztJQUVPLFdBQVc7UUFDZixPQUFPLENBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLO1lBQzFELElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSztZQUMxRCxVQUFVLENBQ04sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxXQUFXLENBQzdEO1lBQ0QsVUFBVSxDQUNOLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUM5RCxDQUNKLENBQUM7SUFDTixDQUFDOytHQWpLUSxvQkFBb0I7bUhBQXBCLG9CQUFvQjs7NEZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdGFibGUsXG4gICAgTmdab25lLFxuICAgIFF1ZXJ5TGlzdCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgQ2hpcENvbXBvbmVudCB9IGZyb20gXCIuL2NoaXAvY2hpcC5jb21wb25lbnRcIjtcbmltcG9ydCB7IElDaGlwc0dyb3VwLCBJQ2hpcHNJdGVtLCBJQ2hpcHNJdGVtc1NvdXJjZSB9IGZyb20gXCIuL3B1YmxpYy1hcGlcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENoaXBzT3ZlcmZsb3dTZXJ2aWNlIHtcbiAgICBwdWJsaWMgaXRlbXNTb3VyY2U6IElDaGlwc0l0ZW1zU291cmNlO1xuICAgIHB1YmxpYyBtYWluQ2VsbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgcHVibGljIGNsZWFyQWxsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgICBwdWJsaWMgbnVpQ2hpcHM6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIHB1YmxpYyBhbGxDaGlwczogUXVlcnlMaXN0PENoaXBDb21wb25lbnQgfCBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XG4gICAgcHVibGljIG92ZXJmbG93Q291bnRlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgcHVibGljIG92ZXJmbG93TGluZXNOdW1iZXI6IG51bWJlcjtcbiAgICBwdWJsaWMgY2hpcHNPdmVyZmxvd2VkOiBFdmVudEVtaXR0ZXI8SUNoaXBzSXRlbXNTb3VyY2U+ID1cbiAgICAgICAgbmV3IEV2ZW50RW1pdHRlcjxJQ2hpcHNJdGVtc1NvdXJjZT4oKTtcblxuICAgIHByaXZhdGUgb3ZlcmZsb3dlZENoaXBzOiBJQ2hpcHNJdGVtc1NvdXJjZTtcbiAgICBwcml2YXRlIGNoaXBSZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XG4gICAgcHJpdmF0ZSBjaGlwc011dGF0aW9uT2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSkge31cblxuICAgIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluaXRDaGlwUmVzaXplT2JzZXJ2ZXIoKTtcbiAgICAgICAgdGhpcy5pbml0Q2hpcHNNdXRhdGlvbk9ic2VydmVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZU92ZXJmbG93KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm92ZXJmbG93ZWRDaGlwcyA9IHtcbiAgICAgICAgICAgIGZsYXRJdGVtczogW10sXG4gICAgICAgICAgICBncm91cGVkSXRlbXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucHJvY2Vzc0NoaXBzT3ZlcmZsb3coKTtcbiAgICAgICAgdGhpcy5jaGlwc092ZXJmbG93ZWQuZW1pdCh0aGlzLm92ZXJmbG93ZWRDaGlwcyk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGlwUmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5jaGlwc011dGF0aW9uT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRDaGlwUmVzaXplT2JzZXJ2ZXIoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5hbGxDaGlwcy5maXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGlwUmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLmhhbmRsZU92ZXJmbG93KCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gUmVuZGVyaW5nIG9jY3VycyBncmFkdWFsbHksIHNvIHdlIHRyYWNraW5nIGV2ZXJ5IGRpbWVuc2lvbiBjaGFuZ2UsIHRvIGNhbGN1bGF0ZSBvdmVyZmxvdyBpdGVtcyBjb3JyZWN0bHlcbiAgICAgICAgLy8gdG8gYXZvaWQgY2FzZSB3aGVuIE92ZXJmbG93IENvdW50ZXIgcmVuZGVycyBvbiB0aGUgbmV4dCBsaW5lLiBPYnNlcnZpbmcgb2NjdXJzIG9ubHkgb24gZmlyc3QgaXRlbSwgYnV0IGl0XG4gICAgICAgIC8vIGFsc28gaW5kaWNhdGVzIHRoYXQgb3RoZXIgaXRlbXMgb24gdGhlIHNhbWUgbGV2ZWwgb2YgRE9NIGlzIGFsc28gcmVuZGVyZWRcbiAgICAgICAgdGhpcy5jaGlwUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShcbiAgICAgICAgICAgIHRoaXMuZ2V0TmF0aXZlRWxlbWVudCh0aGlzLmFsbENoaXBzLmZpcnN0KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdENoaXBzTXV0YXRpb25PYnNlcnZlcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0geyBjaGlsZExpc3Q6IHRydWUgfTtcbiAgICAgICAgdGhpcy5jaGlwc011dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVPdmVyZmxvdygpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2hpcHNNdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5tYWluQ2VsbC5uYXRpdmVFbGVtZW50LCBjb25maWcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc0NoaXBzT3ZlcmZsb3coKTogdm9pZCB7XG4gICAgICAgIGxldCBhY2MgPSAwO1xuICAgICAgICBsZXQgcmVuZGVyZWRMaW5lcyA9IDE7XG4gICAgICAgIGxldCBjaGlwc092ZXJmbG93ID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgcm93TWF4V2lkdGggPSB0aGlzLmdldFJvd1dpZHRoKCk7XG4gICAgICAgIGNvbnN0IGNvdW50ZXJXaWR0aCA9XG4gICAgICAgICAgICB0aGlzLm92ZXJmbG93Q291bnRlcj8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB8fFxuICAgICAgICAgICAgMDtcblxuICAgICAgICB0aGlzLmFsbENoaXBzLnRvQXJyYXkoKS5mb3JFYWNoKChpdGVtOiBFbGVtZW50UmVmIHwgQ2hpcENvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hpcEVsZW1lbnQgPSB0aGlzLmdldE5hdGl2ZUVsZW1lbnQoaXRlbSk7XG4gICAgICAgICAgICBjaGlwRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmVcIjtcbiAgICAgICAgICAgIGNvbnN0IGNoaXBFbGVtZW50V2lkdGggPSBjaGlwRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdExpbmUgPSAoKSA9PiByZW5kZXJlZExpbmVzID09PSB0aGlzLm92ZXJmbG93TGluZXNOdW1iZXI7XG5cbiAgICAgICAgICAgIGlmICghaXNMYXN0TGluZSgpICYmIGFjYyArIGNoaXBFbGVtZW50V2lkdGggPiByb3dNYXhXaWR0aCkge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVkTGluZXMrKztcbiAgICAgICAgICAgICAgICBhY2MgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaXNMYXN0TGluZSgpICYmXG4gICAgICAgICAgICAgICAgYWNjICsgY2hpcEVsZW1lbnRXaWR0aCArIGNvdW50ZXJXaWR0aCA+IHJvd01heFdpZHRoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBhY2MgPSAwO1xuICAgICAgICAgICAgICAgIGNoaXBzT3ZlcmZsb3cgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlwc092ZXJmbG93KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkTGluZXMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFjYyArPSBjaGlwRWxlbWVudFdpZHRoO1xuXG4gICAgICAgICAgICBpZiAoaXNMYXN0TGluZSgpICYmIGNoaXBzT3ZlcmZsb3cpIHtcbiAgICAgICAgICAgICAgICBjaGlwRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVPdmVyZmxvd0NoaXBzKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU92ZXJmbG93Q2hpcHMoaXRlbTogRWxlbWVudFJlZiB8IENoaXBDb21wb25lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2hpcCA9IHRoaXMuZmluZENoaXBJdGVtKGl0ZW0pO1xuXG4gICAgICAgIGlmIChjaGlwPy5pbkZsYXQpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dlZENoaXBzLmZsYXRJdGVtcz8ucHVzaCgoaXRlbSBhcyBDaGlwQ29tcG9uZW50KS5pdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlwPy5pbkdyb3VwKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cElkID0gdGhpcy5pdGVtc1NvdXJjZS5ncm91cGVkSXRlbXM/LmluZGV4T2YoXG4gICAgICAgICAgICAgICAgY2hpcC5pbkdyb3VwXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdHcm91cCA9IHRoaXMub3ZlcmZsb3dlZENoaXBzLmdyb3VwZWRJdGVtcz8uZmluZChcbiAgICAgICAgICAgICAgICAoZ3JvdXApID0+IGdyb3VwLmlkID09PSBgZ3JvdXAke2dyb3VwSWR9YFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nR3JvdXApIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ0dyb3VwLml0ZW1zLnB1c2goKGl0ZW0gYXMgQ2hpcENvbXBvbmVudCkuaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm92ZXJmbG93ZWRDaGlwcy5ncm91cGVkSXRlbXM/LnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBgZ3JvdXAke2dyb3VwSWR9YCxcbiAgICAgICAgICAgICAgICBpdGVtczogWyhpdGVtIGFzIENoaXBDb21wb25lbnQpLml0ZW1dLFxuICAgICAgICAgICAgICAgIGxhYmVsOiBjaGlwLmluR3JvdXAubGFiZWwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZmluZENoaXBJdGVtKFxuICAgICAgICBpdGVtOiBFbGVtZW50UmVmIHwgQ2hpcENvbXBvbmVudFxuICAgICk6IHsgaW5GbGF0PzogSUNoaXBzSXRlbTsgaW5Hcm91cD86IElDaGlwc0dyb3VwIH0gfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoIShpdGVtIGluc3RhbmNlb2YgQ2hpcENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbkZsYXQgPSB0aGlzLml0ZW1zU291cmNlLmZsYXRJdGVtcz8uZmluZCgoaSkgPT4gaSA9PT0gaXRlbS5pdGVtKTtcbiAgICAgICAgY29uc3QgaW5Hcm91cCA9IHRoaXMuaXRlbXNTb3VyY2UuZ3JvdXBlZEl0ZW1zPy5maW5kKChncm91cCkgPT5cbiAgICAgICAgICAgIGdyb3VwLml0ZW1zLmZpbmQoKGkpID0+IGkgPT09IGl0ZW0uaXRlbSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgaW5GbGF0LCBpbkdyb3VwIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROYXRpdmVFbGVtZW50KGl0ZW06IENoaXBDb21wb25lbnQgfCBFbGVtZW50UmVmKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gaXRlbSBpbnN0YW5jZW9mIENoaXBDb21wb25lbnRcbiAgICAgICAgICAgID8gaXRlbS5ob3N0Lm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgIDogaXRlbS5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Um93V2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMubnVpQ2hpcHM/Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLVxuICAgICAgICAgICAgdGhpcy5jbGVhckFsbD8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtXG4gICAgICAgICAgICBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUodGhpcy5udWlDaGlwcz8ubmF0aXZlRWxlbWVudCkucGFkZGluZ0xlZnRcbiAgICAgICAgICAgICkgLVxuICAgICAgICAgICAgcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKHRoaXMubnVpQ2hpcHM/Lm5hdGl2ZUVsZW1lbnQpLnBhZGRpbmdSaWdodFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==