UNPKG

@catull/igniteui-angular

Version:

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

350 lines 31.7 kB
import { __decorate, __metadata } from "tslib"; import { Component, ContentChild, ElementRef, HostBinding, HostListener, Input, TemplateRef, ViewChild, NgZone, AfterViewInit, OnDestroy } from '@angular/core'; import { IgxTabsGroupComponent } from './tabs-group.component'; import { IgxTabItemBase, IgxTabsBase } from './tabs.common'; import { IgxTabItemTemplateDirective } from './tabs.directives'; import ResizeObserver from 'resize-observer-polyfill'; let IgxTabItemComponent = class IgxTabItemComponent extends IgxTabItemBase { constructor(_tabs, _element, _ngZone) { super(); this._tabs = _tabs; this._element = _element; this._ngZone = _ngZone; this._changesCount = 0; // changes and updates accordingly applied to the tab. this._isSelected = false; this._disabled = false; /** * @hidden @internal */ this.role = 'tab'; /** * @hidden @internal */ this.id = 'igx-tab-item-' + this.index; /** * @hidden @internal */ this.ariaLabel = this.label; /** * @hidden @internal */ this.ariaDisabled = this.disabled; /** * @hidden @internal */ this.ariaSelected = this.isSelected; /** * @hidden @internal */ this.ariaControls = 'igx-tab-item-group-' + this.index; this._nativeTabItem = _element; } /** * 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-tab-item label="Tab 1" icon="home"> *``` */ get icon() { return this.relatedGroup ? this.relatedGroup.icon : this._icon; } set icon(newValue) { if (this.relatedGroup) { this.relatedGroup.icon = newValue; } this._icon = newValue; } /** * An @Input property that sets the value of the `label`. *```html *<igx-tabs-item label="Tab 2" icon="folder"> *``` */ get label() { return this.relatedGroup ? this.relatedGroup.label : this._label; } set label(newValue) { if (this.relatedGroup) { this.relatedGroup.label = newValue; } this._label = newValue; } get provideCssClassSelected() { return this.isSelected; } get provideCssClassDisabled() { return this.disabled; } get provideCssClass() { return (!this.disabled && !this.isSelected); } ngAfterViewInit() { this._ngZone.runOutsideAngular(() => { this._resizeObserver = new ResizeObserver(() => { this._tabs.transformIndicatorAnimation(this._nativeTabItem.nativeElement, 0); }); }); } ngOnDestroy() { this._ngZone.runOutsideAngular(() => { this._resizeObserver.disconnect(); }); } /** * @hidden */ onClick(event) { this.select(); } /** * @hidden */ onKeydownArrowRight(event) { this.onKeyDown(false); } /** * @hidden */ onKeydownArrowLeft(event) { this.onKeyDown(true); } /** * @hidden */ onKeydownHome(event) { event.preventDefault(); this.onKeyDown(false, 0); } /** * @hidden */ onKeydownEnd(event) { event.preventDefault(); this.onKeyDown(false, this._tabs.tabs.toArray().length - 1); } /** * @hidden */ get changesCount() { return this._changesCount; } /** * @hidden */ get nativeTabItem() { return this._nativeTabItem; } /** * Gets whether the tab is disabled. * ``` * const disabledItem = this.myTabComponent.tabs.first.disabled; * ``` */ get disabled() { return this.relatedGroup ? this.relatedGroup.disabled : this._disabled; } set disabled(newValue) { if (this.relatedGroup) { this.relatedGroup.disabled = newValue; } else { this._disabled = newValue; } } /** * Gets whether the tab is selected. * ```typescript * const selectedItem = this.myTabComponent.tabs.first.isSelected; * ``` */ get isSelected() { return this.relatedGroup ? this.relatedGroup.isSelected : this._isSelected; } set isSelected(newValue) { if (!this.disabled && this.isSelected !== newValue) { this._tabs.performSelectionChange(newValue ? this : null); } } /** * @hidden */ select() { if (!this.disabled && !this.isSelected) { this._tabs.performSelectionChange(this); } } /** * @hidden */ get index() { if (this._tabs.tabs) { return this._tabs.tabs.toArray().indexOf(this); } return -1; } /** * @hidden */ setSelectedInternal(newValue) { this._isSelected = newValue; this._ngZone.runOutsideAngular(() => { if (this._resizeObserver) { if (this._isSelected) { this._resizeObserver.observe(this._element.nativeElement); } else { this._resizeObserver.disconnect(); } } }); this.tabindex = newValue ? 0 : -1; } onKeyDown(isLeftArrow, index = null) { const tabsArray = this._tabs.tabs.toArray(); if (index === null) { index = (isLeftArrow) ? (this._tabs.selectedIndex === 0) ? tabsArray.length - 1 : this._tabs.selectedIndex - 1 : (this._tabs.selectedIndex === tabsArray.length - 1) ? 0 : this._tabs.selectedIndex + 1; } const tab = tabsArray[index]; tab.select(); } /** * @hidden */ get template() { if (this.relatedGroup && this.relatedGroup.customTabTemplate) { return this.relatedGroup.customTabTemplate; } if (this.customTabTemplateDir) { return this.customTabTemplateDir.template; } return this.defaultTabTemplate; } /** * @hidden */ get context() { return this.relatedGroup ? this.relatedGroup : this; } }; IgxTabItemComponent.ctorParameters = () => [ { type: IgxTabsBase }, { type: ElementRef }, { type: NgZone } ]; __decorate([ Input(), __metadata("design:type", IgxTabsGroupComponent) ], IgxTabItemComponent.prototype, "relatedGroup", void 0); __decorate([ Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], IgxTabItemComponent.prototype, "icon", null); __decorate([ Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], IgxTabItemComponent.prototype, "label", null); __decorate([ ViewChild('defaultTabTemplate', { read: TemplateRef, static: true }), __metadata("design:type", TemplateRef) ], IgxTabItemComponent.prototype, "defaultTabTemplate", void 0); __decorate([ ContentChild(IgxTabItemTemplateDirective, { read: IgxTabItemTemplateDirective }), __metadata("design:type", IgxTabItemTemplateDirective) ], IgxTabItemComponent.prototype, "customTabTemplateDir", void 0); __decorate([ HostBinding('class.igx-tabs__header-menu-item--selected'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxTabItemComponent.prototype, "provideCssClassSelected", null); __decorate([ HostBinding('class.igx-tabs__header-menu-item--disabled'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxTabItemComponent.prototype, "provideCssClassDisabled", null); __decorate([ HostBinding('class.igx-tabs__header-menu-item'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxTabItemComponent.prototype, "provideCssClass", null); __decorate([ HostBinding('attr.role'), __metadata("design:type", Object) ], IgxTabItemComponent.prototype, "role", void 0); __decorate([ HostBinding('attr.tabindex'), __metadata("design:type", Object) ], IgxTabItemComponent.prototype, "tabindex", void 0); __decorate([ HostBinding('attr.id'), __metadata("design:type", Object) ], IgxTabItemComponent.prototype, "id", void 0); __decorate([ HostBinding('attr.aria-label'), __metadata("design:type", Object) ], IgxTabItemComponent.prototype, "ariaLabel", void 0); __decorate([ HostBinding('attr.aria-disabled'), __metadata("design:type", Object) ], IgxTabItemComponent.prototype, "ariaDisabled", void 0); __decorate([ HostBinding('attr.aria-selected'), __metadata("design:type", Object) ], IgxTabItemComponent.prototype, "ariaSelected", void 0); __decorate([ HostBinding('attr.aria-controls'), __metadata("design:type", Object) ], IgxTabItemComponent.prototype, "ariaControls", void 0); __decorate([ HostListener('click', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxTabItemComponent.prototype, "onClick", null); __decorate([ HostListener('keydown.arrowright', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxTabItemComponent.prototype, "onKeydownArrowRight", null); __decorate([ HostListener('keydown.arrowleft', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxTabItemComponent.prototype, "onKeydownArrowLeft", null); __decorate([ HostListener('keydown.home', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxTabItemComponent.prototype, "onKeydownHome", null); __decorate([ HostListener('keydown.end', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxTabItemComponent.prototype, "onKeydownEnd", null); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxTabItemComponent.prototype, "disabled", null); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxTabItemComponent.prototype, "isSelected", null); IgxTabItemComponent = __decorate([ Component({ selector: 'igx-tab-item', template: "<ng-template #defaultTabTemplate let-context>\n <div *ngIf=\"context.icon\" class=\"igx-tabs__header-menu-item-icon\">\n <igx-icon fontSet=\"material\">{{context.icon}}</igx-icon>\n <igx-badge [value]=\"changesCount\" [hidden]=\"changesCount === 0\"></igx-badge>\n </div>\n <div *ngIf=\"context.label\" ngClass=\"igx-tabs__item-label\">{{context.label}}</div>\n</ng-template>\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this.context }\">\n</ng-container>" }), __metadata("design:paramtypes", [IgxTabsBase, ElementRef, NgZone]) ], IgxTabItemComponent); export { IgxTabItemComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi90YWJzL3RhYi1pdGVtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsTUFBTSxFQUNOLGFBQWEsRUFDYixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEUsT0FBTyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFPdEQsSUFBYSxtQkFBbUIsR0FBaEMsTUFBYSxtQkFBb0IsU0FBUSxjQUFjO0lBaUVuRCxZQUFvQixLQUFrQixFQUFVLFFBQW9CLEVBQVUsT0FBZTtRQUN6RixLQUFLLEVBQUUsQ0FBQztRQURRLFVBQUssR0FBTCxLQUFLLENBQWE7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUxyRixrQkFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtRQUN6RSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBdUIxQjs7V0FFRztRQUVJLFNBQUksR0FBRyxLQUFLLENBQUM7UUFRcEI7O1dBRUc7UUFFSSxPQUFFLEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFekM7O1dBRUc7UUFFSSxjQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUU5Qjs7V0FFRztRQUVJLGlC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Q0FDYixhQUFhOzt3REFHeEM7QUFNRDtJQURDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7cUNBQ2IsYUFBYTs7dURBR3ZDO0FBdUJEO0lBREMsS0FBSyxFQUFFOzs7bURBR1A7QUFnQkQ7SUFEQyxLQUFLLEVBQUU7OztxREFHUDtBQWhPUSxtQkFBbUI7SUFML0IsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGNBQWM7UUFDeEIsZ2dCQUFzQztLQUN6QyxDQUFDO3FDQW1FNkIsV0FBVyxFQUFvQixVQUFVLEVBQW1CLE1BQU07R0FqRXBGLG1CQUFtQixDQTBTL0I7U0ExU1ksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBOZ1pvbmUsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBPbkRlc3Ryb3lcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IElneFRhYnNHcm91cENvbXBvbmVudCB9IGZyb20gJy4vdGFicy1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VGFiSXRlbUJhc2UsIElneFRhYnNCYXNlIH0gZnJvbSAnLi90YWJzLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hUYWJJdGVtVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL3RhYnMuZGlyZWN0aXZlcyc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmVzaXplLW9ic2VydmVyLXBvbHlmaWxsJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtdGFiLWl0ZW0nLFxuICAgIHRlbXBsYXRlVXJsOiAndGFiLWl0ZW0uY29tcG9uZW50Lmh0bWwnXG59KVxuXG5leHBvcnQgY2xhc3MgSWd4VGFiSXRlbUNvbXBvbmVudCBleHRlbmRzIElneFRhYkl0ZW1CYXNlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICAvKipcbiAgICAqIEdldHMgdGhlIGdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFiLlxuICAgICogYGBgaHRtbFxuICAgICogY29uc3QgcmVsYXRlZEdyb3VwID0gdGhpcy50YWJiYXIudGFicy50b0FycmF5KClbMV0ucmVsYXRlZEdyb3VwO1xuICAgICogYGBgXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByZWxhdGVkR3JvdXA6IElneFRhYnNHcm91cENvbXBvbmVudDtcblxuICAgIC8qKkBoaWRkZW4qL1xuICAgIHByaXZhdGUgX2ljb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBpY29uYC5cbiAgICAqIFRoZSB2YWx1ZSBzaG91bGQgYmUgdmFsaWQgaWNvbiBuYW1lIGZyb20ge0BsaW5rIGh0dHBzOi8vbWF0ZXJpYWwuaW8vdG9vbHMvaWNvbnMvP3N0eWxlPWJhc2VsaW5lfS5cbiAgICAqYGBgaHRtbFxuICAgICo8aWd4LXRhYi1pdGVtIGxhYmVsPVwiVGFiIDFcIiBpY29uPVwiaG9tZVwiPlxuICAgICpgYGBcbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpY29uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbGF0ZWRHcm91cCA/IHRoaXMucmVsYXRlZEdyb3VwLmljb24gOiB0aGlzLl9pY29uO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGljb24obmV3VmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5yZWxhdGVkR3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMucmVsYXRlZEdyb3VwLmljb24gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pY29uID0gbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqQGhpZGRlbiovXG4gICAgcHJpdmF0ZSBfbGFiZWw6IHN0cmluZztcblxuICAgIC8qKlxuICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBsYWJlbGAuXG4gICAgKmBgYGh0bWxcbiAgICAqPGlneC10YWJzLWl0ZW0gbGFiZWw9XCJUYWIgMlwiIGljb249XCJmb2xkZXJcIj5cbiAgICAqYGBgXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRlZEdyb3VwID8gdGhpcy5yZWxhdGVkR3JvdXAubGFiZWwgOiB0aGlzLl9sYWJlbDtcbiAgICB9XG4gICAgcHVibGljIHNldCBsYWJlbChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnJlbGF0ZWRHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5yZWxhdGVkR3JvdXAubGFiZWwgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sYWJlbCA9IG5ld1ZhbHVlO1xuICAgIH1cblxuICAgIC8qKkBoaWRkZW4qL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRUYWJUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0VGFiVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipAaGlkZGVuKi9cbiAgICBAQ29udGVudENoaWxkKElneFRhYkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hUYWJJdGVtVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwcm90ZWN0ZWQgY3VzdG9tVGFiVGVtcGxhdGVEaXI6IElneFRhYkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIHByaXZhdGUgX25hdGl2ZVRhYkl0ZW06IEVsZW1lbnRSZWY7XG4gICAgcHJpdmF0ZSBfY2hhbmdlc0NvdW50ID0gMDsgLy8gY2hhbmdlcyBhbmQgdXBkYXRlcyBhY2NvcmRpbmdseSBhcHBsaWVkIHRvIHRoZSB0YWIuXG4gICAgcHJpdmF0ZSBfaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFiczogSWd4VGFic0Jhc2UsIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsIHByaXZhdGUgX25nWm9uZTogTmdab25lKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX25hdGl2ZVRhYkl0ZW0gPSBfZWxlbWVudDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10YWJzX19oZWFkZXItbWVudS1pdGVtLS1zZWxlY3RlZCcpXG4gICAgcHVibGljIGdldCBwcm92aWRlQ3NzQ2xhc3NTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10YWJzX19oZWFkZXItbWVudS1pdGVtLS1kaXNhYmxlZCcpXG4gICAgcHVibGljIGdldCBwcm92aWRlQ3NzQ2xhc3NEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGFic19faGVhZGVyLW1lbnUtaXRlbScpXG4gICAgcHVibGljIGdldCBwcm92aWRlQ3NzQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuaXNTZWxlY3RlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIHJvbGUgPSAndGFiJztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgICBwdWJsaWMgdGFiaW5kZXg7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgcHVibGljIGlkID0gJ2lneC10YWItaXRlbS0nICsgdGhpcy5pbmRleDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbGFiZWwnKVxuICAgIHB1YmxpYyBhcmlhTGFiZWwgPSB0aGlzLmxhYmVsO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kaXNhYmxlZCcpXG4gICAgcHVibGljIGFyaWFEaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXNlbGVjdGVkJylcbiAgICBwdWJsaWMgYXJpYVNlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jb250cm9scycpXG4gICAgcHVibGljIGFyaWFDb250cm9scyA9ICdpZ3gtdGFiLWl0ZW0tZ3JvdXAtJyArIHRoaXMuaW5kZXg7XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFicy50cmFuc2Zvcm1JbmRpY2F0b3JBbmltYXRpb24odGhpcy5fbmF0aXZlVGFiSXRlbS5uYXRpdmVFbGVtZW50LCAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25DbGljayhldmVudCkge1xuICAgICAgICB0aGlzLnNlbGVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93cmlnaHQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd1JpZ2h0KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHRoaXMub25LZXlEb3duKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd2xlZnQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd0xlZnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbktleURvd24odHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uaG9tZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkhvbWUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vbktleURvd24oZmFsc2UsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVuZCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkVuZChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm9uS2V5RG93bihmYWxzZSwgdGhpcy5fdGFicy50YWJzLnRvQXJyYXkoKS5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGNoYW5nZXNDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hhbmdlc0NvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgbmF0aXZlVGFiSXRlbSgpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZVRhYkl0ZW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBcdEdldHMgd2hldGhlciB0aGUgdGFiIGlzIGRpc2FibGVkLlxuICAgICogYGBgXG4gICAgKiBjb25zdCBkaXNhYmxlZEl0ZW0gPSB0aGlzLm15VGFiQ29tcG9uZW50LnRhYnMuZmlyc3QuZGlzYWJsZWQ7XG4gICAgKiBgYGBcbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGVkR3JvdXAgPyB0aGlzLnJlbGF0ZWRHcm91cC5kaXNhYmxlZCA6IHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMucmVsYXRlZEdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLnJlbGF0ZWRHcm91cC5kaXNhYmxlZCA9IG5ld1ZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgdGFiIGlzIHNlbGVjdGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLm15VGFiQ29tcG9uZW50LnRhYnMuZmlyc3QuaXNTZWxlY3RlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBpc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGVkR3JvdXAgPyB0aGlzLnJlbGF0ZWRHcm91cC5pc1NlbGVjdGVkIDogdGhpcy5faXNTZWxlY3RlZDtcbiAgICB9XG4gICAgc2V0IGlzU2VsZWN0ZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkICYmIHRoaXMuaXNTZWxlY3RlZCAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYnMucGVyZm9ybVNlbGVjdGlvbkNoYW5nZShuZXdWYWx1ZSA/IHRoaXMgOiBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5fdGFicy5wZXJmb3JtU2VsZWN0aW9uQ2hhbmdlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5fdGFicy50YWJzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGFicy50YWJzLnRvQXJyYXkoKS5pbmRleE9mKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGVjdGVkSW50ZXJuYWwobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faXNTZWxlY3RlZCA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jlc2l6ZU9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRhYmluZGV4ID0gbmV3VmFsdWUgPyAwIDogLTE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbktleURvd24oaXNMZWZ0QXJyb3c6IGJvb2xlYW4sIGluZGV4ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YWJzQXJyYXkgPSB0aGlzLl90YWJzLnRhYnMudG9BcnJheSgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgIGluZGV4ID0gKGlzTGVmdEFycm93KVxuICAgICAgICAgICAgICAgID8gKHRoaXMuX3RhYnMuc2VsZWN0ZWRJbmRleCA9PT0gMCkgPyB0YWJzQXJyYXkubGVuZ3RoIC0gMSA6IHRoaXMuX3RhYnMuc2VsZWN0ZWRJbmRleCAtIDFcbiAgICAgICAgICAgICAgICA6ICh0aGlzLl90YWJzLnNlbGVjdGVkSW5kZXggPT09IHRhYnNBcnJheS5sZW5ndGggLSAxKSA/IDAgOiB0aGlzLl90YWJzLnNlbGVjdGVkSW5kZXggKyAxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYiA9IHRhYnNBcnJheVtpbmRleF07XG4gICAgICAgIHRhYi5zZWxlY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMucmVsYXRlZEdyb3VwICYmIHRoaXMucmVsYXRlZEdyb3VwLmN1c3RvbVRhYlRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGVkR3JvdXAuY3VzdG9tVGFiVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tVGFiVGVtcGxhdGVEaXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVRhYlRlbXBsYXRlRGlyLnRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRUYWJUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250ZXh0KCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbGF0ZWRHcm91cCA/IHRoaXMucmVsYXRlZEdyb3VwIDogdGhpcztcbiAgICB9XG5cbn1cbiJdfQ==