UNPKG

carbon-components-angular

Version:
191 lines 21.8 kB
import { ChangeDetectionStrategy, Component, HostBinding, HostListener, Input, TemplateRef, ViewChild } from "@angular/core"; import { PopoverContainer } from "carbon-components-angular/popover"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; /** * Get started with importing the module: * * ```typescript * import { TooltipModule } from 'carbon-components-angular'; * ``` * * [See demo](../../?path=/story/components-tooltip--basic) */ export class Tooltip extends PopoverContainer { constructor(elementRef, ngZone, renderer, changeDetectorRef) { super(elementRef, ngZone, renderer, changeDetectorRef); this.elementRef = elementRef; this.ngZone = ngZone; this.renderer = renderer; this.changeDetectorRef = changeDetectorRef; this.tooltipClass = true; this.id = `tooltip-${Tooltip.tooltipCount++}`; /** * Set delay before tooltip is shown */ this.enterDelayMs = 100; /** * Set delay when tooltip disappears */ this.leaveDelayMs = 300; /** * Prevent tooltip from showing, used by icon button */ this.disabled = false; this.highContrast = true; this.dropShadow = false; } mouseenter(event) { // If a mouseleave is triggered before the tooltip is displayed (before setTimeout of mouseenter completes) // we trigger the mouseleave only avoiding having to unecessary show the tooltip clearTimeout(this.timeoutId); this.timeoutId = setTimeout(() => { this.handleChange(true, event); }, this.enterDelayMs); } mouseleave(event) { // If a mouseleave is triggered before the tooltip is displayed (before setTimeout of mouseenter completes) // we trigger the mouseleave only avoiding having to unecessary show the tooltip clearTimeout(this.timeoutId); this.timeoutId = setTimeout(() => { this.handleChange(false, event); }, this.leaveDelayMs); } hostkeys(event) { if (open && event.key === "Escape") { event.stopPropagation(); this.handleChange(false, event); } } // We are not focusing on entire popover, only the trigger handleFocus(event) { this.handleChange(true, event); } handleFocusOut(event) { this.handleChange(false, event); } isTemplate(value) { return value instanceof TemplateRef; } /** * Close the popover and reopen it with updated values without emitting an event * @param changes */ ngOnChanges(changes) { // Close and reopen the popover, handle alignment/programmatic open/close const originalState = this.isOpen; this.handleChange(false); // Ignore first change since content is not initialized if ((changes.autoAlign && !changes.autoAlign.firstChange) || (changes.disabled && !changes.disabled.firstChange && !changes.disabled.currentValue) // If description is set to empty string when open & autoAlign is true then set to a new value // positioning of popover is broken because popover content ref/caret no longer exists || changes.description) { /** * When `disabled` is `true`, popover content node is removed. So when re-enabling `disabled`, * we manually update view so querySelector can detect the popover content node. * Otherwise, the position of the popover will be incorrect when autoAlign is enabled. */ this.changeDetectorRef.detectChanges(); // Reset the inline styles this.popoverContentRef = this.elementRef.nativeElement.querySelector(".cds--popover-content"); this.popoverContentRef?.setAttribute("style", ""); this.caretRef = this.elementRef.nativeElement.querySelector("span.cds--popover-caret"); } this.handleChange(originalState); } /** * Check for any changes in the projected content & apply accessibility attribute if needed */ ngAfterContentChecked() { if (this.wrapper) { const buttonElement = this.wrapper.nativeElement.querySelector("button"); if (buttonElement && !buttonElement.getAttribute("aria-labelledby")) { buttonElement.setAttribute("aria-labelledby", this.id); } } } } Tooltip.tooltipCount = 0; Tooltip.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Tooltip, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); Tooltip.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: Tooltip, selector: "cds-tooltip, ibm-tooltip", inputs: { id: "id", enterDelayMs: "enterDelayMs", leaveDelayMs: "leaveDelayMs", disabled: "disabled", description: "description", templateContext: "templateContext" }, host: { listeners: { "mouseenter": "mouseenter($event)", "mouseleave": "mouseleave($event)", "keyup": "hostkeys($event)", "focusin": "handleFocus($event)", "focusout": "handleFocusOut($event)" }, properties: { "class.cds--tooltip": "this.tooltipClass" } }, viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["contentWrapper"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: ` <span #contentWrapper> <ng-content></ng-content> </span> <span *ngIf="description" class="cds--popover" [id]="id" [attr.aria-hidden]="!isOpen" role="tooltip"> <ng-container *ngIf="!disabled"> <span class="cds--popover-content cds--tooltip-content"> <ng-container *ngIf="!isTemplate(description)">{{description}}</ng-container> <ng-template *ngIf="isTemplate(description)" [ngTemplateOutlet]="description" [ngTemplateOutletContext]="{ $implicit: templateContext }"></ng-template> <span *ngIf="autoAlign" class="cds--popover-caret cds--popover--auto-align"></span> </span> <span *ngIf="!autoAlign" class="cds--popover-caret"></span> </ng-container> </span> `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Tooltip, decorators: [{ type: Component, args: [{ selector: "cds-tooltip, ibm-tooltip", changeDetection: ChangeDetectionStrategy.OnPush, template: ` <span #contentWrapper> <ng-content></ng-content> </span> <span *ngIf="description" class="cds--popover" [id]="id" [attr.aria-hidden]="!isOpen" role="tooltip"> <ng-container *ngIf="!disabled"> <span class="cds--popover-content cds--tooltip-content"> <ng-container *ngIf="!isTemplate(description)">{{description}}</ng-container> <ng-template *ngIf="isTemplate(description)" [ngTemplateOutlet]="description" [ngTemplateOutletContext]="{ $implicit: templateContext }"></ng-template> <span *ngIf="autoAlign" class="cds--popover-caret cds--popover--auto-align"></span> </span> <span *ngIf="!autoAlign" class="cds--popover-caret"></span> </ng-container> </span> ` }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { tooltipClass: [{ type: HostBinding, args: ["class.cds--tooltip"] }], id: [{ type: Input }], enterDelayMs: [{ type: Input }], leaveDelayMs: [{ type: Input }], disabled: [{ type: Input }], description: [{ type: Input }], templateContext: [{ type: Input }], wrapper: [{ type: ViewChild, args: ["contentWrapper"] }], mouseenter: [{ type: HostListener, args: ["mouseenter", ["$event"]] }], mouseleave: [{ type: HostListener, args: ["mouseleave", ["$event"]] }], hostkeys: [{ type: HostListener, args: ["keyup", ["$event"]] }], handleFocus: [{ type: HostListener, args: ["focusin", ["$event"]] }], handleFocusOut: [{ type: HostListener, args: ["focusout", ["$event"]] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHRpcC90b29sdGlwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFLTCxXQUFXLEVBQ1gsU0FBUyxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7QUFFckU7Ozs7Ozs7O0dBUUc7QUF5QkgsTUFBTSxPQUFPLE9BQVEsU0FBUSxnQkFBZ0I7SUErQjVDLFlBQ1csVUFBc0IsRUFDdEIsTUFBYyxFQUNkLFFBQW1CLEVBQ25CLGlCQUFvQztRQUU5QyxLQUFLLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUw3QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFoQ1osaUJBQVksR0FBRyxJQUFJLENBQUM7UUFFOUMsT0FBRSxHQUFHLFdBQVcsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7UUFDbEQ7O1dBRUc7UUFDTSxpQkFBWSxHQUFHLEdBQUcsQ0FBQztRQUM1Qjs7V0FFRztRQUNNLGlCQUFZLEdBQUcsR0FBRyxDQUFDO1FBQzVCOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQXFCekIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUdELFVBQVUsQ0FBQyxLQUFLO1FBQ2YsMkdBQTJHO1FBQzNHLGdGQUFnRjtRQUNoRixZQUFZLENBQUMs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RDtTQUNEO0lBQ0YsQ0FBQzs7QUEvSE0sb0JBQVksR0FBRyxDQUFDLENBQUM7b0dBRFosT0FBTzt3RkFBUCxPQUFPLGdvQkFyQlQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFtQlQ7MkZBRVcsT0FBTztrQkF4Qm5CLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLDBCQUEwQjtvQkFDcEMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1CVDtpQkFDRDs4S0FJbUMsWUFBWTtzQkFBOUMsV0FBVzt1QkFBQyxvQkFBb0I7Z0JBRXhCLEVBQUU7c0JBQVYsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRXVCLE9BQU87c0JBQW5DLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQWdCM0IsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXdEMsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXdEMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVakMsV0FBVztzQkFEVixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFNbkMsY0FBYztzQkFEYixZQUFZO3VCQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdEFmdGVyQ29udGVudENoZWNrZWQsXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0Q29tcG9uZW50LFxuXHRFbGVtZW50UmVmLFxuXHRIb3N0QmluZGluZyxcblx0SG9zdExpc3RlbmVyLFxuXHRJbnB1dCxcblx0Tmdab25lLFxuXHRPbkNoYW5nZXMsXG5cdFJlbmRlcmVyMixcblx0U2ltcGxlQ2hhbmdlcyxcblx0VGVtcGxhdGVSZWYsXG5cdFZpZXdDaGlsZFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgUG9wb3ZlckNvbnRhaW5lciB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL3BvcG92ZXJcIjtcblxuLyoqXG4gKiBHZXQgc3RhcnRlZCB3aXRoIGltcG9ydGluZyB0aGUgbW9kdWxlOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbiAqIGBgYFxuICpcbiAqIFtTZWUgZGVtb10oLi4vLi4vP3BhdGg9L3N0b3J5L2NvbXBvbmVudHMtdG9vbHRpcC0tYmFzaWMpXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtdG9vbHRpcCwgaWJtLXRvb2x0aXBcIixcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PHNwYW4gI2NvbnRlbnRXcmFwcGVyPlxuXHRcdFx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXHRcdDwvc3Bhbj5cblx0XHQ8c3BhblxuXHRcdFx0Km5nSWY9XCJkZXNjcmlwdGlvblwiXG5cdFx0XHRjbGFzcz1cImNkcy0tcG9wb3ZlclwiXG5cdFx0XHRbaWRdPVwiaWRcIlxuXHRcdFx0W2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzT3BlblwiXG5cdFx0XHRyb2xlPVwidG9vbHRpcFwiPlxuXHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkaXNhYmxlZFwiPlxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cImNkcy0tcG9wb3Zlci1jb250ZW50IGNkcy0tdG9vbHRpcC1jb250ZW50XCI+XG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGRlc2NyaXB0aW9uKVwiPnt7ZGVzY3JpcHRpb259fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUoZGVzY3JpcHRpb24pXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGVzY3JpcHRpb25cIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHRlbXBsYXRlQ29udGV4dCB9XCI+PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImF1dG9BbGlnblwiIGNsYXNzPVwiY2RzLS1wb3BvdmVyLWNhcmV0IGNkcy0tcG9wb3Zlci0tYXV0by1hbGlnblwiPjwvc3Bhbj5cblx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHQ8c3BhbiAqbmdJZj1cIiFhdXRvQWxpZ25cIiBjbGFzcz1cImNkcy0tcG9wb3Zlci1jYXJldFwiPjwvc3Bhbj5cblx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDwvc3Bhbj5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBUb29sdGlwIGV4dGVuZHMgUG9wb3ZlckNvbnRhaW5lciBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XG5cdHN0YXRpYyB0b29sdGlwQ291bnQgPSAwO1xuXG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tdG9vbHRpcFwiKSB0b29sdGlwQ2xhc3MgPSB0cnVlO1xuXG5cdEBJbnB1dCgpIGlkID0gYHRvb2x0aXAtJHtUb29sdGlwLnRvb2x0aXBDb3VudCsrfWA7XG5cdC8qKlxuXHQgKiBTZXQgZGVsYXkgYmVmb3JlIHRvb2x0aXAgaXMgc2hvd25cblx0ICovXG5cdEBJbnB1dCgpIGVudGVyRGVsYXlNcyA9IDEwMDtcblx0LyoqXG5cdCAqIFNldCBkZWxheSB3aGVuIHRvb2x0aXAgZGlzYXBwZWFyc1xuXHQgKi9cblx0QElucHV0KCkgbGVhdmVEZWxheU1zID0gMzAwO1xuXHQvKipcblx0ICogUHJldmVudCB0b29sdGlwIGZyb20gc2hvd2luZywgdXNlZCBieSBpY29uIGJ1dHRvblxuXHQgKi9cblx0QElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcblx0LyoqXG5cdCAqIFRoZSBzdHJpbmcgb3IgdGVtcGxhdGUgY29udGVudCB0byBiZSBleHBvc2VkIGJ5IHRoZSB0b29sdGlwLlxuXHQgKi9cblx0QElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG5cdC8qKlxuXHQgKiBPcHRpb25hbCBkYXRhIGZvciB0ZW1wbGF0ZXMgcGFzc2VkIGFzIGltcGxpY2l0IGNvbnRleHRcblx0ICovXG5cdEBJbnB1dCgpIHRlbXBsYXRlQ29udGV4dDogYW55O1xuXG5cdEBWaWV3Q2hpbGQoXCJjb250ZW50V3JhcHBlclwiKSB3cmFwcGVyOiBFbGVtZW50UmVmPEhUTUxTcGFuRWxlbWVudD47XG5cblx0cHJpdmF0ZSB0aW1lb3V0SWQ6IGFueTsgLy8gaXQgc2hvdWxkIGJlIG51bWJlciwgYnV0IHNldFRpbWVvdXQgYmVsb3cgaXMgbWF0Y2hpbmcgdGhlIE5vZGVKcyB0eXBlIGluc3RlYWQgb2YgdGhlIEpTIHR5cGVcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZixcblx0XHRwcm90ZWN0ZWQgbmdab25lOiBOZ1pvbmUsXG5cdFx0cHJvdGVjdGVkIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG5cdFx0cHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuXHQpIHtcblx0XHRzdXBlcihlbGVtZW50UmVmLCBuZ1pvbmUsIHJlbmRlcmVyLCBjaGFuZ2VEZXRlY3RvclJlZik7XG5cdFx0dGhpcy5oaWdoQ29udHJhc3QgPSB0cnVlO1xuXHRcdHRoaXMuZHJvcFNoYWRvdyA9IGZhbHNlO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgW1wiJGV2ZW50XCJdKVxuXHRtb3VzZWVudGVyKGV2ZW50KSB7XG5cdFx0Ly8gSWYgYSBtb3VzZWxlYXZlIGlzIHRyaWdnZXJlZCBiZWZvcmUgdGhlIHRvb2x0aXAgaXMgZGlzcGxheWVkIChiZWZvcmUgc2V0VGltZW91dCBvZiBtb3VzZWVudGVyIGNvbXBsZXRlcylcblx0XHQvLyB3ZSB0cmlnZ2VyIHRoZSBtb3VzZWxlYXZlIG9ubHkgYXZvaWRpbmcgaGF2aW5nIHRvIHVuZWNlc3Nhcnkgc2hvdyB0aGUgdG9vbHRpcFxuXHRcdGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XG5cdFx0dGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXMuaGFuZGxlQ2hhbmdlKHRydWUsIGV2ZW50KTtcblx0XHR9LCB0aGlzLmVudGVyRGVsYXlNcyk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBbXCIkZXZlbnRcIl0pXG5cdG1vdXNlbGVhdmUoZXZlbnQpIHtcblx0XHQvLyBJZiBhIG1vdXNlbGVhdmUgaXMgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgdG9vbHRpcCBpcyBkaXNwbGF5ZWQgKGJlZm9yZSBzZXRUaW1lb3V0IG9mIG1vdXNlZW50ZXIgY29tcGxldGVzKVxuXHRcdC8vIHdlIHRyaWdnZXIgdGhlIG1vdXNlbGVhdmUgb25seSBhdm9pZGluZyBoYXZpbmcgdG8gdW5lY2Vzc2FyeSBzaG93IHRoZSB0b29sdGlwXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcblx0XHR0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy5oYW5kbGVDaGFuZ2UoZmFsc2UsIGV2ZW50KTtcblx0XHR9LCB0aGlzLmxlYXZlRGVsYXlNcyk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwia2V5dXBcIiwgW1wiJGV2ZW50XCJdKVxuXHRob3N0a2V5cyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuXHRcdGlmIChvcGVuICYmIGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHR0aGlzLmhhbmRsZUNoYW5nZShmYWxzZSwgZXZlbnQpO1xuXHRcdH1cblx0fVxuXG5cdC8vIFdlIGFyZSBub3QgZm9jdXNpbmcgb24gZW50aXJlIHBvcG92ZXIsIG9ubHkgdGhlIHRyaWdnZXJcblx0QEhvc3RMaXN0ZW5lcihcImZvY3VzaW5cIiwgW1wiJGV2ZW50XCJdKVxuXHRoYW5kbGVGb2N1cyhldmVudDogRXZlbnQpIHtcblx0XHR0aGlzLmhhbmRsZUNoYW5nZSh0cnVlLCBldmVudCk7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgW1wiJGV2ZW50XCJdKVxuXHRoYW5kbGVGb2N1c091dChldmVudDogRXZlbnQpIHtcblx0XHR0aGlzLmhhbmRsZUNoYW5nZShmYWxzZSwgZXZlbnQpO1xuXHR9XG5cblx0aXNUZW1wbGF0ZSh2YWx1ZSkge1xuXHRcdHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb3NlIHRoZSBwb3BvdmVyIGFuZCByZW9wZW4gaXQgd2l0aCB1cGRhdGVkIHZhbHVlcyB3aXRob3V0IGVtaXR0aW5nIGFuIGV2ZW50XG5cdCAqIEBwYXJhbSBjaGFuZ2VzXG5cdCAqL1xuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG5cdFx0Ly8gQ2xvc2UgYW5kIHJlb3BlbiB0aGUgcG9wb3ZlciwgaGFuZGxlIGFsaWdubWVudC9wcm9ncmFtbWF0aWMgb3Blbi9jbG9zZVxuXHRcdGNvbnN0IG9yaWdpbmFsU3RhdGUgPSB0aGlzLmlzT3Blbjtcblx0XHR0aGlzLmhhbmRsZUNoYW5nZShmYWxzZSk7XG5cblx0XHQvLyBJZ25vcmUgZmlyc3QgY2hhbmdlIHNpbmNlIGNvbnRlbnQgaXMgbm90IGluaXRpYWxpemVkXG5cdFx0aWYgKFxuXHRcdFx0KGNoYW5nZXMuYXV0b0FsaWduICYmICFjaGFuZ2VzLmF1dG9BbGlnbi5maXJzdENoYW5nZSlcblx0XHRcdHx8IChjaGFuZ2VzLmRpc2FibGVkICYmICFjaGFuZ2VzLmRpc2FibGVkLmZpcnN0Q2hhbmdlICYmICFjaGFuZ2VzLmRpc2FibGVkLmN1cnJlbnRWYWx1ZSlcblx0XHRcdC8vIElmIGRlc2NyaXB0aW9uIGlzIHNldCB0byBlbXB0eSBzdHJpbmcgd2hlbiBvcGVuICYgYXV0b0FsaWduIGlzIHRydWUgdGhlbiBzZXQgdG8gYSBuZXcgdmFsdWVcblx0XHRcdC8vIHBvc2l0aW9uaW5nIG9mIHBvcG92ZXIgaXMgYnJva2VuIGJlY2F1c2UgcG9wb3ZlciBjb250ZW50IHJlZi9jYXJldCBubyBsb25nZXIgZXhpc3RzXG5cdFx0XHR8fCBjaGFuZ2VzLmRlc2NyaXB0aW9uXG5cdFx0KSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIFdoZW4gYGRpc2FibGVkYCBpcyBgdHJ1ZWAsIHBvcG92ZXIgY29udGVudCBub2RlIGlzIHJlbW92ZWQuIFNvIHdoZW4gcmUtZW5hYmxpbmcgYGRpc2FibGVkYCxcblx0XHRcdCAqIHdlIG1hbnVhbGx5IHVwZGF0ZSB2aWV3IHNvIHF1ZXJ5U2VsZWN0b3IgY2FuIGRldGVjdCB0aGUgcG9wb3ZlciBjb250ZW50IG5vZGUuXG5cdFx0XHQgKiBPdGhlcndpc2UsIHRoZSBwb3NpdGlvbiBvZiB0aGUgcG9wb3ZlciB3aWxsIGJlIGluY29ycmVjdCB3aGVuIGF1dG9BbGlnbiBpcyBlbmFibGVkLlxuXHRcdFx0ICovXG5cdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcblxuXHRcdFx0Ly8gUmVzZXQgdGhlIGlubGluZSBzdHlsZXNcblx0XHRcdHRoaXMucG9wb3ZlckNvbnRlbnRSZWYgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLmNkcy0tcG9wb3Zlci1jb250ZW50XCIpO1xuXHRcdFx0dGhpcy5wb3BvdmVyQ29udGVudFJlZj8uc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJcIik7XG5cdFx0XHR0aGlzLmNhcmV0UmVmID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcInNwYW4uY2RzLS1wb3BvdmVyLWNhcmV0XCIpO1xuXHRcdH1cblxuXHRcdHRoaXMuaGFuZGxlQ2hhbmdlKG9yaWdpbmFsU3RhdGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGZvciBhbnkgY2hhbmdlcyBpbiB0aGUgcHJvamVjdGVkIGNvbnRlbnQgJiBhcHBseSBhY2Nlc3NpYmlsaXR5IGF0dHJpYnV0ZSBpZiBuZWVkZWRcblx0ICovXG5cdG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcblx0XHRpZiAodGhpcy53cmFwcGVyKSB7XG5cdFx0XHRjb25zdCBidXR0b25FbGVtZW50ID0gdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcImJ1dHRvblwiKTtcblx0XHRcdGlmIChidXR0b25FbGVtZW50ICYmICFidXR0b25FbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuXHRcdFx0XHRidXR0b25FbGVtZW50LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiLCB0aGlzLmlkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiJdfQ==