ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
411 lines (410 loc) • 34.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,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';
export class SearchBar {
/**
* @param {?} _elementRef
* @param {?} _localeProvider
*/
constructor(_elementRef, _localeProvider) {
this._elementRef = _elementRef;
this._localeProvider = _localeProvider;
this.prefixCls = 'am-search';
this.cancelCls = {
[`${this.prefixCls}-cancel`]: true
};
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();
}
/**
* @param {?} value
* @return {?}
*/
set defaultValue(value) {
this._defaultValue = value;
this._value = value;
this.inputElementRef.nativeElement.value = this._value;
}
/**
* @return {?}
*/
get value() {
return this._value;
}
/**
* @param {?} v
* @return {?}
*/
set value(v) {
this._value = v || '';
this.inputElementRef.nativeElement.value = this._value;
this.setClass();
}
/**
* @return {?}
*/
get placeholder() {
return this._placeholder;
}
/**
* @param {?} value
* @return {?}
*/
set placeholder(value) {
this._placeholder = value;
}
/**
* @return {?}
*/
get showCancelButton() {
return this._showCancelButton;
}
/**
* @param {?} value
* @return {?}
*/
set showCancelButton(value) {
this._showCancelButton = value;
this.setClass();
}
/**
* @return {?}
*/
get cancelText() {
return this._cancelText;
}
/**
* @param {?} value
* @return {?}
*/
set cancelText(value) {
if (value !== undefined) {
this._cancelText = value;
this._isCustomText = true;
}
}
/**
* @return {?}
*/
get disabled() {
return this._disabled;
}
/**
* @param {?} value
* @return {?}
*/
set disabled(value) {
this._disabled = value;
}
/**
* @return {?}
*/
get maxLength() {
return this._maxLength;
}
/**
* @param {?} value
* @return {?}
*/
set maxLength(value) {
this._maxLength = value;
}
/**
* @param {?} value
* @return {?}
*/
set setFocus(value) {
if (value) {
if (value.focusValue) {
this._focus = true;
this.inputElementRef.nativeElement.focus();
this._blurFromOnClear = true;
this.onSearchbarFocus();
}
else {
this._blurFromOnClear = false;
this.onSearchbarBlur();
}
}
}
/**
* @return {?}
*/
setClass() {
this.wrapCls = {
[`${this.prefixCls}`]: true,
[`${this.prefixCls}-start`]: !!(this._focus || (this._value && this._value.length > 0)) && !this._disabled
};
this.cancelCls = {
[`${this.prefixCls}-cancel`]: true,
[`${this.prefixCls}-cancel-show`]: this._showCancelButton || this._focus || (this._value && this._value.length > 0),
[`${this.prefixCls}-cancel-anim`]: this._focus
};
this.clearCls = {
[`${this.prefixCls}-clear`]: this._value && this._value.length > 0,
[`${this.prefixCls}-clear-show`]: this._value && this._value.length > 0 && !this._isSubmit,
[`${this.prefixCls}-clear-active`]: this._isClearClicking
};
}
/**
* @return {?}
*/
setStyle() {
if (this._inputContainerRef.className.indexOf(`${this.prefixCls}-start`) > -1) {
/** @type {?} */
const 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 {?} */
const btnMarginRight = this._rightBtnRef.offsetWidth + parseInt(this._rightBtnInitMarginLeft, 10);
this._rightBtnRef.style.marginRight = '-' + btnMarginRight + 'px';
}
}
}
/**
* @return {?}
*/
onSearchbarBlur() {
/** @type {?} */
const self = this;
setTimeout(() => {
if (!self._blurFromOnClear && self._value === '' && self._focus) {
self._focus = false;
self._value = '';
self.onBlur.emit();
self.setClass();
}
self._blurFromOnClear = false;
}, 50);
}
/**
* @return {?}
*/
onSearchbarFocus() {
this._focus = true;
this._isSubmit = false;
this.onFocus.emit();
this.setClass();
}
/**
* @param {?} e
* @return {?}
*/
onSearchbarChange(e) {
this._focus = true;
this.onChange.emit(e);
this.setClass();
}
/**
* @param {?} e
* @return {?}
*/
onSearchSubmit(e) {
e.preventDefault();
this._value = e.target[0].value;
this._isSubmit = true;
this.onSubmit.emit(this._value);
this.setClass();
this._blurFromOnClear = true;
}
/**
* @return {?}
*/
onSearchbarCancel() {
this._focus = false;
this._value = '';
this.onCancel.emit();
this.setClass();
}
/**
* @return {?}
*/
onSearchbarClear() {
this._blurFromOnClear = true;
this._isClearClicking = true;
this.onSearchbarChange('');
this.inputElementRef.nativeElement.focus();
this.onClear.emit(this._value);
this.setClass();
setTimeout(() => {
this._value = '';
this._isClearClicking = false;
this._blurFromOnClear = false;
this.setClass();
}, 100);
this.onSearchbarFocus();
}
/**
* @return {?}
*/
ngOnInit() {
this.setClass();
this._localeProvider.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => {
this.locale = this._localeProvider.getLocaleSubObj('SearchBar');
this._cancelText = this._isCustomText ? this._cancelText : this.locale.cancelText;
});
}
/**
* @return {?}
*/
ngAfterViewInit() {
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 {?}
*/
ngAfterViewChecked() {
this.setStyle();
}
/**
* @return {?}
*/
ngOnDestroy() {
this._unsubscribe$.next();
this._unsubscribe$.complete();
}
}
SearchBar.decorators = [
{ type: Component, args: [{
selector: 'SearchBar, nzm-search-bar',
template: "<form name=\"myForm\"\n class=\"{{prefixCls}}\"\n [ngClass]=\"wrapCls\"\n action=\"#\"\n (submit)=\"onSearchSubmit($event)\"\n>\n <div class=\"{{prefixCls}}-input\">\n <div 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 class=\"{{prefixCls}}-synthetic-ph-placeholder\"\n [ngStyle]=\"{'visibility' : (placeholder && !value) ? 'visible' : 'hidden'}\"\n >\n {{placeholder}}\n </span>\n </span>\n </div>\n <input #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\"\n style=\"box-sizing: content-box;transition: 0s\"\n (click)=\"onSearchbarClear()\"\n ></a>\n </div>\n <div class=\"cancel\"\n [ngClass]=\"cancelCls\"\n (click)=\"onSearchbarCancel()\"\n >\n {{cancelText}}\n </div>\n</form>",
encapsulation: ViewEncapsulation.None,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SearchBar),
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 */
SearchBar.ctorParameters = () => [
{ type: ElementRef },
{ type: LocaleProviderService }
];
SearchBar.propDecorators = {
inputElementRef: [{ type: ViewChild, args: ['search',] }],
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 }]
};
if (false) {
/** @type {?} */
SearchBar.prototype.prefixCls;
/** @type {?} */
SearchBar.prototype.clearCls;
/** @type {?} */
SearchBar.prototype.wrapCls;
/** @type {?} */
SearchBar.prototype.cancelCls;
/** @type {?} */
SearchBar.prototype._defaultValue;
/** @type {?} */
SearchBar.prototype._value;
/** @type {?} */
SearchBar.prototype._placeholder;
/** @type {?} */
SearchBar.prototype._showCancelButton;
/** @type {?} */
SearchBar.prototype._cancelText;
/** @type {?} */
SearchBar.prototype._disabled;
/** @type {?} */
SearchBar.prototype._maxLength;
/** @type {?} */
SearchBar.prototype._focus;
/** @type {?} */
SearchBar.prototype._isSubmit;
/** @type {?} */
SearchBar.prototype._isCustomText;
/** @type {?} */
SearchBar.prototype._isClearClicking;
/** @type {?} */
SearchBar.prototype._syntheticPhContainerRef;
/** @type {?} */
SearchBar.prototype._syntheticPhRef;
/** @type {?} */
SearchBar.prototype._rightBtnRef;
/** @type {?} */
SearchBar.prototype._inputContainerRef;
/** @type {?} */
SearchBar.prototype._rightBtnInitMarginLeft;
/** @type {?} */
SearchBar.prototype._blurFromOnClear;
/** @type {?} */
SearchBar.prototype.locale;
/** @type {?} */
SearchBar.prototype._unsubscribe$;
/** @type {?} */
SearchBar.prototype.inputElementRef;
/** @type {?} */
SearchBar.prototype.onSubmit;
/** @type {?} */
SearchBar.prototype.onChange;
/** @type {?} */
SearchBar.prototype.onFocus;
/** @type {?} */
SearchBar.prototype.onBlur;
/** @type {?} */
SearchBar.prototype.onCancel;
/** @type {?} */
SearchBar.prototype.onClear;
/** @type {?} */
SearchBar.prototype._elementRef;
/** @type {?} */
SearchBar.prototype._localeProvider;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInNlYXJjaC1iYXIvc2VhcmNoLWJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBSVQsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUNWLFVBQVUsRUFDVixZQUFZLEVBRVosU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDbkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFzQm5ELE1BQU07Ozs7O0lBZ0hKLFlBQW9CLFdBQXVCLEVBQVUsZUFBc0M7UUFBdkUsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7eUJBL0d2RSxXQUFXO3lCQUdYO1lBQ2xCLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxTQUFTLENBQUMsRUFBRSxJQUFJO1NBQ25DOzZCQUUrQixFQUFFO3NCQUNULEVBQUU7NEJBQ0ksRUFBRTtpQ0FDSSxLQUFLO3lCQUViLEtBQUs7c0JBRVIsS0FBSzt5QkFDRixLQUFLOzZCQUNELEtBQUs7Z0NBQ0YsS0FBSztnQ0FNTCxLQUFLO3NCQUNuQixFQUFFOzZCQUNBLElBQUksT0FBTyxFQUFRO3dCQTBFaEMsSUFBSSxZQUFZLEVBQU87d0JBRXZCLElBQUksWUFBWSxFQUFPO3VC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LENBQUMsQ0FBQzt3QkFDekMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3hFLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUN2RSxDQUFDO2lCQUNIO2FBQ0Y7Ozs7WUE5QkMsVUFBVTtZQU1ILHFCQUFxQjs7OzhCQXFEM0IsU0FBUyxTQUFDLFFBQVE7MkJBR2xCLEtBQUs7b0JBTUwsS0FBSzswQkFTTCxLQUFLOytCQU9MLEtBQUs7eUJBUUwsS0FBSzt1QkFVTCxLQUFLO3dCQU9MLEtBQUs7dUJBT0wsS0FBSzt1QkFjTCxNQUFNO3VCQUVOLE1BQU07c0JBRU4sTUFBTTtxQkFFTixNQUFNO3VCQUVOLE1BQU07c0JBRU4sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBBZnRlclZpZXdDaGVja2VkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgZm9yd2FyZFJlZixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHN0YXRlLCBhbmltYXRlLCB0cmFuc2l0aW9uLCBzdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vbG9jYWxlLXByb3ZpZGVyL2xvY2FsZS1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdTZWFyY2hCYXIsIG56bS1zZWFyY2gtYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlYXJjaEJhciksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2NhbmNlbEJ1dHRvblN0YXRlJywgW1xuICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IHdpZHRoOiAnKicgfSkpLFxuICAgICAgc3RhdGUoJ2hpZGRlbicsIHN0eWxlKHsgd2lkdGg6ICcxMDAlJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+aGlkZGVuJywgW2FuaW1hdGUoMzAwLCBzdHlsZSh7IHdpZHRoOiAnMTAwJScgfSkpXSksXG4gICAgICB0cmFuc2l0aW9uKCdoaWRkZW4gPT4gdmlzaWJsZScsIFthbmltYXRlKDMwMCwgc3R5bGUoeyB3aWR0aDogJyonIH0pKV0pXG4gICAgXSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hCYXIgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLXNlYXJjaCc7XG4gIGNsZWFyQ2xzOiBvYmplY3Q7XG4gIHdyYXBDbHM6IG9iamVjdDtcbiAgY2FuY2VsQ2xzOiBvYmplY3QgPSB7XG4gICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jYW5jZWxgXTogdHJ1ZVxuICB9O1xuXG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9zaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2NhbmNlbFRleHQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWF4TGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgX2ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzU3VibWl0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzQ3VzdG9tVGV4dDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9pc0NsZWFyQ2xpY2tpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3ludGhldGljUGhDb250YWluZXJSZWY6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9zeW50aGV0aWNQaFJlZjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3JpZ2h0QnRuUmVmOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfaW5wdXRDb250YWluZXJSZWY6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9yaWdodEJ0bkluaXRNYXJnaW5MZWZ0OiBzdHJpbmc7XG4gIHByaXZhdGUgX2JsdXJGcm9tT25DbGVhcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGxvY2FsZTogYW55ID0ge307XG4gIHByaXZhdGUgX3Vuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoJylcbiAgaW5wdXRFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodjogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2IHx8ICcnO1xuICAgIHRoaXMuaW5wdXRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgc2hvd0NhbmNlbEJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd0NhbmNlbEJ1dHRvbjtcbiAgfVxuICBzZXQgc2hvd0NhbmNlbEJ1dHRvbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dDYW5jZWxCdXR0b24gPSB2YWx1ZTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGNhbmNlbFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY2FuY2VsVGV4dDtcbiAgfVxuICBzZXQgY2FuY2VsVGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2NhbmNlbFRleHQgPSB2YWx1ZTtcbiAgICAgIHRoaXMuX2lzQ3VzdG9tVGV4dCA9IHRydWU7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heExlbmd0aDtcbiAgfVxuICBzZXQgbWF4TGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhMZW5ndGggPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgc2V0Rm9jdXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZS5mb2N1c1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLl9ibHVyRnJvbU9uQ2xlYXIgPSB0cnVlO1xuICAgICAgICB0aGlzLm9uU2VhcmNoYmFyRm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2JsdXJGcm9tT25DbGVhciA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uU2VhcmNoYmFyQmx1cigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgb25TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkNsZWFyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBfbG9jYWxlUHJvdmlkZXI6IExvY2FsZVByb3ZpZGVyU2VydmljZSkge31cblxuICBzZXRDbGFzcygpIHtcbiAgICB0aGlzLndyYXBDbHMgPSB7XG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9YF06IHRydWUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LXN0YXJ0YF06ICEhKHRoaXMuX2ZvY3VzIHx8ICh0aGlzLl92YWx1ZSAmJiB0aGlzLl92YWx1ZS5sZW5ndGggPiAwKSkgJiYgIXRoaXMuX2Rpc2FibGVkXG4gICAgfTtcbiAgICB0aGlzLmNhbmNlbENscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2FuY2VsYF06IHRydWUsXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWNhbmNlbC1zaG93YF06XG4gICAgICAgIHRoaXMuX3Nob3dDYW5jZWxCdXR0b24gfHwgdGhpcy5fZm9jdXMgfHwgKHRoaXMuX3ZhbHVlICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA+IDApLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jYW5jZWwtYW5pbWBdOiB0aGlzLl9mb2N1c1xuICAgIH07XG4gICAgdGhpcy5jbGVhckNscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2xlYXJgXTogdGhpcy5fdmFsdWUgJiYgdGhpcy5fdmFsdWUubGVuZ3RoID4gMCxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2xlYXItc2hvd2BdOiB0aGlzLl92YWx1ZSAmJiB0aGlzLl92YWx1ZS5sZW5ndGggPiAwICYmICF0aGlzLl9pc1N1Ym1pdCxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2xlYXItYWN0aXZlYF06IHRoaXMuX2lzQ2xlYXJDbGlja2luZ1xuICAgIH07XG4gIH1cblxuICBzZXRTdHlsZSgpIHtcbiAgICBpZiAodGhpcy5faW5wdXRDb250YWluZXJSZWYuY2xhc3NOYW1lLmluZGV4T2YoYCR7dGhpcy5wcmVmaXhDbHN9LXN0YXJ0YCkgPiAtMSkge1xuICAgICAgY29uc3QgcmVhbFdpZHRoID0gdGhpcy5fc3ludGhldGljUGhDb250YWluZXJSZWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICB0aGlzLl9zeW50aGV0aWNQaFJlZi5zdHlsZS53aWR0aCA9IE1hdGguY2VpbChyZWFsV2lkdGgpICsgJ3B4JztcbiAgICAgIGlmICghdGhpcy5fc2hvd0NhbmNlbEJ1dHRvbikge1xuICAgICAgICB0aGlzLl9yaWdodEJ0blJlZi5zdHlsZS5tYXJnaW5SaWdodCA9ICcwJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3ludGhldGljUGhSZWYuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICBpZiAoIXRoaXMuX3Nob3dDYW5jZWxCdXR0b24pIHtcbiAgICAgICAgdGhpcy5fcmlnaHRCdG5Jbml0TWFyZ2luTGVmdCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX3JpZ2h0QnRuUmVmKVsnbWFyZ2luLWxlZnQnXTtcbiAgICAgICAgY29uc3QgYnRuTWFyZ2luUmlnaHQgPSB0aGlzLl9yaWdodEJ0blJlZi5vZmZzZXRXaWR0aCArIHBhcnNlSW50KHRoaXMuX3JpZ2h0QnRuSW5pdE1hcmdpbkxlZnQsIDEwKTtcbiAgICAgICAgdGhpcy5fcmlnaHRCdG5SZWYuc3R5bGUubWFyZ2luUmlnaHQgPSAnLScgKyBidG5NYXJnaW5SaWdodCArICdweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25TZWFyY2hiYXJCbHVyKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFzZWxmLl9ibHVyRnJvbU9uQ2xlYXIgJiYgc2VsZi5fdmFsdWUgPT09ICcnICYmIHNlbGYuX2ZvY3VzKSB7XG4gICAgICAgIHNlbGYuX2ZvY3VzID0gZmFsc2U7XG4gICAgICAgIHNlbGYuX3ZhbHVlID0gJyc7XG4gICAgICAgIHNlbGYub25CbHVyLmVtaXQoKTtcbiAgICAgICAgc2VsZi5zZXRDbGFzcygpO1xuICAgICAgfVxuICAgICAgc2VsZi5fYmx1ckZyb21PbkNsZWFyID0gZmFsc2U7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgb25TZWFyY2hiYXJGb2N1cygpIHtcbiAgICB0aGlzLl9mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5faXNTdWJtaXQgPSBmYWxzZTtcbiAgICB0aGlzLm9uRm9jdXMuZW1pdCgpO1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgfVxuXG4gIG9uU2VhcmNoYmFyQ2hhbmdlKGUpIHtcbiAgICB0aGlzLl9mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KGUpO1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgfVxuXG4gIG9uU2VhcmNoU3VibWl0KGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5fdmFsdWUgPSBlLnRhcmdldFswXS52YWx1ZTtcbiAgICB0aGlzLl9pc1N1Ym1pdCA9IHRydWU7XG4gICAgdGhpcy5vblN1Ym1pdC5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gICAgdGhpcy5fYmx1ckZyb21PbkNsZWFyID0gdHJ1ZTtcbiAgfVxuXG4gIG9uU2VhcmNoYmFyQ2FuY2VsKCkge1xuICAgIHRoaXMuX2ZvY3VzID0gZmFsc2U7XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gIH1cblxuICBvblNlYXJjaGJhckNsZWFyKCkge1xuICAgIHRoaXMuX2JsdXJGcm9tT25DbGVhciA9IHRydWU7XG4gICAgdGhpcy5faXNDbGVhckNsaWNraW5nID0gdHJ1ZTtcbiAgICB0aGlzLm9uU2VhcmNoYmFyQ2hhbmdlKCcnKTtcbiAgICB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5vbkNsZWFyLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgICB0aGlzLl9pc0NsZWFyQ2xpY2tpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2JsdXJGcm9tT25DbGVhciA9IGZhbHNlO1xuICAgICAgdGhpcy5zZXRDbGFzcygpO1xuICAgIH0sIDEwMCk7XG4gICAgdGhpcy5vblNlYXJjaGJhckZvY3VzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gICAgdGhpcy5fbG9jYWxlUHJvdmlkZXIubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlJCkpLnN1YnNjcmliZShfID0+IHtcbiAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5fbG9jYWxlUHJvdmlkZXIuZ2V0TG9jYWxlU3ViT2JqKCdTZWFyY2hCYXInKTtcbiAgICAgIHRoaXMuX2NhbmNlbFRleHQgPSB0aGlzLl9pc0N1c3RvbVRleHQgPyB0aGlzLl9jYW5jZWxUZXh0IDogdGhpcy5sb2NhbGUuY2FuY2VsVGV4dDtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9zeW50aGV0aWNQaENvbnRhaW5lclJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgYCR7dGhpcy5wcmVmaXhDbHN9LXN5bnRoZXRpYy1waC1jb250YWluZXJgXG4gICAgKVswXTtcbiAgICB0aGlzLl9zeW50aGV0aWNQaFJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGAke3RoaXMucHJlZml4Q2xzfS1zeW50aGV0aWMtcGhgKVswXTtcbiAgICB0aGlzLl9yaWdodEJ0blJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjYW5jZWwnKVswXTtcbiAgICB0aGlzLl9pbnB1dENvbnRhaW5lclJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGAke3RoaXMucHJlZml4Q2xzfWApWzBdO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIHRoaXMuc2V0U3R5bGUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==