UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

130 lines 17.7 kB
import { __decorate, __metadata } from "tslib"; import { Directive, HostListener, Injector } from '@angular/core'; import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators'; import { KeyCode } from '@microsoft/windows-admin-center-sdk/core/data/accessibility-manager'; import { LogLevel } from '@microsoft/windows-admin-center-sdk/core/diagnostics/log-level'; import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom'; import { CoreBaseComponent } from '../common/base.component'; import { TooltipHostInstance } from './tooltip-host-instance'; import * as i0 from "@angular/core"; export class TooltipZoneDirective extends CoreBaseComponent { constructor(injector) { super(injector); this.isViewLoaded = false; this.isObserving = false; } /** * The source name to use for logging */ get logSourceName() { return 'TooltipZoneDirective'; } onShortcut(event) { if (event.keyCode === KeyCode.F1 && event.altKey) { if (this.tooltipDirective) { if (!this.tooltipDirective.shown) { this.tooltipDirective.show(true); event.stopImmediatePropagation(); } else { this.tooltipDirective.hide(); } } } } onFocusChange() { // The tooltip is using a template, handle the focusout event properly if template has tab index if (this.tooltipDirective) { event.stopImmediatePropagation(); if (!TooltipHostInstance.activeHost.isFocused) { this.tooltipDirective.hide(); } } } ngOnInit() { this.mutationObserver = new MutationObserver(mutations => { mutations.forEach(() => { /* Observe when a node is added or removed. If this occurs then reset which element will have the aria-keyshortcuts attribute so the first focusable element will only have it.*/ this.unsetAriaShortcutAttribute(); this.setAriaShortcutAttribute(); }); }); } ngAfterViewInit() { this.isViewLoaded = true; this.startObserving(); } ngOnDestroy() { this.stopObserving(); this.unsetAriaShortcutAttribute(); } registerTooltipDirective(tooltipDirective) { this.tooltipDirective = tooltipDirective; this.setAriaShortcutAttribute(); this.startObserving(); } unregisterTooltipDirective() { this.tooltipDirective = null; this.unsetAriaShortcutAttribute(); this.stopObserving(); } startObserving() { // Only start observing if there is a tooltip associated with this zone // and the view has had the initial load. if (this.tooltipDirective && this.isViewLoaded && !this.isObserving && this.mutationObserver) { this.isObserving = true; this.mutationObserver.observe(this.hostElement.nativeElement, { childList: true, subtree: true }); } } stopObserving() { if (this.mutationObserver && this.isObserving) { this.mutationObserver.disconnect(); this.isObserving = false; } } // Add debounce to allow the content of the tooltip zone to load before finding a focusable element setAriaShortcutAttribute() { this.focusableZoneElement = Dom.getFirstElement(this.hostElement.nativeElement, element => Dom.isFocusPossible(element), element => !!element.getAttribute('smeTooltipZone')); if (this.focusableZoneElement) { this.focusableZoneElement.setAttribute('aria-keyshortcuts', this.strings.MsftSmeShell.Angular.TooltipZone.Aria.keyShortcuts); } else { this.log('A tooltip zone must have a child element that is focusable for keyboard accessibility', LogLevel.Error, { TooltipZone: this.hostElement.nativeElement }); } } unsetAriaShortcutAttribute() { if (this.focusableZoneElement) { this.focusableZoneElement.removeAttribute('aria-keyshortcuts'); this.focusableZoneElement = null; } } } /** @nocollapse */ TooltipZoneDirective.ɵfac = function TooltipZoneDirective_Factory(t) { return new (t || TooltipZoneDirective)(i0.ɵɵdirectiveInject(i0.Injector)); }; /** @nocollapse */ TooltipZoneDirective.ɵdir = /** @pureOrBreakMyCode */ i0.ɵɵdefineDirective({ type: TooltipZoneDirective, selectors: [["", "smeTooltipZone", ""]], hostBindings: function TooltipZoneDirective_HostBindings(rf, ctx) { if (rf & 1) { i0.ɵɵlistener("keydown", function TooltipZoneDirective_keydown_HostBindingHandler($event) { return ctx.onShortcut($event); })("focusout", function TooltipZoneDirective_focusout_HostBindingHandler() { return ctx.onFocusChange(); }); } }, exportAs: ["smeTooltipZone"], features: [i0.ɵɵInheritDefinitionFeature] }); __decorate([ Debounce(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], TooltipZoneDirective.prototype, "setAriaShortcutAttribute", null); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TooltipZoneDirective, [{ type: Directive, args: [{ selector: '[smeTooltipZone]', exportAs: 'smeTooltipZone' }] }], function () { return [{ type: i0.Injector }]; }, { onShortcut: [{ type: HostListener, args: ['keydown', ['$event']] }], onFocusChange: [{ type: HostListener, args: ['focusout'] }], setAriaShortcutAttribute: [] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC16b25lLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3Rvb2x0aXAvdG9vbHRpcC16b25lLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxZQUFZLEVBQ1osUUFBUSxFQUdYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDOUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFNOUQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGlCQUFpQjtJQXdDdkQsWUFBWSxRQUFrQjtRQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUE3QlosaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUE2QjVCLENBQUM7SUF4Q0Q7O09BRUc7SUFDSCxJQUFjLGFBQWE7UUFDdkIsT0FBTyxzQkFBc0IsQ0FBQztJQUNsQyxDQUFDO0lBU00sVUFBVSxDQUFDLEtBQW9CO1FBQ2xDLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDOUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO29CQUM5QixJQUFJ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LFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNoSTthQUFNO1lBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FDSix1RkFBdUYsRUFDdkYsUUFBUSxDQUFDLEtBQUssRUFDZCxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUNsRCxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRU8sMEJBQTBCO1FBQzlCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzNCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1NBQ3BDO0lBQ0wsQ0FBQzs7MkdBMUhRLG9CQUFvQjtzR0FBcEIsb0JBQW9COzJHQUFwQixzQkFBa0Isc0ZBQWxCLG1CQUFlOztBQWtHeEI7SUFBQyxRQUFRLEVBQUU7Ozs7b0VBaUJWO3VGQW5IUSxvQkFBb0I7Y0FKaEMsU0FBUztlQUFDO2dCQUNQLFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLFFBQVEsRUFBRSxnQkFBZ0I7YUFDN0I7MkRBaUJVLFVBQVU7a0JBRGhCLFlBQVk7bUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1lBZTVCLGFBQWE7a0JBRG5CLFlBQVk7bUJBQUMsVUFBVTtZQXNFaEIsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBIb3N0TGlzdGVuZXIsXHJcbiAgICBJbmplY3RvcixcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBLZXlDb2RlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2FjY2Vzc2liaWxpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy9sb2ctbGV2ZWwnO1xyXG5pbXBvcnQgeyBEb20gfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RvbS9kb20nO1xyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRvb2x0aXBIb3N0SW5zdGFuY2UgfSBmcm9tICcuL3Rvb2x0aXAtaG9zdC1pbnN0YW5jZSc7XHJcbmltcG9ydCB7IFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICcuL3Rvb2x0aXAuZGlyZWN0aXZlJztcclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1tzbWVUb29sdGlwWm9uZV0nLFxyXG4gICAgZXhwb3J0QXM6ICdzbWVUb29sdGlwWm9uZSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRvb2x0aXBab25lRGlyZWN0aXZlIGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ1Rvb2x0aXBab25lRGlyZWN0aXZlJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvb2x0aXBEaXJlY3RpdmU6IFRvb2x0aXBEaXJlY3RpdmU7XHJcbiAgICBwcml2YXRlIGZvY3VzYWJsZVpvbmVFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcclxuICAgIHByaXZhdGUgaXNWaWV3TG9hZGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGlzT2JzZXJ2aW5nID0gZmFsc2U7XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBwdWJsaWMgb25TaG9ydGN1dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLkYxICYmIGV2ZW50LmFsdEtleSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50b29sdGlwRGlyZWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudG9vbHRpcERpcmVjdGl2ZS5zaG93bikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcERpcmVjdGl2ZS5zaG93KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBEaXJlY3RpdmUuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3Vzb3V0JylcclxuICAgIHB1YmxpYyBvbkZvY3VzQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFRoZSB0b29sdGlwIGlzIHVzaW5nIGEgdGVtcGxhdGUsIGhhbmRsZSB0aGUgZm9jdXNvdXQgZXZlbnQgcHJvcGVybHkgaWYgdGVtcGxhdGUgaGFzIHRhYiBpbmRleFxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBEaXJlY3RpdmUpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmICghVG9vbHRpcEhvc3RJbnN0YW5jZS5hY3RpdmVIb3N0LmlzRm9jdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwRGlyZWN0aXZlLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8qICBPYnNlcnZlIHdoZW4gYSBub2RlIGlzIGFkZGVkIG9yIHJlbW92ZWQuIElmIHRoaXMgb2NjdXJzIHRoZW4gcmVzZXQgd2hpY2ggZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIHdpbGwgaGF2ZSB0aGUgYXJpYS1rZXlzaG9ydGN1dHMgYXR0cmlidXRlIHNvIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCB3aWxsIG9ubHlcclxuICAgICAgICAgICAgICAgICAgICBoYXZlIGl0LiovXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2V0QXJpYVNob3J0Y3V0QXR0cmlidXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFyaWFTaG9ydGN1dEF0dHJpYnV0ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuaXNWaWV3TG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnN0YXJ0T2JzZXJ2aW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuc3RvcE9ic2VydmluZygpO1xyXG4gICAgICAgIHRoaXMudW5zZXRBcmlhU2hvcnRjdXRBdHRyaWJ1dGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJUb29sdGlwRGlyZWN0aXZlKHRvb2x0aXBEaXJlY3RpdmU6IFRvb2x0aXBEaXJlY3RpdmUpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBEaXJlY3RpdmUgPSB0b29sdGlwRGlyZWN0aXZlO1xyXG4gICAgICAgIHRoaXMuc2V0QXJpYVNob3J0Y3V0QXR0cmlidXRlKCk7XHJcbiAgICAgICAgdGhpcy5zdGFydE9ic2VydmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnJlZ2lzdGVyVG9vbHRpcERpcmVjdGl2ZSgpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBEaXJlY3RpdmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudW5zZXRBcmlhU2hvcnRjdXRBdHRyaWJ1dGUoKTtcclxuICAgICAgICB0aGlzLnN0b3BPYnNlcnZpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0T2JzZXJ2aW5nKCkge1xyXG4gICAgICAgIC8vIE9ubHkgc3RhcnQgb2JzZXJ2aW5nIGlmIHRoZXJlIGlzIGEgdG9vbHRpcCBhc3NvY2lhdGVkIHdpdGggdGhpcyB6b25lXHJcbiAgICAgICAgLy8gYW5kIHRoZSB2aWV3IGhhcyBoYWQgdGhlIGluaXRpYWwgbG9hZC5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwRGlyZWN0aXZlICYmIHRoaXMuaXNWaWV3TG9hZGVkICYmICF0aGlzLmlzT2JzZXJ2aW5nICYmIHRoaXMubXV0YXRpb25PYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLmlzT2JzZXJ2aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LCB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0b3BPYnNlcnZpbmcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubXV0YXRpb25PYnNlcnZlciAmJiB0aGlzLmlzT2JzZXJ2aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNPYnNlcnZpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIGRlYm91bmNlIHRvIGFsbG93IHRoZSBjb250ZW50IG9mIHRoZSB0b29sdGlwIHpvbmUgdG8gbG9hZCBiZWZvcmUgZmluZGluZyBhIGZvY3VzYWJsZSBlbGVtZW50XHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHJpdmF0ZSBzZXRBcmlhU2hvcnRjdXRBdHRyaWJ1dGUoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2FibGVab25lRWxlbWVudCA9IERvbS5nZXRGaXJzdEVsZW1lbnQoXHJcbiAgICAgICAgICAgIDxIVE1MRWxlbWVudD50aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgIGVsZW1lbnQgPT4gRG9tLmlzRm9jdXNQb3NzaWJsZShlbGVtZW50KSxcclxuICAgICAgICAgICAgZWxlbWVudCA9PiAhIWVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzbWVUb29sdGlwWm9uZScpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZm9jdXNhYmxlWm9uZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c2FibGVab25lRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEta2V5c2hvcnRjdXRzJywgdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLlRvb2x0aXBab25lLkFyaWEua2V5U2hvcnRjdXRzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyhcclxuICAgICAgICAgICAgICAgICdBIHRvb2x0aXAgem9uZSBtdXN0IGhhdmUgYSBjaGlsZCBlbGVtZW50IHRoYXQgaXMgZm9jdXNhYmxlIGZvciBrZXlib2FyZCBhY2Nlc3NpYmlsaXR5JyxcclxuICAgICAgICAgICAgICAgIExvZ0xldmVsLkVycm9yLFxyXG4gICAgICAgICAgICAgICAgeyBUb29sdGlwWm9uZTogdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50IH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1bnNldEFyaWFTaG9ydGN1dEF0dHJpYnV0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5mb2N1c2FibGVab25lRWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzYWJsZVpvbmVFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1rZXlzaG9ydGN1dHMnKTtcclxuICAgICAgICAgICAgdGhpcy5mb2N1c2FibGVab25lRWxlbWVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==