UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

613 lines 42.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewEncapsulation, Input, Output, forwardRef, ElementRef, EventEmitter, ViewChild } from '@angular/core'; import { trigger, state, animate, transition, style } from '@angular/animations'; import { LocaleProviderService } from '../locale-provider/locale-provider.service'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; var SearchBarComponent = /** @class */ (function () { function SearchBarComponent(_elementRef, _localeProvider) { var _a; this._elementRef = _elementRef; this._localeProvider = _localeProvider; this.prefixCls = 'am-search'; this.cancelCls = (_a = {}, _a[this.prefixCls + "-cancel"] = true, _a); this._defaultValue = ''; this._value = ''; this._placeholder = ''; this._showCancelButton = false; this._disabled = false; this._focus = false; this._isSubmit = false; this._isCustomText = false; this._isClearClicking = false; this._blurFromOnClear = false; this.locale = {}; this._unsubscribe$ = new Subject(); this.onSubmit = new EventEmitter(); this.onChange = new EventEmitter(); this.onFocus = new EventEmitter(); this.onBlur = new EventEmitter(); this.onCancel = new EventEmitter(); this.onClear = new EventEmitter(); this.onChangeFn = (/** * @return {?} */ function () { }); this.onTouchFn = (/** * @return {?} */ function () { }); } Object.defineProperty(SearchBarComponent.prototype, "defaultValue", { set: /** * @param {?} value * @return {?} */ function (value) { this._defaultValue = value; this._value = value; this.inputElementRef.nativeElement.value = this._value; }, enumerable: true, configurable: true }); Object.defineProperty(SearchBarComponent.prototype, "value", { get: /** * @return {?} */ function () { return this._value; }, set: /** * @param {?} v * @return {?} */ function (v) { this._value = v || ''; this.inputElementRef.nativeElement.value = this._value; this.setClass(); }, enumerable: true, configurable: true }); Object.defineProperty(SearchBarComponent.prototype, "placeholder", { get: /** * @return {?} */ function () { return this._placeholder; }, set: /** * @param {?} value * @return {?} */ function (value) { this._placeholder = value; }, enumerable: true, configurable: true }); Object.defineProperty(SearchBarComponent.prototype, "showCancelButton", { get: /** * @return {?} */ function () { return this._showCancelButton; }, set: /** * @param {?} value * @return {?} */ function (value) { this._showCancelButton = value; this.setClass(); }, enumerable: true, configurable: true }); Object.defineProperty(SearchBarComponent.prototype, "cancelText", { get: /** * @return {?} */ function () { return this._cancelText; }, set: /** * @param {?} value * @return {?} */ function (value) { if (value !== undefined) { this._cancelText = value; this._isCustomText = true; } }, enumerable: true, configurable: true }); Object.defineProperty(SearchBarComponent.prototype, "disabled", { get: /** * @return {?} */ function () { return this._disabled; }, set: /** * @param {?} value * @return {?} */ function (value) { this._disabled = value; }, enumerable: true, configurable: true }); Object.defineProperty(SearchBarComponent.prototype, "maxLength", { get: /** * @return {?} */ function () { return this._maxLength; }, set: /** * @param {?} value * @return {?} */ function (value) { this._maxLength = value; }, enumerable: true, configurable: true }); Object.defineProperty(SearchBarComponent.prototype, "setFocus", { set: /** * @param {?} value * @return {?} */ function (value) { if (value) { if (value.focusValue) { this._focus = true; this.inputElementRef.nativeElement.focus(); this._blurFromOnClear = true; this.onSearchbarFocus(); } else { this._blurFromOnClear = false; this.onSearchbarBlur(); } } }, enumerable: true, configurable: true }); /** * @return {?} */ SearchBarComponent.prototype.setClass = /** * @return {?} */ function () { var _a, _b, _c; this.wrapCls = (_a = {}, _a["" + this.prefixCls] = true, _a[this.prefixCls + "-start"] = !!(this._focus || (this._value && this._value.length > 0)) && !this._disabled, _a); this.cancelCls = (_b = {}, _b[this.prefixCls + "-cancel"] = true, _b[this.prefixCls + "-cancel-show"] = this._showCancelButton || this._focus || (this._value && this._value.length > 0), _b[this.prefixCls + "-cancel-anim"] = this._focus, _b); this.clearCls = (_c = {}, _c[this.prefixCls + "-clear"] = this._value && this._value.length > 0, _c[this.prefixCls + "-clear-show"] = this._value && this._value.length > 0 && !this._isSubmit, _c[this.prefixCls + "-clear-active"] = this._isClearClicking, _c); }; /** * @return {?} */ SearchBarComponent.prototype.setStyle = /** * @return {?} */ function () { if (this._inputContainerRef.className.indexOf(this.prefixCls + "-start") > -1) { /** @type {?} */ var realWidth = this._syntheticPhContainerRef.getBoundingClientRect().width; this._syntheticPhRef.style.width = Math.ceil(realWidth) + 'px'; if (!this._showCancelButton) { this._rightBtnRef.style.marginRight = '0'; } } else { this._syntheticPhRef.style.width = '100%'; if (!this._showCancelButton) { this._rightBtnInitMarginLeft = window.getComputedStyle(this._rightBtnRef)['margin-left']; /** @type {?} */ var btnMarginRight = this._rightBtnRef.offsetWidth + parseInt(this._rightBtnInitMarginLeft, 10); this._rightBtnRef.style.marginRight = '-' + btnMarginRight + 'px'; } } }; /** * @return {?} */ SearchBarComponent.prototype.onSearchbarBlur = /** * @return {?} */ function () { /** @type {?} */ var self = this; setTimeout((/** * @return {?} */ function () { if (!self._blurFromOnClear && self._value === '' && self._focus) { self._focus = false; self._value = ''; self.onBlur.emit(); self.setClass(); } self._blurFromOnClear = false; }), 50); }; /** * @return {?} */ SearchBarComponent.prototype.onSearchbarFocus = /** * @return {?} */ function () { this._focus = true; this._isSubmit = false; this.onFocus.emit(); this.setClass(); }; /** * @param {?} e * @return {?} */ SearchBarComponent.prototype.onSearchbarChange = /** * @param {?} e * @return {?} */ function (e) { this._focus = true; this._value = e; this.onChange.emit(e); this.onChangeFn(e); this.setClass(); }; /** * @param {?} e * @return {?} */ SearchBarComponent.prototype.onSearchSubmit = /** * @param {?} e * @return {?} */ function (e) { e.preventDefault(); this._value = e.target[0].value; this._isSubmit = true; this.onSubmit.emit(this._value); this.setClass(); this._blurFromOnClear = true; }; /** * @return {?} */ SearchBarComponent.prototype.onSearchbarCancel = /** * @return {?} */ function () { this._focus = false; this._value = ''; this.onCancel.emit(); this.setClass(); }; /** * @return {?} */ SearchBarComponent.prototype.onSearchbarClear = /** * @return {?} */ function () { var _this = this; this._blurFromOnClear = true; this._isClearClicking = true; this.onSearchbarChange(''); this.inputElementRef.nativeElement.focus(); this.onClear.emit(this._value); this.setClass(); setTimeout((/** * @return {?} */ function () { _this._value = ''; _this._isClearClicking = false; _this._blurFromOnClear = false; _this.setClass(); }), 100); this.onSearchbarFocus(); }; /** * @param {?} value * @return {?} */ SearchBarComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { this._value = value || ''; this.inputElementRef.nativeElement.value = this._value; this.setClass(); }; /** * @param {?} fn * @return {?} */ SearchBarComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChangeFn = fn; }; /** * @param {?} fn * @return {?} */ SearchBarComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.onTouchFn = fn; }; /** * @return {?} */ SearchBarComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.setClass(); this._localeProvider.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe((/** * @param {?} _ * @return {?} */ function (_) { _this.locale = _this._localeProvider.getLocaleSubObj('SearchBar'); _this._cancelText = _this._isCustomText ? _this._cancelText : _this.locale.cancelText; })); }; /** * @return {?} */ SearchBarComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this._syntheticPhContainerRef = this._elementRef.nativeElement.getElementsByClassName(this.prefixCls + "-synthetic-ph-container")[0]; this._syntheticPhRef = this._elementRef.nativeElement.getElementsByClassName(this.prefixCls + "-synthetic-ph")[0]; this._rightBtnRef = this._elementRef.nativeElement.getElementsByClassName('cancel')[0]; this._inputContainerRef = this._elementRef.nativeElement.getElementsByClassName("" + this.prefixCls)[0]; }; /** * @return {?} */ SearchBarComponent.prototype.ngAfterViewChecked = /** * @return {?} */ function () { this.setStyle(); }; /** * @return {?} */ SearchBarComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this._unsubscribe$.next(); this._unsubscribe$.complete(); }; SearchBarComponent.decorators = [ { type: Component, args: [{ selector: 'SearchBar, nzm-search-bar', template: "<form name=\"myForm\" class=\"{{ prefixCls }}\" [ngClass]=\"wrapCls\" action=\"#\" (submit)=\"onSearchSubmit($event)\">\n <div class=\"{{ prefixCls }}-input\">\n <div\n class=\"{{ prefixCls }}-synthetic-ph\"\n style=\"box-sizing:unset\"\n [@cancelButtonState]=\"showCancelButton ? 'visible' : 'hidden'\"\n >\n <span class=\"{{ prefixCls }}-synthetic-ph-container\">\n <i class=\"{{ prefixCls }}-synthetic-ph-icon\"></i>\n <span\n class=\"{{ prefixCls }}-synthetic-ph-placeholder\"\n [ngStyle]=\"{ visibility: placeholder && !value ? 'visible' : 'hidden' }\"\n >\n {{ placeholder }}\n </span>\n </span>\n </div>\n <input\n #search\n class=\"{{ prefixCls }}-value\"\n style=\"outline:none;\"\n [name]=\"'search'\"\n [type]=\"'search'\"\n [disabled]=\"disabled\"\n [maxlength]=\"maxLength\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"value\"\n (blur)=\"onSearchbarBlur()\"\n (focus)=\"onSearchbarFocus()\"\n (ngModelChange)=\"onSearchbarChange($event)\"\n />\n <a [ngClass]=\"clearCls\" style=\"box-sizing: content-box;transition: 0s\" (click)=\"onSearchbarClear()\"></a>\n </div>\n <div class=\"cancel\" [ngClass]=\"cancelCls\" (click)=\"onSearchbarCancel()\">\n {{ cancelText }}\n </div>\n</form>\n", encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return SearchBarComponent; })), multi: true } ], animations: [ trigger('cancelButtonState', [ state('visible', style({ width: '*' })), state('hidden', style({ width: '100%' })), transition('visible =>hidden', [animate(300, style({ width: '100%' }))]), transition('hidden => visible', [animate(300, style({ width: '*' }))]) ]) ] }] } ]; /** @nocollapse */ SearchBarComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: LocaleProviderService } ]; }; SearchBarComponent.propDecorators = { inputElementRef: [{ type: ViewChild, args: ['search', { static: true },] }], defaultValue: [{ type: Input }], value: [{ type: Input }], placeholder: [{ type: Input }], showCancelButton: [{ type: Input }], cancelText: [{ type: Input }], disabled: [{ type: Input }], maxLength: [{ type: Input }], setFocus: [{ type: Input }], onSubmit: [{ type: Output }], onChange: [{ type: Output }], onFocus: [{ type: Output }], onBlur: [{ type: Output }], onCancel: [{ type: Output }], onClear: [{ type: Output }] }; return SearchBarComponent; }()); export { SearchBarComponent }; if (false) { /** @type {?} */ SearchBarComponent.prototype.prefixCls; /** @type {?} */ SearchBarComponent.prototype.clearCls; /** @type {?} */ SearchBarComponent.prototype.wrapCls; /** @type {?} */ SearchBarComponent.prototype.cancelCls; /** * @type {?} * @private */ SearchBarComponent.prototype._defaultValue; /** * @type {?} * @private */ SearchBarComponent.prototype._value; /** * @type {?} * @private */ SearchBarComponent.prototype._placeholder; /** * @type {?} * @private */ SearchBarComponent.prototype._showCancelButton; /** * @type {?} * @private */ SearchBarComponent.prototype._cancelText; /** * @type {?} * @private */ SearchBarComponent.prototype._disabled; /** * @type {?} * @private */ SearchBarComponent.prototype._maxLength; /** * @type {?} * @private */ SearchBarComponent.prototype._focus; /** * @type {?} * @private */ SearchBarComponent.prototype._isSubmit; /** * @type {?} * @private */ SearchBarComponent.prototype._isCustomText; /** * @type {?} * @private */ SearchBarComponent.prototype._isClearClicking; /** * @type {?} * @private */ SearchBarComponent.prototype._syntheticPhContainerRef; /** * @type {?} * @private */ SearchBarComponent.prototype._syntheticPhRef; /** * @type {?} * @private */ SearchBarComponent.prototype._rightBtnRef; /** * @type {?} * @private */ SearchBarComponent.prototype._inputContainerRef; /** * @type {?} * @private */ SearchBarComponent.prototype._rightBtnInitMarginLeft; /** * @type {?} * @private */ SearchBarComponent.prototype._blurFromOnClear; /** * @type {?} * @private */ SearchBarComponent.prototype.locale; /** * @type {?} * @private */ SearchBarComponent.prototype._unsubscribe$; /** @type {?} */ SearchBarComponent.prototype.inputElementRef; /** @type {?} */ SearchBarComponent.prototype.onSubmit; /** @type {?} */ SearchBarComponent.prototype.onChange; /** @type {?} */ SearchBarComponent.prototype.onFocus; /** @type {?} */ SearchBarComponent.prototype.onBlur; /** @type {?} */ SearchBarComponent.prototype.onCancel; /** @type {?} */ SearchBarComponent.prototype.onClear; /** * @type {?} * @private */ SearchBarComponent.prototype.onChangeFn; /** * @type {?} * @private */ SearchBarComponent.prototype.onTouchFn; /** * @type {?} * @private */ SearchBarComponent.prototype._elementRef; /** * @type {?} * @private */ SearchBarComponent.prototype._localeProvider; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInNlYXJjaC1iYXIvc2VhcmNoLWJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBSVQsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUNWLFVBQVUsRUFDVixZQUFZLEVBRVosU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBRXpFO0lBc0lFLDRCQUFvQixXQUF1QixFQUFVLGVBQXNDOztRQUF2RSxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUFVLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQWpIM0YsY0FBUyxHQUFXLFdBQVcsQ0FBQztRQUdoQyxjQUFTO1lBQ1AsR0FBSSxJQUFJLENBQUMsU0FBUyxZQUFTLElBQUcsSUFBSTtnQkFDbEM7UUFFTSxrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixXQUFNLEdBQVcsRUFBRSxDQUFDO1FBQ3BCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUVuQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRTNCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFNbEMscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2xDLFdBQU0sR0FBUSxFQUFFLENBQUM7UUFDakIsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBMEU1QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVuQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVuQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVsQyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVqQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVuQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMxQixlQUFVOzs7UUFBNEIsY0FBTyxDQUFDLEVBQUM7UUFDL0MsY0FBUzs7O1FBQTRCLGNBQU8sQ0FBQyxFQUFDO0lBRXdDLENBQUM7SUFuRi9GLHNCQUNJLDRDQUFZOzs7OztRQURoQixVQUNpQixLQUFhO1lBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pELENBQUM7OztPQUFBO0lBQ0Qsc0JBQ0kscUNBQUs7Ozs7UUFEVDtZQUVFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDOzs7OztRQUNELFVBQVUsQ0FBUztZQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDdkQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLENBQUM7OztPQUxBO0lBTUQsc0JBQ0ksMkNBQVc7Ozs7UUFEZjtZQUVFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzQixDQUFDOzs7OztRQUNELFVBQWdCLEtBQWE7WUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDNUIsQ0FBQzs7O09BSEE7SUFJRCxzQkFDSSxnREFBZ0I7Ozs7UUFEcEI7WUFFRSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNoQyxDQUFDOzs7OztRQUNELFVBQXFCLEtBQWM7WUFDakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEIsQ0FBQzs7O09BSkE7SUFLRCxzQkFDSSwwQ0FBVTs7OztRQURkO1lBRUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFCLENBQUM7Ozs7O1FBQ0QsVUFBZSxLQUFhO1lBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2FBQzNCO1FBQ0gsQ0FBQzs7O09BTkE7SUFPRCxzQkFDSSx3Q0FBUTs7OztRQURaO1lBRUUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7Ozs7O1FBQ0QsVUFBYSxLQUFjO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUM7OztPQUhBO0lBSUQsc0JBQ0kseUNBQVM7Ozs7UUFEYjtZQUVFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN6QixDQUFDOzs7OztRQUNELFVBQWMsS0FBYTtZQUN6QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDOzs7T0FIQTtJQUlELHNCQUNJLHdDQUFROzs7OztRQURaLFVBQ2EsS0FBSztZQUNoQixJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNuQixJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztvQkFDN0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7aUJBQ3pCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7b0JBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztpQkFDeEI7YUFDRjtRQUNILENBQUM7OztPQUFBOzs7O0lBa0JELHFDQUFROzs7SUFBUjs7UUFDRSxJQUFJLENBQUMsT0FBTztZQUNWLEdBQUMsS0FBRyxJQUFJLENBQUMsU0FBVyxJQUFHLElBQUk7WUFDM0IsR0FBSSxJQUFJLENBQUMsU0FBUyxXQUFRLElBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO2VBQzNHLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUztZQUNaLEdBQUksSUFBSSxDQUFDLFNBQVMsWUFBUyxJQUFHLElBQUk7WUFDbEMsR0FBSSxJQUFJLENBQUMsU0FBUyxpQkFBYyxJQUM5QixJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ2xGLEdBQUksSUFBSSxDQUFDLFNBQVMsaUJBQWMsSUFBRyxJQUFJLENBQUMsTUFBTTtlQUMvQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVE7WUFDWCxHQUFJLElBQUksQ0FBQyxTQUFTLFdBQVEsSUFBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbEUsR0FBSSxJQUFJLENBQUMsU0FBUyxnQkFBYSxJQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFDMUYsR0FBSSxJQUFJLENBQUMsU0FBUyxrQkFBZSxJQUFHLElBQUksQ0FBQyxnQkFBZ0I7ZUFDMUQsQ0FBQztJQUNKLENBQUM7Ozs7SUFFRCxxQ0FBUTs7O0lBQVI7UUFDRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFJLElBQUksQ0FBQyxTQUFTLFdBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFOztnQkFDdkUsU0FBUyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUs7WUFDN0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7YUFDM0M7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUMzQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7b0JBQ25GLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQztnQkFDakcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQ25FO1NBQ0Y7SUFDSCxDQUFDOzs7O0lBRUQsNENBQWU7OztJQUFmOztZQUNRLElBQUksR0FBRyxJQUFJO1FBQ2pCLFVBQVU7OztRQUFDO1lBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUMvRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNqQjtZQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsQ0FBQyxHQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQzs7OztJQUVELDZDQUFnQjs7O0lBQWhCO1FBQ0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQzs7Ozs7SUFFRCw4Q0FBaUI7Ozs7SUFBakIsVUFBa0IsQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDOzs7OztJQUVELDJDQUFjOzs7O0lBQWQsVUFBZSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7Ozs7SUFFRCw4Q0FBaUI7OztJQUFqQjtRQUNFLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7Ozs7SUFFRCw2Q0FBZ0I7OztJQUFoQjtRQUFBLGlCQWNDO1FBYkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLFVBQVU7OztRQUFDO1lBQ1QsS0FBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDakIsS0FBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUM5QixLQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzlCLEtBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDLEdBQUUsR0FBRyxDQUFDLENBQUM7UUFDUixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUVELHVDQUFVOzs7O0lBQVYsVUFBVyxLQUFVO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQzs7Ozs7SUFFRCw2Q0FBZ0I7Ozs7SUFBaEIsVUFBaUIsRUFBMkI7UUFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQzs7Ozs7SUFFRCw4Q0FBaUI7Ozs7SUFBakIsVUFBa0IsRUFBMkI7UUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQzs7OztJQUVELHFDQUFROzs7SUFBUjtRQUFBLGlCQU1DO1FBTEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUzs7OztRQUFDLFVBQUEsQ0FBQztZQUMvRSxLQUFJLENBQUMsTUFBTSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDcEYsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7O0lBRUQsNENBQWU7OztJQUFmO1FBQ0UsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUNoRixJQUFJLENBQUMsU0FBUyw0QkFBeUIsQ0FDM0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUksSUFBSSxDQUFDLFNBQVMsa0JBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLEtBQUcsSUFBSSxDQUFDLFNBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFHLENBQUM7Ozs7SUFFRCwrQ0FBa0I7OztJQUFsQjtRQUNFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDOzs7O0lBRUQsd0NBQVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7O2dCQTdRRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsaTJDQUEwQztvQkFDMUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7b0JBQ3JDLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVTs7OzRCQUFDLGNBQU0sT0FBQSxrQkFBa0IsRUFBbEIsQ0FBa0IsRUFBQzs0QkFDakQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7b0JBQ0QsVUFBVSxFQUFFO3dCQUNWLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTs0QkFDM0IsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzs0QkFDdkMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzs0QkFDekMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3hFLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUN2RSxDQUFDO3FCQUNIO2lCQUNGOzs7O2dCQTlCQyxVQUFVO2dCQU1ILHFCQUFxQjs7O2tDQXFEM0IsU0FBUyxTQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7K0JBR3BDLEtBQUs7d0JBTUwsS0FBSzs4QkFTTCxLQUFLO21DQU9MLEtBQUs7NkJBUUwsS0FBSzsyQkFVTCxLQUFLOzRCQU9MLEtBQUs7MkJBT0wsS0FBSzsyQkFjTCxNQUFNOzJCQUVOLE1BQU07MEJBRU4sTUFBTTt5QkFFTixNQUFNOzJCQUVOLE1BQU07MEJBRU4sTUFBTTs7SUE2SVQseUJBQUM7Q0FBQSxBQTlRRCxJQThRQztTQTFQWSxrQkFBa0I7OztJQUM3Qix1Q0FBZ0M7O0lBQ2hDLHNDQUFpQjs7SUFDakIscUNBQWdCOztJQUNoQix1Q0FFRTs7Ozs7SUFFRiwyQ0FBbUM7Ozs7O0lBQ25DLG9DQUE0Qjs7Ozs7SUFDNUIsMENBQWtDOzs7OztJQUNsQywrQ0FBMkM7Ozs7O0lBQzNDLHlDQUE0Qjs7Ozs7SUFDNUIsdUNBQW1DOzs7OztJQUNuQyx3Q0FBMkI7Ozs7O0lBQzNCLG9DQUFnQzs7Ozs7SUFDaEMsdUNBQW1DOzs7OztJQUNuQywyQ0FBdUM7Ozs7O0lBQ3ZDLDhDQUEwQzs7Ozs7SUFDMUMsc0RBQThDOzs7OztJQUM5Qyw2Q0FBcUM7Ozs7O0lBQ3JDLDBDQUFrQzs7Ozs7SUFDbEMsZ0RBQXdDOzs7OztJQUN4QyxxREFBd0M7Ozs7O0lBQ3hDLDhDQUEwQzs7Ozs7SUFDMUMsb0NBQXlCOzs7OztJQUN6QiwyQ0FBNEM7O0lBRTVDLDZDQUNnQjs7SUFzRWhCLHNDQUNtQzs7SUFDbkMsc0NBQ21DOztJQUNuQyxxQ0FDa0M7O0lBQ2xDLG9DQUNpQzs7SUFDakMsc0NBQ21DOztJQUNuQyxxQ0FDa0M7Ozs7O0lBQ2xDLHdDQUF1RDs7Ozs7SUFDdkQsdUNBQXNEOzs7OztJQUUxQyx5Q0FBK0I7Ozs7O0lBQUUsNkNBQThDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBmb3J3YXJkUmVmLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uRGVzdHJveSxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIGFuaW1hdGUsIHRyYW5zaXRpb24sIHN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBMb2NhbGVQcm92aWRlclNlcnZpY2UgfSBmcm9tICcuLi9sb2NhbGUtcHJvdmlkZXIvbG9jYWxlLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdTZWFyY2hCYXIsIG56bS1zZWFyY2gtYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlYXJjaEJhckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2NhbmNlbEJ1dHRvblN0YXRlJywgW1xuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IHdpZHRoOiAnKicgfSkpLFxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgd2lkdGg6ICcxMDAlJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+aGlkZGVuJywgW2FuaW1hdGUoMzAwLCBzdHlsZSh7IHdpZHRoOiAnMTAwJScgfSkpXSksXG4gICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIFthbmltYXRlKDMwMCwgc3R5bGUoeyB3aWR0aDogJyonIH0pKV0pXG4gICAgXSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hCYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1zZWFyY2gnO1xuICBjbGVhckNsczogb2JqZWN0O1xuICB3cmFwQ2xzOiBvYmplY3Q7XG4gIGNhbmNlbENsczogb2JqZWN0ID0ge1xuICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2FuY2VsYF06IHRydWVcbiAgfTtcblxuICBwcml2YXRlIF9kZWZhdWx0VmFsdWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfc2hvd0NhbmNlbEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9jYW5jZWxUZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX21heExlbmd0aDogbnVtYmVyO1xuICBwcml2YXRlIF9mb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9pc1N1Ym1pdDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0N1c3RvbVRleHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNDbGVhckNsaWNraW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3N5bnRoZXRpY1BoQ29udGFpbmVyUmVmOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfc3ludGhldGljUGhSZWY6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9yaWdodEJ0blJlZjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX2lucHV0Q29udGFpbmVyUmVmOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfcmlnaHRCdG5Jbml0TWFyZ2luTGVmdDogc3RyaW5nO1xuICBwcml2YXRlIF9ibHVyRnJvbU9uQ2xlYXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBsb2NhbGU6IGFueSA9IHt9O1xuICBwcml2YXRlIF91bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGlucHV0RWxlbWVudFJlZjtcblxuICBASW5wdXQoKVxuICBzZXQgZGVmYXVsdFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuaW5wdXRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHY6IHN0cmluZykge1xuICAgIHRoaXMuX3ZhbHVlID0gdiB8fCAnJztcbiAgICB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzcygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHNob3dDYW5jZWxCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3dDYW5jZWxCdXR0b247XG4gIH1cbiAgc2V0IHNob3dDYW5jZWxCdXR0b24odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93Q2FuY2VsQnV0dG9uID0gdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzcygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBjYW5jZWxUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbmNlbFRleHQ7XG4gIH1cbiAgc2V0IGNhbmNlbFRleHQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9jYW5jZWxUZXh0ID0gdmFsdWU7XG4gICAgICB0aGlzLl9pc0N1c3RvbVRleHQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9tYXhMZW5ndGg7XG4gIH1cbiAgc2V0IG1heExlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHNldEZvY3VzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUuZm9jdXNWYWx1ZSkge1xuICAgICAgICB0aGlzLl9mb2N1cyA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5fYmx1ckZyb21PbkNsZWFyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vblNlYXJjaGJhckZvY3VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ibHVyRnJvbU9uQ2xlYXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vblNlYXJjaGJhckJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25Gb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25DbGVhciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBwcml2YXRlIG9uQ2hhbmdlRm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaEZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX2xvY2FsZVByb3ZpZGVyOiBMb2NhbGVQcm92aWRlclNlcnZpY2UpIHt9XG5cbiAgc2V0Q2xhc3MoKSB7XG4gICAgdGhpcy53cmFwQ2xzID0ge1xuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfWBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1zdGFydGBdOiAhISh0aGlzLl9mb2N1cyB8fCAodGhpcy5fdmFsdWUgJiYgdGhpcy5fdmFsdWUubGVuZ3RoID4gMCkpICYmICF0aGlzLl9kaXNhYmxlZFxuICAgIH07XG4gICAgdGhpcy5jYW5jZWxDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWNhbmNlbGBdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jYW5jZWwtc2hvd2BdOlxuICAgICAgICB0aGlzLl9zaG93Q2FuY2VsQnV0dG9uIHx8IHRoaXMuX2ZvY3VzIHx8ICh0aGlzLl92YWx1ZSAmJiB0aGlzLl92YWx1ZS5sZW5ndGggPiAwKSxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2FuY2VsLWFuaW1gXTogdGhpcy5fZm9jdXNcbiAgICB9O1xuICAgIHRoaXMuY2xlYXJDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWNsZWFyYF06IHRoaXMuX3ZhbHVlICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA+IDAsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWNsZWFyLXNob3dgXTogdGhpcy5fdmFsdWUgJiYgdGhpcy5fdmFsdWUubGVuZ3RoID4gMCAmJiAhdGhpcy5faXNTdWJtaXQsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWNsZWFyLWFjdGl2ZWBdOiB0aGlzLl9pc0NsZWFyQ2xpY2tpbmdcbiAgICB9O1xuICB9XG5cbiAgc2V0U3R5bGUoKSB7XG4gICAgaWYgKHRoaXMuX2lucHV0Q29udGFpbmVyUmVmLmNsYXNzTmFtZS5pbmRleE9mKGAke3RoaXMucHJlZml4Q2xzfS1zdGFydGApID4gLTEpIHtcbiAgICAgIGNvbnN0IHJlYWxXaWR0aCA9IHRoaXMuX3N5bnRoZXRpY1BoQ29udGFpbmVyUmVmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgdGhpcy5fc3ludGhldGljUGhSZWYuc3R5bGUud2lkdGggPSBNYXRoLmNlaWwocmVhbFdpZHRoKSArICdweCc7XG4gICAgICBpZiAoIXRoaXMuX3Nob3dDYW5jZWxCdXR0b24pIHtcbiAgICAgICAgdGhpcy5fcmlnaHRCdG5SZWYuc3R5bGUubWFyZ2luUmlnaHQgPSAnMCc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N5bnRoZXRpY1BoUmVmLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgaWYgKCF0aGlzLl9zaG93Q2FuY2VsQnV0dG9uKSB7XG4gICAgICAgIHRoaXMuX3JpZ2h0QnRuSW5pdE1hcmdpbkxlZnQgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9yaWdodEJ0blJlZilbJ21hcmdpbi1sZWZ0J107XG4gICAgICAgIGNvbnN0IGJ0bk1hcmdpblJpZ2h0ID0gdGhpcy5fcmlnaHRCdG5SZWYub2Zmc2V0V2lkdGggKyBwYXJzZUludCh0aGlzLl9yaWdodEJ0bkluaXRNYXJnaW5MZWZ0LCAxMCk7XG4gICAgICAgIHRoaXMuX3JpZ2h0QnRuUmVmLnN0eWxlLm1hcmdpblJpZ2h0ID0gJy0nICsgYnRuTWFyZ2luUmlnaHQgKyAncHgnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoYmFyQmx1cigpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghc2VsZi5fYmx1ckZyb21PbkNsZWFyICYmIHNlbGYuX3ZhbHVlID09PSAnJyAmJiBzZWxmLl9mb2N1cykge1xuICAgICAgICBzZWxmLl9mb2N1cyA9IGZhbHNlO1xuICAgICAgICBzZWxmLl92YWx1ZSA9ICcnO1xuICAgICAgICBzZWxmLm9uQmx1ci5lbWl0KCk7XG4gICAgICAgIHNlbGYuc2V0Q2xhc3MoKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuX2JsdXJGcm9tT25DbGVhciA9IGZhbHNlO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIG9uU2VhcmNoYmFyRm9jdXMoKSB7XG4gICAgdGhpcy5fZm9jdXMgPSB0cnVlO1xuICAgIHRoaXMuX2lzU3VibWl0ID0gZmFsc2U7XG4gICAgdGhpcy5vbkZvY3VzLmVtaXQoKTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gIH1cblxuICBvblNlYXJjaGJhckNoYW5nZShlKSB7XG4gICAgdGhpcy5fZm9jdXMgPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlID0gZTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoZSk7XG4gICAgdGhpcy5vbkNoYW5nZUZuKGUpO1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgfVxuXG4gIG9uU2VhcmNoU3VibWl0KGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5fdmFsdWUgPSBlLnRhcmdldFswXS52YWx1ZTtcbiAgICB0aGlzLl9pc1N1Ym1pdCA9IHRydWU7XG4gICAgdGhpcy5vblN1Ym1pdC5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gICAgdGhpcy5fYmx1ckZyb21PbkNsZWFyID0gdHJ1ZTtcbiAgfVxuXG4gIG9uU2VhcmNoYmFyQ2FuY2VsKCkge1xuICAgIHRoaXMuX2ZvY3VzID0gZmFsc2U7XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gIH1cblxuICBvblNlYXJjaGJhckNsZWFyKCkge1xuICAgIHRoaXMuX2JsdXJGcm9tT25DbGVhciA9IHRydWU7XG4gICAgdGhpcy5faXNDbGVhckNsaWNraW5nID0gdHJ1ZTtcbiAgICB0aGlzLm9uU2VhcmNoYmFyQ2hhbmdlKCcnKTtcbiAgICB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5vbkNsZWFyLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgICB0aGlzLl9pc0NsZWFyQ2xpY2tpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2JsdXJGcm9tT25DbGVhciA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRDbGFzcygpO1xuICAgIH0sIDEwMCk7XG4gICAgdGhpcy5vblNlYXJjaGJhckZvY3VzKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlIHx8ICcnO1xuICAgIHRoaXMuaW5wdXRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoRm4gPSBmbjtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgICB0aGlzLl9sb2NhbGVQcm92aWRlci5sb2NhbGVDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLl9sb2NhbGVQcm92aWRlci5nZXRMb2NhbGVTdWJPYmooJ1NlYXJjaEJhcicpO1xuICAgICAgdGhpcy5fY2FuY2VsVGV4dCA9IHRoaXMuX2lzQ3VzdG9tVGV4dCA/IHRoaXMuX2NhbmNlbFRleHQgOiB0aGlzLmxvY2FsZS5jYW5jZWxUZXh0O1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX3N5bnRoZXRpY1BoQ29udGFpbmVyUmVmID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICBgJHt0aGlzLnByZWZpeENsc30tc3ludGhldGljLXBoLWNvbnRhaW5lcmBcbiAgICApWzBdO1xuICAgIHRoaXMuX3N5bnRoZXRpY1BoUmVmID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYCR7dGhpcy5wcmVmaXhDbHN9LXN5bnRoZXRpYy1waGApWzBdO1xuICAgIHRoaXMuX3JpZ2h0QnRuUmVmID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NhbmNlbCcpWzBdO1xuICAgIHRoaXMuX2lucHV0Q29udGFpbmVyUmVmID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYCR7dGhpcy5wcmVmaXhDbHN9YClbMF07XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgdGhpcy5zZXRTdHlsZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19