@lxlib/seed
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.1.
427 lines • 31.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: se.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __decorate, __metadata, __read, __spread } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, Host, Input, Optional, Renderer2, TemplateRef, ViewChild, ViewEncapsulation, } from '@angular/core';
import { FormControlName, NgModel, RequiredValidator } from '@angular/forms';
import { ResponsiveService } from '@lxlib/theme';
import { InputBoolean, InputNumber, isEmpty } from '@lxlib/util';
import { helpMotion } from 'ng-zorro-antd/core/animation';
import { SEContainerComponent } from './se-container.component';
/** @type {?} */
var prefixCls = "se";
/** @type {?} */
var nextUniqueId = 0;
var SEComponent = /** @class */ (function () {
function SEComponent(el, parent, rep, ren, cdr) {
this.parent = parent;
this.rep = rep;
this.ren = ren;
this.cdr = cdr;
this.clsMap = [];
this.inited = false;
this.onceFlag = false;
this.errorData = {};
this.invalid = false;
this._labelWidth = null;
this.required = false;
this.controlClass = '';
this._id = "_se-" + nextUniqueId++;
this._autoId = true;
if (parent == null) {
throw new Error("[se] must include 'se-container' component");
}
this.el = el.nativeElement;
}
Object.defineProperty(SEComponent.prototype, "error", {
set: /**
* @param {?} val
* @return {?}
*/
function (val) {
this.errorData = typeof val === 'string' || val instanceof TemplateRef ? { '': val } : val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SEComponent.prototype, "id", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._id = value;
this._autoId = false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SEComponent.prototype, "paddingValue", {
// #endregion
get:
// #endregion
/**
* @return {?}
*/
function () {
return this.parent.gutter / 2;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SEComponent.prototype, "showErr", {
get: /**
* @return {?}
*/
function () {
return this.invalid && !!this._error;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SEComponent.prototype, "compact", {
get: /**
* @return {?}
*/
function () {
return this.parent.size === 'compact';
},
enumerable: true,
configurable: true
});
Object.defineProperty(SEComponent.prototype, "ngControl", {
get: /**
* @private
* @return {?}
*/
function () {
return this.ngModel || this.formControlName;
},
enumerable: true,
configurable: true
});
/**
* @private
* @template THIS
* @this {THIS}
* @return {THIS}
*/
SEComponent.prototype.setClass = /**
* @private
* @template THIS
* @this {THIS}
* @return {THIS}
*/
function () {
var _a = (/** @type {?} */ (this)), el = _a.el, ren = _a.ren, clsMap = _a.clsMap, col = _a.col, parent = _a.parent, cdr = _a.cdr, line = _a.line, labelWidth = _a.labelWidth, rep = _a.rep;
(/** @type {?} */ (this))._labelWidth = parent.nzLayout === 'horizontal' ? (labelWidth != null ? labelWidth : parent.labelWidth) : null;
clsMap.forEach((/**
* @param {?} cls
* @return {?}
*/
function (cls) { return ren.removeClass(el, cls); }));
clsMap.length = 0;
/** @type {?} */
var repCls = parent.nzLayout === 'horizontal' ? rep.genCls(col != null ? col : parent.colInCon || parent.col) : [];
clsMap.push.apply(clsMap, __spread(["ant-form-item"], repCls, [prefixCls + "__item"]));
if (line || parent.line) {
clsMap.push(prefixCls + "__line");
}
clsMap.forEach((/**
* @param {?} cls
* @return {?}
*/
function (cls) { return ren.addClass(el, cls); }));
cdr.detectChanges();
return (/** @type {?} */ (this));
};
/**
* @private
* @return {?}
*/
SEComponent.prototype.bindModel = /**
* @private
* @return {?}
*/
function () {
var _this = this;
var _a, _b, _c;
if (!this.ngControl || this.status$)
return;
this.status$ = (/** @type {?} */ (this.ngControl.statusChanges)).subscribe((/**
* @param {?} res
* @return {?}
*/
function (res) { return _this.updateStatus(res === 'INVALID'); }));
if (this._autoId) {
/** @type {?} */
var control = (/** @type {?} */ ((_b = (_a = ((/** @type {?} */ (this.ngControl.valueAccessor)))) === null || _a === void 0 ? void 0 : _a._elementRef) === null || _b === void 0 ? void 0 : _b.nativeElement));
if (control) {
control.id = this._id;
}
}
// auto required
if (this.required !== true) {
/** @type {?} */
var rawValidators = (/** @type {?} */ ((_c = ((/** @type {?} */ (this.ngControl)))) === null || _c === void 0 ? void 0 : _c._rawValidators));
this.required = rawValidators.find((/**
* @param {?} w
* @return {?}
*/
function (w) { return w instanceof RequiredValidator; })) != null;
this.cdr.detectChanges();
}
};
/**
* @private
* @param {?} invalid
* @return {?}
*/
SEComponent.prototype.updateStatus = /**
* @private
* @param {?} invalid
* @return {?}
*/
function (invalid) {
if (this.ngControl.disabled || this.ngControl.isDisabled) {
return;
}
this.invalid = (/** @type {?} */ (((invalid && this.onceFlag) || (this.ngControl.dirty && invalid))));
/** @type {?} */
var errors = this.ngControl.errors;
if (errors != null && Object.keys(errors).length > 0) {
/** @type {?} */
var key = Object.keys(errors)[0] || '';
/** @type {?} */
var err = this.errorData[key];
this._error = err != null ? err : this.errorData[''] || '';
}
this.cdr.detectChanges();
};
/**
* @return {?}
*/
SEComponent.prototype.checkContent = /**
* @return {?}
*/
function () {
/** @type {?} */
var el = this.contentElement.nativeElement;
/** @type {?} */
var cls = prefixCls + "__item-empty";
if (isEmpty(el)) {
this.ren.addClass(el, cls);
}
else {
this.ren.removeClass(el, cls);
}
};
/**
* @return {?}
*/
SEComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
this.checkContent();
};
/**
* @return {?}
*/
SEComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.onceFlag = this.parent.firstVisual;
if (this.inited)
this.setClass().bindModel();
};
/**
* @return {?}
*/
SEComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
this.setClass().bindModel();
this.inited = true;
if (this.onceFlag) {
Promise.resolve().then((/**
* @return {?}
*/
function () {
_this.updateStatus((/** @type {?} */ (_this.ngControl.invalid)));
_this.onceFlag = false;
}));
}
};
/**
* @return {?}
*/
SEComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.status$) {
this.status$.unsubscribe();
}
};
SEComponent.decorators = [
{ type: Component, args: [{
selector: 'se',
exportAs: 'se',
template: "<div class=\"ant-form-item-label\" [class.se__nolabel]=\"!label\" [style.width.px]=\"_labelWidth\">\n <label *ngIf=\"label\" [attr.for]=\"_id\" class=\"se__label\" [ngClass]=\"{'ant-form-item-required': required}\">\n <span class=\"se__label-text\">\n <ng-container *nzStringTemplateOutlet=\"label\">{{ label }}</ng-container>\n </span>\n <span *ngIf=\"optional || optionalHelp\" class=\"se__label-optional\" [class.se__label-optional-no-text]=\"!optional\">\n <ng-container *nzStringTemplateOutlet=\"optional\">{{ optional }}</ng-container>\n <i *ngIf=\"optionalHelp\" nz-tooltip [nzTooltipTitle]=\"optionalHelp\" nz-icon nzType=\"question-circle\"></i>\n </span>\n </label>\n</div>\n<div class=\"ant-form-item-control se__control\">\n <div class=\"ant-form-item-control-input {{controlClass}}\">\n <div class=\"ant-form-item-control-input-content\" (cdkObserveContent)=\"checkContent()\" #contentElement>\n <ng-content></ng-content>\n </div>\n </div>\n <div class=\"ant-form-item-explain\" *ngIf=\"showErr && !compact\">\n <div @helpMotion>\n <ng-container *nzStringTemplateOutlet=\"_error\">{{ _error }}</ng-container>\n </div>\n </div>\n <div *ngIf=\"extra && !compact\" class=\"ant-form-item-extra\">\n <ng-container *nzStringTemplateOutlet=\"extra\">{{ extra }}</ng-container>\n </div>\n</div>\n",
host: {
'[style.padding-left.px]': 'paddingValue',
'[style.padding-right.px]': 'paddingValue',
'[class.ant-form-item-has-error]': 'showErr',
'[class.ant-form-item-with-help]': 'showErr && !compact',
},
preserveWhitespaces: false,
animations: [helpMotion],
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
SEComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: SEContainerComponent, decorators: [{ type: Optional }, { type: Host }] },
{ type: ResponsiveService },
{ type: Renderer2 },
{ type: ChangeDetectorRef }
]; };
SEComponent.propDecorators = {
ngModel: [{ type: ContentChild, args: [NgModel, { static: true },] }],
formControlName: [{ type: ContentChild, args: [FormControlName, { static: true },] }],
contentElement: [{ type: ViewChild, args: ['contentElement', { static: true },] }],
optional: [{ type: Input }],
optionalHelp: [{ type: Input }],
error: [{ type: Input }],
extra: [{ type: Input }],
label: [{ type: Input }],
col: [{ type: Input }],
required: [{ type: Input }],
controlClass: [{ type: Input }],
line: [{ type: Input }],
labelWidth: [{ type: Input }],
id: [{ type: Input }]
};
__decorate([
InputNumber(null),
__metadata("design:type", Number)
], SEComponent.prototype, "col", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], SEComponent.prototype, "required", void 0);
__decorate([
InputBoolean(null),
__metadata("design:type", Boolean)
], SEComponent.prototype, "line", void 0);
__decorate([
InputNumber(null),
__metadata("design:type", Number)
], SEComponent.prototype, "labelWidth", void 0);
return SEComponent;
}());
export { SEComponent };
if (false) {
/**
* @type {?}
* @private
*/
SEComponent.prototype.el;
/**
* @type {?}
* @private
*/
SEComponent.prototype.status$;
/**
* @type {?}
* @private
*/
SEComponent.prototype.ngModel;
/**
* @type {?}
* @private
*/
SEComponent.prototype.formControlName;
/**
* @type {?}
* @private
*/
SEComponent.prototype.contentElement;
/**
* @type {?}
* @private
*/
SEComponent.prototype.clsMap;
/**
* @type {?}
* @private
*/
SEComponent.prototype.inited;
/**
* @type {?}
* @private
*/
SEComponent.prototype.onceFlag;
/**
* @type {?}
* @private
*/
SEComponent.prototype.errorData;
/** @type {?} */
SEComponent.prototype.invalid;
/** @type {?} */
SEComponent.prototype._labelWidth;
/** @type {?} */
SEComponent.prototype._error;
/** @type {?} */
SEComponent.prototype.optional;
/** @type {?} */
SEComponent.prototype.optionalHelp;
/** @type {?} */
SEComponent.prototype.extra;
/** @type {?} */
SEComponent.prototype.label;
/** @type {?} */
SEComponent.prototype.col;
/** @type {?} */
SEComponent.prototype.required;
/** @type {?} */
SEComponent.prototype.controlClass;
/** @type {?} */
SEComponent.prototype.line;
/** @type {?} */
SEComponent.prototype.labelWidth;
/** @type {?} */
SEComponent.prototype._id;
/** @type {?} */
SEComponent.prototype._autoId;
/**
* @type {?}
* @private
*/
SEComponent.prototype.parent;
/**
* @type {?}
* @private
*/
SEComponent.prototype.rep;
/**
* @type {?}
* @private
*/
SEComponent.prototype.ren;
/**
* @type {?}
* @private
*/
SEComponent.prototype.cdr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGx4bGliL3NlZWQvc2UvIiwic291cmNlcyI6WyJzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsSUFBSSxFQUNKLEtBQUssRUFHTCxRQUFRLEVBQ1IsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHMUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0lBRTFELFNBQVMsR0FBRyxJQUFJOztJQUNsQixZQUFZLEdBQUcsQ0FBQztBQUVwQjtJQXlFRSxxQkFDRSxFQUFjLEVBQ2MsTUFBNEIsRUFDaEQsR0FBc0IsRUFDdEIsR0FBYyxFQUNkLEdBQXNCO1FBSEYsV0FBTSxHQUFOLE1BQU0sQ0FBc0I7UUFDaEQsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBVztRQUNkLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBeER4QixXQUFNLEdBQWEsRUFBRSxDQUFDO1FBQ3RCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGNBQVMsR0FBa0QsRUFBRSxDQUFDO1FBQ3RFLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFD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SUFDekIsZ0NBQXNFOztJQUN0RSw4QkFBZ0I7O0lBQ2hCLGtDQUFrQzs7SUFDbEMsNkJBQW1DOztJQUluQywrQkFBOEM7O0lBQzlDLG1DQUFrRDs7SUFLbEQsNEJBQTJDOztJQUMzQyw0QkFBMkM7O0lBQzNDLDBCQUF3Qzs7SUFDeEMsK0JBQTBDOztJQUMxQyxtQ0FBbUM7O0lBQ25DLDJCQUEyQzs7SUFDM0MsaUNBQStDOztJQVEvQywwQkFBOEI7O0lBQzlCLDhCQUFlOzs7OztJQXNCYiw2QkFBd0Q7Ozs7O0lBQ3hELDBCQUE4Qjs7Ozs7SUFDOUIsMEJBQXNCOzs7OztJQUN0QiwwQkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sTmFtZSwgTmdNb2RlbCwgUmVxdWlyZWRWYWxpZGF0b3IsIFZhbGlkYXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJlc3BvbnNpdmVTZXJ2aWNlIH0gZnJvbSAnQGx4bGliL3RoZW1lJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiwgSW5wdXROdW1iZXIsIGlzRW1wdHkgfSBmcm9tICdAbHhsaWIvdXRpbCc7XG5pbXBvcnQgeyBoZWxwTW90aW9uIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL2FuaW1hdGlvbic7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTRUNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vc2UtY29udGFpbmVyLmNvbXBvbmVudCc7XG5cbmNvbnN0IHByZWZpeENscyA9IGBzZWA7XG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2UnLFxuICBleHBvcnRBczogJ3NlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDoge1xuICAgICdbc3R5bGUucGFkZGluZy1sZWZ0LnB4XSc6ICdwYWRkaW5nVmFsdWUnLFxuICAgICdbc3R5bGUucGFkZGluZy1yaWdodC5weF0nOiAncGFkZGluZ1ZhbHVlJyxcbiAgICAnW2NsYXNzLmFudC1mb3JtLWl0ZW0taGFzLWVycm9yXSc6ICdzaG93RXJyJyxcbiAgICAnW2NsYXNzLmFudC1mb3JtLWl0ZW0td2l0aC1oZWxwXSc6ICdzaG93RXJyICYmICFjb21wYWN0JyxcbiAgfSxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGFuaW1hdGlvbnM6IFtoZWxwTW90aW9uXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFNFQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGVsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBzdGF0dXMkOiBTdWJzY3JpcHRpb247XG4gIEBDb250ZW50Q2hpbGQoTmdNb2RlbCwgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSByZWFkb25seSBuZ01vZGVsOiBOZ01vZGVsO1xuICBAQ29udGVudENoaWxkKEZvcm1Db250cm9sTmFtZSwgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JtQ29udHJvbE5hbWU6IEZvcm1Db250cm9sTmFtZTtcbiAgQFZpZXdDaGlsZCgnY29udGVudEVsZW1lbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHJlYWRvbmx5IGNvbnRlbnRFbGVtZW50OiBFbGVtZW50UmVmO1xuICBwcml2YXRlIGNsc01hcDogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBpbml0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvbmNlRmxhZyA9IGZhbHNlO1xuICBwcml2YXRlIGVycm9yRGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPiB9ID0ge307XG4gIGludmFsaWQgPSBmYWxzZTtcbiAgX2xhYmVsV2lkdGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBfZXJyb3I6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gIC8vICNyZWdpb24gZmllbGRzXG5cbiAgQElucHV0KCkgb3B0aW9uYWw6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKSBvcHRpb25hbEhlbHA6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKVxuICBzZXQgZXJyb3IodmFsOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPiB8IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD4gfSkge1xuICAgIHRoaXMuZXJyb3JEYXRhID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdmFsIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgPyB7ICcnOiB2YWwgfSA6IHZhbDtcbiAgfVxuICBASW5wdXQoKSBleHRyYTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgQElucHV0KCkgQElucHV0TnVtYmVyKG51bGwpIGNvbDogbnVtYmVyO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgY29udHJvbENsYXNzOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbihudWxsKSBsaW5lOiBib29sZWFuO1xuICBASW5wdXQoKSBASW5wdXROdW1iZXIobnVsbCkgbGFiZWxXaWR0aDogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgICB0aGlzLl9hdXRvSWQgPSBmYWxzZTtcbiAgfVxuXG4gIF9pZCA9IGBfc2UtJHtuZXh0VW5pcXVlSWQrK31gO1xuICBfYXV0b0lkID0gdHJ1ZTtcblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgZ2V0IHBhZGRpbmdWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5ndXR0ZXIgLyAyO1xuICB9XG5cbiAgZ2V0IHNob3dFcnIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaW52YWxpZCAmJiAhIXRoaXMuX2Vycm9yO1xuICB9XG5cbiAgZ2V0IGNvbXBhY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LnNpemUgPT09ICdjb21wYWN0JztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG5nQ29udHJvbCgpOiBOZ01vZGVsIHwgRm9ybUNvbnRyb2xOYW1lIHtcbiAgICByZXR1cm4gdGhpcy5uZ01vZGVsIHx8IHRoaXMuZm9ybUNvbnRyb2xOYW1lO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWw6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBwcml2YXRlIHBhcmVudDogU0VDb250YWluZXJDb21wb25lbnQsXG4gICAgcHJpdmF0ZSByZXA6IFJlc3BvbnNpdmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVuOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHtcbiAgICBpZiAocGFyZW50ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW3NlXSBtdXN0IGluY2x1ZGUgJ3NlLWNvbnRhaW5lcicgY29tcG9uZW50YCk7XG4gICAgfVxuICAgIHRoaXMuZWwgPSBlbC5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRDbGFzcygpOiB0aGlzIHtcbiAgICBjb25zdCB7IGVsLCByZW4sIGNsc01hcCwgY29sLCBwYXJlbnQsIGNkciwgbGluZSwgbGFiZWxXaWR0aCwgcmVwIH0gPSB0aGlzO1xuICAgIHRoaXMuX2xhYmVsV2lkdGggPSBwYXJlbnQubnpMYXlvdXQgPT09ICdob3Jpem9udGFsJyA/IChsYWJlbFdpZHRoICE9IG51bGwgPyBsYWJlbFdpZHRoIDogcGFyZW50LmxhYmVsV2lkdGgpIDogbnVsbDtcbiAgICBjbHNNYXAuZm9yRWFjaChjbHMgPT4gcmVuLnJlbW92ZUNsYXNzKGVsLCBjbHMpKTtcbiAgICBjbHNNYXAubGVuZ3RoID0gMDtcbiAgICBjb25zdCByZXBDbHMgPSBwYXJlbnQubnpMYXlvdXQgPT09ICdob3Jpem9udGFsJyA/IHJlcC5nZW5DbHMoY29sICE9IG51bGwgPyBjb2wgOiBwYXJlbnQuY29sSW5Db24gfHwgcGFyZW50LmNvbCkgOiBbXTtcbiAgICBjbHNNYXAucHVzaChgYW50LWZvcm0taXRlbWAsIC4uLnJlcENscywgYCR7cHJlZml4Q2xzfV9faXRlbWApO1xuICAgIGlmIChsaW5lIHx8IHBhcmVudC5saW5lKSB7XG4gICAgICBjbHNNYXAucHVzaChgJHtwcmVmaXhDbHN9X19saW5lYCk7XG4gICAgfVxuICAgIGNsc01hcC5mb3JFYWNoKGNscyA9PiByZW4uYWRkQ2xhc3MoZWwsIGNscykpO1xuICAgIGNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGJpbmRNb2RlbCgpIHtcbiAgICBpZiAoIXRoaXMubmdDb250cm9sIHx8IHRoaXMuc3RhdHVzJCkgcmV0dXJuO1xuXG4gICAgdGhpcy5zdGF0dXMkID0gdGhpcy5uZ0NvbnRyb2wuc3RhdHVzQ2hhbmdlcyEuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLnVwZGF0ZVN0YXR1cyhyZXMgPT09ICdJTlZBTElEJykpO1xuICAgIGlmICh0aGlzLl9hdXRvSWQpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSAodGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciBhcyBOelNhZmVBbnkpPy5fZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wuaWQgPSB0aGlzLl9pZDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYXV0byByZXF1aXJlZFxuICAgIGlmICh0aGlzLnJlcXVpcmVkICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCByYXdWYWxpZGF0b3JzID0gKHRoaXMubmdDb250cm9sIGFzIE56U2FmZUFueSk/Ll9yYXdWYWxpZGF0b3JzIGFzIEFycmF5PFZhbGlkYXRvcj47XG4gICAgICB0aGlzLnJlcXVpcmVkID0gcmF3VmFsaWRhdG9ycy5maW5kKHcgPT4gdyBpbnN0YW5jZW9mIFJlcXVpcmVkVmFsaWRhdG9yKSAhPSBudWxsO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdHVzKGludmFsaWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQgfHwgdGhpcy5uZ0NvbnRyb2wuaXNEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmludmFsaWQgPSAoKGludmFsaWQgJiYgdGhpcy5vbmNlRmxhZykgfHwgKHRoaXMubmdDb250cm9sLmRpcnR5ICYmIGludmFsaWQpKSBhcyBib29sZWFuO1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMubmdDb250cm9sLmVycm9ycztcbiAgICBpZiAoZXJyb3JzICE9IG51bGwgJiYgT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhlcnJvcnMpWzBdIHx8ICcnO1xuICAgICAgY29uc3QgZXJyID0gdGhpcy5lcnJvckRhdGFba2V5XTtcbiAgICAgIHRoaXMuX2Vycm9yID0gZXJyICE9IG51bGwgPyBlcnIgOiB0aGlzLmVycm9yRGF0YVsnJ10gfHwgJyc7XG4gICAgfVxuXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgY2hlY2tDb250ZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGNscyA9IGAke3ByZWZpeENsc31fX2l0ZW0tZW1wdHlgO1xuICAgIGlmIChpc0VtcHR5KGVsKSkge1xuICAgICAgdGhpcy5yZW4uYWRkQ2xhc3MoZWwsIGNscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVuLnJlbW92ZUNsYXNzKGVsLCBjbHMpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrQ29udGVudCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5vbmNlRmxhZyA9IHRoaXMucGFyZW50LmZpcnN0VmlzdWFsO1xuICAgIGlmICh0aGlzLmluaXRlZCkgdGhpcy5zZXRDbGFzcygpLmJpbmRNb2RlbCgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0Q2xhc3MoKS5iaW5kTW9kZWwoKTtcbiAgICB0aGlzLmluaXRlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMub25jZUZsYWcpIHtcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cyh0aGlzLm5nQ29udHJvbC5pbnZhbGlkISk7XG4gICAgICAgIHRoaXMub25jZUZsYWcgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXR1cyQpIHtcbiAgICAgIHRoaXMuc3RhdHVzJC51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxufVxuIl19