UNPKG

@stratio/egeo

Version:
932 lines 67.1 kB
/** * @fileoverview added by tsickle * Generated from: lib/st-tag-input/st-tag-input.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /* * © 2017 Stratio Big Data Inc., Sucursal en España. * * This software is licensed under the Apache License, Version 2.0. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the terms of the License for more details. * * SPDX-License-Identifier: Apache-2.0. */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, forwardRef, HostBinding, Input, ViewChild } from '@angular/core'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms'; /** * \@description {Component} Tag Input * * This component is a text input box that automatically creates tags out of a typed text. * * \@example * * {html} * * ``` * <st-tag-input * class="st-form-field" * name="tag-input-reactive" * formControlName="tag-input-reactive" * [autocompleteList]="filteredlist" * [withAutocomplete]="true" * [disabled]="disabled" * [label]="'Tag Input with Reactive Form'" * [id]="'tag-input-reactive'" * [placeholder]="'Add tags separated by commas'" * [tooltip]="'This is a Tag Input component tooltip'" * [forbiddenValues]="['test']" * (input)="onFilterList($event)"> * </st-tag-input> * <st-tag-input * class="st-form-field" * name="tag-input-template-driven" * [(ngModel)]="tags.templateDriven" * [autocompleteList]="filteredlist" * [withAutocomplete]="true" * [disabled]="disabled" * [label]="'Tag Input with Template Driven Form'" * [id]="'tag-input-template-driven'" * [placeholder]="'Add tags separated by commas'" * [tooltip]="'This is a Tag Input component tooltip'" * [regularExpression]="pattern" * (input)="onFilterList($event)"> * </st-tag-input> * ``` */ var StTagInputComponent = /** @class */ (function () { function StTagInputComponent(_selectElement, _cd) { this._selectElement = _selectElement; this._cd = _cd; /** * \@input {string | null} [label=null] Label to show over the input. It is empty by default */ this.label = null; /** * \@input {string | null} [tooltip=null] The tooltip to show over the label. It is empty by default */ this.tooltip = null; /** * \@input {string | null} [placeholder=null] The text that appears as placeholder of the input. It is empty by default */ this.placeholder = null; /** * \@input {string | null} [errorMessage=null] Error message to show. It is empty by default */ this.errorMessage = null; /** * \@input {string | null} [type=null] Type of the items */ this.type = 'text'; /** * \@input {boolean} [withAutocomplete=false] Enable autocomplete feature. It is false by default */ this.withAutocomplete = false; /** * \@input {(StDropDownMenuItem | StDropDownMenuGroup)[]} [autocompleteList=Array()] List to be used for autocomplete feature. It is empty by default */ this.autocompleteList = []; /** * \@input {boolean} [charsToShowAutocompleteList=Array()] List to be used for autocomplete feature. It is empty by default */ this.charsToShowAutocompleteList = 1; /** * \@input {boolean} [allowFreeText=true] Boolean to allow user to type a free text or not */ this.allowFreeText = true; /** * \@input {string[]} [forbiddenValues=Array()] A list of values that user can not type and if he types one of them, * tag input will be invalid. It is empty by default */ this.forbiddenValues = []; /** * \@input {string} [regularExpression=] Regular expression to validate values. It is null by default */ this.regularExpression = null; /** * \@Input {boolean} [forceValidations=false] If you specify it to 'true', the tag input checks the errors before being modified by user */ this.forceValidations = false; this.expandedMenu = false; this.items = []; this.innerInputContent = ''; this.isPristine = true; this.showErrorValue = false; this._focus = false; this._isDisabled = false; this._newElementInput = null; this._selected = null; this.onChange = (/** * @param {?} _ * @return {?} */ function (_) { }); this.onTouched = (/** * @return {?} */ function () { }); } Object.defineProperty(StTagInputComponent.prototype, "disabled", { /** @input {boolean} [disabled=false] Disable the component. It is false by default */ get: /** * \@input {boolean} [disabled=false] Disable the component. It is false by default * @return {?} */ function () { return this._isDisabled; }, set: /** * @param {?} value * @return {?} */ function (value) { this._isDisabled = value; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "hasLabel", { get: /** * @return {?} */ function () { return this.label !== null && this.label.length > 0; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "hasFocus", { get: /** * @return {?} */ function () { return this._focus; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "hasPlaceholder", { get: /** * @return {?} */ function () { return !this._focus && !this.items.length && this.placeholder && this.placeholder.length > 0; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "hasAutocomplete", { get: /** * @return {?} */ function () { return this.expandedMenu && this.autocompleteList && this.autocompleteList.length > 0; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "disableValue", { get: /** * @return {?} */ function () { return this._isDisabled === true ? '' : null; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "isValidInput", { get: /** * @return {?} */ function () { /** @type {?} */ var isForbidden = this.forbiddenValues.length && this.forbiddenValues.indexOf(this.innerInputContent) > -1; /** @type {?} */ var isDuplicated = this.items.indexOf(this.innerInputContent) !== -1; /** @type {?} */ var matchedPattern = this.regularExpression ? this._regularExp.test(this.innerInputContent) : true; return this.innerInputContent.length ? !isForbidden && !isDuplicated && matchedPattern : true; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "tagSelected", { get: /** * @return {?} */ function () { return this._selected; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "selectId", { get: /** * @return {?} */ function () { /** @type {?} */ var select = this._selectElement.nativeElement; return select.getAttribute('id') !== null ? select.id : null; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "inputId", { get: /** * @return {?} */ function () { return this.selectId !== null ? this.selectId + "-input" : null; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "labelId", { get: /** * @return {?} */ function () { return this.selectId !== null ? this.selectId + "-label" : null; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "tagId", { get: /** * @return {?} */ function () { return this.selectId !== null ? this.selectId + "-tag-" : null; }, enumerable: true, configurable: true }); Object.defineProperty(StTagInputComponent.prototype, "listId", { get: /** * @return {?} */ function () { return this.selectId !== null ? this.selectId + "-autocomplete" : null; }, enumerable: true, configurable: true }); /** * @return {?} */ StTagInputComponent.prototype.ngOnInit = /** * @return {?} */ function () { this._newElementInput = this.newElementInput.nativeElement; switch (this.type) { case 'number': { this.regularExpression = '^\\d+(\\.\\d+)?$'; break; } case 'integer': { this.regularExpression = '^\\d+$'; break; } default: { break; } } this._regularExp = new RegExp(this.regularExpression); this.showErrorValue = this.showError(); this._cd.markForCheck(); }; /** * @param {?} changes * @return {?} */ StTagInputComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { this.checkAutocompleteMenuChange(changes); if (this.forceValidations) { this.writeValue(this.items); } this._cd.markForCheck(); }; /** * @param {?} data * @return {?} */ StTagInputComponent.prototype.writeValue = /** * @param {?} data * @return {?} */ function (data) { var e_1, _a; if (data && Array.isArray(data) && data.length) { this.items = []; try { for (var data_1 = tslib_1.__values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) { var value = data_1_1.value; /** @type {?} */ var parsedValue = this._getParsedTag(value); if (parsedValue || !isNaN(parsedValue)) { this.items.push(parsedValue); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1); } finally { if (e_1) throw e_1.error; } } this.onChange(this.items); this.isPristine = false; this._cd.markForCheck(); } }; /** * @param {?} disabled * @return {?} */ StTagInputComponent.prototype.setDisabledState = /** * @param {?} disabled * @return {?} */ function (disabled) { this.disabled = disabled; this._cd.markForCheck(); }; /** * @param {?} control * @return {?} */ StTagInputComponent.prototype.validate = /** * @param {?} control * @return {?} */ function (control) { }; // Registry the change function to propagate internal model changes // Registry the change function to propagate internal model changes /** * @param {?} fn * @return {?} */ StTagInputComponent.prototype.registerOnChange = // Registry the change function to propagate internal model changes /** * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * @param {?} fn * @return {?} */ StTagInputComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; // Input actions // Input actions /** * @param {?} text * @return {?} */ StTagInputComponent.prototype.onInputText = // Input actions /** * @param {?} text * @return {?} */ function (text) { this.innerInputContent = text; this.showAutocompleteMenu(); }; /** * @param {?} event * @return {?} */ StTagInputComponent.prototype.onInputFocusIn = /** * @param {?} event * @return {?} */ function (event) { if (!this._isDisabled) { this._focus = true; this._newElementInput.focus(); this._forceResetAutoCompleteList(); this.showAutocompleteMenu(); } event.stopPropagation(); }; /** * @param {?} event * @return {?} */ StTagInputComponent.prototype.onInputFocusOut = /** * @param {?} event * @return {?} */ function (event) { if (!this.expandedMenu) { this._focus = false; this.addCurrentTag(); } event.stopPropagation(); }; /** * @param {?} event * @return {?} */ StTagInputComponent.prototype.onInputKeyDown = /** * @param {?} event * @return {?} */ function (event) { switch (event.keyCode) { case 188: // Comma case 13: // Enter if (this.innerInputContent.length && this.isValidInput) { this.addTag(this.innerInputContent); this._forceResetAutoCompleteList(); } event.preventDefault(); break; case 9: // Tab if (this.innerInputContent.length && this.isValidInput) { this.addTag(this.innerInputContent); event.preventDefault(); } else if (this.innerInputContent.length) { this.clearInput(); } break; case 46: // Delete if (this.innerInputContent.length) { this.clearInput(); } else if (this.items.length) { event.target.previousElementSibling.focus(); } break; case 8: // Backspace case 37: // Left if (this.items.length && !this.innerInputContent.length) { event.target.previousElementSibling.focus(); } break; default: break; } }; // Tag actions // Tag actions /** * @param {?} event * @param {?} index * @return {?} */ StTagInputComponent.prototype.onTagKeyDown = // Tag actions /** * @param {?} event * @param {?} index * @return {?} */ function (event, index) { switch (event.keyCode) { case 8: // Backspace case 46: // Delete if (this._selected !== null) { this.deleteTag(this._selected); this._selected = null; this._newElementInput.focus(); } break; case 37: // Left if (this._selected > 0) { event.target.previousElementSibling.focus(); } break; case 39: // Right if (this._selected < this.items.length) { event.target.nextElementSibling.focus(); } break; default: break; } }; /** * @param {?} event * @param {?} index * @return {?} */ StTagInputComponent.prototype.onTagFocusIn = /** * @param {?} event * @param {?} index * @return {?} */ function (event, index) { if (!this._isDisabled) { this._focus = true; this.addCurrentTag(); this.expandedMenu = false; this._selected = index; } }; /** * @param {?} event * @param {?} index * @return {?} */ StTagInputComponent.prototype.onTagFocusOut = /** * @param {?} event * @param {?} index * @return {?} */ function (event, index) { this._focus = false; this._selected = null; }; /** * @param {?} event * @param {?} index * @return {?} */ StTagInputComponent.prototype.onTagClick = /** * @param {?} event * @param {?} index * @return {?} */ function (event, index) { event.stopPropagation(); event.preventDefault(); }; // Dropdown actions // Dropdown actions /** * @param {?} data * @return {?} */ StTagInputComponent.prototype.onListSelect = // Dropdown actions /** * @param {?} data * @return {?} */ function (data) { this._focus = false; if (data.value.length && this.items.indexOf(data.value) === -1) { this.addTag(data.value); } else { this.clearInput(); } }; /** * @param {?} event * @return {?} */ StTagInputComponent.prototype.onClickOutside = /** * @param {?} event * @return {?} */ function (event) { if (this.expandedMenu) { this._focus = false; this.addCurrentTag(); } }; /** * @return {?} */ StTagInputComponent.prototype.showError = /** * @return {?} */ function () { return typeof this.errorMessage === 'string' && (!this.isPristine || this.forceValidations) && !this._focus && !this.disabled; }; /** * @param {?} index * @return {?} */ StTagInputComponent.prototype.deleteTag = /** * @param {?} index * @return {?} */ function (index) { this.items.splice(index, 1); this.onChange(this.items); this._newElementInput.value = ''; this.innerInputContent = ''; this._newElementInput.dispatchEvent(new Event('input')); }; /** * @private * @param {?} tag * @return {?} */ StTagInputComponent.prototype.addTag = /** * @private * @param {?} tag * @return {?} */ function (tag) { /** @type {?} */ var parsedValue = this._getParsedTag(tag); if (parsedValue || !isNaN(parsedValue)) { this.items.push(parsedValue); this.clearInput(); this.onChange(this.items); this.isPristine = false; } this.showErrorValue = this.showError(); }; /** * @private * @return {?} */ StTagInputComponent.prototype.addCurrentTag = /** * @private * @return {?} */ function () { if (this.innerInputContent.length && this.isValidInput) { this.addTag(this.innerInputContent); } else { this.clearInput(); } }; /** * @private * @return {?} */ StTagInputComponent.prototype.clearInput = /** * @private * @return {?} */ function () { if (this.expandedMenu) { this.expandedMenu = false; } this.innerInputContent = ''; this._newElementInput.innerText = ''; }; /** * @private * @return {?} */ StTagInputComponent.prototype.showAutocompleteMenu = /** * @private * @return {?} */ function () { if (this.withAutocomplete && !this.expandedMenu && this.charsToShowAutocompleteList <= this.innerInputContent.length) { this.expandedMenu = true; } if (this.innerInputContent === '' && this.charsToShowAutocompleteList) { this.expandedMenu = false; } this._cd.markForCheck(); }; /** * @private * @param {?} changes * @return {?} */ StTagInputComponent.prototype.checkAutocompleteMenuChange = /** * @private * @param {?} changes * @return {?} */ function (changes) { if (changes && changes.autocompleteList) { this._cd.markForCheck(); } }; /** * @private * @param {?} tag * @return {?} */ StTagInputComponent.prototype._getParsedTag = /** * @private * @param {?} tag * @return {?} */ function (tag) { switch (this.type) { case 'number': { return parseFloat(tag); } case 'integer': { return parseInt(tag, 0); } default: return tag; } }; /** * @private * @return {?} */ StTagInputComponent.prototype._forceResetAutoCompleteList = /** * @private * @return {?} */ function () { if (!this.charsToShowAutocompleteList && this.withAutocomplete) { this._newElementInput.innerText = ''; /** @type {?} */ var event_1 = new Event('input', { 'bubbles': true }); event_1.data = ''; this._newElementInput.dispatchEvent(event_1); } }; StTagInputComponent.decorators = [ { type: Component, args: [{ selector: 'st-tag-input', template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<st-dropdown-menu [items]=\"autocompleteList\" [attr.id]=\"listId\" [placement]=\"'bottom-start'\" [active]=\"hasAutocomplete\"\n (change)=\"onListSelect($event)\">\n\n <div class=\"st-tag-input\">\n <label *ngIf=\"hasLabel\" class=\"st-tag-input__label st-label\" [attr.id]=\"labelId\"\n [attr.title]=\"tooltip\"\n [attr.disabled]=\"disableValue\"\n [ngClass]=\"{ 'active': hasFocus, 'error': showErrorValue }\">{{label}}</label>\n\n <div #inputElement class=\"st-tag-input__input st-input\"\n [attr.disabled]=\"disableValue\" (clickOutside)=\"onClickOutside($event)\"\n [ngClass]=\"{ 'active': hasFocus, 'error': showErrorValue }\" (click)=\"onInputFocusIn($event)\">\n\n <span *ngIf=\"hasPlaceholder\" class=\"st-tag-input__placeholder\" [attr.disabled]=\"disableValue\">{{placeholder}}</span>\n <div class=\"st-tag-input__item tag-item\" *ngFor=\"let item of items; let i = index;\"\n [tabindex]=\"0\"\n [attr.id]=\"tagId + i\"\n (focusin)=\"onTagFocusIn($event, i)\"\n (focusout)=\"onTagFocusOut($event, i)\"\n (blur)=\"onTagFocusOut($event, i)\"\n (click)=\"onTagClick($event, i)\"\n (keydown)=\"onTagKeyDown($event, i)\">{{item}}<span *ngIf=\"!disabled\" class=\"icon-cross remove-tag-button\" (click)=\"deleteTag(i); $event.stopPropagation()\"></span>\n </div>\n\n <div #newElement type=\"type\"\n class=\"st-tag-input__text inner-input\"\n [attr.contenteditable]=\"(disableValue === null && allowFreeText)\"\n [attr.id]=\"inputId\"\n [ngClass]=\"{ 'error': !isValidInput }\"\n (focusin)=\"onInputFocusIn($event)\"\n (focusout)=\"onInputFocusOut($event)\"\n (blur)=\"onInputFocusOut($event)\"\n (input)=\"onInputText($event.target.textContent)\"\n (keydown)=\"onInputKeyDown($event)\"></div>\n </div>\n </div>\n\n</st-dropdown-menu>\n<span class=\"info-message\" *ngIf=\"infoMessage && isPristine\">{{infoMessage}}</span>\n<span *ngIf=\"showErrorValue\" class=\"st-input-error-message\">{{errorMessage}}</span>\n\n\n", host: { 'class': 'st-tag-input' }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return StTagInputComponent; })), multi: true }, { provide: NG_VALIDATORS, useExisting: forwardRef((/** * @return {?} */ function () { return StTagInputComponent; })), multi: true } ], changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";:host{display:block;width:100%;position:relative}.inner-input{border:0;outline:0;display:inline-block;padding:5px 10px;vertical-align:top;margin-bottom:5px;overflow:hidden;max-width:100%;min-height:30px}.tag-item{display:inline-block;margin-right:5px;overflow:hidden;max-width:100%}.tag-item:focus{outline:0}.st-tag-input__placeholder{display:inline-block;padding-top:5px}"] }] } ]; /** @nocollapse */ StTagInputComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: ChangeDetectorRef } ]; }; StTagInputComponent.propDecorators = { label: [{ type: Input }], tooltip: [{ type: Input }], placeholder: [{ type: Input }], errorMessage: [{ type: Input }], type: [{ type: Input }], withAutocomplete: [{ type: Input }], autocompleteList: [{ type: Input }], charsToShowAutocompleteList: [{ type: Input }], allowFreeText: [{ type: Input }], infoMessage: [{ type: Input }], forbiddenValues: [{ type: Input }], regularExpression: [{ type: Input }], forceValidations: [{ type: Input }], newElementInput: [{ type: ViewChild, args: ['newElement', { static: true },] }], inputElement: [{ type: ViewChild, args: ['inputElement', { static: false },] }], disabled: [{ type: Input }], hasAutocomplete: [{ type: HostBinding, args: ['class.st-tag-input--autocomplete',] }] }; return StTagInputComponent; }()); export { StTagInputComponent }; if (false) { /** * \@input {string | null} [label=null] Label to show over the input. It is empty by default * @type {?} */ StTagInputComponent.prototype.label; /** * \@input {string | null} [tooltip=null] The tooltip to show over the label. It is empty by default * @type {?} */ StTagInputComponent.prototype.tooltip; /** * \@input {string | null} [placeholder=null] The text that appears as placeholder of the input. It is empty by default * @type {?} */ StTagInputComponent.prototype.placeholder; /** * \@input {string | null} [errorMessage=null] Error message to show. It is empty by default * @type {?} */ StTagInputComponent.prototype.errorMessage; /** * \@input {string | null} [type=null] Type of the items * @type {?} */ StTagInputComponent.prototype.type; /** * \@input {boolean} [withAutocomplete=false] Enable autocomplete feature. It is false by default * @type {?} */ StTagInputComponent.prototype.withAutocomplete; /** * \@input {(StDropDownMenuItem | StDropDownMenuGroup)[]} [autocompleteList=Array()] List to be used for autocomplete feature. It is empty by default * @type {?} */ StTagInputComponent.prototype.autocompleteList; /** * \@input {boolean} [charsToShowAutocompleteList=Array()] List to be used for autocomplete feature. It is empty by default * @type {?} */ StTagInputComponent.prototype.charsToShowAutocompleteList; /** * \@input {boolean} [allowFreeText=true] Boolean to allow user to type a free text or not * @type {?} */ StTagInputComponent.prototype.allowFreeText; /** * \@input {string} [infoMessage=] Message used to inform user about what values he has to introduce * @type {?} */ StTagInputComponent.prototype.infoMessage; /** * \@input {string[]} [forbiddenValues=Array()] A list of values that user can not type and if he types one of them, * tag input will be invalid. It is empty by default * @type {?} */ StTagInputComponent.prototype.forbiddenValues; /** * \@input {string} [regularExpression=] Regular expression to validate values. It is null by default * @type {?} */ StTagInputComponent.prototype.regularExpression; /** * \@Input {boolean} [forceValidations=false] If you specify it to 'true', the tag input checks the errors before being modified by user * @type {?} */ StTagInputComponent.prototype.forceValidations; /** @type {?} */ StTagInputComponent.prototype.newElementInput; /** @type {?} */ StTagInputComponent.prototype.inputElement; /** @type {?} */ StTagInputComponent.prototype.expandedMenu; /** @type {?} */ StTagInputComponent.prototype.items; /** @type {?} */ StTagInputComponent.prototype.innerInputContent; /** @type {?} */ StTagInputComponent.prototype.isPristine; /** @type {?} */ StTagInputComponent.prototype.showErrorValue; /** * @type {?} * @private */ StTagInputComponent.prototype._focus; /** * @type {?} * @private */ StTagInputComponent.prototype._isDisabled; /** * @type {?} * @private */ StTagInputComponent.prototype._newElementInput; /** * @type {?} * @private */ StTagInputComponent.prototype._selected; /** * @type {?} * @private */ StTagInputComponent.prototype._regularExp; /** @type {?} */ StTagInputComponent.prototype.onChange; /** @type {?} */ StTagInputComponent.prototype.onTouched; /** * @type {?} * @private */ StTagInputComponent.prototype._selectElement; /** * @type {?} * @private */ StTagInputComponent.prototype._cd; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGFnLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdHJhdGlvL2VnZW8vIiwic291cmNlcyI6WyJsaWIvc3QtdGFnLWlucHV0L3N0LXRhZy1pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVdBLE9BQU8sRUFDSix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBSUwsU0FBUyxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBcUMsYUFBYSxFQUFFLGlCQUFpQixFQUFhLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNENoSDtJQWtFRyw2QkFBb0IsY0FBMEIsRUFDMUIsR0FBc0I7UUFEdEIsbUJBQWMsR0FBZCxjQUFjLENBQVk7UUFDMUIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7Ozs7UUFwRGpDLFVBQUssR0FBa0IsSUFBSSxDQUFDOzs7O1FBRTVCLFlBQU8sR0FBa0IsSUFBSSxDQUFDOzs7O1FBRTlCLGdCQUFXLEdBQWtCLElBQUksQ0FBQzs7OztRQUVsQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7Ozs7UUFFbkMsU0FBSSxHQUFrQixNQUFNLENBQUM7Ozs7UUFHN0IscUJBQWdCLEdBQVksS0FBSyxDQUFDOzs7O1FBRWxDLHFCQUFnQixHQUFpRCxFQUFFLENBQUM7Ozs7UUFFcEUsZ0NBQTJCLEdBQVcsQ0FBQyxDQUFDOzs7O1FBRXhDLGtCQUFhLEdBQVksSUFBSSxDQUFDOzs7OztRQU85QixvQkFBZSxHQUFhLEVBQUUsQ0FBQzs7OztRQUUvQixzQkFBaUIsR0FBZSxJQUFJLENBQUM7Ozs7UUFFckMscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBS3BDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLFVBQUssR0FBVSxFQUFFLENBQUM7UUFDbEIsc0JBQWlCLEdBQVcsRUFBRSxDQUFDO1FBQy9CLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0IsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFL0IsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixxQkFBZ0IsR0FBNEIsSUFBSSxDQUFDO1FBQ2pELGNBQVMsR0FBa0IsSUFBSSxDQUFDO1FBR3hDLGFBQVE7Ozs7UUFBRyxVQUFDLENBQU07UUFDbEIsQ0FBQyxFQUFBO1FBRUQsY0FBUzs7O1FBQUc7UUFDWixDQUFDLEVBQUE7SUFJRCxDQUFDO0lBR0Qsc0JBQ0kseUNBQVE7UUFGWixzRkFBc0Y7Ozs7O1FBQ3RGO1lBRUcsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzNCLENBQUM7Ozs7O1FBRUQsVUFBYSxLQUFjO1lBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUM7OztPQUpBO0lBTUQsc0JBQUkseUNBQVE7Ozs7UUFBWjtZQUNHLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7OztPQUFBO0lBRUQsc0JBQUkseUNBQVE7Ozs7UUFBWjtZQUNHLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0QixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLCtDQUFjOzs7O1FBQWxCO1lBQ0csT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoRyxDQUFDOzs7T0FBQTtJQUVELHNCQUNJLGdEQUFlOzs7O1FBRG5CO1lBRUcsT0FBTyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN6RixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDZDQUFZOzs7O1FBQWhCO1lBQ0csT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEQsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSw2Q0FBWTs7OztRQUFoQjs7Z0JBQ1MsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Z0JBQ3RHLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7O2dCQUNoRSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNwRyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsWUFBWSxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2pHLENBQUM7OztPQUFBO0lBRUQsc0JBQUksNENBQVc7Ozs7UUFBZjtZQUNHLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN6QixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHlDQUFROzs7O1FBQVo7O2dCQUNTLE1BQU0sR0FBZ0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhO1lBQzdELE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNoRSxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHdDQUFPOzs7O1FBQVg7WUFDRyxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBSSxJQUFJLENBQUMsUUFBUSxXQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuRSxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHdDQUFPOzs7O1FBQVg7WUFDRyxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBSSxJQUFJLENBQUMsUUFBUSxXQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuRSxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHNDQUFLOzs7O1FBQVQ7WUFDRyxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBSSxJQUFJLENBQUMsUUFBUSxVQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNsRSxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHVDQUFNOzs7O1FBQVY7WUFDRyxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBSSxJQUFJLENBQUMsUUFBUSxrQkFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUUsQ0FBQzs7O09BQUE7Ozs7SUFFRCxzQ0FBUTs7O0lBQVI7UUFDRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUM7UUFDM0QsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2hCLEtBQUssUUFBUSxDQUFDLENBQUM7Z0JBQ1osSUFBSSxDQUFDLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDO2dCQUM1QyxNQUFNO2FBQ1I7WUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dCQUNiLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUM7Z0JBQ2xDLE1BQU07YUFDUjtZQUNELE9BQU8sQ0FBQyxDQUFDO2dCQUNOLE1BQU07YUFDUjtTQUNIO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNCLENBQUM7Ozs7O0lBR0QseUNBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCO1FBQy9CLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5QjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7Ozs7SUFFRCx3Q0FBVTs7OztJQUFWLFVBQVcsSUFBUzs7UUFDakIsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDOztnQkFDaEIsS0FBb0IsSUFBQSxTQUFBLGlCQUFBLElBQUksQ0FBQSwwQkFBQSw0Q0FBRTtvQkFBckIsSUFBTSxLQUFLLGlCQUFBOzt3QkFDUCxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7b0JBQzdDLElBQUksV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDL0I7aUJBQ0g7Ozs7Ozs7OztZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDMUI7SUFDSixDQUFDOzs7OztJQUVELDhDQUFnQjs7OztJQUFoQixVQUFpQixRQUFpQjtRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNCLENBQUM7Ozs7O0lBRUQsc0NBQVE7Ozs7SUFBUixVQUFTLE9BQW9CO0lBQzdCLENBQUM7SUFFRCxtRUFBbUU7Ozs7OztJQUNuRSw4Q0FBZ0I7Ozs7OztJQUFoQixVQUFpQixFQUFvQjtRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDOzs7OztJQUVELCtDQUFpQjs7OztJQUFqQixVQUFrQixFQUFPO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQkFBZ0I7Ozs7OztJQUNoQix5Q0FBVzs7Ozs7O0lBQVgsVUFBWSxJQUFZO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDL0IsQ0FBQzs7Ozs7SUFFRCw0Q0FBYzs7OztJQUFkLFVBQWUsS0FBWTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDOUI7UUFDRCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7Ozs7SUFFRCw2Q0FBZTs7OztJQUFmLFVBQWdCLEtBQVk7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3ZCO1FBQ0QsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7Ozs7O0lBRUQsNENBQWM7Ozs7SUFBZCxVQUFlLEtBQVU7UUFDdEIsUUFBUSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ3BCLEtBQUssR0FBRyxDQUFDLENBQUMsUUFBUTtZQUNsQixLQUFLLEVBQUUsRUFBRSxRQUFRO2dCQUNkLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUNwQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztpQkFDckM7Z0JBQ0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixNQUFNO1lBQ1QsS0FBSyxDQUFDLEVBQUUsTUFBTTtnQkFDWCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDcEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2lCQUN6QjtxQkFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7b0JBQ3ZDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztpQkFDcEI7Z0JBQ0QsTUFBTTtZQUNULEtBQUssRUFBRSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFO29CQUNoQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7aUJBQ3BCO3FCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7b0JBQzNCLEtBQUssQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQzlDO2dCQUNELE1BQU07WUFDVCxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVk7WUFDcEIsS0FBSyxFQUFFLEVBQUUsT0FBTztnQkFDYixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtvQkFDdEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDOUM7Z0JBQ0QsTUFBTTtZQUNUO2dCQUNHLE1BQU07U0FDWDtJQUNKLENBQUM7SUFFRCxjQUFjOzs7Ozs7O0lBQ2QsMENBQVk7Ozs7Ozs7SUFBWixVQUFhLEtBQVUsRUFBRSxLQUFhO1FBQ25DLFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNwQixLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVk7WUFDcEIsS0FBSyxFQUFFLEVBQUUsU0FBUztnQkFDZixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO29CQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDaEM7Z0JBQ0QsTUFBTTtZQUNULEtBQUssRUFBRSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRTtvQkFDckIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDOUM7Z0JBQ0QsTUFBTTtZQUNULEtBQUssRUFBRSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO29CQUNyQyxLQUFLLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUMxQztnQkFDRCxNQUFNO1lBQ1Q7Z0JBQ0csTUFBTTtTQUNYO0lBQ0osQ0FBQzs7Ozs7O0lBRUQsMENBQVk7Ozs7O0lBQVosVUFBYSxLQUFZLEVBQUUsS0FBYTtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDekI7SUFDSixDQUFDOzs7Ozs7SUFFRCwyQ0FBYTs7Ozs7SUFBYixVQUFjLEtBQVksRUFBRSxLQUFhO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7Ozs7OztJQUVELHdDQUFVOzs7OztJQUFWLFVBQVcsS0FBWSxFQUFFLEtBQWE7UUFDbkMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsbUJBQW1COzs7Ozs7SUFDbkIsMENBQVk7Ozs7OztJQUFaLFVBQWEsSUFBd0I7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUI7YUFBTTtZQUNKLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNwQjtJQUNKLENBQUM7Ozs7O0lBRUQsNENBQWM7Ozs7SUFBZCxVQUFlLEtBQVk7UUFDeEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN2QjtJQUNKLENBQUM7Ozs7SUFFRCx1Q0FBUzs7O0lBQVQ7UUFDRyxPQUFPLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNqSSxDQUFDOzs7OztJQUdELHVDQUFTOzs7O0lBQVQsVUFBVSxLQUFhO1FBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDOzs7Ozs7SUFFTyxvQ0FBTTs7Ozs7SUFBZCxVQUFlLEdBQVc7O1lBQ2pCLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQztRQUMzQyxJQUFJLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxQyxDQUFDOzs7OztJQUVPLDJDQUFhOzs7O0lBQXJCO1FBQ0csSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUN0QzthQUFNO1lBQ0osSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3BCO0lBQ0osQ0FBQzs7Ozs7SUFFTyx3Q0FBVTs7OztJQUFsQjtRQUNHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztTQUM1QjtRQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDeEMsQ0FBQzs7Ozs7SUFFTyxrREFBb0I7Ozs7SUFBNUI7UUFDRyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLDJCQUEyQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7WUFDbkgsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDM0I7UUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFO1lBQ3BFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQixDQUFDOzs7Ozs7SUFFTyx5REFBMkI7Ozs7O0lBQW5DLFVBQW9DLE9BQXNCO1FBQ3ZELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQzFCO0lBQ0osQ0FBQzs7Ozs7O0lBRU8sMkNBQWE7Ozs7O0lBQXJCLFVBQXNCLEdBQVc7UUFDOUIsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2hCLEtBQUssUUFBUSxDQUFDLENBQUM7Z0JBQ1osT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekI7WUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dCQUNiLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMxQjtZQUNEO2dCQUNHLE9BQU8sR0FBRyxDQUFDO1NBQ2hCO0lBQ0osQ0FBQzs7Ozs7SUFFTyx5REFBMkI7Ozs7SUFBbkM7UUFDRyxJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUM3RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQzs7Z0JBQy9CLE9BQUssR0FBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ25DLFNBQVMsRUFBRSxJQUFJO2FBQ2pCLENBQUM7WUFDRixPQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE9BQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0osQ0FBQzs7Z0JBNVlILFNBQVMsU0FBQztvQkFDUixRQUFRLEVBQUUsY0FBYztvQkFDeEIsa3BGQUE0QztvQkFFNUMsSUFBSSxFQUFFO3dCQUNILE9BQU8sRUFBRSxjQUFjO3FCQUN6QjtvQkFDRCxTQUFTLEVBQUU7d0JBQ1IsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFVBQVU7Ozs0QkFBQyxjQUFNLE9BQUEsbUJBQW1CLEVBQW5CLENBQW1CLEVBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO3dCQUMvRixFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFVBQVU7Ozs0QkFBQyxjQUFNLE9BQUEsbUJBQW1CLEVBQW5CLENBQW1CLEVBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO3FCQUFDO29CQUMvRixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7aUJBQ2pEOzs7O2dCQWhFRSxVQUFVO2dCQUZWLGlCQUFpQjs7O3dCQXNFaEIsS0FBSzswQkFFTCxLQUFLOzhCQUVMLEtBQUs7K0JBRUwsS0FBSzt1QkFFTCxLQUFLO21DQUdMLEtBQUs7bUNBRUwsS0FBSzs4Q0FFTCxLQUFLO2dDQUVMLEtBQUs7OEJBRUwsS0FBSztrQ0FLTCxLQUFLO29DQUVMLEtBQUs7bUNBRUwsS0FBSztrQ0FFTCxTQUFTLFNBQUMsWUFBWSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQzsrQkFDdEMsU0FBUyxTQUFDLGNBQWMsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7MkJBeUJ6QyxLQUFLO2tDQXFCTCxXQUFXLFNBQUMsa0NBQWtDOztJQWlUbEQsMEJBQUM7Q0FBQSxBQTdZRCxJQTZZQztTQWpZWSxtQkFBbUI7Ozs7OztJQUc3QixvQ0FBcUM7Ozs7O0lBRXJDLHNDQUF1Qzs7Ozs7SUFFdkMsMENBQTJDOzs7OztJQUUzQywyQ0FBNEM7Ozs7O0lBRTVDLG1DQUFzQzs7Ozs7SUFHdEMsK0NBQTJDOzs7OztJQUUzQywrQ0FBNkU7Ozs7O0lBRTdFLDBEQUFpRDs7Ozs7SUFFakQsNENBQXVDOzs7OztJQUV2QywwQ0FBNkI7Ozs7OztJQUs3Qiw4Q0FBd0M7Ozs7O0lBRXhDLGdEQUE4Qzs7Ozs7SUFFOUMsK0NBQTJDOztJQUUzQyw4Q0FBcUU7O0lBQ3JFLDJDQUFxRTs7SUFFckUsMkNBQXFDOztJQUNyQyxvQ0FBeUI7O0lBQ3pCLGdEQUFzQzs7SUFDdEMseUNBQWtDOztJQUNsQyw2Q0FBdUM7Ozs7O0lBRXZDLHFDQUFnQzs7Ozs7SUFDaEMsMENBQXFDOzs7OztJQUNyQywrQ0FBeUQ7Ozs7O0lBQ3pELHdDQUF3Qzs7Ozs7SUFDeEMsMENBQTRCOztJQUU1Qix1Q0FDQzs7SUFFRCx3Q0FDQzs7Ozs7SUFFVyw2Q0FBa0M7Ozs7O0lBQ2xDLGtDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiDCqSAyMDE3IFN0cmF0aW8gQmlnIERhdGEgSW5jLiwgU3VjdXJzYWwgZW4gRXNwYcOxYS5cbiAqXG4gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZO1xuICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiAqIFNlZSB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMC5cbiAqL1xuXG5pbXBvcnQge1xuICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgIENvbXBvbmVudCxcbiAgIEVsZW1lbnRSZWYsXG4gICBmb3J3YXJkUmVmLFxuICAgSG9zdEJpbmRpbmcsXG4gICBJbnB1dCxcbiAgIE9uQ2hhbmdlcyxcbiAgIE9uSW5pdCxcbiAgIFNpbXBsZUNoYW5nZXMsXG4gICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFN0RHJvcERvd25NZW51R3JvdXAsIFN0RHJvcERvd25NZW51SXRlbSB9IGZyb20gJy4uL3N0LWRyb3Bkb3duLW1lbnUvc3QtZHJvcGRvd24tbWVudS5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiB7Q29tcG9uZW50fSBUYWcgSW5wdXRcbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBpcyBhIHRleHQgaW5wdXQgYm94IHRoYXQgYXV0b21hdGljYWxseSBjcmVhdGVzIHRhZ3Mgb3V0IG9mIGEgdHlwZWQgdGV4dC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIHtodG1sfVxuICpcbiAqIGBgYFxuICogPHN0LXRhZy1pbnB1dFxuICogICAgY2xhc3M9XCJzdC1mb3JtLWZpZWxkXCJcbiAqICAgIG5hbWU9XCJ0YWctaW5wdXQtcmVhY3RpdmVcIlxuICogICAgZm9ybUNvbnRyb2xOYW1lPVwidGFnLWlucHV0LXJlYWN0aXZlXCJcbiAqICAgIFthdXRvY29tcGxldGVMaXN0XT1cImZpbHRlcmVkbGlzdFwiXG4gKiAgICBbd2l0aEF1dG9jb21wbGV0ZV09XCJ0cnVlXCJcbiAqICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gKiAgICBbbGFiZWxdPVwiJ1RhZyBJbnB1dCB3aXRoIFJlYWN0aXZlIEZvcm0nXCJcbiAqICAgIFtpZF09XCIndGFnLWlucHV0LXJlYWN0aXZlJ1wiXG4gKiAgICBbcGxhY2Vob2xkZXJdPVwiJ0FkZCB0YWdzIHNlcGFyYXRlZCBieSBjb21tYXMnXCJcbiAqICAgIFt0b29sdGlwXT1cIidUaGlzIGlzIGEgVGFnIElucHV0IGNvbXBvbmVudCB0b29sdGlwJ1wiXG4gKiAgICBbZm9yYmlkZGVuVmFsdWVzXT1cIlsndGVzdCddXCJcbiAqICAgIChpbnB1dCk9XCJvbkZpbHRlckxpc3QoJGV2ZW50KVwiPlxuICogPC9zdC10YWctaW5wdXQ+XG4gKiA8c3QtdGFnLWlucHV0XG4gKiAgICBjbGFzcz1cInN0LWZvcm0tZmllbGRcIlxuICogICAgbmFtZT1cInRhZy1pbnB1dC10ZW1wbGF0ZS1kcml2ZW5cIlxuICogICAgWyhuZ01vZGVsKV09XCJ0YWdzLnRlbXBsYXRlRHJpdmVuXCJcbiAqICAgIFthdXRvY29tcGxldGVMaXN0XT1cImZpbHRlcmVkbGlzdFwiXG4gKiAgICBbd2l0aEF1dG9jb21wbGV0ZV09XCJ0cnVlXCJcbiAqICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gKiAgICBbbGFiZWxdPVwiJ1RhZyBJbnB1dCB3aXRoIFRlbXBsYXRlIERyaXZlbiBGb3JtJ1wiXG4gKiAgICBbaWRdPVwiJ3RhZy1pbnB1dC10ZW1wbGF0ZS1kcml2ZW4nXCJcbiAqICAgIFtwbGFjZWhvbGRlcl09XCInQWRkIHRhZ3Mgc2VwYXJhdGVkIGJ5IGNvbW1hcydcIlxuICogICAgW3Rvb2x0aXBdPVwiJ1RoaXMgaXMgYSBUYWcgSW5wdXQgY29tcG9uZW50IHRvb2x0aXAnXCJcbiAqICAgIFtyZWd1bGFyRXhwcmVzc2lvbl09XCJwYXR0ZXJuXCJcbiAqICAgIChpbnB1dCk9XCJvbkZpbHRlckxpc3QoJGV2ZW50KVwiPlxuICogPC9zdC10YWctaW5wdXQ+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICBzZWxlY3RvcjogJ3N0LXRhZy1pbnB1dCcsXG4gICB0ZW1wbGF0ZVVybDogJy4vc3QtdGFnLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgIHN0eWxlVXJsczogWycuL3N0LXRhZy1pbnB1dC5jb21wb25lbnQuc2NzcyddLFxuICAgaG9zdDoge1xuICAgICAgJ2NsYXNzJzogJ3N0LXRhZy1pbnB1dCdcbiAgIH0sXG4gICBwcm92aWRlcnM6IFtcbiAgICAgIHsgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKC