ngx-selectbox-may
Version:
Angular selectbox with autocomplete
591 lines • 44.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, ElementRef, ViewChild, ViewChildren, QueryList, forwardRef, Output, EventEmitter, ContentChild, TemplateRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { NgxSelectboxMayService } from './ngx-selectbox-may.service';
import { NGXSelectMayConfigs } from './ngx-selectbox-may-configs';
var NgxSelectboxMayComponent = /** @class */ (function () {
function NgxSelectboxMayComponent(_selectboxref, selectboxService) {
this._selectboxref = _selectboxref;
this.selectboxService = selectboxService;
this.dropdownRows = [];
this.configs = new NGXSelectMayConfigs();
this.selectedRows = [];
this.show_items = false;
this.searchText = "";
this.isEnable = true;
this.propagateChange = function (_) { };
this.propagateOnTouch = function (_) { };
this.onKeyUp = new EventEmitter();
this.onSelect = new EventEmitter();
this.onBlur = new EventEmitter();
}
Object.defineProperty(NgxSelectboxMayComponent.prototype, "items", {
set: /**
* @param {?} items
* @return {?}
*/
function (items) {
this.createDropdownRows(items);
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxSelectboxMayComponent.prototype, "cssClass", {
set: /**
* @param {?} cssClass
* @return {?}
*/
function (cssClass) {
this.configs.cssClass = cssClass;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxSelectboxMayComponent.prototype, "valueField", {
set: /**
* @param {?} valueField
* @return {?}
*/
function (valueField) {
this.configs.valueField = valueField;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxSelectboxMayComponent.prototype, "labelField", {
set: /**
* @param {?} labelField
* @return {?}
*/
function (labelField) {
this.configs.labelField = labelField;
this.reconfigureLabelsAndValues();
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxSelectboxMayComponent.prototype, "placeholder", {
set: /**
* @param {?} placeholder
* @return {?}
*/
function (placeholder) {
this.configs.placeholderText = placeholder;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxSelectboxMayComponent.prototype, "emptyText", {
set: /**
* @param {?} emptyText
* @return {?}
*/
function (emptyText) {
this.configs.emptyText = emptyText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxSelectboxMayComponent.prototype, "showEmptyResultText", {
set: /**
* @param {?} showEmptyText
* @return {?}
*/
function (showEmptyText) {
this.configs.showEmptyResultsLabel = showEmptyText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxSelectboxMayComponent.prototype, "isMulti", {
set: /**
* @param {?} isMulti
* @return {?}
*/
function (isMulti) {
this.configs.isMultiSelect = isMulti;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxSelectboxMayComponent.prototype, "isLoading", {
set: /**
* @param {?} isLoading
* @return {?}
*/
function (isLoading) {
this._isLoading = isLoading;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxSelectboxMayComponent.prototype, "loadingText", {
set: /**
* @param {?} loadingText
* @return {?}
*/
function (loadingText) {
this._loadingText = loadingText;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
/**
* @param {?} items
* @return {?}
*/
NgxSelectboxMayComponent.prototype.createDropdownRows = /**
* @param {?} items
* @return {?}
*/
function (items) {
this.dropdownRows = this.selectboxService.createDropdownRows(items, this.configs);
this.setValuesPassedExternal(this.ngModelValue);
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.reconfigureLabelsAndValues = /**
* @return {?}
*/
function () {
this.selectboxService.reconfigureDropdownRowLabelsAndValues(this.dropdownRows, this.configs);
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.getSelectboxLabel = /**
* @return {?}
*/
function () {
/** @type {?} */
var label = this.selectboxService.createDropdownLabel(this.configs, this.selectedRows);
return label ? label : this.configs.placeholderText;
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.getEmptyTextLabel = /**
* @return {?}
*/
function () {
return this.configs.emptyText ? this.configs.emptyText : NGXSelectMayConfigs.EMPTY_TEXT;
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.getLoadingText = /**
* @return {?}
*/
function () {
return this._loadingText ? this._loadingText : NGXSelectMayConfigs.LOADING_TEXT;
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.onClickSelectBox = /**
* @return {?}
*/
function () {
this.showItemsWindow();
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.getActiveClass = /**
* @return {?}
*/
function () {
return NGXSelectMayConfigs.ROW_ACTIVE_CLASS;
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.showItemsWindow = /**
* @return {?}
*/
function () {
this.show_items = true;
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.hideItemsWindow = /**
* @return {?}
*/
function () {
this.onBlur.emit(this.searchText);
this.resetFilters();
this.show_items = false;
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.onRemoveClick = /**
* @return {?}
*/
function () {
this.selectboxService.unselectAllSelectedRows(this.dropdownRows);
this.selectedRows = [];
this.publishValue();
};
/**
* @param {?} e
* @return {?}
*/
NgxSelectboxMayComponent.prototype.onSearchKeydown = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (e.key == "Escape") {
this.hideItemsWindow();
}
//Up and Down arrow events
if (e.keyCode == 38 || e.keyCode == 40) {
e.preventDefault();
}
};
/**
* @param {?} e
* @return {?}
*/
NgxSelectboxMayComponent.prototype.onSearchKeyup = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (e.keyCode == 38 || e.keyCode == 40 || e.key == "Escape") {
e.preventDefault();
}
else {
this.onKeyUp.emit(this.searchText);
}
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.resetFilters = /**
* @return {?}
*/
function () {
this.searchText = "";
};
/**
* @param {?} row
* @param {?} index
* @return {?}
*/
NgxSelectboxMayComponent.prototype.onClickItem = /**
* @param {?} row
* @param {?} index
* @return {?}
*/
function (row, index) {
if (this.configs.isMultiSelect) {
}
else {
this.selectedRows = this.selectboxService.setSelectedItems(this.configs, this.selectedRows, this.dropdownRows, row);
this.onSelect.emit(row.data);
this.hideItemsWindow();
}
this.publishValue();
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.publishValue = /**
* @return {?}
*/
function () {
/** @type {?} */
var values = this.selectedRows.map(function (r) { return r.value; });
if (this.configs.isMultiSelect) {
this.propagateChange(values);
}
else {
this.propagateChange(values.length > 0 ? values[0] : "");
}
};
/**
* @param {?} obj
* @return {?}
*/
NgxSelectboxMayComponent.prototype.setValuesPassedExternal = /**
* @param {?} obj
* @return {?}
*/
function (obj) {
if (this.configs.isMultiSelect) {
this.selectedRows = this.selectboxService.selectItemsByValue(this.dropdownRows, obj);
}
else {
this.selectedRows = this.selectboxService.selectItemByValue(this.dropdownRows, obj);
}
};
Object.defineProperty(NgxSelectboxMayComponent.prototype, "content", {
/*
*
* On Item browse open window begin & document outside click event Begins
*
*/
set: /*
*
* On Item browse open window begin & document outside click event Begins
*
*/
/**
* @param {?} content
* @return {?}
*/
function (content) {
this.itemWindow = content;
// this.positionWindow();
this.focusToSearchField();
this.scrollToSelectedItem();
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.positionWindow = /**
* @return {?}
*/
function () {
if (this.searchField) {
/** @type {?} */
var selectBoxRef = this._selectboxref.nativeElement;
/** @type {?} */
var viewportOffset = selectBoxRef.getBoundingClientRect();
console.log(viewportOffset);
this.itemWindow.nativeElement.setAttribute('style', 'width: ' + (selectBoxRef.firstChild.offsetWidth + 3) + 'px; top: ' + (viewportOffset.top - 5) + 'px; margin-left: -12px;');
}
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.focusToSearchField = /**
* @return {?}
*/
function () {
if (this.searchField) {
this.searchField.nativeElement.focus();
}
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.scrollToSelectedItem = /**
* @return {?}
*/
function () {
var _this = this;
this.listItems.forEach(function (li) {
if (li.nativeElement.classList.contains(NGXSelectMayConfigs.ROW_ACTIVE_CLASS)) {
/** @type {?} */
var scrollLi = li.nativeElement;
_this.itemWindow.nativeElement.getElementsByTagName("ul")[0].scrollTop = scrollLi.offsetTop - (scrollLi.offsetHeight + 20);
}
});
};
/**
* @param {?} e
* @return {?}
*/
NgxSelectboxMayComponent.prototype.onClickOutside = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (!this._selectboxref.nativeElement.contains(event.target) && this.show_items) {
this.hideItemsWindow();
}
};
/**
* @param {?} e
* @return {?}
*/
NgxSelectboxMayComponent.prototype.onWindowResize = /**
* @param {?} e
* @return {?}
*/
function (e) {
// this.positionWindow();
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.setDisable = /**
* @return {?}
*/
function () {
this.hideItemsWindow();
this.isEnable = false;
};
/**
* @return {?}
*/
NgxSelectboxMayComponent.prototype.setEnable = /**
* @return {?}
*/
function () {
this.isEnable = true;
};
/**
* @param {?} obj
* @return {?}
*/
NgxSelectboxMayComponent.prototype.writeValue = /**
* @param {?} obj
* @return {?}
*/
function (obj) {
this.ngModelValue = obj;
this.setValuesPassedExternal(obj);
};
/**
* @param {?} fn
* @return {?}
*/
NgxSelectboxMayComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.propagateChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
NgxSelectboxMayComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.propagateOnTouch = fn;
};
/**
* @param {?} isDisabled
* @return {?}
*/
NgxSelectboxMayComponent.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
console.log(isDisabled, "set disable");
if (isDisabled) {
this.setDisable();
}
else {
this.setEnable();
}
};
NgxSelectboxMayComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-selectbox-may',
host: {
'(document:click)': 'onClickOutside($event)',
'(window:resize)': 'onWindowResize($event)'
},
template: "<div [ngClass]=\"configs.cssClass\" class=\"__ngx-selectbox-may\">\n <span class=\"__selected-label\">\n <span>{{getSelectboxLabel()}}</span>\n </span>\n <div *ngIf=\"_isLoading\" class=\"__loading-text\">{{getLoadingText()}}</div>\n <div class=\"__clickable-area\" (click)=\"onClickSelectBox()\"></div>\n <button *ngIf=\"selectedRows.length>0 && isEnable\" type=\"button\" class=\"__remove-selected-btn\" (click)=\"onRemoveClick()\">\n <i></i>\n </button>\n <div *ngIf=\"show_items\" class=\"__item-list-browser\" #item_window>\n <div class=\"__item-search\">\n <input #search_field type=\"text\" max-length=\"15\" (keydown)=\"onSearchKeydown($event)\"\n (keyup)=\"onSearchKeyup($event)\" placeholder=\"search\" [(ngModel)]=\"searchText\" />\n </div>\n <ng-container *ngTemplateOutlet=\"actionTemplate\"></ng-container>\n <ul class=\"__ngx-selectbox-ul\">\n <ng-container *ngFor=\"let item of dropdownRows | ngx_item_filter:searchText; let i = index; let l = count\">\n <li #li_item *ngIf=\"l>0\" (click)=\"onClickItem(item, i)\" [ngClass]=\"item.isSelected ? getActiveClass() : ''\">\n {{item.label}}\n </li>\n </ng-container>\n <li class=\"__empty-items\"\n *ngIf=\"(dropdownRows | ngx_item_filter:searchText).length === 0 && configs.showEmptyResultsLabel\">\n {{getEmptyTextLabel()}}\n </li>\n </ul>\n </div>\n <div *ngIf=\"!isEnable\" class=\"__disabled-mask\"></div>\n</div>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return NgxSelectboxMayComponent; }),
multi: true,
}
],
styles: [".__ngx-selectbox-may{position:relative;min-width:200px;padding:3px 40px 3px 10px;display:flex;align-items:center;cursor:pointer;background-color:#fff}.__ngx-selectbox-may .__disabled-mask{position:absolute;background-color:rgba(0,0,0,.15);top:0;left:0;right:0;bottom:0}.__ngx-selectbox-may::before{content:\"\\f107\";position:absolute;font-family:FontAwesome;color:#3f495b;right:10px;top:0;bottom:0;display:flex;align-items:center;font-size:14px}.__ngx-selectbox-may .__selected-label{position:relative;display:block;width:100%;text-align:left;height:19px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.__ngx-selectbox-may .__remove-selected-btn{background-color:transparent;border:0;outline:0;cursor:pointer;position:absolute;right:20px;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__clickable-area{position:absolute;top:0;left:0;right:0;bottom:0}.__ngx-selectbox-may .__remove-selected-btn i::before{content:\"\\f00d\";font-family:FontAwesome;font-style:normal!important;-webkit-text-stroke:.5px #f1f4f8}.__ngx-selectbox-may .__selected-label .__remove-selected-btn::before{content:\"\\f00c\";position:absolute;font-family:FontAwesome;right:12px;font-size:12px;top:0;bottom:0;display:flex;align-items:center;-webkit-text-stroke:.5px #f1f4f8}.__ngx-selectbox-may .__item-list-browser{position:absolute;background-color:#fff;border-radius:4px;border:1px solid #dfe3e9;box-shadow:0 3px 18px -6px rgba(0,0,0,.5);z-index:1;top:-2px;left:-2px;right:-2px}.__ngx-selectbox-may .__item-list-browser ul{max-height:200px;overflow-y:auto;padding:0;margin:0;border-top:1px solid #dfe3e9}.__ngx-selectbox-may .__item-list-browser ul li{color:#777;font-size:13px;text-align:left;padding:9px 24px 9px 12px;border-bottom:1px solid #dfe3e9;cursor:pointer;line-height:17px}.__ngx-selectbox-may .__item-list-browser ul li.selected,.__ngx-selectbox-may .__item-list-browser ul li:hover{background-color:#f1f4f8;color:#2ea2f8}.__ngx-selectbox-may .__item-list-browser ul li.active{background-color:#f1f4f8;color:#2ea2f8;position:relative}.__ngx-selectbox-may .__item-list-browser ul li.active::before{content:\"\\f00c\";position:absolute;font-family:FontAwesome;right:12px;font-size:12px;-webkit-text-stroke:.5px #f1f4f8;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__item-list-browser ul li.__empty-items{color:#ff7f74;background-color:#fff4f4;cursor:auto}.__ngx-selectbox-may .__item-list-browser ul li:last-child{border-bottom:none}.__ngx-selectbox-may .__item-list-browser .__item-search{padding:5px;display:flex;position:relative}.__ngx-selectbox-may .__item-list-browser .__item-search::before{content:\"\\f002\";position:absolute;font-family:FontAwesome;right:16px;-webkit-text-stroke:.5px #fff;color:#ced0da;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__item-list-browser .__item-search input[type=text]{width:100%;border:1px solid #dfe3e9;border-radius:4px;padding:8px 30px 8px 10px;outline:0}.__ngx-selectbox-may .__item-list-browser .__item-search input[type=text]:focus{border:1px solid #2ea2f8;box-shadow:0 0 0 3px #2ea2f84d}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar{width:11px;height:18px}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-thumb{height:6px;border:3px solid transparent;background-clip:padding-box;-webkit-border-radius:7px;background-color:rgba(0,0,0,.15);-webkit-box-shadow:inset -1px -1px 0 rgba(0,0,0,.05) inset 1px 1px 0 rgba(0,0,0,.05)}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-button{width:0;height:0;display:none}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-corner{background-color:transparent}.__ngx-selectbox-may .__loading-text{position:absolute;background-color:#e5e5e5;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;padding-left:10px;border-radius:4px;z-index:2}"]
}] }
];
/** @nocollapse */
NgxSelectboxMayComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: NgxSelectboxMayService }
]; };
NgxSelectboxMayComponent.propDecorators = {
items: [{ type: Input, args: ["items",] }],
cssClass: [{ type: Input, args: ["css-class",] }],
valueField: [{ type: Input, args: ["value-field",] }],
labelField: [{ type: Input, args: ["label-field",] }],
placeholder: [{ type: Input, args: ["placeholder",] }],
emptyText: [{ type: Input, args: ["empty-text",] }],
showEmptyResultText: [{ type: Input, args: ["show-empty-text",] }],
isMulti: [{ type: Input, args: ["is-multi",] }],
isLoading: [{ type: Input, args: ["is-loading",] }],
loadingText: [{ type: Input, args: ["loading-text",] }],
onKeyUp: [{ type: Output, args: ["search-keyup",] }],
onSelect: [{ type: Output, args: ["on-select-item",] }],
onBlur: [{ type: Output, args: ["on-blur",] }],
searchField: [{ type: ViewChild, args: ['search_field',] }],
listItems: [{ type: ViewChildren, args: ["li_item",] }],
actionTemplate: [{ type: ContentChild, args: ['actionTemplate',] }],
content: [{ type: ViewChild, args: ['item_window',] }]
};
return NgxSelectboxMayComponent;
}());
export { NgxSelectboxMayComponent };
if (false) {
/** @type {?} */
NgxSelectboxMayComponent.prototype.dropdownRows;
/** @type {?} */
NgxSelectboxMayComponent.prototype.configs;
/** @type {?} */
NgxSelectboxMayComponent.prototype.selectedRows;
/** @type {?} */
NgxSelectboxMayComponent.prototype.show_items;
/** @type {?} */
NgxSelectboxMayComponent.prototype.searchText;
/** @type {?} */
NgxSelectboxMayComponent.prototype.isEnable;
/** @type {?} */
NgxSelectboxMayComponent.prototype.propagateChange;
/** @type {?} */
NgxSelectboxMayComponent.prototype.propagateOnTouch;
/** @type {?} */
NgxSelectboxMayComponent.prototype._isLoading;
/** @type {?} */
NgxSelectboxMayComponent.prototype._loadingText;
/** @type {?} */
NgxSelectboxMayComponent.prototype.onKeyUp;
/** @type {?} */
NgxSelectboxMayComponent.prototype.onSelect;
/** @type {?} */
NgxSelectboxMayComponent.prototype.onBlur;
/** @type {?} */
NgxSelectboxMayComponent.prototype.searchField;
/** @type {?} */
NgxSelectboxMayComponent.prototype.listItems;
/** @type {?} */
NgxSelectboxMayComponent.prototype.itemWindow;
/** @type {?} */
NgxSelectboxMayComponent.prototype.actionTemplate;
/** @type {?} */
NgxSelectboxMayComponent.prototype.ngModelValue;
/**
* @type {?}
* @private
*/
NgxSelectboxMayComponent.prototype._selectboxref;
/**
* @type {?}
* @private
*/
NgxSelectboxMayComponent.prototype.selectboxService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNlbGVjdGJveC1tYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNlbGVjdGJveC1tYXkvIiwic291cmNlcyI6WyJsaWIvbmd4LXNlbGVjdGJveC1tYXkuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFnQixNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZNLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsbUJBQW1CLEVBQW1CLE1BQU0sNkJBQTZCLENBQUM7QUFFbkY7SUF5RkUsa0NBQW9CLGFBQXlCLEVBQVUsZ0JBQXdDO1FBQTNFLGtCQUFhLEdBQWIsYUFBYSxDQUFZO1FBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF3QjtRQXZFL0YsaUJBQVksR0FBMkIsRUFBRSxDQUFDO1FBQzFDLFlBQU8sR0FBd0IsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pELGlCQUFZLEdBQTJCLEVBQUUsQ0FBQztRQUMxQyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4QixvQkFBZSxHQUFHLFVBQUMsQ0FBTSxJQUFPLENBQUMsQ0FBQztRQUNsQyxxQkFBZ0IsR0FBRyxVQUFDLENBQU0sSUFBTyxDQUFDLENBQUM7UUF1RFgsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFTL0MsQ0FBQztJQWhFRCxzQkFDSSwyQ0FBSzs7Ozs7UUFEVCxVQUNVLEtBQVk7WUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7OztPQUFBO0lBRUQsc0JBQ0ksOENBQVE7Ozs7O1FBRFosVUFDYSxRQUFnQjtZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDbkMsQ0FBQzs7O09BQUE7SUFFRCxzQkFDSSxnREFBVTs7Ozs7UUFEZCxVQUNlLFVBQWtCO1lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN2QyxDQUFDOzs7T0FBQTtJQUVELHNCQUNJLGdEQUFVOzs7OztRQURkLFVBQ2UsVUFBa0I7WUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQ3JDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ3BDLENBQUM7OztPQUFBO0lBRUQsc0JBQ0ksaURBQVc7Ozs7O1FBRGYsVUFDZ0IsV0FBbUI7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO1FBQzdDLENBQUM7OztPQUFBO0lBRUQsc0JBQ0ksK0NBQVM7Ozs7O1FBRGIsVUFDYyxTQUFpQjtZQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDckMsQ0FBQzs7O09BQUE7SUFFRCxzQkFDSSx5REFBbUI7Ozs7O1FBRHZCLFVBQ3dCLGFBQXNCO1lBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEdBQUcsYUFBYSxDQUFDO1FBQ3JELENBQUM7OztPQUFBO0lBRUQsc0JBQ0ksNkNBQU87Ozs7O1FBRFgsVUFDWSxPQUFnQjtZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDdkMsQ0FBQzs7O09BQUE7SUFHRCxzQkFDSSwrQ0FBUzs7Ozs7UUFEYixVQUNjLFNBQWtCO1lBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzlCLENBQUM7OztPQUFBO0lBR0Qsc0JBQ0ksaURBQVc7Ozs7O1FBRGYsVUFDZ0IsV0FBbUI7WUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDbEMsQ0FBQzs7O09BQUE7Ozs7SUFlRCwyQ0FBUTs7O0lBQVI7SUFDQSxDQUFDOzs7OztJQUdELHFEQUFrQjs7OztJQUFsQixVQUFtQixLQUFZO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRCxDQUFDOzs7O0lBRUQsNkRBQTBCOzs7SUFBMUI7UUFDRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0YsQ0FBQzs7OztJQUVELG9EQUFpQjs7O0lBQWpCOztZQUNNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3RGLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO0lBQ3RELENBQUM7Ozs7SUFFRCxvREFBaUI7OztJQUFqQjtRQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7SUFDMUYsQ0FBQzs7OztJQUVELGlEQUFjOzs7SUFBZDtRQUNFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDO0lBQ2xGLENBQUM7Ozs7SUFFRCxtREFBZ0I7OztJQUFoQjtRQUNFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDOzs7O0lBRUQsaURBQWM7OztJQUFkO1FBQ0UsT0FBTyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQztJQUM5QyxDQUFDOzs7O0lBRUQsa0RBQWU7OztJQUFmO1FBQ0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQzs7OztJQUVELGtEQUFlOzs7SUFBZjtRQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQzs7OztJQUVELGdEQUFhOzs7SUFBYjtRQUNFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7Ozs7O0lBRUQsa0RBQWU7Ozs7SUFBZixVQUFnQixDQUFDO1FBQ2YsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLFFBQVEsRUFBRTtZQUNyQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7UUFDRCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRTtZQUN0QyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDOzs7OztJQUVELGdEQUFhOzs7O0lBQWIsVUFBYyxDQUFDO1FBQ2IsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLFFBQVEsRUFBRTtZQUMzRCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDcEI7YUFDSTtZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7Ozs7SUFFRCwrQ0FBWTs7O0lBQVo7UUFDRSxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDOzs7Ozs7SUFFRCw4Q0FBVzs7Ozs7SUFBWCxVQUFZLEdBQW9CLEVBQUUsS0FBYTtRQUM3QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO1NBRS9CO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNwSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7Ozs7SUFFRCwrQ0FBWTs7O0lBQVo7O1lBQ00sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssRUFBUCxDQUFPLENBQUM7UUFDaEQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtZQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFEO0lBQ0gsQ0FBQzs7Ozs7SUFFRCwwREFBdUI7Ozs7SUFBdkIsVUFBd0IsR0FBUTtRQUM5QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO1lBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDdEY7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDckY7SUFDSCxDQUFDO0lBUUQsc0JBQThCLDZDQUFPO1FBTnJDOzs7O1VBSUU7Ozs7Ozs7Ozs7UUFFRixVQUFzQyxPQUFtQjtZQUN2RCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztZQUMxQix5QkFBeUI7WUFDekIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQzs7O09BQUE7Ozs7SUFFRCxpREFBYzs7O0lBQWQ7UUFDRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7O2dCQUNkLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWE7O2dCQUNqRCxjQUFjLEdBQUcsWUFBWSxDQUFDLHFCQUFxQixFQUFFO1lBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxTQUFTLEdBQUcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLHlCQUF5QixDQUFDLENBQUM7U0FDakw7SUFDSCxDQUFDOzs7O0lBRUQscURBQWtCOzs7SUFBbEI7UUFDRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDeEM7SUFDSCxDQUFDOzs7O0lBRUQsdURBQW9COzs7SUFBcEI7UUFBQSxpQkFPQztRQU5DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQUEsRUFBRTtZQUN2QixJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFOztvQkFDdkUsUUFBUSxHQUFHLEVBQUUsQ0FBQyxhQUFhO2dCQUNqQyxLQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDM0g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRUQsaURBQWM7Ozs7SUFBZCxVQUFlLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQy9FLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7Ozs7O0lBRUQsaURBQWM7Ozs7SUFBZCxVQUFlLENBQUM7UUFDZCx5QkFBeUI7SUFDM0IsQ0FBQzs7OztJQUVELDZDQUFVOzs7SUFBVjtRQUNFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDOzs7O0lBRUQsNENBQVM7OztJQUFUO1FBQ0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQzs7Ozs7SUFzQ0QsNkNBQVU7Ozs7SUFBVixVQUFXLEdBQVE7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDeEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Ozs7O0lBQ0QsbURBQWdCOzs7O0lBQWhCLFVBQWlCLEVBQU87UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQzs7Ozs7SUFDRCxvREFBaUI7Ozs7SUFBakIsVUFBa0IsRUFBTztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQzdCLENBQUM7Ozs7O0lBQ0QsbURBQWdCOzs7O0lBQWhCLFVBQWtCLFVBQW1CO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUcsVUFBVSxFQUFDO1lBQ1osSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO2FBQUk7WUFDSCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDbEI7SUFDSCxDQUFDOztnQkEvU0YsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLElBQUksRUFBRTt3QkFDSixrQkFBa0IsRUFBRSx3QkFBd0I7d0JBQzVDLGlCQUFpQixFQUFFLHdCQUF3QjtxQkFDNUM7b0JBQ0QsbTlDQUFpRDtvQkFFakQsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLHdCQUF3QixFQUF4QixDQUF3QixDQUFDOzRCQUN2RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjs7aUJBQ0Y7Ozs7Z0JBcEJrQyxVQUFVO2dCQUVwQyxzQkFBc0I7Ozt3QkE4QjVCLEtBQUssU0FBQyxPQUFPOzJCQUtiLEtBQUssU0FBQyxXQUFXOzZCQUtqQixLQUFLLFNBQUMsYUFBYTs2QkFLbkIsS0FBSyxTQUFDLGFBQWE7OEJBTW5CLEtBQUssU0FBQyxhQUFhOzRCQUtuQixLQUFLLFNBQUMsWUFBWTtzQ0FLbEIsS0FBSyxTQUFDLGlCQUFpQjswQkFLdkIsS0FBSyxTQUFDLFVBQVU7NEJBTWhCLEtBQUssU0FBQyxZQUFZOzhCQU1sQixLQUFLLFNBQUMsY0FBYzswQkFLcEIsTUFBTSxTQUFDLGNBQWM7MkJBQ3JCLE1BQU0sU0FBQyxnQkFBZ0I7eUJBQ3ZCLE1BQU0sU0FBQyxTQUFTOzhCQUVoQixTQUFTLFNBQUMsY0FBYzs0QkFDeEIsWUFBWSxTQUFDLFNBQVM7aUNBR3RCLFlBQVksU0FBQyxnQkFBZ0I7MEJBZ0g3QixTQUFTLFNBQUMsYUFBYTs7SUF5RzFCLCtCQUFDO0NBQUEsQUFqVEQsSUFpVEM7U0FqU1ksd0JBQXdCOzs7SUFFbkMsZ0RBQTBDOztJQUMxQywyQ0FBeUQ7O0lBQ3pELGdEQUEwQzs7SUFDMUMsOENBQTRCOztJQUM1Qiw4Q0FBd0I7O0lBQ3hCLDRDQUF3Qjs7SUFDeEIsbURBQWtDOztJQUNsQyxvREFBbUM7O0lBMkNuQyw4Q0FBb0I7O0lBTXBCLGdEQUFxQjs7SUFNckIsMkNBQXFEOztJQUNyRCw0Q0FBd0Q7O0lBQ3hELDBDQUErQzs7SUFFL0MsK0NBQW1EOztJQUNuRCw2Q0FBMEQ7O0lBQzFELDhDQUF1Qjs7SUFFdkIsa0RBQXdFOztJQXFNeEUsZ0RBQWtCOzs7OztJQXBNTixpREFBaUM7Ozs7O0lBQUUsb0RBQWdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0LCBmb3J3YXJkUmVmLCBIb3N0TGlzdGVuZXIsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDb250ZW50Q2hpbGQsIFRlbXBsYXRlUmVmLCBPbkRlc3Ryb3ksIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmd4U2VsZWN0Ym94TWF5U2VydmljZSB9IGZyb20gJy4vbmd4LXNlbGVjdGJveC1tYXkuc2VydmljZSc7XG5pbXBvcnQgeyBOR1hTZWxlY3RNYXlDb25maWdzLCBOR1hTZWxlY3RNYXlSb3cgfSBmcm9tICcuL25neC1zZWxlY3Rib3gtbWF5LWNvbmZpZ3MnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtc2VsZWN0Ym94LW1heScsXG4gIGhvc3Q6IHtcbiAgICAnKGRvY3VtZW50OmNsaWNrKSc6ICdvbkNsaWNrT3V0c2lkZSgkZXZlbnQpJyxcbiAgICAnKHdpbmRvdzpyZXNpemUpJzogJ29uV2luZG93UmVzaXplKCRldmVudCknXG4gIH0sXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtc2VsZWN0Ym94LW1heS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25neC1zZWxlY3Rib3gtbWF5LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4U2VsZWN0Ym94TWF5Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hTZWxlY3Rib3hNYXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBkcm9wZG93blJvd3M6IEFycmF5PE5HWFNlbGVjdE1heVJvdz4gPSBbXTtcbiAgY29uZmlnczogTkdYU2VsZWN0TWF5Q29uZmlncyA9IG5ldyBOR1hTZWxlY3RNYXlDb25maWdzKCk7XG4gIHNlbGVjdGVkUm93czogQXJyYXk8TkdYU2VsZWN0TWF5Um93PiA9IFtdO1xuICBzaG93X2l0ZW1zOiBib29sZWFuID0gZmFsc2U7XG4gIHNlYXJjaFRleHQ6IHN0cmluZyA9IFwiXCI7XG4gIGlzRW5hYmxlOmJvb2xlYW4gPSB0cnVlO1xuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XG4gIHByb3BhZ2F0ZU9uVG91Y2ggPSAoXzogYW55KSA9PiB7IH07XG5cbiAgQElucHV0KFwiaXRlbXNcIilcbiAgc2V0IGl0ZW1zKGl0ZW1zOiBhbnlbXSkge1xuICAgIHRoaXMuY3JlYXRlRHJvcGRvd25Sb3dzKGl0ZW1zKTtcbiAgfVxuXG4gIEBJbnB1dChcImNzcy1jbGFzc1wiKVxuICBzZXQgY3NzQ2xhc3MoY3NzQ2xhc3M6IHN0cmluZykge1xuICAgIHRoaXMuY29uZmlncy5jc3NDbGFzcyA9IGNzc0NsYXNzO1xuICB9XG5cbiAgQElucHV0KFwidmFsdWUtZmllbGRcIilcbiAgc2V0IHZhbHVlRmllbGQodmFsdWVGaWVsZDogc3RyaW5nKSB7XG4gICAgdGhpcy5jb25maWdzLnZhbHVlRmllbGQgPSB2YWx1ZUZpZWxkO1xuICB9XG5cbiAgQElucHV0KFwibGFiZWwtZmllbGRcIilcbiAgc2V0IGxhYmVsRmllbGQobGFiZWxGaWVsZDogc3RyaW5nKSB7XG4gICAgdGhpcy5jb25maWdzLmxhYmVsRmllbGQgPSBsYWJlbEZpZWxkO1xuICAgIHRoaXMucmVjb25maWd1cmVMYWJlbHNBbmRWYWx1ZXMoKTtcbiAgfVxuXG4gIEBJbnB1dChcInBsYWNlaG9sZGVyXCIpXG4gIHNldCBwbGFjZWhvbGRlcihwbGFjZWhvbGRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy5jb25maWdzLnBsYWNlaG9sZGVyVGV4dCA9IHBsYWNlaG9sZGVyO1xuICB9XG5cbiAgQElucHV0KFwiZW1wdHktdGV4dFwiKVxuICBzZXQgZW1wdHlUZXh0KGVtcHR5VGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5jb25maWdzLmVtcHR5VGV4dCA9IGVtcHR5VGV4dDtcbiAgfVxuXG4gIEBJbnB1dChcInNob3ctZW1wdHktdGV4dFwiKVxuICBzZXQgc2hvd0VtcHR5UmVzdWx0VGV4dChzaG93RW1wdHlUZXh0OiBib29sZWFuKSB7XG4gICAgdGhpcy5jb25maWdzLnNob3dFbXB0eVJlc3VsdHNMYWJlbCA9IHNob3dFbXB0eVRleHQ7XG4gIH1cblxuICBASW5wdXQoXCJpcy1tdWx0aVwiKVxuICBzZXQgaXNNdWx0aShpc011bHRpOiBib29sZWFuKSB7XG4gICAgdGhpcy5jb25maWdzLmlzTXVsdGlTZWxlY3QgPSBpc011bHRpO1xuICB9XG5cbiAgX2lzTG9hZGluZzogYm9vbGVhbjtcbiAgQElucHV0KFwiaXMtbG9hZGluZ1wiKVxuICBzZXQgaXNMb2FkaW5nKGlzTG9hZGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzTG9hZGluZyA9IGlzTG9hZGluZztcbiAgfVxuXG4gIF9sb2FkaW5nVGV4dDogc3RyaW5nO1xuICBASW5wdXQoXCJsb2FkaW5nLXRleHRcIilcbiAgc2V0IGxvYWRpbmdUZXh0KGxvYWRpbmdUZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2FkaW5nVGV4dCA9IGxvYWRpbmdUZXh0O1xuICB9XG5cbiAgQE91dHB1dChcInNlYXJjaC1rZXl1cFwiKSBvbktleVVwID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KFwib24tc2VsZWN0LWl0ZW1cIikgb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoXCJvbi1ibHVyXCIpIG9uQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdzZWFyY2hfZmllbGQnKSBzZWFyY2hGaWVsZDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZHJlbihcImxpX2l0ZW1cIikgbGlzdEl0ZW1zOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIGl0ZW1XaW5kb3c6IEVsZW1lbnRSZWY7XG5cbiAgQENvbnRlbnRDaGlsZCgnYWN0aW9uVGVtcGxhdGUnKSBhY3Rpb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8RWxlbWVudFJlZj47XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NlbGVjdGJveHJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBzZWxlY3Rib3hTZXJ2aWNlOiBOZ3hTZWxlY3Rib3hNYXlTZXJ2aWNlKSB7XG5cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICB9XG5cblxuICBjcmVhdGVEcm9wZG93blJvd3MoaXRlbXM6IGFueVtdKSB7XG4gICAgdGhpcy5kcm9wZG93blJvd3MgPSB0aGlzLnNlbGVjdGJveFNlcnZpY2UuY3JlYXRlRHJvcGRvd25Sb3dzKGl0ZW1zLCB0aGlzLmNvbmZpZ3MpO1xuICAgIHRoaXMuc2V0VmFsdWVzUGFzc2VkRXh0ZXJuYWwodGhpcy5uZ01vZGVsVmFsdWUpO1xuICB9XG5cbiAgcmVjb25maWd1cmVMYWJlbHNBbmRWYWx1ZXMoKSB7XG4gICAgdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLnJlY29uZmlndXJlRHJvcGRvd25Sb3dMYWJlbHNBbmRWYWx1ZXModGhpcy5kcm9wZG93blJvd3MsIHRoaXMuY29uZmlncyk7XG4gIH1cblxuICBnZXRTZWxlY3Rib3hMYWJlbCgpIHtcbiAgICBsZXQgbGFiZWwgPSB0aGlzLnNlbGVjdGJveFNlcnZpY2UuY3JlYXRlRHJvcGRvd25MYWJlbCh0aGlzLmNvbmZpZ3MsIHRoaXMuc2VsZWN0ZWRSb3dzKTtcbiAgICByZXR1cm4gbGFiZWwgPyBsYWJlbCA6IHRoaXMuY29uZmlncy5wbGFjZWhvbGRlclRleHQ7XG4gIH1cblxuICBnZXRFbXB0eVRleHRMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWdzLmVtcHR5VGV4dCA/IHRoaXMuY29uZmlncy5lbXB0eVRleHQgOiBOR1hTZWxlY3RNYXlDb25maWdzLkVNUFRZX1RFWFQ7XG4gIH1cblxuICBnZXRMb2FkaW5nVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZGluZ1RleHQgPyB0aGlzLl9sb2FkaW5nVGV4dCA6IE5HWFNlbGVjdE1heUNvbmZpZ3MuTE9BRElOR19URVhUO1xuICB9XG5cbiAgb25DbGlja1NlbGVjdEJveCgpIHtcbiAgICB0aGlzLnNob3dJdGVtc1dpbmRvdygpO1xuICB9XG5cbiAgZ2V0QWN0aXZlQ2xhc3MoKSB7XG4gICAgcmV0dXJuIE5HWFNlbGVjdE1heUNvbmZpZ3MuUk9XX0FDVElWRV9DTEFTUztcbiAgfVxuXG4gIHNob3dJdGVtc1dpbmRvdygpIHtcbiAgICB0aGlzLnNob3dfaXRlbXMgPSB0cnVlO1xuICB9XG5cbiAgaGlkZUl0ZW1zV2luZG93KCkge1xuICAgIHRoaXMub25CbHVyLmVtaXQodGhpcy5zZWFyY2hUZXh0KTtcbiAgICB0aGlzLnJlc2V0RmlsdGVycygpO1xuICAgIHRoaXMuc2hvd19pdGVtcyA9IGZhbHNlO1xuICB9XG5cbiAgb25SZW1vdmVDbGljaygpIHtcbiAgICB0aGlzLnNlbGVjdGJveFNlcnZpY2UudW5zZWxlY3RBbGxTZWxlY3RlZFJvd3ModGhpcy5kcm9wZG93blJvd3MpO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gW107XG4gICAgdGhpcy5wdWJsaXNoVmFsdWUoKTtcbiAgfVxuXG4gIG9uU2VhcmNoS2V5ZG93bihlKSB7XG4gICAgaWYgKGUua2V5ID09IFwiRXNjYXBlXCIpIHtcbiAgICAgIHRoaXMuaGlkZUl0ZW1zV2luZG93KCk7XG4gICAgfVxuICAgIC8vVXAgYW5kIERvd24gYXJyb3cgZXZlbnRzXG4gICAgaWYgKGUua2V5Q29kZSA9PSAzOCB8fCBlLmtleUNvZGUgPT0gNDApIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaEtleXVwKGUpIHtcbiAgICBpZiAoZS5rZXlDb2RlID09IDM4IHx8IGUua2V5Q29kZSA9PSA0MCB8fCBlLmtleSA9PSBcIkVzY2FwZVwiKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5vbktleVVwLmVtaXQodGhpcy5zZWFyY2hUZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEZpbHRlcnMoKSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gXCJcIjtcbiAgfVxuXG4gIG9uQ2xpY2tJdGVtKHJvdzogTkdYU2VsZWN0TWF5Um93LCBpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuY29uZmlncy5pc011bHRpU2VsZWN0KSB7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGJveFNlcnZpY2Uuc2V0U2VsZWN0ZWRJdGVtcyh0aGlzLmNvbmZpZ3MsIHRoaXMuc2VsZWN0ZWRSb3dzLCB0aGlzLmRyb3Bkb3duUm93cywgcm93KTtcbiAgICAgIHRoaXMub25TZWxlY3QuZW1pdChyb3cuZGF0YSk7XG4gICAgICB0aGlzLmhpZGVJdGVtc1dpbmRvdygpO1xuICAgIH1cbiAgICB0aGlzLnB1Ymxpc2hWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGlzaFZhbHVlKCkge1xuICAgIGxldCB2YWx1ZXMgPSB0aGlzLnNlbGVjdGVkUm93cy5tYXAociA9PiByLnZhbHVlKTtcbiAgICBpZiAodGhpcy5jb25maWdzLmlzTXVsdGlTZWxlY3QpIHtcbiAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHZhbHVlcy5sZW5ndGggPiAwID8gdmFsdWVzWzBdIDogXCJcIik7XG4gICAgfVxuICB9XG5cbiAgc2V0VmFsdWVzUGFzc2VkRXh0ZXJuYWwob2JqOiBhbnkpIHtcbiAgICBpZiAodGhpcy5jb25maWdzLmlzTXVsdGlTZWxlY3QpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gdGhpcy5zZWxlY3Rib3hTZXJ2aWNlLnNlbGVjdEl0ZW1zQnlWYWx1ZSh0aGlzLmRyb3Bkb3duUm93cywgb2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGJveFNlcnZpY2Uuc2VsZWN0SXRlbUJ5VmFsdWUodGhpcy5kcm9wZG93blJvd3MsIG9iaik7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgKlxuICAqIE9uIEl0ZW0gYnJvd3NlIG9wZW4gd2luZG93IGJlZ2luICYgZG9jdW1lbnQgb3V0c2lkZSBjbGljayBldmVudCBCZWdpbnNcbiAgKiBcbiAgKi9cblxuICBAVmlld0NoaWxkKCdpdGVtX3dpbmRvdycpIHNldCBjb250ZW50KGNvbnRlbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICB0aGlzLml0ZW1XaW5kb3cgPSBjb250ZW50O1xuICAgIC8vIHRoaXMucG9zaXRpb25XaW5kb3coKTtcbiAgICB0aGlzLmZvY3VzVG9TZWFyY2hGaWVsZCgpO1xuICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZEl0ZW0oKTtcbiAgfVxuXG4gIHBvc2l0aW9uV2luZG93KCkge1xuICAgIGlmICh0aGlzLnNlYXJjaEZpZWxkKSB7XG4gICAgICBjb25zdCBzZWxlY3RCb3hSZWYgPSB0aGlzLl9zZWxlY3Rib3hyZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIHZhciB2aWV3cG9ydE9mZnNldCA9IHNlbGVjdEJveFJlZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnNvbGUubG9nKHZpZXdwb3J0T2Zmc2V0KTtcbiAgICAgIHRoaXMuaXRlbVdpbmRvdy5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnd2lkdGg6ICcgKyAoc2VsZWN0Qm94UmVmLmZpcnN0Q2hpbGQub2Zmc2V0V2lkdGggKyAzKSArICdweDsgdG9wOiAnICsgKHZpZXdwb3J0T2Zmc2V0LnRvcCAtIDUpICsgJ3B4OyBtYXJnaW4tbGVmdDogLTEycHg7Jyk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNUb1NlYXJjaEZpZWxkKCkge1xuICAgIGlmICh0aGlzLnNlYXJjaEZpZWxkKSB7XG4gICAgICB0aGlzLnNlYXJjaEZpZWxkLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBzY3JvbGxUb1NlbGVjdGVkSXRlbSgpIHtcbiAgICB0aGlzLmxpc3RJdGVtcy5mb3JFYWNoKGxpID0+IHtcbiAgICAgIGlmIChsaS5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhOR1hTZWxlY3RNYXlDb25maWdzLlJPV19BQ1RJVkVfQ0xBU1MpKSB7XG4gICAgICAgIGNvbnN0IHNjcm9sbExpID0gbGkubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5pdGVtV2luZG93Lm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ1bFwiKVswXS5zY3JvbGxUb3AgPSBzY3JvbGxMaS5vZmZzZXRUb3AgLSAoc2Nyb2xsTGkub2Zmc2V0SGVpZ2h0ICsgMjApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25DbGlja091dHNpZGUoZSkge1xuICAgIGlmICghdGhpcy5fc2VsZWN0Ym94cmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJiB0aGlzLnNob3dfaXRlbXMpIHtcbiAgICAgIHRoaXMuaGlkZUl0ZW1zV2luZG93KCk7XG4gICAgfVxuICB9XG5cbiAgb25XaW5kb3dSZXNpemUoZSkge1xuICAgIC8vIHRoaXMucG9zaXRpb25XaW5kb3coKTtcbiAgfVxuXG4gIHNldERpc2FibGUoKXtcbiAgICB0aGlzLmhpZGVJdGVtc1dpbmRvdygpO1xuICAgIHRoaXMuaXNFbmFibGUgPSBmYWxzZTtcbiAgfVxuXG4gIHNldEVuYWJsZSgpe1xuICAgIHRoaXMuaXNFbmFibGUgPSB0cnVlO1xuICB9XG5cbiAgLypcbiAgKlxuICAqIE9uIEl0ZW0gYnJvd3NlIG9wZW4gd2luZG93IGJlZ2luICYgZG9jdW1lbnQgb3V0c2lkZSBjbGljayBldmVudCBFbmRzXG4gICogXG4gICovXG5cblxuXG4gIC8qXG4gIC8vb24gZG9jdW1lbnQga2V5IHVwIGFuZCBkb3duXG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pIG9uS2V5ZG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZigoZXZlbnQua2V5Q29kZSA9PSAzOCB8fCBldmVudC5rZXlDb2RlID09IDQwKSAmJiB0aGlzLml0ZW1XaW5kb3cgJiYgdGhpcy5jbG9uZWRJdGVtcy5sZW5ndGggPiAwKXtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIHZhciB1bCA9IHRoaXMuaXRlbVdpbmRvdy5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidWxcIilbMF1cbiAgICAgICAgdmFyIHNlbGVjdGVkTGkgPSB1bC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzZWxlY3RlZCcpWzBdO1xuICAgICAgICBpZihzZWxlY3RlZExpKXtcbiAgICAgICAgICBpbmRleCA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodWwuY2hpbGRyZW4sIHNlbGVjdGVkTGkpO1xuICAgICAgICAgIHNlbGVjdGVkTGkuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vdXAgYXJyb3dcbiAgICAgICAgaWYoZXZlbnQua2V5Q29kZSA9PSAzOCl7XG4gICAgICAgICAgaW5kZXggPSAoKGluZGV4IC0gMSkgPCAwKSA/IDAgOiAoaW5kZXggLSAxKTtcbiAgICAgICAgfVxuICAgICAgICAvL2Rvd24gYXJyb3dcbiAgICAgICAgZWxzZXtcbiAgICAgICAgICBpbmRleCA9ICgoaW5kZXggKyAxKSA+ICh1bC5jaGlsZHJlbi5sZW5ndGggLTEpKSA/ICh1bC5jaGlsZHJlbi5sZW5ndGggLTEpIDogIChpbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHVsLmNoaWxkcmVuW2luZGV4XS5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgICAgIHVsLnNjcm9sbFRvcCA9IHVsLmNoaWxkcmVuW2luZGV4XS5vZmZzZXRUb3AgLSAodWwuY2hpbGRyZW5baW5kZXhdLm9mZnNldEhlaWdodCArIDIwKTtcbiAgICB9XG4gIH1cbiovXG4gIC8vQ29udHJvbCB2YWx1ZSBhY2Nlc3NvciBiZWdpbnNcbiAgLy9TdG9yZSBleHRlcm5hbCB2YWx1ZSBvbmNlIGl0ZW1zIGdvdCBsb2FkZWQgaW4gdG8gZHJvcGRvd25cbiAgbmdNb2RlbFZhbHVlOiBhbnk7XG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm5nTW9kZWxWYWx1ZSA9IG9iajtcbiAgICB0aGlzLnNldFZhbHVlc1Bhc3NlZEV4dGVybmFsKG9iaik7XG4gIH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVPblRvdWNoID0gZm47XG4gIH1cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKGlzRGlzYWJsZWQsIFwic2V0IGRpc2FibGVcIik7XG4gICAgaWYoaXNEaXNhYmxlZCl7XG4gICAgICB0aGlzLnNldERpc2FibGUoKTtcbiAgICB9ZWxzZXtcbiAgICAgIHRoaXMuc2V0RW5hYmxlKCk7XG4gICAgfVxuICB9XG4gIC8vQ29udHJvbCB2YWx1ZSBhY2Nlc3NvciBlbmRzXG59Il19