tp-window
Version:
ThingsPro window component UI
195 lines (185 loc) • 16.4 kB
JavaScript
import { Component, ViewChild, Input, ContentChildren, Output, EventEmitter, NgModule } from '@angular/core';
import { trigger, state, style, animate, transition } from '@angular/animations';
import { PortalModule } from '@angular/cdk/portal';
import 'rxjs';
import { CommonModule } from '@angular/common';
import { MatToolbarModule, MatTooltipModule } from '@angular/material';
import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatMenuModule } from '@angular/material/menu';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class WindowStateComponent {
}
WindowStateComponent.decorators = [
{ type: Component, args: [{
selector: 'tp-window-state',
template: `
<ng-template #templateRef>
<ng-content></ng-content>
</ng-template>
`,
inputs: ['name', 'icon', 'type']
},] },
];
WindowStateComponent.propDecorators = {
templateRef: [{ type: ViewChild, args: ['templateRef',] }],
type: [{ type: Input }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
const /** @type {?} */ fadeOutAnimation = trigger('fadeOut', [
state('in', style({ opacity: 1 })),
transition('* => void', [
animate(500, style({ opacity: 0 }))
])
]);
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class WindowComponent {
constructor() {
this.maxStateNumber = 5;
this.stateChange = new EventEmitter();
this.isShowLoading = false;
}
/**
* @param {?} loading
* @return {?}
*/
set loading(loading) {
if (loading) {
this.isShowLoading = true;
loading.subscribe(() => {
this.isShowLoading = false;
});
}
}
/**
* @param {?} portal
* @return {?}
*/
setPortal(portal) {
this.optionPortal = portal;
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.currentState = this.states.first;
}
/**
* @param {?} state
* @return {?}
*/
navigate(state$$1) {
if (state$$1.type !== 'Button') {
this.currentState = state$$1;
}
this.stateChange.emit(state$$1);
}
}
WindowComponent.decorators = [
{ type: Component, args: [{
selector: 'tp-window',
template: `<div class="tp-window">
<mat-toolbar>
<p class="mat-body-2 toolbar-title">{{name}}</p>
<div class="toolbar-flex"></div>
<ng-template [cdkPortalOutlet]="optionPortal"></ng-template>
<ng-template [ngIf]="states.length <= maxStateNumber">
<ng-container *ngFor="let state of states">
<button *ngIf="state.type !== 'Content'" mat-icon-button (click)="navigate(state)" matTooltip="{{state.name}}">
<mat-icon>{{state.icon}}</mat-icon>
</button>
</ng-container>
</ng-template>
<ng-template [ngIf]="states.length > maxStateNumber">
<ng-container *ngFor="let state of states">
<button *ngIf="state.type === 'Button'" mat-icon-button (click)="navigate(state)" matTooltip="{{state.name}}">
<mat-icon>{{state.icon}}</mat-icon>
</button>
</ng-container>
<button mat-icon-button [matMenuTriggerFor]="menu">
<mat-icon>more_horiz</mat-icon>
</button>
<mat-menu #menu="matMenu">
<ng-container *ngFor="let state of states">
<button *ngIf="state.type === 'State'" mat-menu-item (click)="navigate(state)">
<mat-icon>{{state.icon}}</mat-icon>
<span>{{state.name}}</span>
</button>
</ng-container>
</mat-menu>
</ng-template>
</mat-toolbar>
<div class="loading">
<mat-progress-bar *ngIf="isShowLoading" [ ]="'in'" mode="indeterminate" color="primary"></mat-progress-bar>
</div>
<div class="content padding">
<div *ngTemplateOutlet="currentState.templateRef"></div>
</div>
<ng-content></ng-content>
</div>
`,
styles: [`.tp-window{box-shadow:0 1px 3px 0 rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12)}.tp-window mat-toolbar .toolbar-title{color:#9e9e9e}.tp-window mat-toolbar .toolbar-flex{flex:1}.tp-window button{color:#9e9e9e;transition:background ease-out .2s}.tp-window button:hover{background-color:#e0e0e0}.tp-window .padding{padding:1em 1.5em}.tp-window .loading{height:10px}`],
inputs: ['name'],
exportAs: 'tpWindow',
animations: [fadeOutAnimation]
},] },
];
WindowComponent.propDecorators = {
loadingRef: [{ type: ViewChild, args: ['loadingPortal',] }],
states: [{ type: ContentChildren, args: [WindowStateComponent,] }],
loading: [{ type: Input }],
maxStateNumber: [{ type: Input }],
optionPortal: [{ type: Input }],
stateChange: [{ type: Output }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class WindowModule {
}
WindowModule.decorators = [
{ type: NgModule, args: [{
imports: [
PortalModule,
MatMenuModule,
MatProgressBarModule,
MatButtonModule,
MatIconModule,
MatTooltipModule,
CommonModule,
MatToolbarModule
],
declarations: [WindowComponent, WindowStateComponent],
exports: [WindowComponent, WindowStateComponent]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/** @enum {number} */
const stateType = {
Button: 0,
Content: 1,
State: 2,
};
stateType[stateType.Button] = "Button";
stateType[stateType.Content] = "Content";
stateType[stateType.State] = "State";
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { stateType, WindowComponent, WindowModule, fadeOutAnimation as ɵb, WindowStateComponent as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAtd2luZG93LmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly90cC13aW5kb3cvbGliL3RwLXdpbmRvdy5zdGF0ZS5jb21wb25lbnQudHMiLCJuZzovL3RwLXdpbmRvdy9saWIvdHAtd2luZG93LmFuaW1hdGlvbi50cyIsIm5nOi8vdHAtd2luZG93L2xpYi90cC13aW5kb3cuY29tcG9uZW50LnRzIiwibmc6Ly90cC13aW5kb3cvbGliL3RwLXdpbmRvdy5tb2R1bGUudHMiLCJuZzovL3RwLXdpbmRvdy9wdWJsaWNfYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmV4cG9ydCB0eXBlIHN0YXRlVHlwZSA9ICdCdXR0b24nIHwgJ0NvbnRlbnQnIHwgJ1N0YXRlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndHAtd2luZG93LXN0YXRlJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctdGVtcGxhdGUgI3RlbXBsYXRlUmVmPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGlucHV0czogWyduYW1lJywgJ2ljb24nLCAndHlwZSddXG59KVxuXG5leHBvcnQgY2xhc3MgV2luZG93U3RhdGVDb21wb25lbnQge1xuXG4gIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlUmVmJykgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpXG4gIHR5cGU6IHN0YXRlVHlwZTtcbiAgbmFtZTogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG59XG4iLCJpbXBvcnQge1xuICB0cmlnZ2VyLFxuICBzdGF0ZSxcbiAgc3R5bGUsXG4gIGFuaW1hdGUsXG4gIHRyYW5zaXRpb24sXG4gIEFuaW1hdGlvblRyaWdnZXJNZXRhZGF0YVxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuZXhwb3J0IGNvbnN0IGZhZGVPdXRBbmltYXRpb246QW5pbWF0aW9uVHJpZ2dlck1ldGFkYXRhID0gdHJpZ2dlcignZmFkZU91dCcsIFtcbiAgc3RhdGUoJ2luJywgc3R5bGUoe29wYWNpdHk6IDF9KSksXG4gIHRyYW5zaXRpb24oJyogPT4gdm9pZCcsIFtcbiAgICBhbmltYXRlKDUwMCwgc3R5bGUoe29wYWNpdHk6IDB9KSlcbiAgXSlcbl0pXG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBUZW1wbGF0ZVJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENka1BvcnRhbE91dGxldCwgUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBXaW5kb3dTdGF0ZUNvbXBvbmVudCxzdGF0ZVR5cGUgfSBmcm9tICcuL3RwLXdpbmRvdy5zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmFkZU91dEFuaW1hdGlvbiB9IGZyb20gJy4vdHAtd2luZG93LmFuaW1hdGlvbic7XG5leHBvcnQgeyBzdGF0ZVR5cGUgfSBmcm9tICcuL3RwLXdpbmRvdy5zdGF0ZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0cC13aW5kb3cnLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJ0cC13aW5kb3dcIj5cbiAgPG1hdC10b29sYmFyPlxuICAgIDxwIGNsYXNzPVwibWF0LWJvZHktMiB0b29sYmFyLXRpdGxlXCI+e3tuYW1lfX08L3A+XG4gICAgPGRpdiBjbGFzcz1cInRvb2xiYXItZmxleFwiPjwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlIFtjZGtQb3J0YWxPdXRsZXRdPVwib3B0aW9uUG9ydGFsXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzdGF0ZXMubGVuZ3RoIDw9IG1heFN0YXRlTnVtYmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YXRlIG9mIHN0YXRlc1wiPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzdGF0ZS50eXBlICE9PSAnQ29udGVudCdcIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cIm5hdmlnYXRlKHN0YXRlKVwiIG1hdFRvb2x0aXA9XCJ7e3N0YXRlLm5hbWV9fVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7c3RhdGUuaWNvbn19PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwic3RhdGVzLmxlbmd0aCA+IG1heFN0YXRlTnVtYmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YXRlIG9mIHN0YXRlc1wiPlxuICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzdGF0ZS50eXBlID09PSAnQnV0dG9uJ1wiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwibmF2aWdhdGUoc3RhdGUpXCIgbWF0VG9vbHRpcD1cInt7c3RhdGUubmFtZX19XCI+XG4gICAgICAgICAgICA8bWF0LWljb24+e3tzdGF0ZS5pY29ufX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cbiAgICAgICAgICA8bWF0LWljb24+bW9yZV9ob3JpejwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RhdGUgb2Ygc3RhdGVzXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic3RhdGUudHlwZSA9PT0gJ1N0YXRlJ1wiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm5hdmlnYXRlKHN0YXRlKVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24+e3tzdGF0ZS5pY29ufX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8c3Bhbj57e3N0YXRlLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L21hdC1tZW51PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICA8L21hdC10b29sYmFyPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZ1wiPlxuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiaXNTaG93TG9hZGluZ1wiIFtAZmFkZU91dF09XCInaW4nXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBjb2xvcj1cInByaW1hcnlcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29udGVudCBwYWRkaW5nXCI+XG4gICAgPGRpdiAqbmdUZW1wbGF0ZU91dGxldD1cImN1cnJlbnRTdGF0ZS50ZW1wbGF0ZVJlZlwiPjwvZGl2PlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG5gLFxuICBzdHlsZXM6IFtgLnRwLXdpbmRvd3tib3gtc2hhZG93OjAgMXB4IDNweCAwIHJnYmEoMCwwLDAsLjIpLDAgMXB4IDFweCAwIHJnYmEoMCwwLDAsLjE0KSwwIDJweCAxcHggLTFweCByZ2JhKDAsMCwwLC4xMil9LnRwLXdpbmRvdyBtYXQtdG9vbGJhciAudG9vbGJhci10aXRsZXtjb2xvcjojOWU5ZTllfS50cC13aW5kb3cgbWF0LXRvb2xiYXIgLnRvb2xiYXItZmxleHtmbGV4OjF9LnRwLXdpbmRvdyBidXR0b257Y29sb3I6IzllOWU5ZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgZWFzZS1vdXQgLjJzfS50cC13aW5kb3cgYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2UwZTBlMH0udHAtd2luZG93IC5wYWRkaW5ne3BhZGRpbmc6MWVtIDEuNWVtfS50cC13aW5kb3cgLmxvYWRpbmd7aGVpZ2h0OjEwcHh9YF0sXG4gIGlucHV0czogWyduYW1lJ10sXG4gIGV4cG9ydEFzOiAndHBXaW5kb3cnLFxuICBhbmltYXRpb25zOiBbZmFkZU91dEFuaW1hdGlvbl1cbn0pXG5leHBvcnQgY2xhc3MgV2luZG93Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2xvYWRpbmdQb3J0YWwnKSBsb2FkaW5nUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkcmVuKFdpbmRvd1N0YXRlQ29tcG9uZW50KSBzdGF0ZXM6IFF1ZXJ5TGlzdDxXaW5kb3dTdGF0ZUNvbXBvbmVudD47XG4gIEBJbnB1dCgpXG4gIHNldCBsb2FkaW5nKGxvYWRpbmc6T2JzZXJ2YWJsZTxhbnk+KSB7XG4gICAgaWYobG9hZGluZykge1xuICAgICAgdGhpcy5pc1Nob3dMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIGxvYWRpbmcuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc1Nob3dMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgQElucHV0KCkgbWF4U3RhdGVOdW1iZXI6IG51bWJlciA9IDU7XG4gIEBJbnB1dCgpIG9wdGlvblBvcnRhbDogUG9ydGFsPGFueT4gfCB1bmRlZmluZWQ7XG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPFdpbmRvd1N0YXRlQ29tcG9uZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8V2luZG93U3RhdGVDb21wb25lbnQ+KCk7XG4gIG5hbWU6IHN0cmluZztcbiAgY3VycmVudFN0YXRlOiBXaW5kb3dTdGF0ZUNvbXBvbmVudDtcbiAgaXNTaG93TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNldFBvcnRhbChwb3J0YWw6IFBvcnRhbDxhbnk+KSB7XG4gICAgdGhpcy5vcHRpb25Qb3J0YWwgPSBwb3J0YWw7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLnN0YXRlcy5maXJzdDtcbiAgfVxuXG4gIG5hdmlnYXRlKHN0YXRlOiBXaW5kb3dTdGF0ZUNvbXBvbmVudCkge1xuICAgIGlmKHN0YXRlLnR5cGUgIT09ICdCdXR0b24nKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHN0YXRlO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQoc3RhdGUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFdpbmRvd0NvbXBvbmVudCB9IGZyb20gJy4vdHAtd2luZG93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaW5kb3dTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vdHAtd2luZG93LnN0YXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRUb29sYmFyTW9kdWxlLCBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IFBvcnRhbE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgUG9ydGFsTW9kdWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0VG9vbGJhck1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW1dpbmRvd0NvbXBvbmVudCwgV2luZG93U3RhdGVDb21wb25lbnRdLFxuICBleHBvcnRzOiBbV2luZG93Q29tcG9uZW50LCBXaW5kb3dTdGF0ZUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgV2luZG93TW9kdWxlIHsgfVxuIiwiZXhwb3J0ICogZnJvbSAnLi9saWIvdHAtd2luZG93LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi90cC13aW5kb3cubW9kdWxlJztcbmV4cG9ydCBlbnVtIHN0YXRlVHlwZSB7XG4gIEJ1dHRvbiwgQ29udGVudCwgU3RhdGVcbn1cbiJdLCJuYW1lcyI6WyJzdGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7OztZQUdDLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQixRQUFRLEVBQUU7Ozs7R0FJVDtnQkFDRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQzthQUNqQzs7OzBCQUlFLFNBQVMsU0FBQyxhQUFhO21CQUN2QixLQUFLOzs7Ozs7O0FDaEJSLHVCQVNhLGdCQUFnQixHQUE0QixPQUFPLENBQUMsU0FBUyxFQUFFO0lBQzFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7SUFDaEMsVUFBVSxDQUFDLFdBQVcsRUFBRTtRQUN0QixPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQ2xDLENBQUM7Q0FDSCxDQUFDOzs7Ozs7QUNkRjs7OEJBNkVvQyxDQUFDOzJCQUV5QixJQUFJLFlBQVksRUFBd0I7NkJBRzNFLEtBQUs7Ozs7OztJQWQ5QixJQUNJLE9BQU8sQ0FBQyxPQUF1QjtRQUNqQyxJQUFHLE9BQU8sRUFBRTtZQUNWLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxTQUFTLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2FBQzVCLENBQUMsQ0FBQztTQUNKO0tBQ0Y7Ozs7O0lBUUQsU0FBUyxDQUFDLE1BQW1CO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0tBQzVCOzs7O0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7S0FDdkM7Ozs7O0lBRUQsUUFBUSxDQUFDQSxRQUEyQjtRQUNsQyxJQUFHQSxRQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHQSxRQUFLLENBQUM7U0FDM0I7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQ0EsUUFBSyxDQUFDLENBQUM7S0FDOUI7OztZQWpGRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F5Q1g7Z0JBQ0MsTUFBTSxFQUFFLENBQUMsd1lBQXdZLENBQUM7Z0JBQ2xaLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztnQkFDaEIsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDO2FBQy9COzs7eUJBRUUsU0FBUyxTQUFDLGVBQWU7cUJBQ3pCLGVBQWUsU0FBQyxvQkFBb0I7c0JBQ3BDLEtBQUs7NkJBU0wsS0FBSzsyQkFDTCxLQUFLOzBCQUNMLE1BQU07Ozs7Ozs7QUMvRVQ7OztZQVdDLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUU7b0JBQ1AsWUFBWTtvQkFDWixhQUFhO29CQUNiLG9CQUFvQjtvQkFDcEIsZUFBZTtvQkFDZixhQUFhO29CQUNiLGdCQUFnQjtvQkFDaEIsWUFBWTtvQkFDWixnQkFBZ0I7aUJBQUM7Z0JBQ25CLFlBQVksRUFBRSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQztnQkFDckQsT0FBTyxFQUFFLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDO2FBQ2pEOzs7Ozs7O0FDdkJEOzs7Ozs7Ozs7Ozs7Ozs7OzsifQ==