angular-admin-lte-teliqo
Version:
npm# angular-admin-lte
384 lines (383 loc) • 30.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, EventEmitter, Input, NgZone, Output, QueryList, Renderer2, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
import { TabToggleDirective } from './tabs.directive';
import { removeListeners, removeSubscriptions } from '../helpers';
export class TabHeaderComponent {
}
TabHeaderComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-tab-header',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>',
changeDetection: ChangeDetectionStrategy.OnPush
},] },
];
/** @nocollapse */
TabHeaderComponent.propDecorators = {
"templateRef": [{ type: ViewChild, args: ['templateRef',] },],
};
function TabHeaderComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TabHeaderComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TabHeaderComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TabHeaderComponent.propDecorators;
/** @type {?} */
TabHeaderComponent.prototype.templateRef;
}
export class TabContentComponent {
}
TabContentComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-tab-content',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>',
changeDetection: ChangeDetectionStrategy.OnPush
},] },
];
/** @nocollapse */
TabContentComponent.propDecorators = {
"templateRef": [{ type: ViewChild, args: ['templateRef',] },],
};
function TabContentComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TabContentComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TabContentComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TabContentComponent.propDecorators;
/** @type {?} */
TabContentComponent.prototype.templateRef;
}
export class TabComponent {
constructor() {
this.isActive = false;
}
/**
* \@method ngOnInit
* @return {?}
*/
ngOnInit() {
if (this.tabContentComponent) {
this.contentTemplateRef = this.tabContentComponent.templateRef;
}
else {
this.contentTemplateRef = this.templateRef;
}
}
}
TabComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-tab',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>',
changeDetection: ChangeDetectionStrategy.OnPush
},] },
];
/** @nocollapse */
TabComponent.propDecorators = {
"header": [{ type: Input },],
"isDisabled": [{ type: Input },],
"tabColor": [{ type: Input },],
"templateRef": [{ type: ViewChild, args: ['templateRef',] },],
"tabHeaderComponent": [{ type: ContentChild, args: [TabHeaderComponent,] },],
"tabContentComponent": [{ type: ContentChild, args: [TabContentComponent,] },],
};
function TabComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TabComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TabComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TabComponent.propDecorators;
/** @type {?} */
TabComponent.prototype.index;
/** @type {?} */
TabComponent.prototype.isActive;
/** @type {?} */
TabComponent.prototype.contentTemplateRef;
/** @type {?} */
TabComponent.prototype.header;
/** @type {?} */
TabComponent.prototype.isDisabled;
/** @type {?} */
TabComponent.prototype.tabColor;
/** @type {?} */
TabComponent.prototype.templateRef;
/** @type {?} */
TabComponent.prototype.tabHeaderComponent;
/** @type {?} */
TabComponent.prototype.tabContentComponent;
}
export class TabsHeaderComponent {
}
TabsHeaderComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-tabs-header',
template: '<ng-template #templateRef><ng-content></ng-content></ng-template>',
changeDetection: ChangeDetectionStrategy.OnPush
},] },
];
/** @nocollapse */
TabsHeaderComponent.propDecorators = {
"templateRef": [{ type: ViewChild, args: ['templateRef',] },],
};
function TabsHeaderComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TabsHeaderComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TabsHeaderComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TabsHeaderComponent.propDecorators;
/** @type {?} */
TabsHeaderComponent.prototype.templateRef;
}
export class TabsComponent {
/**
* \@method constructor
* @param {?} changeDetectorRef [description]
* @param {?} ngZone [description]
* @param {?} renderer2 [description]
*/
constructor(changeDetectorRef, ngZone, renderer2) {
this.changeDetectorRef = changeDetectorRef;
this.ngZone = ngZone;
this.renderer2 = renderer2;
this.listeners = [];
this.subscriptions = [];
this.headerStyleClass = 'header pull-left';
this.navStyleClass = 'nav nav-tabs';
this.contentStyleClass = 'tab-content';
this.styleClass = 'nav-tabs-custom';
this.onClose = new EventEmitter();
this.onOpen = new EventEmitter();
}
/**
* @param {?} index
* @return {?}
*/
set activeTabIndex(index) {
this.activatedTabIndex = index;
this.changeDetectorRef.detectChanges();
}
/**
* \@method ngAfterViewInit
* @return {?}
*/
ngAfterContentInit() {
// Set tab index on load.
this.setTabIndex();
// Update tab index if tabs is updated.
this.subscriptions.push(this.tabs.changes.subscribe(() => {
this.setTabIndex();
}));
// Open tab on load.
this.openTabIndex();
}
/**
* \@method ngAfterViewInit
* @return {?}
*/
ngAfterViewInit() {
// Set tab toggles on load.
this.setTabsToggle();
// Update tab toggles if tabs is updated.
this.subscriptions.push(this.tabToggleDirectives.changes.subscribe(() => {
this.setTabsToggle();
}));
}
/**
* \@method ngOnChanges
* @param {?} changes [description]
* @return {?}
*/
ngOnChanges(changes) {
if (changes["activeTabIndex"]) {
this.openTabIndex();
}
}
/**
* \@method ngOnDestroy
* @return {?}
*/
ngOnDestroy() {
removeListeners(this.listeners);
removeSubscriptions(this.subscriptions);
}
/**
* [toggleTab description]
* \@method toggleTab
* @return {?}
*/
openTabIndex() {
if (this.tabs) {
this.tabs.forEach((tab) => {
if (this.activatedTabIndex === tab.index || (this.activatedTabIndex === undefined && tab.index === 0)) {
tab.isActive = true;
this.onOpen.emit({ index: tab.index });
this.changeDetectorRef.detectChanges();
}
else if (tab.isActive) {
tab.isActive = false;
this.onClose.emit({ index: tab.index });
this.changeDetectorRef.detectChanges();
}
});
}
}
/**
* [openTab description]
* \@method openTab
* @param {?} event [description]
* @param {?} tabToOpen [description]
* @return {?}
*/
openTab(event, tabToOpen) {
event.preventDefault();
tabToOpen.isActive = true;
this.onOpen.emit({ event, index: tabToOpen.index });
this.tabs.forEach((tab) => {
if (tab.isActive && tabToOpen !== tab) {
tab.isActive = false;
this.onClose.emit({ event, index: tab.index });
}
});
}
/**
* [setTabIndex description]
* \@method setTabIndex
* @return {?}
*/
setTabIndex() {
this.tabs.forEach((tab, index) => {
tab.index = index;
});
this.changeDetectorRef.detectChanges();
}
/**
* [setTabsToggle description]
* \@method setTabsToggle
* @return {?}
*/
setTabsToggle() {
this.listeners = removeListeners(this.listeners);
this.ngZone.runOutsideAngular(() => {
this.tabToggleDirectives.forEach((tabToggle) => {
this.listeners.push(this.renderer2.listen(tabToggle.elementRef.nativeElement, 'click', (event) => {
this.openTab(event, tabToggle.tabComponent);
this.changeDetectorRef.detectChanges();
}));
});
});
}
}
TabsComponent.decorators = [
{ type: Component, args: [{
selector: 'mk-tabs',
template: `<div [ngClass]="styleClass">
<ul [ngClass]="navStyleClass" [class.pull-right]="header || tabsHeaderComponent">
<li *ngFor="let tab of tabs" [class.active]="tab.isActive" [mkColor]="tab.tabColor || tabsColor" mkColorProperty="border-top-color">
<a *ngIf="!tab.isDisabled" [mkTabToggle]="tab" href="#">
{{tab.header}}
<ng-template *ngIf="!tab.header" [ngTemplateOutlet]="tab.tabHeaderComponent?.templateRef"></ng-template>
</a>
<ng-template [ngIf]="tab.isDisabled">
{{tab.header}}
<ng-template *ngIf="!tab.header" [ngTemplateOutlet]="tab.tabHeaderComponent.templateRef"></ng-template>
</ng-template>
</li>
<li *ngIf="tabsHeaderComponent || header" [ngClass]="headerStyleClass">
{{header}}
<ng-template *ngIf="!header" [ngTemplateOutlet]="tabsHeaderComponent.templateRef"></ng-template>
</li>
</ul>
<div [ngClass]="contentStyleClass">
<div *ngFor="let tab of tabs" class="tab-pane" [class.active]="tab.isActive">
<ng-template [ngTemplateOutlet]="tab.contentTemplateRef"></ng-template>
</div>
</div>
</div>
`,
styles: [`.nav-tabs-custom>.nav-tabs>li{border-top-width:0}.nav-tabs-custom>.nav-tabs>li.active{border-top-width:3px}`],
changeDetection: ChangeDetectionStrategy.OnPush
},] },
];
/** @nocollapse */
TabsComponent.ctorParameters = () => [
{ type: ChangeDetectorRef, },
{ type: NgZone, },
{ type: Renderer2, },
];
TabsComponent.propDecorators = {
"activeTabIndex": [{ type: Input },],
"header": [{ type: Input },],
"headerStyleClass": [{ type: Input },],
"navStyleClass": [{ type: Input },],
"contentStyleClass": [{ type: Input },],
"styleClass": [{ type: Input },],
"tabsColor": [{ type: Input },],
"onClose": [{ type: Output },],
"onOpen": [{ type: Output },],
"tabsHeaderComponent": [{ type: ContentChild, args: [TabsHeaderComponent,] },],
"tabs": [{ type: ContentChildren, args: [TabComponent,] },],
"tabToggleDirectives": [{ type: ViewChildren, args: [TabToggleDirective,] },],
};
function TabsComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
TabsComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
TabsComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
TabsComponent.propDecorators;
/** @type {?} */
TabsComponent.prototype.activatedTabIndex;
/** @type {?} */
TabsComponent.prototype.listeners;
/** @type {?} */
TabsComponent.prototype.subscriptions;
/** @type {?} */
TabsComponent.prototype.header;
/** @type {?} */
TabsComponent.prototype.headerStyleClass;
/** @type {?} */
TabsComponent.prototype.navStyleClass;
/** @type {?} */
TabsComponent.prototype.contentStyleClass;
/** @type {?} */
TabsComponent.prototype.styleClass;
/** @type {?} */
TabsComponent.prototype.tabsColor;
/** @type {?} */
TabsComponent.prototype.onClose;
/** @type {?} */
TabsComponent.prototype.onOpen;
/** @type {?} */
TabsComponent.prototype.tabsHeaderComponent;
/** @type {?} */
TabsComponent.prototype.tabs;
/** @type {?} */
TabsComponent.prototype.tabToggleDirectives;
/** @type {?} */
TabsComponent.prototype.changeDetectorRef;
/** @type {?} */
TabsComponent.prototype.ngZone;
/** @type {?} */
TabsComponent.prototype.renderer2;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWFkbWluLWx0ZS10ZWxpcW8vIiwic291cmNlcyI6WyJsaWIvdGFicy90YWJzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBSU4sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBRVQsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVlsRSxNQUFNOzs7WUFMTCxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLFFBQVEsRUFBRSxtRUFBbUU7Z0JBQzdFLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOzs7OzRCQUVFLFNBQVMsU0FBQyxhQUFhOzs7Ozs7Ozs7Ozs7Ozs7QUFZMUIsTUFBTTs7O1lBTEwsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLFFBQVEsRUFBRSxtRUFBbUU7Z0JBQzdFLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOzs7OzRCQUVFLFNBQVMsU0FBQyxhQUFhOzs7Ozs7Ozs7Ozs7Ozs7QUFXMUIsTUFBTTs7d0JBRWMsS0FBSzs7Ozs7O0lBZ0J2QixRQUFRO1FBQ04sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztTQUNoRTtRQUFDLElBQUks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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZSxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBUYWJUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuL3RhYnMuZGlyZWN0aXZlJztcblxuaW1wb3J0IHsgcmVtb3ZlTGlzdGVuZXJzLCByZW1vdmVTdWJzY3JpcHRpb25zIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbi8vIEBUT0RPIFZlcnRpY2FsIHRhYnNcblxuLypcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21rLXRhYi1oZWFkZXInLFxuICB0ZW1wbGF0ZTogJzxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVSZWY+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvbmctdGVtcGxhdGU+JyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFiSGVhZGVyQ29tcG9uZW50IHtcbiAgQFZpZXdDaGlsZCgndGVtcGxhdGVSZWYnKSBwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG59XG5cblxuLypcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21rLXRhYi1jb250ZW50JyxcbiAgdGVtcGxhdGU6ICc8bmctdGVtcGxhdGUgI3RlbXBsYXRlUmVmPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRhYkNvbnRlbnRDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZVJlZicpIHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pjtcbn1cblxuLypcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21rLXRhYicsXG4gIHRlbXBsYXRlOiAnPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVJlZj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9uZy10ZW1wbGF0ZT4nLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwdWJsaWMgaW5kZXg6IG51bWJlcjtcbiAgcHVibGljIGlzQWN0aXZlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjb250ZW50VGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KCkgcHVibGljIGhlYWRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgaXNEaXNhYmxlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIHRhYkNvbG9yOiBzdHJpbmc7XG5cbiAgQFZpZXdDaGlsZCgndGVtcGxhdGVSZWYnKSBwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZChUYWJIZWFkZXJDb21wb25lbnQpIHB1YmxpYyB0YWJIZWFkZXJDb21wb25lbnQ6IFRhYkhlYWRlckNvbXBvbmVudDtcbiAgQENvbnRlbnRDaGlsZChUYWJDb250ZW50Q29tcG9uZW50KSBwdWJsaWMgdGFiQ29udGVudENvbXBvbmVudDogVGFiQ29udGVudENvbXBvbmVudDtcblxuICAvKipcbiAgICogQG1ldGhvZCBuZ09uSW5pdFxuICAgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMudGFiQ29udGVudENvbXBvbmVudCkge1xuICAgICAgdGhpcy5jb250ZW50VGVtcGxhdGVSZWYgPSB0aGlzLnRhYkNvbnRlbnRDb21wb25lbnQudGVtcGxhdGVSZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudFRlbXBsYXRlUmVmID0gdGhpcy50ZW1wbGF0ZVJlZjtcbiAgICB9XG4gIH1cbn1cblxuLypcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21rLXRhYnMtaGVhZGVyJyxcbiAgdGVtcGxhdGU6ICc8bmctdGVtcGxhdGUgI3RlbXBsYXRlUmVmPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRhYnNIZWFkZXJDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZVJlZicpIHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pjtcbn1cblxuLypcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21rLXRhYnMnLFxuICB0ZW1wbGF0ZTogYDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiPlxuICA8dWwgW25nQ2xhc3NdPVwibmF2U3R5bGVDbGFzc1wiIFtjbGFzcy5wdWxsLXJpZ2h0XT1cImhlYWRlciB8fCB0YWJzSGVhZGVyQ29tcG9uZW50XCI+XG4gICAgPGxpICpuZ0Zvcj1cImxldCB0YWIgb2YgdGFic1wiIFtjbGFzcy5hY3RpdmVdPVwidGFiLmlzQWN0aXZlXCIgW21rQ29sb3JdPVwidGFiLnRhYkNvbG9yIHx8IHRhYnNDb2xvclwiIG1rQ29sb3JQcm9wZXJ0eT1cImJvcmRlci10b3AtY29sb3JcIj5cbiAgICAgIDxhICpuZ0lmPVwiIXRhYi5pc0Rpc2FibGVkXCIgW21rVGFiVG9nZ2xlXT1cInRhYlwiIGhyZWY9XCIjXCI+XG4gICAgICAgIHt7dGFiLmhlYWRlcn19XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIiF0YWIuaGVhZGVyXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFiLnRhYkhlYWRlckNvbXBvbmVudD8udGVtcGxhdGVSZWZcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9hPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInRhYi5pc0Rpc2FibGVkXCI+XG4gICAgICAgIHt7dGFiLmhlYWRlcn19XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIiF0YWIuaGVhZGVyXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFiLnRhYkhlYWRlckNvbXBvbmVudC50ZW1wbGF0ZVJlZlwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbGk+XG4gICAgPGxpICpuZ0lmPVwidGFic0hlYWRlckNvbXBvbmVudCB8fCBoZWFkZXJcIiBbbmdDbGFzc109XCJoZWFkZXJTdHlsZUNsYXNzXCI+XG4gICAgICB7e2hlYWRlcn19XG4gICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCIhaGVhZGVyXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFic0hlYWRlckNvbXBvbmVudC50ZW1wbGF0ZVJlZlwiPjwvbmctdGVtcGxhdGU+XG4gICAgPC9saT5cbiAgPC91bD5cbiAgPGRpdiBbbmdDbGFzc109XCJjb250ZW50U3R5bGVDbGFzc1wiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJzXCIgY2xhc3M9XCJ0YWItcGFuZVwiIFtjbGFzcy5hY3RpdmVdPVwidGFiLmlzQWN0aXZlXCI+XG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFiLmNvbnRlbnRUZW1wbGF0ZVJlZlwiPjwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5gLFxuICBzdHlsZXM6IFtgLm5hdi10YWJzLWN1c3RvbT4ubmF2LXRhYnM+bGl7Ym9yZGVyLXRvcC13aWR0aDowfS5uYXYtdGFicy1jdXN0b20+Lm5hdi10YWJzPmxpLmFjdGl2ZXtib3JkZXItdG9wLXdpZHRoOjNweH1gXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFic0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBhY3RpdmF0ZWRUYWJJbmRleDogbnVtYmVyO1xuICBwcml2YXRlIGxpc3RlbmVycyA9IFtdO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBbXTtcblxuICBASW5wdXQoKSBwdWJsaWMgc2V0IGFjdGl2ZVRhYkluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGl2YXRlZFRhYkluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgQElucHV0KCkgcHVibGljIGhlYWRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgaGVhZGVyU3R5bGVDbGFzcyA9ICdoZWFkZXIgcHVsbC1sZWZ0JztcbiAgQElucHV0KCkgcHVibGljIG5hdlN0eWxlQ2xhc3MgPSAnbmF2IG5hdi10YWJzJztcbiAgQElucHV0KCkgcHVibGljIGNvbnRlbnRTdHlsZUNsYXNzID0gJ3RhYi1jb250ZW50JztcbiAgQElucHV0KCkgcHVibGljIHN0eWxlQ2xhc3MgPSAnbmF2LXRhYnMtY3VzdG9tJztcbiAgQElucHV0KCkgcHVibGljIHRhYnNDb2xvcjogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKSBwdWJsaWMgb25DbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvbk9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQENvbnRlbnRDaGlsZChUYWJzSGVhZGVyQ29tcG9uZW50KSBwdWJsaWMgdGFic0hlYWRlckNvbXBvbmVudDogVGFic0hlYWRlckNvbXBvbmVudDtcblxuICBAQ29udGVudENoaWxkcmVuKFRhYkNvbXBvbmVudCkgcHVibGljIHRhYnM6IFF1ZXJ5TGlzdDxUYWJDb21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGRyZW4oVGFiVG9nZ2xlRGlyZWN0aXZlKSBwdWJsaWMgdGFiVG9nZ2xlRGlyZWN0aXZlczogUXVlcnlMaXN0PFRhYlRvZ2dsZURpcmVjdGl2ZT47XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIG5nWm9uZSAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIHJlbmRlcmVyMiAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmdBZnRlclZpZXdJbml0XG4gICAqL1xuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgLy8gU2V0IHRhYiBpbmRleCBvbiBsb2FkLlxuICAgIHRoaXMuc2V0VGFiSW5kZXgoKTtcblxuICAgIC8vIFVwZGF0ZSB0YWIgaW5kZXggaWYgdGFicyBpcyB1cGRhdGVkLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMudGFicy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldFRhYkluZGV4KCk7XG4gICAgfSkpO1xuXG4gICAgLy8gT3BlbiB0YWIgb24gbG9hZC5cbiAgICB0aGlzLm9wZW5UYWJJbmRleCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmdBZnRlclZpZXdJbml0XG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gU2V0IHRhYiB0b2dnbGVzIG9uIGxvYWQuXG4gICAgdGhpcy5zZXRUYWJzVG9nZ2xlKCk7XG5cbiAgICAvLyBVcGRhdGUgdGFiIHRvZ2dsZXMgaWYgdGFicyBpcyB1cGRhdGVkLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMudGFiVG9nZ2xlRGlyZWN0aXZlcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldFRhYnNUb2dnbGUoKTtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBuZ09uQ2hhbmdlc1xuICAgKiBAcGFyYW0gY2hhbmdlcyBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7W3Byb3BLZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZX0pIHtcbiAgICBpZiAoY2hhbmdlcy5hY3RpdmVUYWJJbmRleCkge1xuICAgICAgdGhpcy5vcGVuVGFiSW5kZXgoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBuZ09uRGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgcmVtb3ZlTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKTtcbiAgICByZW1vdmVTdWJzY3JpcHRpb25zKHRoaXMuc3Vic2NyaXB0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogW3RvZ2dsZVRhYiBkZXNjcmlwdGlvbl1cbiAgICogQG1ldGhvZCB0b2dnbGVUYWJcbiAgICovXG4gIHB1YmxpYyBvcGVuVGFiSW5kZXgoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGFicykge1xuICAgICAgdGhpcy50YWJzLmZvckVhY2goKHRhYjogVGFiQ29tcG9uZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2YXRlZFRhYkluZGV4ID09PSB0YWIuaW5kZXggfHwgKHRoaXMuYWN0aXZhdGVkVGFiSW5kZXggPT09IHVuZGVmaW5lZCAmJiB0YWIuaW5kZXggPT09IDApKSB7XG4gICAgICAgICAgdGFiLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLm9uT3Blbi5lbWl0KHtpbmRleDogdGFiLmluZGV4fSk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFiLmlzQWN0aXZlKSB7XG4gICAgICAgICAgdGFiLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5vbkNsb3NlLmVtaXQoe2luZGV4OiB0YWIuaW5kZXh9KTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFtvcGVuVGFiIGRlc2NyaXB0aW9uXVxuICAgKiBAbWV0aG9kIG9wZW5UYWJcbiAgICogQHBhcmFtIGV2ZW50ICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB0YWJUb09wZW4gW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgcHVibGljIG9wZW5UYWIoZXZlbnQ6IEV2ZW50LCB0YWJUb09wZW46IFRhYkNvbXBvbmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGFiVG9PcGVuLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLm9uT3Blbi5lbWl0KHtldmVudCwgaW5kZXg6IHRhYlRvT3Blbi5pbmRleH0pO1xuICAgIHRoaXMudGFicy5mb3JFYWNoKCh0YWI6IFRhYkNvbXBvbmVudCkgPT4ge1xuICAgICAgaWYgKHRhYi5pc0FjdGl2ZSAmJiB0YWJUb09wZW4gIT09IHRhYikge1xuICAgICAgICB0YWIuaXNBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vbkNsb3NlLmVtaXQoe2V2ZW50LCBpbmRleDogdGFiLmluZGV4fSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogW3NldFRhYkluZGV4IGRlc2NyaXB0aW9uXVxuICAgKiBAbWV0aG9kIHNldFRhYkluZGV4XG4gICAqL1xuICBwcml2YXRlIHNldFRhYkluZGV4KCk6IHZvaWQge1xuICAgIHRoaXMudGFicy5mb3JFYWNoKCh0YWI6IFRhYkNvbXBvbmVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdGFiLmluZGV4ID0gaW5kZXg7XG4gICAgfSk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogW3NldFRhYnNUb2dnbGUgZGVzY3JpcHRpb25dXG4gICAqIEBtZXRob2Qgc2V0VGFic1RvZ2dsZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXRUYWJzVG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdGVuZXJzID0gcmVtb3ZlTGlzdGVuZXJzKHRoaXMubGlzdGVuZXJzKTtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnRhYlRvZ2dsZURpcmVjdGl2ZXMuZm9yRWFjaCgodGFiVG9nZ2xlOiBUYWJUb2dnbGVEaXJlY3RpdmUpID0+IHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh0aGlzLnJlbmRlcmVyMi5saXN0ZW4odGFiVG9nZ2xlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5vcGVuVGFiKGV2ZW50LCB0YWJUb2dnbGUudGFiQ29tcG9uZW50KTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==