@uiowa/uiowa-account
Version:
Angular library to manage MFK and UNI Account output
183 lines • 20.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChildren, QueryList } from '@angular/core';
import { Account, ElementInputText, ElementInputHidden } from '../models';
import { InputControlService } from '../input-control.service';
import { DigitOnlyDirective } from '@uiowa/digit-only';
export class AccountInputComponent {
/**
* @param {?} inputControlService
*/
constructor(inputControlService) {
this.inputControlService = inputControlService;
this.options = [];
this.index = 0;
this.accountChange = new EventEmitter();
this.questions = [];
}
/**
* @return {?}
*/
ngOnInit() {
this.account.elements.forEach((element, loopIndex) => {
if (this.options.find(x => x.name === element.webApiProperty)) {
/** @type {?} */
const hiddenOption = this.options.find(x => x.name === element.webApiProperty);
this.questions.push(new ElementInputHidden({
value: hiddenOption.defaultValue,
label: element.display,
key: element.webApiProperty + '_' + this.index,
size: element.size,
display: hiddenOption.display,
id: element.webApiProperty + '_' + this.index
}));
}
else {
this.questions.push(new ElementInputText({
value: this.account.getElementString(loopIndex),
label: element.display,
key: element.webApiProperty + '_' + this.index,
size: element.size,
name: element.webApiProperty,
id: element.webApiProperty + '_' + this.index
}));
}
});
this.form = this.inputControlService.toFormGroup(this.questions);
this.accountString = this.parse(this.questions, this.account.delimiter);
}
/**
* @return {?}
*/
parseAccount() {
return this.parse(this.questions, this.account.delimiter);
}
/**
* @param {?} questions
* @param {?} delimeter
* @return {?}
*/
parse(questions, delimeter) {
/** @type {?} */
let accountString = '';
questions.forEach((x, index) => {
accountString += x.value;
if (this.account.showDelimeter(index, true)) {
accountString += delimeter;
}
});
return accountString;
}
/**
* @param {?} e
* @return {?}
*/
paste(e) {
/** @type {?} */
const pastedInput = e.clipboardData.getData('text/plain').trim();
e.preventDefault();
if (!pastedInput) {
return;
}
this.pasteAccount(pastedInput.split(this.account.delimiter));
this.accountChange.emit(this.parseAccount());
}
/**
* @param {?} input
* @return {?}
*/
pasteAccount(input) {
input.forEach((x, index) => {
if (index + 1 <= this.questions.length &&
!(this.questions[index].controlType === 'hidden') &&
!isNaN(+x) &&
this.questions[index].size === x.trim().length) {
this.form.controls[this.questions[index].id].patchValue(x);
}
});
}
/**
* @param {?} e
* @return {?}
*/
onKeyup(e) {
this.accountChange.emit(this.parseAccount());
if ((e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)) {
return; // only numbers can trigger auto jump feature.
}
/** @type {?} */
const currentInputId = e.target['id'];
if (this.form.controls[currentInputId].value.length === e.target['maxLength']) {
/** @type {?} */
const currentQuestionIndex = this.questions.findIndex(x => x.key === currentInputId);
for (let i = currentQuestionIndex + 1; i < this.questions.length; i++) {
if (this.questions[i].controlType === 'hidden') {
continue;
}
/** @type {?} */
const nextInput = this.questions[i];
/** @type {?} */
const nextInputField = this.formInputs.find(v => v.el.nativeElement['id'] === nextInput.key);
nextInputField.el.nativeElement.focus();
break;
}
}
}
/**
* @param {?} e
* @return {?}
*/
onKeydown(e) {
if (e.keyCode !== 9) {
return;
}
if (e.target['readOnly']) {
return;
}
while (this.form.controls[e.target['id']].value.length < e.target['maxLength']) {
this.form.controls[e.target['id']].patchValue(this.form.controls[e.target['id']].value.concat(0));
}
}
}
AccountInputComponent.decorators = [
{ type: Component, args: [{
selector: 'uiowa-account-input',
template: "<div id=\"account-container\">\n <form (ngSubmit)=\"null\" [formGroup]=\"form\">\n <div *ngFor=\"let question of questions\" class=\"account-field\" [style.width.rem]=\"question.size + 1\">\n <div [formGroup]=\"form\">\n <label [attr.for]=\"question.id\" class=\"account-field-label\">{{question.label}}</label>\n\n <div [ngSwitch]=\"question.controlType\" [ngClass]=\"{hiddenLabel: question.controlType === 'hidden'}\">\n\n <input *ngSwitchCase=\"'textbox'\" [formControlName]=\"question.key\" [id]=\"question.id\" [type]=\"question.controlType\"\n [attr.maxlength]=\"question.size\" [style.width.rem]=\"question.size+1\" [attr.maxlength]=\"question.size\"\n inputmode=\"numeric\" pattern=\"[0-9]*\" digitOnly class=\"form-control\" (keydown)=\"onKeydown($event)\" (keyup)=\"onKeyup($event)\"\n (paste)=\"paste($event)\">\n <input *ngSwitchCase=\"'hidden'\" [formControlName]=\"question.key\" [id]=\"question.id\" [type]=\"question.controlType\"\n [attr.maxlength]=\"question.size\" [style.width.rem]=\"question.size\">\n <span *ngSwitchCase=\"'hidden'\">{{question.display}}</span>\n </div>\n </div>\n </div>\n </form>\n</div>\n",
providers: [InputControlService],
styles: [":host{display:inline-flex}.account-field{display:inline-block;vertical-align:bottom;margin-right:.25rem}.account-field .form-control{padding:.375rem!important;text-align:center;font-size:1rem;font-weight:400;font-style:normal;font-variant:normal}label.account-field-label{display:block;font-size:.625rem;margin-bottom:0;text-align:center;white-space:nowrap}div.hiddenLabel{margin-top:7px;text-align:center;padding-bottom:6px}"]
}] }
];
/** @nocollapse */
AccountInputComponent.ctorParameters = () => [
{ type: InputControlService }
];
AccountInputComponent.propDecorators = {
account: [{ type: Input }],
options: [{ type: Input }],
index: [{ type: Input }],
accountChange: [{ type: Output }],
formInputs: [{ type: ViewChildren, args: [DigitOnlyDirective,] }]
};
if (false) {
/** @type {?} */
AccountInputComponent.prototype.account;
/** @type {?} */
AccountInputComponent.prototype.options;
/** @type {?} */
AccountInputComponent.prototype.index;
/** @type {?} */
AccountInputComponent.prototype.accountChange;
/** @type {?} */
AccountInputComponent.prototype.formInputs;
/** @type {?} */
AccountInputComponent.prototype.questions;
/** @type {?} */
AccountInputComponent.prototype.form;
/** @type {?} */
AccountInputComponent.prototype.accountString;
/** @type {?} */
AccountInputComponent.prototype.inputControlService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdWlvd2EvdWlvd2EtYWNjb3VudC8iLCJzb3VyY2VzIjpbImxpYi9hY2NvdW50LWlucHV0L2FjY291bnQtaW5wdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEcsT0FBTyxFQUFFLE9BQU8sRUFBaUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFRdkQsTUFBTSxPQUFPLHFCQUFxQjs7OztJQWtCaEMsWUFBb0IsbUJBQXdDO1FBQXhDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFkNUQsWUFBTyxHQUFtQixFQUFFLENBQUM7UUFFN0IsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUdWLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUszQyxjQUFTLEdBQTRCLEVBQUUsQ0FBQztJQUl1QixDQUFDOzs7O0lBRWhFLFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEVBQUU7WUFDbkQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFOztzQkFDdkQsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsY0FBYyxDQUFDO2dCQUM5RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDakIsSUFBSSxrQkFBa0IsQ0FBQztvQkFDckIsS0FBSyxFQUFFLFlBQVksQ0FBQyxZQUFZO29CQUNoQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE9BQU87b0JBQ3RCLEdBQUcsRUFBRSxPQUFPLENBQUMsY0FBYyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSztvQkFDOUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO29CQUNsQixPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU87b0JBQzdCLEVBQUUsRUFBRSxPQUFPLENBQUMsY0FBYyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSztpQkFDOUMsQ0FBQyxDQUNILENBQUM7YUFDSDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDakIsSUFBSSxnQkFBZ0IsQ0FBQztvQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO29CQUMvQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE9BQU87b0JBQ3RCLEdBQUcsRUFBRSxPQUFPLENBQUMsY0FBYyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSztvQkFDOUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO29CQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLGNBQWM7b0JBQzVCLEVBQUUsRUFBRSxPQUFPLENBQUMsY0FBYyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSztpQkFDOUMsQ0FBQyxDQUNILENBQUM7YUFDSDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7Ozs7SUFFTyxZQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUQsQ0FBQzs7Ozs7O0lBRU8sS0FBSyxDQUFDLFNBQWtDLEVBQUUsU0FBaUI7O1lBQzdELGFBQWEsR0FBRyxFQUFFO1FBQ3RCLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDN0IsYUFBYSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQzNDLGFBQWEsSUFBSSxTQUFTLENBQUM7YUFDNUI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBRUQsS0FBSyxDQUFDLENBQWlCOztjQUNmLFdBQVcsR0FBVyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFFeEUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDOzs7OztJQUVPLFlBQVksQ0FBQyxLQUFlO1FBQ2xDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDekIsSUFDRSxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTTtnQkFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxLQUFLLFFBQVEsQ0FBQztnQkFDakQsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFDOUM7Z0JBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRUQsT0FBTyxDQUFDLENBQWdCO1FBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsRUFBRTtZQUM3RSxPQUFPLENBQUMsOENBQThDO1NBQ3ZEOztjQUNLLGNBQWMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRTs7a0JBQ3ZFLG9CQUFvQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxjQUFjLENBQUM7WUFDcEYsS0FBSyxJQUFJLENBQUMsR0FBRyxvQkFBb0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFBRTtvQkFDOUMsU0FBUztpQkFDVjs7c0JBQ0ssU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDOztzQkFDN0IsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDNUYsY0FBYyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU07YUFDUDtTQUNGO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxTQUFTLENBQUMsQ0FBZ0I7UUFDeEIsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRTtZQUNuQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDeEIsT0FBTztTQUNSO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRztJQUNILENBQUM7OztZQWhJRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHFCQUFxQjtnQkFDL0Isb3VDQUE2QztnQkFFN0MsU0FBUyxFQUFFLENBQUMsbUJBQW1CLENBQUM7O2FBQ2pDOzs7O1lBUlEsbUJBQW1COzs7c0JBVXpCLEtBQUs7c0JBRUwsS0FBSztvQkFFTCxLQUFLOzRCQUdMLE1BQU07eUJBR04sWUFBWSxTQUFDLGtCQUFrQjs7OztJQVZoQyx3Q0FDaUI7O0lBQ2pCLHdDQUM2Qjs7SUFDN0Isc0NBQ1U7O0lBRVYsOENBQzJDOztJQUUzQywyQ0FDMEM7O0lBRTFDLDBDQUF3Qzs7SUFDeEMscUNBQWdCOztJQUNoQiw4Q0FBc0I7O0lBRVYsb0RBQWdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjY291bnQsIEZpZWxkT3B0aW9uLCBFbGVtZW50SW5wdXRCYXNlLCBFbGVtZW50SW5wdXRUZXh0LCBFbGVtZW50SW5wdXRIaWRkZW4gfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRDb250cm9sU2VydmljZSB9IGZyb20gJy4uL2lucHV0LWNvbnRyb2wuc2VydmljZSc7XG5pbXBvcnQgeyBEaWdpdE9ubHlEaXJlY3RpdmUgfSBmcm9tICdAdWlvd2EvZGlnaXQtb25seSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Vpb3dhLWFjY291bnQtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWNjb3VudC1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FjY291bnQtaW5wdXQuY29tcG9uZW50LmNzcyddLFxuICBwcm92aWRlcnM6IFtJbnB1dENvbnRyb2xTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBBY2NvdW50SW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBhY2NvdW50OiBBY2NvdW50O1xuICBASW5wdXQoKVxuICBvcHRpb25zPzogRmllbGRPcHRpb25bXSA9IFtdO1xuICBASW5wdXQoKVxuICBpbmRleCA9IDA7XG5cbiAgQE91dHB1dCgpXG4gIGFjY291bnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkcmVuKERpZ2l0T25seURpcmVjdGl2ZSlcbiAgZm9ybUlucHV0czogUXVlcnlMaXN0PERpZ2l0T25seURpcmVjdGl2ZT47XG5cbiAgcXVlc3Rpb25zOiBFbGVtZW50SW5wdXRCYXNlPGFueT5bXSA9IFtdO1xuICBmb3JtOiBGb3JtR3JvdXA7XG4gIGFjY291bnRTdHJpbmc6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGlucHV0Q29udHJvbFNlcnZpY2U6IElucHV0Q29udHJvbFNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5hY2NvdW50LmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGxvb3BJbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5maW5kKHggPT4geC5uYW1lID09PSBlbGVtZW50LndlYkFwaVByb3BlcnR5KSkge1xuICAgICAgICBjb25zdCBoaWRkZW5PcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZCh4ID0+IHgubmFtZSA9PT0gZWxlbWVudC53ZWJBcGlQcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMucXVlc3Rpb25zLnB1c2goXG4gICAgICAgICAgbmV3IEVsZW1lbnRJbnB1dEhpZGRlbih7XG4gICAgICAgICAgICB2YWx1ZTogaGlkZGVuT3B0aW9uLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIGxhYmVsOiBlbGVtZW50LmRpc3BsYXksXG4gICAgICAgICAgICBrZXk6IGVsZW1lbnQud2ViQXBpUHJvcGVydHkgKyAnXycgKyB0aGlzLmluZGV4LFxuICAgICAgICAgICAgc2l6ZTogZWxlbWVudC5zaXplLFxuICAgICAgICAgICAgZGlzcGxheTogaGlkZGVuT3B0aW9uLmRpc3BsYXksXG4gICAgICAgICAgICBpZDogZWxlbWVudC53ZWJBcGlQcm9wZXJ0eSArICdfJyArIHRoaXMuaW5kZXhcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbnMucHVzaChcbiAgICAgICAgICBuZXcgRWxlbWVudElucHV0VGV4dCh7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5hY2NvdW50LmdldEVsZW1lbnRTdHJpbmcobG9vcEluZGV4KSxcbiAgICAgICAgICAgIGxhYmVsOiBlbGVtZW50LmRpc3BsYXksXG4gICAgICAgICAgICBrZXk6IGVsZW1lbnQud2ViQXBpUHJvcGVydHkgKyAnXycgKyB0aGlzLmluZGV4LFxuICAgICAgICAgICAgc2l6ZTogZWxlbWVudC5zaXplLFxuICAgICAgICAgICAgbmFtZTogZWxlbWVudC53ZWJBcGlQcm9wZXJ0eSxcbiAgICAgICAgICAgIGlkOiBlbGVtZW50LndlYkFwaVByb3BlcnR5ICsgJ18nICsgdGhpcy5pbmRleFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmZvcm0gPSB0aGlzLmlucHV0Q29udHJvbFNlcnZpY2UudG9Gb3JtR3JvdXAodGhpcy5xdWVzdGlvbnMpO1xuICAgIHRoaXMuYWNjb3VudFN0cmluZyA9IHRoaXMucGFyc2UodGhpcy5xdWVzdGlvbnMsIHRoaXMuYWNjb3VudC5kZWxpbWl0ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUFjY291bnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSh0aGlzLnF1ZXN0aW9ucywgdGhpcy5hY2NvdW50LmRlbGltaXRlcik7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlKHF1ZXN0aW9uczogRWxlbWVudElucHV0QmFzZTxhbnk+W10sIGRlbGltZXRlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgYWNjb3VudFN0cmluZyA9ICcnO1xuICAgIHF1ZXN0aW9ucy5mb3JFYWNoKCh4LCBpbmRleCkgPT4ge1xuICAgICAgYWNjb3VudFN0cmluZyArPSB4LnZhbHVlO1xuICAgICAgaWYgKHRoaXMuYWNjb3VudC5zaG93RGVsaW1ldGVyKGluZGV4LCB0cnVlKSkge1xuICAgICAgICBhY2NvdW50U3RyaW5nICs9IGRlbGltZXRlcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWNjb3VudFN0cmluZztcbiAgfVxuXG4gIHBhc3RlKGU6IENsaXBib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgcGFzdGVkSW5wdXQ6IHN0cmluZyA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJykudHJpbSgpO1xuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmICghcGFzdGVkSW5wdXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXN0ZUFjY291bnQocGFzdGVkSW5wdXQuc3BsaXQodGhpcy5hY2NvdW50LmRlbGltaXRlcikpO1xuICAgIHRoaXMuYWNjb3VudENoYW5nZS5lbWl0KHRoaXMucGFyc2VBY2NvdW50KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXN0ZUFjY291bnQoaW5wdXQ6IHN0cmluZ1tdKSB7XG4gICAgaW5wdXQuZm9yRWFjaCgoeCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5kZXggKyAxIDw9IHRoaXMucXVlc3Rpb25zLmxlbmd0aCAmJlxuICAgICAgICAhKHRoaXMucXVlc3Rpb25zW2luZGV4XS5jb250cm9sVHlwZSA9PT0gJ2hpZGRlbicpICYmXG4gICAgICAgICFpc05hTigreCkgJiZcbiAgICAgICAgdGhpcy5xdWVzdGlvbnNbaW5kZXhdLnNpemUgPT09IHgudHJpbSgpLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLnF1ZXN0aW9uc1tpbmRleF0uaWRdLnBhdGNoVmFsdWUoeCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbktleXVwKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLmFjY291bnRDaGFuZ2UuZW1pdCh0aGlzLnBhcnNlQWNjb3VudCgpKTtcbiAgICBpZiAoKGUua2V5Q29kZSA8IDQ4IHx8IGUua2V5Q29kZSA+IDU3KSAmJiAoZS5rZXlDb2RlIDwgOTYgfHwgZS5rZXlDb2RlID4gMTA1KSkge1xuICAgICAgcmV0dXJuOyAvLyBvbmx5IG51bWJlcnMgY2FuIHRyaWdnZXIgYXV0byBqdW1wIGZlYXR1cmUuXG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRJbnB1dElkID0gZS50YXJnZXRbJ2lkJ107XG4gICAgaWYgKHRoaXMuZm9ybS5jb250cm9sc1tjdXJyZW50SW5wdXRJZF0udmFsdWUubGVuZ3RoID09PSBlLnRhcmdldFsnbWF4TGVuZ3RoJ10pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRRdWVzdGlvbkluZGV4ID0gdGhpcy5xdWVzdGlvbnMuZmluZEluZGV4KHggPT4geC5rZXkgPT09IGN1cnJlbnRJbnB1dElkKTtcbiAgICAgIGZvciAobGV0IGkgPSBjdXJyZW50UXVlc3Rpb25JbmRleCArIDE7IGkgPCB0aGlzLnF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbnNbaV0uY29udHJvbFR5cGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dElucHV0ID0gdGhpcy5xdWVzdGlvbnNbaV07XG4gICAgICAgIGNvbnN0IG5leHRJbnB1dEZpZWxkID0gdGhpcy5mb3JtSW5wdXRzLmZpbmQodiA9PiB2LmVsLm5hdGl2ZUVsZW1lbnRbJ2lkJ10gPT09IG5leHRJbnB1dC5rZXkpO1xuICAgICAgICBuZXh0SW5wdXRGaWVsZC5lbC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uS2V5ZG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGUua2V5Q29kZSAhPT0gOSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZS50YXJnZXRbJ3JlYWRPbmx5J10pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAodGhpcy5mb3JtLmNvbnRyb2xzW2UudGFyZ2V0WydpZCddXS52YWx1ZS5sZW5ndGggPCBlLnRhcmdldFsnbWF4TGVuZ3RoJ10pIHtcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tlLnRhcmdldFsnaWQnXV0ucGF0Y2hWYWx1ZSh0aGlzLmZvcm0uY29udHJvbHNbZS50YXJnZXRbJ2lkJ11dLnZhbHVlLmNvbmNhdCgwKSk7XG4gICAgfVxuICB9XG59XG4iXX0=