ngx-pluto
Version:
302 lines • 24.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, Input, forwardRef, HostListener } from "@angular/core";
import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from "@angular/forms";
/**
* 多行文本输入框
*
* <example-url>https://stackblitz.com/edit/np-textarea-example?embed=1&file=src/app/app.component.html</example-url>
*/
export class NpTextarea {
constructor() {
this.navigationKeys = [
'Backspace',
'Delete',
'Tab',
'Escape',
'Enter',
'Home',
'End',
'ArrowLeft',
'ArrowRight',
'Clear',
'Copy',
'Paste'
];
this.currentLen = 0;
this.chineseReg = /[^\x00-\xff]/g;
/**
* 占位符
*/
this.placeholder = '';
/**
* 最大长度
*
* Default -1 indicate that the length of input is not limited
* The max of maxLen is 999
*/
this.maxLen = -1;
/**
* 只允许填写数字
*/
this.numberOnly = false;
this.emitChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @return {?}
*/
ngAfterViewInit() {
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes) {
}
}
/**
* @param {?} event
* @return {?}
*/
onChange(event) {
/** @type {?} */
let newValue = event.target.value;
this.emitChange(newValue);
}
/**
* @param {?} obj
* @return {?}
*/
writeValue(obj) {
if (obj || obj === '') {
this.val = obj;
if (this.maxLen > -1) {
this.calculateCurrentLen();
}
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.emitChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) { }
/**
* @param {?} control
* @return {?}
*/
validate(control) {
// TODO: customize validation
return null;
}
/**
* @param {?} e
* @return {?}
*/
onKeyup(e) {
if (this.maxLen === -1) {
return;
}
if (this.maxLen > -1) {
this.calculateCurrentLen();
// Hack: when typing chinese character, input control will not prevent the character typing
/** @type {?} */
let chineseCharLen = this.val ? (this.val.match(this.chineseReg) || []) : [];
if (chineseCharLen.length > 0) {
this.val = this.val.substring(0, this.maxLen);
}
}
if (this.numberOnly) {
this.val = this.val ? this.val.replace(this.chineseReg, '') : '';
}
}
/**
* @private
* @return {?}
*/
isTriggerKeyEvents() {
return this.maxLen !== -1 || this.numberOnly;
}
/**
* @param {?} e
* @return {?}
*/
onKeyDown(e) {
if (!this.isTriggerKeyEvents()) {
return;
}
if (this.navigationKeys.indexOf(e.key) > -1 || // Allow: navigation keys: backspace, delete, arrows etc.
(e.key === 'a' && e.ctrlKey === true) || // Allow: Ctrl+A
(e.key === 'c' && e.ctrlKey === true) || // Allow: Ctrl+C
(e.key === 'v' && e.ctrlKey === true) || // Allow: Ctrl+V
(e.key === 'x' && e.ctrlKey === true) || // Allow: Ctrl+X
(e.key === 'a' && e.metaKey === true) || // Allow: Cmd+A (Mac)
(e.key === 'c' && e.metaKey === true) || // Allow: Cmd+C (Mac)
(e.key === 'v' && e.metaKey === true) || // Allow: Cmd+V (Mac)
(e.key === 'x' && e.metaKey === true) // Allow: Cmd+X (Mac)
) {
return;
}
if (this.maxLen > -1) {
/** @type {?} */
let hightlightText = window.getSelection() + '';
if (this.val && this.val.length >= this.maxLen && hightlightText === '') {
e.preventDefault();
}
}
if (this.numberOnly) {
if (isNaN(Number(e.key))) {
e.preventDefault();
}
}
}
/**
* @param {?} event
* @return {?}
*/
onPaste(event) {
if (!this.isTriggerKeyEvents()) {
return;
}
event.preventDefault();
/** @type {?} */
let currentVal = this.val;
if (this.maxLen > -1 || this.numberOnly) {
/** @type {?} */
let clipboardData = event.clipboardData.getData('text/plain');
if (this.numberOnly) {
/** @type {?} */
let pastedInput = clipboardData.replace(/\D/g, '');
this.val = currentVal + pastedInput;
}
if (this.maxLen > -1) {
/** @type {?} */
let pastedInput = clipboardData.substring(0, this.maxLen);
this.val = currentVal + pastedInput;
}
}
}
/**
* @private
* @return {?}
*/
calculateCurrentLen() {
this.currentLen = this.val ? this.val.length : 0;
this.currentLen = this.currentLen > this.maxLen ? this.maxLen : this.currentLen;
}
}
NpTextarea.decorators = [
{ type: Component, args: [{
selector: `np-textarea`,
template: "<div id=\"np-textarea-wrapper\" class=\"np-textarea-wrapper np-row\">\r\n <div class=\"np-column np-lbl-container\" *ngIf=\"label\">\r\n <label for=\"np-textarea\" class=\"np-textarea-lbl\">\r\n <span class=\"form-required\" *ngIf=\"isRequired\">*</span>\r\n {{ label }}\r\n </label>\r\n </div>\r\n <div class=\"np-column np-textarea-container\">\r\n <textarea class=\"np-textarea\" id=\"np-textarea\" [(ngModel)]=\"val\" [placeholder]=\"placeholder\" [attr.disabled]=\"isDisabled ? '' : null\"\r\n [class.disabled]=\"isDisabled\" (change)=\"onChange($event)\" (keyup)=\"onChange($event)\" cols=\"30\" rows=\"10\" >\r\n </textarea>\r\n <span class=\"error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n <div class=\"np-len\" *ngIf=\"maxLen > -1 && maxLen < 1000\">\r\n <span class=\"cur-length\">{{ currentLen }}</span> / <span>{{ maxLen }}</span>\r\n </div>\r\n </div>\r\n</div>\r\n",
encapsulation: ViewEncapsulation.None,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => NpTextarea)),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef((/**
* @return {?}
*/
() => NpTextarea)),
multi: true,
}
],
styles: [".flex-wrap{display:flex}.col-flex{flex-direction:column}.row-flex{flex-direction:row}.middle-flex{justify-content:center;align-items:center}.np-row{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.np-column{display:flex;flex-direction:column;flex-basis:100%;flex:1}.backdrop-transparent{opacity:0}#np-textarea-wrapper{align-items:baseline}#np-textarea-wrapper .np-lbl-container{flex:0}#np-textarea-wrapper .np-lbl-container .np-textarea-lbl{width:80px;margin-right:20px;text-align:right;font-size:13px;font-weight:700}#np-textarea-wrapper .np-textarea-container{position:relative}#np-textarea-wrapper .np-textarea-container .np-textarea{box-sizing:border-box;background-image:none;border-radius:1px;display:inline-block;padding:5px 10px;margin:0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%;height:83px;line-height:20px}#np-textarea-wrapper .np-textarea-container .np-textarea:focus{outline:0!important;outline-offset:unset;border-width:1px}#np-textarea-wrapper .np-textarea-container .error-message{display:block;font-size:10px;margin:5px}#np-textarea-wrapper .np-textarea-container .np-len{position:absolute;right:5px;height:34px;line-height:34px;font-size:14px;z-index:1000}"]
}] }
];
/** @nocollapse */
NpTextarea.ctorParameters = () => [];
NpTextarea.propDecorators = {
label: [{ type: Input }],
isRequired: [{ type: Input }],
placeholder: [{ type: Input }],
errorMessage: [{ type: Input }],
isDisabled: [{ type: Input }],
maxLen: [{ type: Input }],
numberOnly: [{ type: Input }],
onKeyup: [{ type: HostListener, args: ['keyup', ['$event'],] }],
onKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }],
onPaste: [{ type: HostListener, args: ['paste', ['$event'],] }]
};
if (false) {
/** @type {?} */
NpTextarea.prototype.val;
/**
* @type {?}
* @private
*/
NpTextarea.prototype.navigationKeys;
/** @type {?} */
NpTextarea.prototype.currentLen;
/** @type {?} */
NpTextarea.prototype.chineseReg;
/**
* 标签
* @type {?}
*/
NpTextarea.prototype.label;
/**
* 是否必填 - 必填则有红色*号在标签前面;否则没有
* @type {?}
*/
NpTextarea.prototype.isRequired;
/**
* 占位符
* @type {?}
*/
NpTextarea.prototype.placeholder;
/**
* 错误信息 - 将以红色字体显示在输入框下方
* @type {?}
*/
NpTextarea.prototype.errorMessage;
/**
* 是否禁用
* @type {?}
*/
NpTextarea.prototype.isDisabled;
/**
* 最大长度
*
* Default -1 indicate that the length of input is not limited
* The max of maxLen is 999
* @type {?}
*/
NpTextarea.prototype.maxLen;
/**
* 只允许填写数字
* @type {?}
*/
NpTextarea.prototype.numberOnly;
/**
* @type {?}
* @private
*/
NpTextarea.prototype.emitChange;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvdGV4dGFyZWEvdGV4dGFyZWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQTJCLEtBQUssRUFBVSxVQUFVLEVBQStDLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFzRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUF5QnRJLE1BQU0sT0FBTyxVQUFVO0lBMkNyQjtRQXZDUSxtQkFBYyxHQUFHO1lBQ3ZCLFdBQVc7WUFDWCxRQUFRO1lBQ1IsS0FBSztZQUNMLFFBQVE7WUFDUixPQUFPO1lBQ1AsTUFBTTtZQUNOLEtBQUs7WUFDTCxXQUFXO1lBQ1gsWUFBWTtZQUNaLE9BQU87WUFDUCxNQUFNO1lBQ04sT0FBTztTQUNSLENBQUM7UUFDRixlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLGVBQVUsR0FBRyxlQUFlLENBQUM7Ozs7UUFPcEIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7Ozs7Ozs7UUFZekIsV0FBTSxHQUFXLENBQUMsQ0FBQyxDQUFDOzs7O1FBRXBCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDN0IsZUFBVTs7OztRQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUM7SUFFckIsQ0FBQzs7OztJQUVqQixRQUFRO0lBRVIsQ0FBQzs7OztJQUVELGVBQWU7SUFDZixDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sRUFBRTtTQUVaO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxRQUFRLENBQUMsS0FBVTs7WUFDYixRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFHNUIsQ0FBQzs7Ozs7SUFFRCxV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TCxLQUFLO3NCQTZDTCxZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO3dCQXlCaEMsWUFBWSxTQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztzQkFrQ2xDLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7SUE3SWpDLHlCQUFZOzs7OztJQUNaLG9DQWFFOztJQUNGLGdDQUF1Qjs7SUFDdkIsZ0NBQTZCOzs7OztJQUc3QiwyQkFBdUI7Ozs7O0lBRXZCLGdDQUE2Qjs7Ozs7SUFFN0IsaUNBQWtDOzs7OztJQUVsQyxrQ0FBOEI7Ozs7O0lBRTlCLGdDQUE2Qjs7Ozs7Ozs7SUFRN0IsNEJBQTZCOzs7OztJQUU3QixnQ0FBcUM7Ozs7O0lBQ3JDLGdDQUFxQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBJbnB1dCwgT25Jbml0LCBmb3J3YXJkUmVmLCBDaGFuZ2VEZXRlY3RvclJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBIb3N0TGlzdGVuZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgTkdfVkFMSURBVE9SUywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgVmFsaWRhdGlvbkVycm9ycywgQWJzdHJhY3RDb250cm9sIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vKipcclxuICog5aSa6KGM5paH5pys6L6T5YWl5qGGXHJcbiAqIFxyXG4gKiA8ZXhhbXBsZS11cmw+aHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L25wLXRleHRhcmVhLWV4YW1wbGU/ZW1iZWQ9MSZmaWxlPXNyYy9hcHAvYXBwLmNvbXBvbmVudC5odG1sPC9leGFtcGxlLXVybD5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtdGV4dGFyZWFgLFxyXG4gIHRlbXBsYXRlVXJsOiAndGV4dGFyZWEuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ3RleHRhcmVhLnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBUZXh0YXJlYSksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBUZXh0YXJlYSksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfV1cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOcFRleHRhcmVhIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xyXG5cclxuXHJcbiAgdmFsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uS2V5cyA9IFtcclxuICAgICdCYWNrc3BhY2UnLFxyXG4gICAgJ0RlbGV0ZScsXHJcbiAgICAnVGFiJyxcclxuICAgICdFc2NhcGUnLFxyXG4gICAgJ0VudGVyJyxcclxuICAgICdIb21lJyxcclxuICAgICdFbmQnLFxyXG4gICAgJ0Fycm93TGVmdCcsXHJcbiAgICAnQXJyb3dSaWdodCcsXHJcbiAgICAnQ2xlYXInLFxyXG4gICAgJ0NvcHknLFxyXG4gICAgJ1Bhc3RlJ1xyXG4gIF07XHJcbiAgY3VycmVudExlbjogbnVtYmVyID0gMDtcclxuICBjaGluZXNlUmVnID0gL1teXFx4MDAtXFx4ZmZdL2c7XHJcblxyXG4gIC8qKuagh+etviAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgLyoq5piv5ZCm5b+F5aGrIC0g5b+F5aGr5YiZ5pyJ57qi6ImyKuWPt+WcqOagh+etvuWJjemdou+8m+WQpuWImeayoeaciSAqL1xyXG4gIEBJbnB1dCgpIGlzUmVxdWlyZWQ6IGJvb2xlYW47XHJcbiAgLyoq5Y2g5L2N56ymICovXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG4gIC8qKumUmeivr+S/oeaBryAtIOWwhuS7pee6ouiJsuWtl+S9k+aYvuekuuWcqOi+k+WFpeahhuS4i+aWuSAqL1xyXG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gIC8qKuaYr+WQpuemgeeUqCAqL1xyXG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIOacgOWkp+mVv+W6plxyXG4gICAqIFxyXG4gICAqIERlZmF1bHQgLTEgaW5kaWNhdGUgdGhhdCB0aGUgbGVuZ3RoIG9mIGlucHV0IGlzIG5vdCBsaW1pdGVkXHJcbiAgICogVGhlIG1heCBvZiBtYXhMZW4gaXMgOTk5XHJcbiAgICovXHJcbiAgQElucHV0KCkgbWF4TGVuOiBudW1iZXIgPSAtMTtcclxuICAvKirlj6rlhYHorrjloavlhpnmlbDlrZcgKi9cclxuICBASW5wdXQoKSBudW1iZXJPbmx5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcykge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCBuZXdWYWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShuZXdWYWx1ZSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChvYmogfHwgb2JqID09PSAnJykge1xyXG4gICAgICB0aGlzLnZhbCA9IG9iajtcclxuICAgICAgaWYgKHRoaXMubWF4TGVuID4gLTEpIHtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUN1cnJlbnRMZW4oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgfVxyXG5cclxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHtcclxuICAgIC8vIFRPRE86IGN1c3RvbWl6ZSB2YWxpZGF0aW9uXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleXVwJywgWyckZXZlbnQnXSlcclxuICBvbktleXVwKGU6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLm1heExlbiA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1heExlbiA+IC0xKSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlQ3VycmVudExlbigpO1xyXG5cclxuICAgICAgLy8gSGFjazogd2hlbiB0eXBpbmcgY2hpbmVzZSBjaGFyYWN0ZXIsIGlucHV0IGNvbnRyb2wgd2lsbCBub3QgcHJldmVudCB0aGUgY2hhcmFjdGVyIHR5cGluZ1xyXG4gICAgICBsZXQgY2hpbmVzZUNoYXJMZW4gPSB0aGlzLnZhbCA/ICh0aGlzLnZhbC5tYXRjaCh0aGlzLmNoaW5lc2VSZWcpIHx8IFtdKSA6IFtdO1xyXG4gICAgICBpZiAoY2hpbmVzZUNoYXJMZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc3Vic3RyaW5nKDAsIHRoaXMubWF4TGVuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm51bWJlck9ubHkpIHtcclxuICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbCA/IHRoaXMudmFsLnJlcGxhY2UodGhpcy5jaGluZXNlUmVnLCAnJykgOiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNUcmlnZ2VyS2V5RXZlbnRzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWF4TGVuICE9PSAtMSB8fCB0aGlzLm51bWJlck9ubHk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbktleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmlzVHJpZ2dlcktleUV2ZW50cygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbktleXMuaW5kZXhPZihlLmtleSkgPiAtMSB8fCAgLy8gQWxsb3c6IG5hdmlnYXRpb24ga2V5czogYmFja3NwYWNlLCBkZWxldGUsIGFycm93cyBldGMuXHJcbiAgICAgIChlLmtleSA9PT0gJ2EnICYmIGUuY3RybEtleSA9PT0gdHJ1ZSkgfHwgICAgLy8gQWxsb3c6IEN0cmwrQVxyXG4gICAgICAoZS5rZXkgPT09ICdjJyAmJiBlLmN0cmxLZXkgPT09IHRydWUpIHx8ICAgIC8vIEFsbG93OiBDdHJsK0NcclxuICAgICAgKGUua2V5ID09PSAndicgJiYgZS5jdHJsS2V5ID09PSB0cnVlKSB8fCAgICAvLyBBbGxvdzogQ3RybCtWXHJcbiAgICAgIChlLmtleSA9PT0gJ3gnICYmIGUuY3RybEtleSA9PT0gdHJ1ZSkgfHwgICAgLy8gQWxsb3c6IEN0cmwrWFxyXG4gICAgICAoZS5rZXkgPT09ICdhJyAmJiBlLm1ldGFLZXkgPT09IHRydWUpIHx8ICAgIC8vIEFsbG93OiBDbWQrQSAoTWFjKVxyXG4gICAgICAoZS5rZXkgPT09ICdjJyAmJiBlLm1ldGFLZXkgPT09IHRydWUpIHx8ICAgIC8vIEFsbG93OiBDbWQrQyAoTWFjKVxyXG4gICAgICAoZS5rZXkgPT09ICd2JyAmJiBlLm1ldGFLZXkgPT09IHRydWUpIHx8ICAgIC8vIEFsbG93OiBDbWQrViAoTWFjKVxyXG4gICAgICAoZS5rZXkgPT09ICd4JyAmJiBlLm1ldGFLZXkgPT09IHRydWUpICAgICAgIC8vIEFsbG93OiBDbWQrWCAoTWFjKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5tYXhMZW4gPiAtMSkge1xyXG4gICAgICBsZXQgaGlnaHRsaWdodFRleHQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkgKyAnJztcclxuICAgICAgaWYgKHRoaXMudmFsICYmIHRoaXMudmFsLmxlbmd0aCA+PSB0aGlzLm1heExlbiAmJiBoaWdodGxpZ2h0VGV4dCA9PT0gJycpIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5udW1iZXJPbmx5KSB7XHJcbiAgICAgIGlmIChpc05hTihOdW1iZXIoZS5rZXkpKSkge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigncGFzdGUnLCBbJyRldmVudCddKVxyXG4gIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuaXNUcmlnZ2VyS2V5RXZlbnRzKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgbGV0IGN1cnJlbnRWYWwgPSB0aGlzLnZhbDtcclxuICAgIGlmICh0aGlzLm1heExlbiA+IC0xIHx8IHRoaXMubnVtYmVyT25seSkge1xyXG4gICAgICBsZXQgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG5cclxuICAgICAgaWYgKHRoaXMubnVtYmVyT25seSkge1xyXG4gICAgICAgIGxldCBwYXN0ZWRJbnB1dDogc3RyaW5nID0gY2xpcGJvYXJkRGF0YS5yZXBsYWNlKC9cXEQvZywgJycpOyAvLyBnZXQgYSBudW1iZXItb25seSBzdHJpbmdcclxuICAgICAgICB0aGlzLnZhbCA9IGN1cnJlbnRWYWwgKyBwYXN0ZWRJbnB1dDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMubWF4TGVuID4gLTEpIHtcclxuICAgICAgICBsZXQgcGFzdGVkSW5wdXQ6IHN0cmluZyA9IGNsaXBib2FyZERhdGEuc3Vic3RyaW5nKDAsIHRoaXMubWF4TGVuKTtcclxuICAgICAgICB0aGlzLnZhbCA9IGN1cnJlbnRWYWwgKyBwYXN0ZWRJbnB1dDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGNhbGN1bGF0ZUN1cnJlbnRMZW4oKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRMZW4gPSB0aGlzLnZhbCA/IHRoaXMudmFsLmxlbmd0aCA6IDA7XHJcbiAgICB0aGlzLmN1cnJlbnRMZW4gPSB0aGlzLmN1cnJlbnRMZW4gPiB0aGlzLm1heExlbiA/IHRoaXMubWF4TGVuIDogdGhpcy5jdXJyZW50TGVuO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbiJdfQ==