mdc-autocomplete
Version:
MdcAutocomplete in conjunction with MdcAutocompleteList and MdcAutocompleteListItem are a pack of angular components to provide an autocomplete functionality to Angular MDC web.
195 lines (187 loc) • 14.8 kB
JavaScript
import { Injectable, Component, ViewChild, ContentChild, Output, EventEmitter, Input, NgModule, defineInjectable } from '@angular/core';
import { MdcTextFieldModule } from '@angular-mdc/web';
import { MdcAutocompleteList, MdcAutocompleteListModule } from 'mdc-autocomplete-list';
import { MdcAutocompleteListItemModule } from 'mdc-autocomplete-list-item';
import { FormsModule } from '@angular/forms';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class MdcAutocompleteService {
constructor() { }
}
MdcAutocompleteService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
MdcAutocompleteService.ctorParameters = () => [];
/** @nocollapse */ MdcAutocompleteService.ngInjectableDef = defineInjectable({ factory: function MdcAutocompleteService_Factory() { return new MdcAutocompleteService(); }, token: MdcAutocompleteService, providedIn: "root" });
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class MdcAutocompleteComponent {
constructor() { }
/**
* @return {?}
*/
ngOnInit() {
}
}
MdcAutocompleteComponent.decorators = [
{ type: Component, args: [{
selector: 'mdc-mdc-autocomplete',
template: `
<p>
mdc-autocomplete works!
</p>
`,
styles: []
},] },
];
/** @nocollapse */
MdcAutocompleteComponent.ctorParameters = () => [];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
// tslint:disable-next-line:component-class-suffix
class MdcAutocomplete {
constructor() {
this.itemSelected = new EventEmitter();
this.label = '';
}
/**
* @return {?}
*/
get value() { return this._value; }
/**
* @param {?} val
* @return {?}
*/
set value(val) {
this._value = val;
this.autocompleteList.filter = val;
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.setNativeInputAtrributes();
this.autocompleteList.itemSelected.subscribe((itemValue) => {
this.selectedItemValue = itemValue;
this.value = itemValue.toString();
this.itemSelected.emit(itemValue);
this.autocompleteList.visible = false;
});
}
/**
* @param {?} event
* @return {?}
*/
onKeyDown(event) {
if (event.key === 'ArrowDown') {
this.autocompleteList.focusNextItem();
}
else if (event.key === 'ArrowUp') {
this.autocompleteList.focusPreviousItem();
}
else if (event.key === 'Enter') {
this.autocompleteList.selectFocusedItem();
}
}
/**
* @param {?} event
* @return {?}
*/
onKeyUp(event) {
if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp' && event.key !== 'Enter') {
this.onTextFieldChange();
}
}
/**
* @return {?}
*/
onTextFieldChange() {
this.autocompleteList.visible = true;
this.autocompleteList.filter = this.textField.value;
}
/**
* @param {?} focus
* @return {?}
*/
onFocus(focus) {
setTimeout(() => {
this.autocompleteList.visible = focus;
}, 100);
}
/**
* @return {?}
*/
setNativeInputAtrributes() {
/** @type {?} */
const nativeInput = this.textField.elementRef.nativeElement.querySelector('input');
nativeInput.autocomplete = 'off';
// @ts-ignore
nativeInput.autocorrect = 'off';
// @ts-ignore
nativeInput.autocapitalize = 'off';
}
}
MdcAutocomplete.decorators = [
{ type: Component, args: [{
selector: 'mdc-autocomplete',
template: `<div class="autocomplete">
<mdc-text-field #textField [(ngModel)]="value" [label]="label" (keydown)="onKeyDown($event)" (keyup)="onKeyUp($event)"
(click)="onFocus(true)" (focus)="onFocus(true)" (focusout)="onFocus(false)" (blur)="onFocus(false)"
autocomplete="off" autocorrect="off" autocapitalize="off">
</mdc-text-field>
<ng-content select="mdc-autocomplete-list"></ng-content>
</div>
`,
styles: [`.autocomplete{display:inline-block}`]
},] },
];
/** @nocollapse */
MdcAutocomplete.ctorParameters = () => [];
MdcAutocomplete.propDecorators = {
label: [{ type: Input }],
itemSelected: [{ type: Output }],
textField: [{ type: ViewChild, args: ['textField',] }],
autocompleteList: [{ type: ContentChild, args: [MdcAutocompleteList,] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class MdcAutocompleteModule {
}
MdcAutocompleteModule.decorators = [
{ type: NgModule, args: [{
imports: [
MdcAutocompleteListModule,
MdcAutocompleteListItemModule,
MdcTextFieldModule,
FormsModule
],
declarations: [MdcAutocompleteComponent, MdcAutocomplete],
exports: [MdcAutocomplete]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { MdcAutocompleteService, MdcAutocompleteModule, MdcAutocomplete, MdcAutocompleteComponent as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLWF1dG9jb21wbGV0ZS5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbWRjLWF1dG9jb21wbGV0ZS9saWIvbWRjLWF1dG9jb21wbGV0ZS5zZXJ2aWNlLnRzIiwibmc6Ly9tZGMtYXV0b2NvbXBsZXRlL2xpYi9tZGMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIm5nOi8vbWRjLWF1dG9jb21wbGV0ZS9saWIvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCJuZzovL21kYy1hdXRvY29tcGxldGUvbGliL21kYy1hdXRvY29tcGxldGUubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1kY0F1dG9jb21wbGV0ZVNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ21kYy1tZGMtYXV0b2NvbXBsZXRlJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHA+XHJcbiAgICAgIG1kYy1hdXRvY29tcGxldGUgd29ya3MhXHJcbiAgICA8L3A+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZGNBdXRvY29tcGxldGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIENvbnRlbnRDaGlsZCwgQWZ0ZXJDb250ZW50SW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1kY1RleHRGaWVsZCB9IGZyb20gJ0Bhbmd1bGFyLW1kYy93ZWInO1xyXG5pbXBvcnQgeyBNZGNBdXRvY29tcGxldGVMaXN0IH0gZnJvbSAnbWRjLWF1dG9jb21wbGV0ZS1saXN0JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbWRjLWF1dG9jb21wbGV0ZScsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlXCI+XHJcbiAgPG1kYy10ZXh0LWZpZWxkICN0ZXh0RmllbGQgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIFtsYWJlbF09XCJsYWJlbFwiIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgKGtleXVwKT1cIm9uS2V5VXAoJGV2ZW50KVwiXHJcbiAgKGNsaWNrKT1cIm9uRm9jdXModHJ1ZSlcIiAoZm9jdXMpPVwib25Gb2N1cyh0cnVlKVwiIChmb2N1c291dCk9XCJvbkZvY3VzKGZhbHNlKVwiIChibHVyKT1cIm9uRm9jdXMoZmFsc2UpXCJcclxuICBhdXRvY29tcGxldGU9XCJvZmZcIiBhdXRvY29ycmVjdD1cIm9mZlwiIGF1dG9jYXBpdGFsaXplPVwib2ZmXCI+XHJcbiAgPC9tZGMtdGV4dC1maWVsZD5cclxuICA8bmctY29udGVudCBzZWxlY3Q9XCJtZGMtYXV0b2NvbXBsZXRlLWxpc3RcIj48L25nLWNvbnRlbnQ+XHJcbjwvZGl2PlxyXG5gLFxyXG4gIHN0eWxlczogW2AuYXV0b2NvbXBsZXRle2Rpc3BsYXk6aW5saW5lLWJsb2NrfWBdXHJcbn0pXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtY2xhc3Mtc3VmZml4XHJcbmV4cG9ydCBjbGFzcyBNZGNBdXRvY29tcGxldGUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQge1xyXG5cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgaXRlbVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgndGV4dEZpZWxkJykgdGV4dEZpZWxkOiBNZGNUZXh0RmllbGQ7XHJcbiAgQENvbnRlbnRDaGlsZChNZGNBdXRvY29tcGxldGVMaXN0KSBhdXRvY29tcGxldGVMaXN0OiBNZGNBdXRvY29tcGxldGVMaXN0O1xyXG5cclxuICBfdmFsdWU6IHN0cmluZztcclxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl92YWx1ZTsgfVxyXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xyXG4gICAgdGhpcy5hdXRvY29tcGxldGVMaXN0LmZpbHRlciA9IHZhbDtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkSXRlbVZhbHVlOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5sYWJlbCA9ICcnO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICB0aGlzLnNldE5hdGl2ZUlucHV0QXRycmlidXRlcygpO1xyXG5cclxuICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdC5pdGVtU2VsZWN0ZWQuc3Vic2NyaWJlKChpdGVtVmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1WYWx1ZSA9IGl0ZW1WYWx1ZTtcclxuICAgICAgdGhpcy52YWx1ZSA9IGl0ZW1WYWx1ZS50b1N0cmluZygpO1xyXG4gICAgICB0aGlzLml0ZW1TZWxlY3RlZC5lbWl0KGl0ZW1WYWx1ZSk7XHJcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcclxuICAgICAgdGhpcy5hdXRvY29tcGxldGVMaXN0LmZvY3VzTmV4dEl0ZW0oKTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcclxuICAgICAgdGhpcy5hdXRvY29tcGxldGVMaXN0LmZvY3VzUHJldmlvdXNJdGVtKCk7XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xyXG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUxpc3Quc2VsZWN0Rm9jdXNlZEl0ZW0oKTtcclxuICAgIH1cclxuICB9XHJcbiAgb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ0Fycm93RG93bicgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dVcCcgJiYgZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XHJcbiAgICAgIHRoaXMub25UZXh0RmllbGRDaGFuZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uVGV4dEZpZWxkQ2hhbmdlKCkge1xyXG4gICAgdGhpcy5hdXRvY29tcGxldGVMaXN0LnZpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy5hdXRvY29tcGxldGVMaXN0LmZpbHRlciA9IHRoaXMudGV4dEZpZWxkLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgb25Gb2N1cyhmb2N1czogYm9vbGVhbikge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdC52aXNpYmxlID0gZm9jdXM7XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXROYXRpdmVJbnB1dEF0cnJpYnV0ZXMoKSB7XHJcbiAgICBjb25zdCBuYXRpdmVJbnB1dDogSFRNTElucHV0RWxlbWVudCA9IHRoaXMudGV4dEZpZWxkLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xyXG4gICAgbmF0aXZlSW5wdXQuYXV0b2NvbXBsZXRlID0gJ29mZic7XHJcbiAgICAvLyBAdHMtaWdub3JlXHJcbiAgICBuYXRpdmVJbnB1dC5hdXRvY29ycmVjdCA9ICdvZmYnO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgbmF0aXZlSW5wdXQuYXV0b2NhcGl0YWxpemUgPSAnb2ZmJztcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWRjQXV0b2NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi9tZGMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1kY0F1dG9jb21wbGV0ZSB9IGZyb20gJy4vYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNZGNBdXRvY29tcGxldGVMaXN0TW9kdWxlIH0gZnJvbSAnbWRjLWF1dG9jb21wbGV0ZS1saXN0JztcclxuaW1wb3J0IHsgTWRjQXV0b2NvbXBsZXRlTGlzdEl0ZW1Nb2R1bGUgfSBmcm9tICdtZGMtYXV0b2NvbXBsZXRlLWxpc3QtaXRlbSc7XHJcbmltcG9ydCB7IE1kY1RleHRGaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyLW1kYy93ZWInO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgTWRjQXV0b2NvbXBsZXRlTGlzdE1vZHVsZSxcclxuICAgIE1kY0F1dG9jb21wbGV0ZUxpc3RJdGVtTW9kdWxlLFxyXG4gICAgTWRjVGV4dEZpZWxkTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGVcclxuICBdLFxyXG4gIGRlY2xhcmF0aW9uczogW01kY0F1dG9jb21wbGV0ZUNvbXBvbmVudCwgTWRjQXV0b2NvbXBsZXRlXSxcclxuICBleHBvcnRzOiBbTWRjQXV0b2NvbXBsZXRlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWRjQXV0b2NvbXBsZXRlTW9kdWxlIHsgfVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0lBT0UsaUJBQWlCOzs7WUFMbEIsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7Ozs7Ozs7O0FDSkQ7SUFhRSxpQkFBaUI7Ozs7SUFFakIsUUFBUTtLQUNQOzs7WUFkRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtnQkFDaEMsUUFBUSxFQUFFOzs7O0dBSVQ7Z0JBQ0QsTUFBTSxFQUFFLEVBQUU7YUFDWDs7Ozs7Ozs7O0FDVkQsQUFJQTtBQWFBO0lBaUJFOzRCQWRtRCxJQUFJLFlBQVksRUFBRTtRQWVuRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztLQUNqQjs7OztRQVZVLEtBQUssS0FBYSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7O1FBQ3JDLEtBQUssQ0FBQyxHQUFXO1FBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDOzs7OztJQVNyQyxRQUFRO0tBQ1A7Ozs7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFFaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTO1lBQ3JELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7WUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7U0FDdkMsQ0FBQyxDQUFDO0tBQ0o7Ozs7O0lBRUQsU0FBUyxDQUFDLEtBQW9CO1FBQzVCLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxXQUFXLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3ZDO2FBQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMzQzthQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDM0M7S0FDRjs7Ozs7SUFDRCxPQUFPLENBQUMsS0FBb0I7UUFDMUIsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRTtZQUNqRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjtLQUNGOzs7O0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztLQUNyRDs7Ozs7SUFFRCxPQUFPLENBQUMsS0FBYztRQUNwQixVQUFVLENBQUM7WUFDVCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztTQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ1Q7Ozs7SUFFTyx3QkFBd0I7O1FBQzlCLE1BQU0sV0FBVyxHQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JHLFdBQVcsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDOztRQUVqQyxXQUFXLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7UUFFaEMsV0FBVyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7Ozs7WUFoRnRDLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUU7Ozs7Ozs7Q0FPWDtnQkFDQyxNQUFNLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQzthQUNoRDs7Ozs7b0JBSUUsS0FBSzsyQkFDTCxNQUFNO3dCQUVOLFNBQVMsU0FBQyxXQUFXOytCQUNyQixZQUFZLFNBQUMsbUJBQW1COzs7Ozs7O0FDdkJuQzs7O1lBUUMsUUFBUSxTQUFDO2dCQUNSLE9BQU8sRUFBRTtvQkFDUCx5QkFBeUI7b0JBQ3pCLDZCQUE2QjtvQkFDN0Isa0JBQWtCO29CQUNsQixXQUFXO2lCQUNaO2dCQUNELFlBQVksRUFBRSxDQUFDLHdCQUF3QixFQUFFLGVBQWUsQ0FBQztnQkFDekQsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDO2FBQzNCOzs7Ozs7Ozs7Ozs7Ozs7In0=