UNPKG

ng-zorro-antd-mobile

Version:

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

462 lines 33 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, EventEmitter, Input, Output, ViewEncapsulation, HostBinding, NgZone } from '@angular/core'; import { CustomInputService } from './custom-input.service'; export class CustomInputComponent { /** * @param {?} _ref * @param {?} _customInputService * @param {?} _ngZone */ constructor(_ref, _customInputService, _ngZone) { this._ref = _ref; this._customInputService = _customInputService; this._ngZone = _ngZone; this.keyboardPrefixCls = 'am-number-keyboard'; this.focus = false; this._value = ''; this._defaultValue = ''; this._placeholder = ''; this._editable = true; this._disabled = false; this._setFocus = false; this.onChange = new EventEmitter(); this.onBlur = new EventEmitter(); this.onFocus = new EventEmitter(); this.clsFakeContainer = true; this.inputFocus = (/** * @return {?} */ () => { this.removeBlurListener(); /** @type {?} */ const focus = this.focus; if (!focus || this._setFocus) { this.onInputFocus(); } setTimeout((/** * @return {?} */ () => { this.addBlurListener(); }), 50); }); this.doBlur = (/** * @param {?} ev * @return {?} */ ev => { /** @type {?} */ const value = this._value; // 点击是否是组件本身 /** @type {?} */ let parentFound = false; // 点击目标是否是custom-input /** @type {?} */ let isInput = false; // 点击目标是否是custom-keyboard /** @type {?} */ let isKeyboard = false; /** @type {?} */ let isClear = false; /** @type {?} */ let target = ev.target; while (target && target !== null && !parentFound) { if (target === this._ref.nativeElement) { parentFound = true; } if (target.localName === 'custominput') { isInput = true; } if (target.localName === 'customkeyboard') { isKeyboard = true; } if (target.className.indexOf('am-input-clear') >= 0) { isClear = true; } target = target.parentElement; } // 当点击目标是本身的时候,获取焦点、不隐藏keyboard // 当点击目标不是本身但是其他的custom-input时,失去焦点、不隐藏keyboard // 当点击目标是keyboard时,不失去焦点,不隐藏keyboard if (parentFound) { this.focus = true; } else if (isInput) { this._setFocus = false; this.focus = false; this.onBlur.emit(this._value); } if (this.focus && isKeyboard) { this.focus = true; this.onKeyboardClick(CustomInputService.clickValue); } if (!parentFound && !isInput && !isKeyboard && !isClear && !this._setFocus) { this.focus = false; this._setFocus = false; this.onBlur.emit(this._value); CustomInputService.hideKeyboard(); } this.setFakeInputCls(); }); this.removeBlurListener = (/** * @return {?} */ () => { document.removeEventListener('click', this.doBlur, false); }); this.addBlurListener = (/** * @return {?} */ () => { document.addEventListener('click', this.doBlur, false); }); this.onInputBlur = (/** * @param {?} value * @return {?} */ value => { this.focus = false; this.setFakeInputCls(); this.onBlur.emit(this._value); CustomInputService.hideKeyboard(); }); this.onInputFocus = (/** * @return {?} */ () => { this.onFocus.emit(this._value); this.focus = true; this._setFocus = false; this.setFakeInputCls(); setTimeout((/** * @return {?} */ () => { CustomInputService.showKeyboard(); }), 100); }); this.setFakeInputCls = (/** * @return {?} */ () => { this.fakeInputCls = { [`fake-input`]: true, ['fake-input-disabled']: this._disabled, ['focus']: this.focus }; }); this.setContainerCls = (/** * @return {?} */ () => { this.clsFakeContainerLeft = this._moneyKeyboardAlign === 'left'; }); this.onKeyboardClick = (/** * @param {?} keyboardItemValue * @return {?} */ keyboardItemValue => { /** @type {?} */ let valueAfterChange; // 删除键 if (keyboardItemValue === 'delete') { valueAfterChange = this._value.substring(0, this._value.length - 1); this.onChange.emit(valueAfterChange); // 确认键 } else if (keyboardItemValue === 'confirm') { valueAfterChange = this._value; this.onChange.emit(valueAfterChange); this.onInputBlur(this._value); // 收起键 } else if (keyboardItemValue === 'hide') { valueAfterChange = this._value; this.onInputBlur(valueAfterChange); } else { if (this._maxLength !== undefined && +this._maxLength >= 0 && (this._value + keyboardItemValue).length > this._maxLength) { valueAfterChange = (this._value + keyboardItemValue).substr(0, this._maxLength); this.onChange.emit(valueAfterChange); } else { valueAfterChange = this._value + keyboardItemValue; this.onChange.emit(valueAfterChange); } } this._ngZone.run((/** * @return {?} */ () => { this._value = valueAfterChange; })); }); } /** * @return {?} */ get value() { return this._value; } /** * @param {?} v * @return {?} */ set value(v) { if (typeof v === 'undefined' || v === null) { this._value = ''; } else if (this._maxLength !== undefined && this._maxLength >= 0) { this._value = v.toString().substr(0, this._maxLength); } else { this._value = v.toString(); } } /** * @param {?} value * @return {?} */ set defaultValue(value) { this._defaultValue = value; if (!this._value) { this._value = this._defaultValue.toString(); } } /** * @param {?} value * @return {?} */ set maxLength(value) { this._maxLength = value; } /** * @return {?} */ get placeholder() { return this._placeholder; } /** * @param {?} value * @return {?} */ set placeholder(value) { this._placeholder = value; } /** * @param {?} value * @return {?} */ set editable(value) { this._editable = value; } /** * @param {?} value * @return {?} */ set disabled(value) { this._disabled = value; } /** * @return {?} */ get fontColor() { return this._fontColor; } /** * @param {?} value * @return {?} */ set fontColor(value) { this._fontColor = value; } /** * @param {?} value * @return {?} */ set moneyKeyboardAlign(value) { this._moneyKeyboardAlign = value; this.setContainerCls(); } /** * @param {?} value * @return {?} */ set setFocus(value) { if (value) { this._setFocus = value.focus; if (this._setFocus) { this.inputFocus(); } } } /** * @return {?} */ onFakeInputClick() { if (this._preventKeyboard) { return; } this.inputFocus(); } /** * @return {?} */ ngOnInit() { this._preventKeyboard = this._disabled || !this._editable; this.setFakeInputCls(); this.setContainerCls(); } /** * @return {?} */ ngOnDestroy() { this.removeBlurListener(); if (CustomInputService) { CustomInputService.hideKeyboard(); CustomInputService.compRef = null; } /** @type {?} */ const container = document.querySelector(`#${this.keyboardPrefixCls}-container`); if (container) { container.remove(); } } } CustomInputComponent.decorators = [ { type: Component, args: [{ selector: 'CustomInput', template: "<div *ngIf=\"value === ''\" class=\"fake-input-placeholder\">\n {{ placeholder }}\n</div>\n<div [ngClass]=\"fakeInputCls\" [style.color]=\"fontColor\" (click)=\"onFakeInputClick()\">\n {{ value }}\n</div>\n", encapsulation: ViewEncapsulation.None, providers: [CustomInputService] }] } ]; /** @nocollapse */ CustomInputComponent.ctorParameters = () => [ { type: ElementRef }, { type: CustomInputService }, { type: NgZone } ]; CustomInputComponent.propDecorators = { value: [{ type: Input }], defaultValue: [{ type: Input }], maxLength: [{ type: Input }], placeholder: [{ type: Input }], editable: [{ type: Input }], disabled: [{ type: Input }], fontColor: [{ type: Input }], moneyKeyboardAlign: [{ type: Input }], setFocus: [{ type: Input }], onChange: [{ type: Output }], onBlur: [{ type: Output }], onFocus: [{ type: Output }], clsFakeContainer: [{ type: HostBinding, args: ['class.fake-input-container',] }], clsFakeContainerLeft: [{ type: HostBinding, args: ['class.fake-input-container-left',] }] }; if (false) { /** @type {?} */ CustomInputComponent.prototype.keyboardPrefixCls; /** @type {?} */ CustomInputComponent.prototype.fakeInputCls; /** @type {?} */ CustomInputComponent.prototype.focus; /** * @type {?} * @private */ CustomInputComponent.prototype._value; /** * @type {?} * @private */ CustomInputComponent.prototype._defaultValue; /** * @type {?} * @private */ CustomInputComponent.prototype._placeholder; /** * @type {?} * @private */ CustomInputComponent.prototype._maxLength; /** * @type {?} * @private */ CustomInputComponent.prototype._editable; /** * @type {?} * @private */ CustomInputComponent.prototype._disabled; /** * @type {?} * @private */ CustomInputComponent.prototype._setFocus; /** * @type {?} * @private */ CustomInputComponent.prototype._preventKeyboard; /** * @type {?} * @private */ CustomInputComponent.prototype._moneyKeyboardAlign; /** * @type {?} * @private */ CustomInputComponent.prototype._fontColor; /** @type {?} */ CustomInputComponent.prototype.onChange; /** @type {?} */ CustomInputComponent.prototype.onBlur; /** @type {?} */ CustomInputComponent.prototype.onFocus; /** @type {?} */ CustomInputComponent.prototype.clsFakeContainer; /** @type {?} */ CustomInputComponent.prototype.clsFakeContainerLeft; /** @type {?} */ CustomInputComponent.prototype.inputFocus; /** @type {?} */ CustomInputComponent.prototype.doBlur; /** @type {?} */ CustomInputComponent.prototype.removeBlurListener; /** @type {?} */ CustomInputComponent.prototype.addBlurListener; /** @type {?} */ CustomInputComponent.prototype.onInputBlur; /** @type {?} */ CustomInputComponent.prototype.onInputFocus; /** @type {?} */ CustomInputComponent.prototype.setFakeInputCls; /** @type {?} */ CustomInputComponent.prototype.setContainerCls; /** @type {?} */ CustomInputComponent.prototype.onKeyboardClick; /** * @type {?} * @private */ CustomInputComponent.prototype._ref; /** * @type {?} * @private */ CustomInputComponent.prototype._customInputService; /** * @type {?} * @private */ CustomInputComponent.prototype._ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW5wdXQtaXRlbS9jdXN0b20taW5wdXQvY3VzdG9tLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBR04saUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFRNUQsTUFBTSxPQUFPLG9CQUFvQjs7Ozs7O0lBd0YvQixZQUFvQixJQUFnQixFQUFVLG1CQUF1QyxFQUFVLE9BQWU7UUFBMUYsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBdkY5RyxzQkFBaUIsR0FBVyxvQkFBb0IsQ0FBQztRQUVqRCxVQUFLLEdBQVksS0FBSyxDQUFDO1FBRWYsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNwQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUUxQixjQUFTLEdBQVksSUFBSSxDQUFDO1FBQzFCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQWtFbkMsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXRELFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVwRCxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHckQscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBYWpDLGVBQVU7OztRQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsa0JBQWtCLEVBQUUs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c0Q7O0lBQ3RELHNDQUNvRDs7SUFDcEQsdUNBQ3FEOztJQUVyRCxnREFDaUM7O0lBQ2pDLG9EQUM4Qjs7SUFXOUIsMENBU0M7O0lBRUQsc0NBOENDOztJQUVELGtEQUVDOztJQUVELCtDQUVDOztJQUVELDJDQUtDOztJQUVELDRDQVFDOztJQUVELCtDQU1DOztJQUVELCtDQUVDOztJQUVELCtDQStCQzs7Ozs7SUF4SVcsb0NBQXdCOzs7OztJQUFFLG1EQUErQzs7Ozs7SUFBRSx1Q0FBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBIb3N0QmluZGluZyxcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3VzdG9tSW5wdXRTZXJ2aWNlIH0gZnJvbSAnLi9jdXN0b20taW5wdXQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0N1c3RvbUlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW0N1c3RvbUlucHV0U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGtleWJvYXJkUHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tbnVtYmVyLWtleWJvYXJkJztcbiAgZmFrZUlucHV0Q2xzOiBvYmplY3Q7XG4gIGZvY3VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX21heExlbmd0aDogbnVtYmVyO1xuICBwcml2YXRlIF9lZGl0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3NldEZvY3VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3ByZXZlbnRLZXlib2FyZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfbW9uZXlLZXlib2FyZEFsaWduOiBzdHJpbmc7XG4gIHByaXZhdGUgX2ZvbnRDb2xvcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodjogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyB8fCB2ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9ICcnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fbWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fbWF4TGVuZ3RoID49IDApIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdi50b1N0cmluZygpLnN1YnN0cigwLCB0aGlzLl9tYXhMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHYudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCF0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IG1heExlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICB9XG4gIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZWRpdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9lZGl0YWJsZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGZvbnRDb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9udENvbG9yO1xuICB9XG4gIHNldCBmb250Q29sb3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2ZvbnRDb2xvciA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtb25leUtleWJvYXJkQWxpZ24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX21vbmV5S2V5Ym9hcmRBbGlnbiA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xzKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IHNldEZvY3VzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9zZXRGb2N1cyA9IHZhbHVlLmZvY3VzO1xuICAgICAgaWYgKHRoaXMuX3NldEZvY3VzKSB7XG4gICAgICAgIHRoaXMuaW5wdXRGb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmFrZS1pbnB1dC1jb250YWluZXInKVxuICBjbHNGYWtlQ29udGFpbmVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mYWtlLWlucHV0LWNvbnRhaW5lci1sZWZ0JylcbiAgY2xzRmFrZUNvbnRhaW5lckxlZnQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9jdXN0b21JbnB1dFNlcnZpY2U6IEN1c3RvbUlucHV0U2VydmljZSwgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgb25GYWtlSW5wdXRDbGljaygpIHtcbiAgICBpZiAodGhpcy5fcHJldmVudEtleWJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5wdXRGb2N1cygpO1xuICB9XG5cbiAgaW5wdXRGb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLnJlbW92ZUJsdXJMaXN0ZW5lcigpO1xuICAgIGNvbnN0IGZvY3VzID0gdGhpcy5mb2N1cztcbiAgICBpZiAoIWZvY3VzIHx8IHRoaXMuX3NldEZvY3VzKSB7XG4gICAgICB0aGlzLm9uSW5wdXRGb2N1cygpO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYWRkQmx1ckxpc3RlbmVyKCk7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgZG9CbHVyID0gZXYgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgLy8g54K55Ye75piv5ZCm5piv57uE5Lu25pys6LqrXG4gICAgbGV0IHBhcmVudEZvdW5kID0gZmFsc2U7XG4gICAgLy8g54K55Ye755uu5qCH5piv5ZCm5pivY3VzdG9tLWlucHV0XG4gICAgbGV0IGlzSW5wdXQgPSBmYWxzZTtcbiAgICAvLyDngrnlh7vnm67moIfmmK/lkKbmmK9jdXN0b20ta2V5Ym9hcmRcbiAgICBsZXQgaXNLZXlib2FyZCA9IGZhbHNlO1xuICAgIGxldCBpc0NsZWFyID0gZmFsc2U7XG4gICAgbGV0IHRhcmdldCA9IGV2LnRhcmdldDtcbiAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldCAhPT0gbnVsbCAmJiAhcGFyZW50Rm91bmQpIHtcbiAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX3JlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHBhcmVudEZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQubG9jYWxOYW1lID09PSAnY3VzdG9taW5wdXQnKSB7XG4gICAgICAgIGlzSW5wdXQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldC5sb2NhbE5hbWUgPT09ICdjdXN0b21rZXlib2FyZCcpIHtcbiAgICAgICAgaXNLZXlib2FyZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdhbS1pbnB1dC1jbGVhcicpID49IDApIHtcbiAgICAgICAgaXNDbGVhciA9IHRydWU7XG4gICAgICB9XG4gICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcbiAgICB9XG4gICAgLy8g5b2T54K55Ye755uu5qCH5piv5pys6Lqr55qE5pe25YCZ77yM6I635Y+W54Sm54K544CB5LiN6ZqQ6JePa2V5Ym9hcmRcbiAgICAvLyDlvZPngrnlh7vnm67moIfkuI3mmK/mnKzouqvkvYbmmK/lhbbku5bnmoRjdXN0b20taW5wdXTml7bvvIzlpLHljrvnhKbngrnjgIHkuI3pmpDol49rZXlib2FyZFxuICAgIC8vIOW9k+eCueWHu+ebruagh+aYr2tleWJvYXJk5pe277yM5LiN5aSx5Y6754Sm54K577yM5LiN6ZqQ6JePa2V5Ym9hcmRcbiAgICBpZiAocGFyZW50Rm91bmQpIHtcbiAgICAgIHRoaXMuZm9jdXMgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoaXNJbnB1dCkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMub25CbHVyLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb2N1cyAmJiBpc0tleWJvYXJkKSB7XG4gICAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICAgIHRoaXMub25LZXlib2FyZENsaWNrKEN1c3RvbUlucHV0U2VydmljZS5jbGlja1ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKCFwYXJlbnRGb3VuZCAmJiAhaXNJbnB1dCAmJiAhaXNLZXlib2FyZCAmJiAhaXNDbGVhciAmJiAhdGhpcy5fc2V0Rm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3NldEZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9uQmx1ci5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICAgIEN1c3RvbUlucHV0U2VydmljZS5oaWRlS2V5Ym9hcmQoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRGYWtlSW5wdXRDbHMoKTtcbiAgfVxuXG4gIHJlbW92ZUJsdXJMaXN0ZW5lciA9ICgpID0+IHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9CbHVyLCBmYWxzZSk7XG4gIH1cblxuICBhZGRCbHVyTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmRvQmx1ciwgZmFsc2UpO1xuICB9XG5cbiAgb25JbnB1dEJsdXIgPSB2YWx1ZSA9PiB7XG4gICAgdGhpcy5mb2N1cyA9IGZhbHNlO1xuICAgIHRoaXMuc2V0RmFrZUlucHV0Q2xzKCk7XG4gICAgdGhpcy5vbkJsdXIuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgQ3VzdG9tSW5wdXRTZXJ2aWNlLmhpZGVLZXlib2FyZCgpO1xuICB9XG5cbiAgb25JbnB1dEZvY3VzID0gKCkgPT4ge1xuICAgIHRoaXMub25Gb2N1cy5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXRGb2N1cyA9IGZhbHNlO1xuICAgIHRoaXMuc2V0RmFrZUlucHV0Q2xzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBDdXN0b21JbnB1dFNlcnZpY2Uuc2hvd0tleWJvYXJkKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHNldEZha2VJbnB1dENscyA9ICgpID0+IHtcbiAgICB0aGlzLmZha2VJbnB1dENscyA9IHtcbiAgICAgIFtgZmFrZS1pbnB1dGBdOiB0cnVlLFxuICAgICAgWydmYWtlLWlucHV0LWRpc2FibGVkJ106IHRoaXMuX2Rpc2FibGVkLFxuICAgICAgWydmb2N1cyddOiB0aGlzLmZvY3VzXG4gICAgfTtcbiAgfVxuXG4gIHNldENvbnRhaW5lckNscyA9ICgpID0+IHtcbiAgICB0aGlzLmNsc0Zha2VDb250YWluZXJMZWZ0ID0gdGhpcy5fbW9uZXlLZXlib2FyZEFsaWduID09PSAnbGVmdCc7XG4gIH1cblxuICBvbktleWJvYXJkQ2xpY2sgPSBrZXlib2FyZEl0ZW1WYWx1ZSA9PiB7XG4gICAgbGV0IHZhbHVlQWZ0ZXJDaGFuZ2U7XG4gICAgLy8g5Yig6Zmk6ZSuXG4gICAgaWYgKGtleWJvYXJkSXRlbVZhbHVlID09PSAnZGVsZXRlJykge1xuICAgICAgdmFsdWVBZnRlckNoYW5nZSA9IHRoaXMuX3ZhbHVlLnN1YnN0cmluZygwLCB0aGlzLl92YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZUFmdGVyQ2hhbmdlKTtcbiAgICAgIC8vIOehruiupOmUrlxuICAgIH0gZWxzZSBpZiAoa2V5Ym9hcmRJdGVtVmFsdWUgPT09ICdjb25maXJtJykge1xuICAgICAgdmFsdWVBZnRlckNoYW5nZSA9IHRoaXMuX3ZhbHVlO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgICAgdGhpcy5vbklucHV0Qmx1cih0aGlzLl92YWx1ZSk7XG4gICAgICAvLyDmlLbotbfplK5cbiAgICB9IGVsc2UgaWYgKGtleWJvYXJkSXRlbVZhbHVlID09PSAnaGlkZScpIHtcbiAgICAgIHZhbHVlQWZ0ZXJDaGFuZ2UgPSB0aGlzLl92YWx1ZTtcbiAgICAgIHRoaXMub25JbnB1dEJsdXIodmFsdWVBZnRlckNoYW5nZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fbWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgK3RoaXMuX21heExlbmd0aCA+PSAwICYmXG4gICAgICAgICh0aGlzLl92YWx1ZSArIGtleWJvYXJkSXRlbVZhbHVlKS5sZW5ndGggPiB0aGlzLl9tYXhMZW5ndGhcbiAgICAgICkge1xuICAgICAgICB2YWx1ZUFmdGVyQ2hhbmdlID0gKHRoaXMuX3ZhbHVlICsga2V5Ym9hcmRJdGVtVmFsdWUpLnN1YnN0cigwLCB0aGlzLl9tYXhMZW5ndGgpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodmFsdWVBZnRlckNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZUFmdGVyQ2hhbmdlID0gdGhpcy5fdmFsdWUgKyBrZXlib2FyZEl0ZW1WYWx1ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVBZnRlckNoYW5nZTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX3ByZXZlbnRLZXlib2FyZCA9IHRoaXMuX2Rpc2FibGVkIHx8ICF0aGlzLl9lZGl0YWJsZTtcbiAgICB0aGlzLnNldEZha2VJbnB1dENscygpO1xuICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xzKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUJsdXJMaXN0ZW5lcigpO1xuICAgIGlmIChDdXN0b21JbnB1dFNlcnZpY2UpIHtcbiAgICAgIEN1c3RvbUlucHV0U2VydmljZS5oaWRlS2V5Ym9hcmQoKTtcbiAgICAgIEN1c3RvbUlucHV0U2VydmljZS5jb21wUmVmID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7dGhpcy5rZXlib2FyZFByZWZpeENsc30tY29udGFpbmVyYCk7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xuICAgIH1cbiAgfVxufVxuIl19