UNPKG

ng-zorro-antd-mobile

Version:

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

506 lines 35.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,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'; var CustomInputComponent = /** @class */ (function () { function CustomInputComponent(_ref, _customInputService, _ngZone) { var _this = this; 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 {?} */ function () { _this.removeBlurListener(); /** @type {?} */ var focus = _this.focus; if (!focus || _this._setFocus) { _this.onInputFocus(); } setTimeout((/** * @return {?} */ function () { _this.addBlurListener(); }), 50); }); this.doBlur = (/** * @param {?} ev * @return {?} */ function (ev) { /** @type {?} */ var value = _this._value; // 点击是否是组件本身 /** @type {?} */ var parentFound = false; // 点击目标是否是custom-input /** @type {?} */ var isInput = false; // 点击目标是否是custom-keyboard /** @type {?} */ var isKeyboard = false; /** @type {?} */ var isClear = false; /** @type {?} */ var 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 {?} */ function () { document.removeEventListener('click', _this.doBlur, false); }); this.addBlurListener = (/** * @return {?} */ function () { document.addEventListener('click', _this.doBlur, false); }); this.onInputBlur = (/** * @param {?} value * @return {?} */ function (value) { _this.focus = false; _this.setFakeInputCls(); _this.onBlur.emit(_this._value); CustomInputService.hideKeyboard(); }); this.onInputFocus = (/** * @return {?} */ function () { _this.onFocus.emit(_this._value); _this.focus = true; _this._setFocus = false; _this.setFakeInputCls(); setTimeout((/** * @return {?} */ function () { CustomInputService.showKeyboard(); }), 100); }); this.setFakeInputCls = (/** * @return {?} */ function () { var _a; _this.fakeInputCls = (_a = {}, _a["fake-input"] = true, _a['fake-input-disabled'] = _this._disabled, _a['focus'] = _this.focus, _a); }); this.setContainerCls = (/** * @return {?} */ function () { _this.clsFakeContainerLeft = _this._moneyKeyboardAlign === 'left'; }); this.onKeyboardClick = (/** * @param {?} keyboardItemValue * @return {?} */ function (keyboardItemValue) { /** @type {?} */ var 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 {?} */ function () { _this._value = valueAfterChange; })); }); } Object.defineProperty(CustomInputComponent.prototype, "value", { get: /** * @return {?} */ function () { return this._value; }, set: /** * @param {?} v * @return {?} */ function (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(); } }, enumerable: true, configurable: true }); Object.defineProperty(CustomInputComponent.prototype, "defaultValue", { set: /** * @param {?} value * @return {?} */ function (value) { this._defaultValue = value; if (!this._value) { this._value = this._defaultValue.toString(); } }, enumerable: true, configurable: true }); Object.defineProperty(CustomInputComponent.prototype, "maxLength", { set: /** * @param {?} value * @return {?} */ function (value) { this._maxLength = value; }, enumerable: true, configurable: true }); Object.defineProperty(CustomInputComponent.prototype, "placeholder", { get: /** * @return {?} */ function () { return this._placeholder; }, set: /** * @param {?} value * @return {?} */ function (value) { this._placeholder = value; }, enumerable: true, configurable: true }); Object.defineProperty(CustomInputComponent.prototype, "editable", { set: /** * @param {?} value * @return {?} */ function (value) { this._editable = value; }, enumerable: true, configurable: true }); Object.defineProperty(CustomInputComponent.prototype, "disabled", { set: /** * @param {?} value * @return {?} */ function (value) { this._disabled = value; }, enumerable: true, configurable: true }); Object.defineProperty(CustomInputComponent.prototype, "fontColor", { get: /** * @return {?} */ function () { return this._fontColor; }, set: /** * @param {?} value * @return {?} */ function (value) { this._fontColor = value; }, enumerable: true, configurable: true }); Object.defineProperty(CustomInputComponent.prototype, "moneyKeyboardAlign", { set: /** * @param {?} value * @return {?} */ function (value) { this._moneyKeyboardAlign = value; this.setContainerCls(); }, enumerable: true, configurable: true }); Object.defineProperty(CustomInputComponent.prototype, "setFocus", { set: /** * @param {?} value * @return {?} */ function (value) { if (value) { this._setFocus = value.focus; if (this._setFocus) { this.inputFocus(); } } }, enumerable: true, configurable: true }); /** * @return {?} */ CustomInputComponent.prototype.onFakeInputClick = /** * @return {?} */ function () { if (this._preventKeyboard) { return; } this.inputFocus(); }; /** * @return {?} */ CustomInputComponent.prototype.ngOnInit = /** * @return {?} */ function () { this._preventKeyboard = this._disabled || !this._editable; this.setFakeInputCls(); this.setContainerCls(); }; /** * @return {?} */ CustomInputComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.removeBlurListener(); if (CustomInputService) { CustomInputService.hideKeyboard(); CustomInputService.compRef = null; } /** @type {?} */ var 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 = function () { return [ { 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',] }] }; return CustomInputComponent; }()); export { CustomInputComponent }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW5wdXQtaXRlbS9jdXN0b20taW5wdXQvY3VzdG9tLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBR04saUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQ7SUE4RkUsOEJBQW9CLElBQWdCLEVBQVUsbUJBQXVDLEVBQVUsT0FBZTtRQUE5RyxpQkFBa0g7UUFBOUYsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBdkY5RyxzQkFBaUIsR0FBVyxvQkFBb0IsQ0FBQztRQUVqRCxVQUFLLEdBQVksS0FBSyxDQUFDO1FBRWYsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNwQixrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUMzQixpQkFBWSxHQUFXLEVBQUUsQ0FBQztRQUUxQixjQUFTLEdBQVksSUFBSSxDQUFDO1FBQzFCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQWtFbkMsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXRELFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVwRCxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHckQscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBYWpDLGVBQVU7OztRQUFHO1lBQ1gsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O2dCQUNwQixLQUFLLEdB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O0lBQ2xDLG1EQUFvQzs7Ozs7SUFDcEMsMENBQTJCOztJQThEM0Isd0NBQ3NEOztJQUN0RCxzQ0FDb0Q7O0lBQ3BELHVDQUNxRDs7SUFFckQsZ0RBQ2lDOztJQUNqQyxvREFDOEI7O0lBVzlCLDBDQVNDOztJQUVELHNDQThDQzs7SUFFRCxrREFFQzs7SUFFRCwrQ0FFQzs7SUFFRCwyQ0FLQzs7SUFFRCw0Q0FRQzs7SUFFRCwrQ0FNQzs7SUFFRCwrQ0FFQzs7SUFFRCwrQ0ErQkM7Ozs7O0lBeElXLG9DQUF3Qjs7Ozs7SUFBRSxtREFBK0M7Ozs7O0lBQUUsdUNBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSG9zdEJpbmRpbmcsXG4gIE5nWm9uZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEN1c3RvbUlucHV0U2VydmljZSB9IGZyb20gJy4vY3VzdG9tLWlucHV0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDdXN0b21JbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20taW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtDdXN0b21JbnB1dFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbUlucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBrZXlib2FyZFByZWZpeENsczogc3RyaW5nID0gJ2FtLW51bWJlci1rZXlib2FyZCc7XG4gIGZha2VJbnB1dENsczogb2JqZWN0O1xuICBmb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9tYXhMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zZXRGb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9wcmV2ZW50S2V5Ym9hcmQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX21vbmV5S2V5Ym9hcmRBbGlnbjogc3RyaW5nO1xuICBwcml2YXRlIF9mb250Q29sb3I6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHY6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgfHwgdiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuX21heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX21heExlbmd0aCA+PSAwKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHYudG9TdHJpbmcoKS5zdWJzdHIoMCwgdGhpcy5fbWF4TGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2LnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBkZWZhdWx0VmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICghdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBtYXhMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heExlbmd0aCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcbiAgfVxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGVkaXRhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZWRpdGFibGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBmb250Q29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZvbnRDb2xvcjtcbiAgfVxuICBzZXQgZm9udENvbG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9mb250Q29sb3IgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbW9uZXlLZXlib2FyZEFsaWduKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9tb25leUtleWJvYXJkQWxpZ24gPSB2YWx1ZTtcbiAgICB0aGlzLnNldENvbnRhaW5lckNscygpO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzZXRGb2N1cyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2V0Rm9jdXMgPSB2YWx1ZS5mb2N1cztcbiAgICAgIGlmICh0aGlzLl9zZXRGb2N1cykge1xuICAgICAgICB0aGlzLmlucHV0Rm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25CbHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25Gb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZha2UtaW5wdXQtY29udGFpbmVyJylcbiAgY2xzRmFrZUNvbnRhaW5lcjogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmFrZS1pbnB1dC1jb250YWluZXItbGVmdCcpXG4gIGNsc0Zha2VDb250YWluZXJMZWZ0OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBfY3VzdG9tSW5wdXRTZXJ2aWNlOiBDdXN0b21JbnB1dFNlcnZpY2UsIHByaXZhdGUgX25nWm9uZTogTmdab25lKSB7fVxuXG4gIG9uRmFrZUlucHV0Q2xpY2soKSB7XG4gICAgaWYgKHRoaXMuX3ByZXZlbnRLZXlib2FyZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlucHV0Rm9jdXMoKTtcbiAgfVxuXG4gIGlucHV0Rm9jdXMgPSAoKSA9PiB7XG4gICAgdGhpcy5yZW1vdmVCbHVyTGlzdGVuZXIoKTtcbiAgICBjb25zdCBmb2N1cyA9IHRoaXMuZm9jdXM7XG4gICAgaWYgKCFmb2N1cyB8fCB0aGlzLl9zZXRGb2N1cykge1xuICAgICAgdGhpcy5vbklucHV0Rm9jdXMoKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmFkZEJsdXJMaXN0ZW5lcigpO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIGRvQmx1ciA9IGV2ID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgIC8vIOeCueWHu+aYr+WQpuaYr+e7hOS7tuacrOi6q1xuICAgIGxldCBwYXJlbnRGb3VuZCA9IGZhbHNlO1xuICAgIC8vIOeCueWHu+ebruagh+aYr+WQpuaYr2N1c3RvbS1pbnB1dFxuICAgIGxldCBpc0lucHV0ID0gZmFsc2U7XG4gICAgLy8g54K55Ye755uu5qCH5piv5ZCm5pivY3VzdG9tLWtleWJvYXJkXG4gICAgbGV0IGlzS2V5Ym9hcmQgPSBmYWxzZTtcbiAgICBsZXQgaXNDbGVhciA9IGZhbHNlO1xuICAgIGxldCB0YXJnZXQgPSBldi50YXJnZXQ7XG4gICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQgIT09IG51bGwgJiYgIXBhcmVudEZvdW5kKSB7XG4gICAgICBpZiAodGFyZ2V0ID09PSB0aGlzLl9yZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBwYXJlbnRGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LmxvY2FsTmFtZSA9PT0gJ2N1c3RvbWlucHV0Jykge1xuICAgICAgICBpc0lucHV0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQubG9jYWxOYW1lID09PSAnY3VzdG9ta2V5Ym9hcmQnKSB7XG4gICAgICAgIGlzS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRhcmdldC5jbGFzc05hbWUuaW5kZXhPZignYW0taW5wdXQtY2xlYXInKSA+PSAwKSB7XG4gICAgICAgIGlzQ2xlYXIgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICAgIC8vIOW9k+eCueWHu+ebruagh+aYr+acrOi6q+eahOaXtuWAme+8jOiOt+WPlueEpueCueOAgeS4jemakOiXj2tleWJvYXJkXG4gICAgLy8g5b2T54K55Ye755uu5qCH5LiN5piv5pys6Lqr5L2G5piv5YW25LuW55qEY3VzdG9tLWlucHV05pe277yM5aSx5Y6754Sm54K544CB5LiN6ZqQ6JePa2V5Ym9hcmRcbiAgICAvLyDlvZPngrnlh7vnm67moIfmmK9rZXlib2FyZOaXtu+8jOS4jeWkseWOu+eEpueCue+8jOS4jemakOiXj2tleWJvYXJkXG4gICAgaWYgKHBhcmVudEZvdW5kKSB7XG4gICAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGlzSW5wdXQpIHtcbiAgICAgIHRoaXMuX3NldEZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9uQmx1ci5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9jdXMgJiYgaXNLZXlib2FyZCkge1xuICAgICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgICB0aGlzLm9uS2V5Ym9hcmRDbGljayhDdXN0b21JbnB1dFNlcnZpY2UuY2xpY2tWYWx1ZSk7XG4gICAgfVxuICAgIGlmICghcGFyZW50Rm91bmQgJiYgIWlzSW5wdXQgJiYgIWlzS2V5Ym9hcmQgJiYgIWlzQ2xlYXIgJiYgIXRoaXMuX3NldEZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgICB0aGlzLl9zZXRGb2N1cyA9IGZhbHNlO1xuICAgICAgdGhpcy5vbkJsdXIuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgICBDdXN0b21JbnB1dFNlcnZpY2UuaGlkZUtleWJvYXJkKCk7XG4gICAgfVxuICAgIHRoaXMuc2V0RmFrZUlucHV0Q2xzKCk7XG4gIH1cblxuICByZW1vdmVCbHVyTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmRvQmx1ciwgZmFsc2UpO1xuICB9XG5cbiAgYWRkQmx1ckxpc3RlbmVyID0gKCkgPT4ge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kb0JsdXIsIGZhbHNlKTtcbiAgfVxuXG4gIG9uSW5wdXRCbHVyID0gdmFsdWUgPT4ge1xuICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLnNldEZha2VJbnB1dENscygpO1xuICAgIHRoaXMub25CbHVyLmVtaXQodGhpcy5fdmFsdWUpO1xuICAgIEN1c3RvbUlucHV0U2VydmljZS5oaWRlS2V5Ym9hcmQoKTtcbiAgfVxuXG4gIG9uSW5wdXRGb2N1cyA9ICgpID0+IHtcbiAgICB0aGlzLm9uRm9jdXMuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5fc2V0Rm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLnNldEZha2VJbnB1dENscygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgQ3VzdG9tSW5wdXRTZXJ2aWNlLnNob3dLZXlib2FyZCgpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBzZXRGYWtlSW5wdXRDbHMgPSAoKSA9PiB7XG4gICAgdGhpcy5mYWtlSW5wdXRDbHMgPSB7XG4gICAgICBbYGZha2UtaW5wdXRgXTogdHJ1ZSxcbiAgICAgIFsnZmFrZS1pbnB1dC1kaXNhYmxlZCddOiB0aGlzLl9kaXNhYmxlZCxcbiAgICAgIFsnZm9jdXMnXTogdGhpcy5mb2N1c1xuICAgIH07XG4gIH1cblxuICBzZXRDb250YWluZXJDbHMgPSAoKSA9PiB7XG4gICAgdGhpcy5jbHNGYWtlQ29udGFpbmVyTGVmdCA9IHRoaXMuX21vbmV5S2V5Ym9hcmRBbGlnbiA9PT0gJ2xlZnQnO1xuICB9XG5cbiAgb25LZXlib2FyZENsaWNrID0ga2V5Ym9hcmRJdGVtVmFsdWUgPT4ge1xuICAgIGxldCB2YWx1ZUFmdGVyQ2hhbmdlO1xuICAgIC8vIOWIoOmZpOmUrlxuICAgIGlmIChrZXlib2FyZEl0ZW1WYWx1ZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIHZhbHVlQWZ0ZXJDaGFuZ2UgPSB0aGlzLl92YWx1ZS5zdWJzdHJpbmcoMCwgdGhpcy5fdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodmFsdWVBZnRlckNoYW5nZSk7XG4gICAgICAvLyDnoa7orqTplK5cbiAgICB9IGVsc2UgaWYgKGtleWJvYXJkSXRlbVZhbHVlID09PSAnY29uZmlybScpIHtcbiAgICAgIHZhbHVlQWZ0ZXJDaGFuZ2UgPSB0aGlzLl92YWx1ZTtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZUFmdGVyQ2hhbmdlKTtcbiAgICAgIHRoaXMub25JbnB1dEJsdXIodGhpcy5fdmFsdWUpO1xuICAgICAgLy8g5pS26LW36ZSuXG4gICAgfSBlbHNlIGlmIChrZXlib2FyZEl0ZW1WYWx1ZSA9PT0gJ2hpZGUnKSB7XG4gICAgICB2YWx1ZUFmdGVyQ2hhbmdlID0gdGhpcy5fdmFsdWU7XG4gICAgICB0aGlzLm9uSW5wdXRCbHVyKHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX21heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICt0aGlzLl9tYXhMZW5ndGggPj0gMCAmJlxuICAgICAgICAodGhpcy5fdmFsdWUgKyBrZXlib2FyZEl0ZW1WYWx1ZSkubGVuZ3RoID4gdGhpcy5fbWF4TGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgdmFsdWVBZnRlckNoYW5nZSA9ICh0aGlzLl92YWx1ZSArIGtleWJvYXJkSXRlbVZhbHVlKS5zdWJzdHIoMCwgdGhpcy5fbWF4TGVuZ3RoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHZhbHVlQWZ0ZXJDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVBZnRlckNoYW5nZSA9IHRoaXMuX3ZhbHVlICsga2V5Ym9hcmRJdGVtVmFsdWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZUFmdGVyQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlQWZ0ZXJDaGFuZ2U7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9wcmV2ZW50S2V5Ym9hcmQgPSB0aGlzLl9kaXNhYmxlZCB8fCAhdGhpcy5fZWRpdGFibGU7XG4gICAgdGhpcy5zZXRGYWtlSW5wdXRDbHMoKTtcbiAgICB0aGlzLnNldENvbnRhaW5lckNscygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmVCbHVyTGlzdGVuZXIoKTtcbiAgICBpZiAoQ3VzdG9tSW5wdXRTZXJ2aWNlKSB7XG4gICAgICBDdXN0b21JbnB1dFNlcnZpY2UuaGlkZUtleWJvYXJkKCk7XG4gICAgICBDdXN0b21JbnB1dFNlcnZpY2UuY29tcFJlZiA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3RoaXMua2V5Ym9hcmRQcmVmaXhDbHN9LWNvbnRhaW5lcmApO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==