UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

263 lines • 21.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ContentChild, ElementRef, HostBinding, Input, HostListener } from '@angular/core'; import { IgxTabItemTemplateDirective } from './tabs.directives'; import { IgxTabsBase } from './tabs.common'; export class IgxTabsGroupComponent { /** * @param {?} _tabs * @param {?} _element */ constructor(_tabs, _element) { this._tabs = _tabs; this._element = _element; /** * An \@Input property that allows you to enable/disable the `IgxTabGroupComponent`. * ```html * <igx-tabs-group label="Tab 2 Lorem ipsum dolor sit" icon="home" [disabled]="true"> * ``` */ this.disabled = false; this.isSelected = false; /** * @hidden */ this.role = 'tabpanel'; /** * @hidden */ this.styleClass = true; } /** * @param {?} event * @return {?} */ onResize(event) { if (this.isSelected) { this.transformContentAnimation(0); } } /** * An accessor that returns the `IgxTabItemComponent` component. * ```typescript * \@ViewChild("MyTabsGroup") * public tab: IgxTabsGroupComponent; * ngAfterViewInIt(){ * let tabComponent = this.tab.relatedTab; * } * ``` * @return {?} */ get relatedTab() { if (this._tabs.tabs) { return (/** @type {?} */ (this._tabs.tabs.toArray()[this.index])); } } /** * An accessor that returns the value of the index of the `IgxTabsGroupComponent`. * ```typescript * \@ViewChild("MyTabsGroup") * public tab: IgxTabsGroupComponent; * ngAfterViewInIt(){ * let tabIndex = this.tab.index; * } * ``` * @return {?} */ get index() { if (this._tabs.groups) { return this._tabs.groups.toArray().indexOf(this); } } /** * @hidden * @return {?} */ get customTabTemplate() { return this._tabTemplate; } /** * @hidden * @param {?} template * @return {?} */ set customTabTemplate(template) { this._tabTemplate = template; } /** * @hidden * @return {?} */ ngAfterContentInit() { if (this.tabTemplate) { this._tabTemplate = this.tabTemplate.template; } } /** * @hidden * @return {?} */ ngAfterViewChecked() { this._element.nativeElement.setAttribute('aria-labelledby', `igx-tab-item-${this.index}`); this._element.nativeElement.setAttribute('id', `igx-tabs__group-${this.index}`); if (this.isSelected) { /** @type {?} */ const tabItem = this.relatedTab.nativeTabItem.nativeElement; this.transformContentAnimation(0); this.transformIndicatorAnimation(tabItem); } } /** * A method that sets the focus on a tab. * \@memberof {\@link IgxTabsGroupComponent} * ```typescript * \@ViewChild("MyChild") * public tab : IgxTabsGroupComponent; * ngAfterViewInit(){ * this.tab.select(); * } * ``` * @param {?=} focusDelay A number representing the expected delay. * @return {?} */ select(focusDelay = 200) { if (this.disabled || this.isSelected) { return; } this.isSelected = true; this.relatedTab.tabindex = 0; if (focusDelay !== 0) { setTimeout(() => { this.relatedTab.nativeTabItem.nativeElement.focus(); }, focusDelay); } this.handleSelection(); this._tabs.onTabItemSelected.emit({ tab: this._tabs.tabs.toArray()[this.index], group: this }); } /** * @private * @return {?} */ handleSelection() { /** @type {?} */ const tabElement = this.relatedTab.nativeTabItem.nativeElement; // Scroll to the left if (tabElement.offsetLeft < this._tabs.offset) { this._tabs.scrollElement(tabElement, false); } // Scroll to the right /** @type {?} */ const viewPortOffsetWidth = this._tabs.viewPort.nativeElement.offsetWidth; /** @type {?} */ const delta = (tabElement.offsetLeft + tabElement.offsetWidth) - (viewPortOffsetWidth + this._tabs.offset); // Fix for IE 11, a difference is accumulated from the widths calculations if (delta > 1) { this._tabs.scrollElement(tabElement, true); } this.transformContentAnimation(0.2); this.transformIndicatorAnimation(tabElement); } /** * @private * @param {?} duration * @return {?} */ transformContentAnimation(duration) { /** @type {?} */ const contentOffset = this._tabs.tabsContainer.nativeElement.offsetWidth * this.index; this._tabs.contentsContainer.nativeElement.style.transitionDuration = `${duration}s`; this._tabs.contentsContainer.nativeElement.style.transform = `translate(${-contentOffset}px)`; } /** * @private * @param {?} element * @return {?} */ transformIndicatorAnimation(element) { this._tabs.selectedIndicator.nativeElement.style.width = `${element.offsetWidth}px`; this._tabs.selectedIndicator.nativeElement.style.transform = `translate(${element.offsetLeft}px)`; } } IgxTabsGroupComponent.decorators = [ { type: Component, args: [{ selector: 'igx-tabs-group', template: "<ng-content *ngIf=\"isSelected\"></ng-content>\n" }] } ]; /** @nocollapse */ IgxTabsGroupComponent.ctorParameters = () => [ { type: IgxTabsBase }, { type: ElementRef } ]; IgxTabsGroupComponent.propDecorators = { disabled: [{ type: Input }], icon: [{ type: Input }], label: [{ type: Input }], tabTemplate: [{ type: ContentChild, args: [IgxTabItemTemplateDirective, { read: IgxTabItemTemplateDirective },] }], role: [{ type: HostBinding, args: ['attr.role',] }], styleClass: [{ type: HostBinding, args: ['class.igx-tabs__group',] }], onResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }] }; if (false) { /** * An \@Input property that allows you to enable/disable the `IgxTabGroupComponent`. * ```html * <igx-tabs-group label="Tab 2 Lorem ipsum dolor sit" icon="home" [disabled]="true"> * ``` * @type {?} */ IgxTabsGroupComponent.prototype.disabled; /** * An \@Input property that sets the value of the `icon`. * The value should be valid icon name from {\@link https://material.io/tools/icons/?style=baseline}. * ```html * <igx-tabs-group label="Tab 1" icon="home"> * ``` * @type {?} */ IgxTabsGroupComponent.prototype.icon; /** * An \@Input property that sets the value of the `label`. * ```html * <igx-tabs-group label="Tab 1" icon="folder"> * ``` * @type {?} */ IgxTabsGroupComponent.prototype.label; /** @type {?} */ IgxTabsGroupComponent.prototype.isSelected; /** * @hidden * @type {?} * @protected */ IgxTabsGroupComponent.prototype.tabTemplate; /** * @type {?} * @private */ IgxTabsGroupComponent.prototype._tabTemplate; /** * @hidden * @type {?} */ IgxTabsGroupComponent.prototype.role; /** * @hidden * @type {?} */ IgxTabsGroupComponent.prototype.styleClass; /** * @type {?} * @private */ IgxTabsGroupComponent.prototype._tabs; /** * @type {?} * @private */ IgxTabsGroupComponent.prototype._element; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3RhYnMvdGFicy1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFHSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUVMLFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQU85RCxNQUFNLE9BQU8scUJBQXFCOzs7OztJQXdDOUIsWUFBb0IsS0FBa0IsRUFBVSxRQUFvQjtRQUFoRCxVQUFLLEdBQUwsS0FBSyxDQUFhO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBWTs7Ozs7OztRQS9CN0QsYUFBUSxHQUFHLEtBQUssQ0FBQztRQXFCakIsZUFBVSxHQUFHLEtBQUssQ0FBQzs7OztRQWlCbkIsU0FBSSxHQUFHLFVBQVUsQ0FBQzs7OztRQU1sQixlQUFVLEdBQUcsSUFBSSxDQUFDO0lBWnpCLENBQUM7Ozs7O0lBZU0sUUFBUSxDQUFDLEtBQUs7UUFDakIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyQztJQUNMLENBQUM7Ozs7Ozs7Ozs7OztJQVlELElBQUksVUFBVTtRQUNWLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDakIsT0FBTyxtQkFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQXVCLENBQUM7U0FDdkU7SUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7SUFZRCxJQUFJLEtBQUs7UUFDTCxJQUFJLElB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QUFFLENBQUMsUUFBUSxDQUFDOzs7Ozs7Ozs7O0lBL0N6Qyx5Q0FDd0I7Ozs7Ozs7OztJQVN4QixxQ0FDb0I7Ozs7Ozs7O0lBUXBCLHNDQUNxQjs7SUFFckIsMkNBQTBCOzs7Ozs7SUFLMUIsNENBQ21EOzs7OztJQUVuRCw2Q0FBdUM7Ozs7O0lBUXZDLHFDQUN5Qjs7Ozs7SUFLekIsMkNBQ3lCOzs7OztJQWJiLHNDQUEwQjs7Ozs7SUFBRSx5Q0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgSG9zdExpc3RlbmVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJZ3hUYWJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi90YWItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VGFiSXRlbVRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi90YWJzLmRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgSWd4VGFic0Jhc2UsIElneFRhYnNHcm91cEJhc2UgfSBmcm9tICcuL3RhYnMuY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtdGFicy1ncm91cCcsXG4gICAgdGVtcGxhdGVVcmw6ICd0YWJzLWdyb3VwLmNvbXBvbmVudC5odG1sJ1xufSlcblxuZXhwb3J0IGNsYXNzIElneFRhYnNHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIElneFRhYnNHcm91cEJhc2UsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0NoZWNrZWQge1xuXG4gICAgLyoqXG4gICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBhbGxvd3MgeW91IHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBgSWd4VGFiR3JvdXBDb21wb25lbnRgLlxuICAgICpgYGBodG1sXG4gICAgKjxpZ3gtdGFicy1ncm91cCBsYWJlbD1cIlRhYiAyICBMb3JlbSBpcHN1bSBkb2xvciBzaXRcIiBpY29uPVwiaG9tZVwiIFtkaXNhYmxlZF09XCJ0cnVlXCI+XG4gICAgKmBgYFxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBpY29uYC5cbiAgICAqIFRoZSB2YWx1ZSBzaG91bGQgYmUgdmFsaWQgaWNvbiBuYW1lIGZyb20ge0BsaW5rIGh0dHBzOi8vbWF0ZXJpYWwuaW8vdG9vbHMvaWNvbnMvP3N0eWxlPWJhc2VsaW5lfS5cbiAgICAqYGBgaHRtbFxuICAgICo8aWd4LXRhYnMtZ3JvdXAgbGFiZWw9XCJUYWIgMVwiIGljb249XCJob21lXCI+XG4gICAgKmBgYFxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWNvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYGxhYmVsYC5cbiAgICAqYGBgaHRtbFxuICAgICo8aWd4LXRhYnMtZ3JvdXAgbGFiZWw9XCJUYWIgMVwiIGljb249XCJmb2xkZXJcIj5cbiAgICAqYGBgXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xuXG4gICAgcHVibGljIGlzU2VsZWN0ZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFRhYkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hUYWJJdGVtVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwcm90ZWN0ZWQgdGFiVGVtcGxhdGU6IElneFRhYkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIHByaXZhdGUgX3RhYlRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFiczogSWd4VGFic0Jhc2UsIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ3RhYnBhbmVsJztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10YWJzX19ncm91cCcpXG4gICAgcHVibGljIHN0eWxlQ2xhc3MgPSB0cnVlO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uUmVzaXplKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udGVudEFuaW1hdGlvbigwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFjY2Vzc29yIHRoYXQgcmV0dXJucyB0aGUgYElneFRhYkl0ZW1Db21wb25lbnRgIGNvbXBvbmVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIk15VGFic0dyb3VwXCIpXG4gICAgICogcHVibGljIHRhYjogSWd4VGFic0dyb3VwQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5JdCgpe1xuICAgICAqICAgIGxldCB0YWJDb21wb25lbnQgPSB0aGlzLnRhYi5yZWxhdGVkVGFiO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgcmVsYXRlZFRhYigpOiBJZ3hUYWJJdGVtQ29tcG9uZW50IHtcbiAgICAgICAgaWYgKHRoaXMuX3RhYnMudGFicykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhYnMudGFicy50b0FycmF5KClbdGhpcy5pbmRleF0gYXMgSWd4VGFiSXRlbUNvbXBvbmVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFjY2Vzc29yIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGluZGV4IG9mIHRoZSBgSWd4VGFic0dyb3VwQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIk15VGFic0dyb3VwXCIpXG4gICAgICogcHVibGljIHRhYjogSWd4VGFic0dyb3VwQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5JdCgpe1xuICAgICAqICAgIGxldCB0YWJJbmRleCA9IHRoaXMudGFiLmluZGV4O1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX3RhYnMuZ3JvdXBzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGFicy5ncm91cHMudG9BcnJheSgpLmluZGV4T2YodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGN1c3RvbVRhYlRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFiVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IGN1c3RvbVRhYlRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMuX3RhYlRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRhYlRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl90YWJUZW1wbGF0ZSA9IHRoaXMudGFiVGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgYGlneC10YWItaXRlbS0ke3RoaXMuaW5kZXh9YCk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgYGlneC10YWJzX19ncm91cC0ke3RoaXMuaW5kZXh9YCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgY29uc3QgdGFiSXRlbSA9IHRoaXMucmVsYXRlZFRhYi5uYXRpdmVUYWJJdGVtLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRBbmltYXRpb24oMCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUluZGljYXRvckFuaW1hdGlvbih0YWJJdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbWV0aG9kIHRoYXQgc2V0cyB0aGUgZm9jdXMgb24gYSB0YWIuXG4gICAgICogQG1lbWJlcm9mIHtAbGluayBJZ3hUYWJzR3JvdXBDb21wb25lbnR9XG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlDaGlsZFwiKVxuICAgICAqcHVibGljIHRhYiA6IElneFRhYnNHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIHRoaXMudGFiLnNlbGVjdCgpO1xuICAgICAqfVxuICAgICAqYGBgXG4gICAgICogQHBhcmFtIGZvY3VzRGVsYXkgQSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBleHBlY3RlZCBkZWxheS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0KGZvY3VzRGVsYXkgPSAyMDApOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlbGF0ZWRUYWIudGFiaW5kZXggPSAwO1xuXG4gICAgICAgIGlmIChmb2N1c0RlbGF5ICE9PSAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0ZWRUYWIubmF0aXZlVGFiSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9LCBmb2N1c0RlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLl90YWJzLm9uVGFiSXRlbVNlbGVjdGVkLmVtaXQoeyB0YWI6IHRoaXMuX3RhYnMudGFicy50b0FycmF5KClbdGhpcy5pbmRleF0sIGdyb3VwOiB0aGlzIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YWJFbGVtZW50ID0gdGhpcy5yZWxhdGVkVGFiLm5hdGl2ZVRhYkl0ZW0ubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyBTY3JvbGwgdG8gdGhlIGxlZnRcbiAgICAgICAgaWYgKHRhYkVsZW1lbnQub2Zmc2V0TGVmdCA8IHRoaXMuX3RhYnMub2Zmc2V0KSB7XG4gICAgICAgICAgICB0aGlzLl90YWJzLnNjcm9sbEVsZW1lbnQodGFiRWxlbWVudCwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSByaWdodFxuICAgICAgICBjb25zdCB2aWV3UG9ydE9mZnNldFdpZHRoID0gdGhpcy5fdGFicy52aWV3UG9ydC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zdCBkZWx0YSA9ICh0YWJFbGVtZW50Lm9mZnNldExlZnQgKyB0YWJFbGVtZW50Lm9mZnNldFdpZHRoKSAtICh2aWV3UG9ydE9mZnNldFdpZHRoICsgdGhpcy5fdGFicy5vZmZzZXQpO1xuICAgICAgICAvLyBGaXggZm9yIElFIDExLCBhIGRpZmZlcmVuY2UgaXMgYWNjdW11bGF0ZWQgZnJvbSB0aGUgd2lkdGhzIGNhbGN1bGF0aW9uc1xuICAgICAgICBpZiAoZGVsdGEgPiAxKSB7XG4gICAgICAgICAgICB0aGlzLl90YWJzLnNjcm9sbEVsZW1lbnQodGFiRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRBbmltYXRpb24oMC4yKTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1JbmRpY2F0b3JBbmltYXRpb24odGFiRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1Db250ZW50QW5pbWF0aW9uKGR1cmF0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGVudE9mZnNldCA9IHRoaXMuX3RhYnMudGFic0NvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICogdGhpcy5pbmRleDtcbiAgICAgICAgdGhpcy5fdGFicy5jb250ZW50c0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IGAke2R1cmF0aW9ufXNgO1xuICAgICAgICB0aGlzLl90YWJzLmNvbnRlbnRzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgkey1jb250ZW50T2Zmc2V0fXB4KWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1JbmRpY2F0b3JBbmltYXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFicy5zZWxlY3RlZEluZGljYXRvci5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7ZWxlbWVudC5vZmZzZXRXaWR0aH1weGA7XG4gICAgICAgIHRoaXMuX3RhYnMuc2VsZWN0ZWRJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7ZWxlbWVudC5vZmZzZXRMZWZ0fXB4KWA7XG4gICAgfVxufVxuIl19