UNPKG

@ui-tool/core

Version:
206 lines 25.7 kB
import { merge as lodashMerge } from 'lodash-es'; import { AbstractControl, FormArray, FormControl, FormControlDirective, FormGroup, NgControl, NgModel } from '@angular/forms'; import { ValidationMessage } from '../../../../models/implementations/validation-summarizers/validation-message'; export class ValidationSummarizerBaseService { //#endregion //#region Constructor // tslint:disable-next-line:max-line-length constructor(id) { this._id = id; this._validatorNameToValidationMessage = {}; } //#endregion //#region Methods getId() { return this._id; } // Get a single control validation message. loadControlValidationMessage(controlLabel, control) { const messages = this.loadControlValidationMessages(controlLabel, control); if (!messages) { return null; } return messages[0]; } // Get all control validation messages. loadControlValidationMessages(controlLabel, control) { // Invalid control. if (!control) { return null; } // List of validation messages. const messages = []; if (!control.errors || !control.errors) { return []; } const keys = Object.keys(control.errors); for (const key of keys) { if (!control.hasError(key)) { continue; } let boundValue = ''; if (key === 'min' || key === 'max') { boundValue = control.errors[key][key]; } else if (key === 'minlength' || key === 'maxlength') { boundValue = control.errors[key].requiredLength; } else { boundValue = control.errors[key]; } const additionalValue = {}; if (key && key.length && boundValue) { additionalValue[key] = boundValue; } const message = this.buildValidationMessage(controlLabel, key, additionalValue); if (!message) { return [{ key, content: key, additionalValue: additionalValue[key] }]; } const validationMessage = new ValidationMessage(key, message); validationMessage.key = key; validationMessage.content = message; validationMessage.additionalValue[key] = boundValue; messages.push(validationMessage); } return messages; } // Whether component has been attached with any multiple-validation-summarizers or not. hasValidator(name, ngControl) { if (!ngControl) { return false; } let actualControl = null; if (ngControl instanceof NgControl) { actualControl = ngControl.control; } else if (ngControl instanceof NgModel) { actualControl = ngControl.control; } else if (ngControl instanceof AbstractControl) { actualControl = ngControl; } if (!actualControl) { return false; } if (!actualControl.validator) { return false; } const validator = actualControl.validator({}); if (!validator) { return false; } return validator[name]; } // Update the dictionary which is used for mapping validation property & validation message. updateValidationMessageDictionary(validationMessageDictionary) { if (!validationMessageDictionary) { this._validatorNameToValidationMessage = {}; return; } this._validatorNameToValidationMessage = { ...validationMessageDictionary }; } // Run validation on controls inside a form. doFormControlsValidation(formGroup) { // Form group is not valid. if (!formGroup) { return; } // No control is found. const controls = formGroup.controls; if (!controls) { return; } const keys = Object.keys(controls); for (const key of keys) { const control = formGroup.controls[key]; this.doControlValidation(control); } } // Do control validation doControlValidation(control) { try { if (control instanceof FormControl) { control.markAsTouched({ onlySelf: true }); control.markAsDirty({ onlySelf: true }); control.updateValueAndValidity({ emitEvent: false }); control.statusChanges.emit(control.status); return; } if (control instanceof FormArray) { // Get the list of control; const children = control.controls; for (const child of children) { this.doControlValidation(child); } return; } if (control instanceof FormControlDirective) { const formControlDirective = control; formControlDirective.control.markAsTouched({ onlySelf: true }); formControlDirective.control.markAsDirty({ onlySelf: true }); formControlDirective.control.updateValueAndValidity({ emitEvent: false }); formControlDirective.statusChanges.emit(control.status); } if (control instanceof FormGroup) { this.doFormControlsValidation(control); } } catch (exception) { // Suppress error. } } // Get control validation errors. loadControlValidationErrors(control) { if (control instanceof FormControl) { return control.errors; } if (control instanceof FormControlDirective) { const formControlDirective = control; return formControlDirective.errors; } const validationErrors = {}; if (control instanceof FormGroup) { const controlValidationErrors = this.loadFormControlsValidationError(control); lodashMerge(validationErrors, controlValidationErrors); } return validationErrors; } // Run validation on controls inside a form. loadFormControlsValidationError(formGroup) { // Form group is not valid. if (!formGroup) { return null; } // No control is found. const controls = formGroup.controls; if (!controls) { return null; } const validationErrors = {}; const keys = Object.keys(controls); for (const key of keys) { const control = formGroup.controls[key]; const validationError = this.loadControlValidationErrors(control); lodashMerge(validationErrors, validationError); } return validationErrors; } //#endregion //#region Internal methods // Build validation message from specific information. buildValidationMessage(controlLabel, validatorName, additionalValue) { if (!this._validatorNameToValidationMessage) { return ''; } const validationMessage = this._validatorNameToValidationMessage[validatorName]; if (!validationMessage) { return ''; } return validationMessage; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1zdW1tYXJpemVyLWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvc2VydmljZXMvaW1wbGVtZW50YXRpb25zL3ZhbGlkYXRvcnMvdmFsaWRhdGlvbi1zdW1tYXJpemVycy92YWxpZGF0aW9uLXN1bW1hcml6ZXItYmFzZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxLQUFLLElBQUksV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxlQUFlLEVBQ2YsU0FBUyxFQUNULFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsU0FBUyxFQUNULFNBQVMsRUFFVCxPQUFPLEVBRVIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw4RUFBOEUsQ0FBQztBQUcvRyxNQUFNLE9BQU8sK0JBQStCO0lBYTFDLFlBQVk7SUFFWixxQkFBcUI7SUFFckIsMkNBQTJDO0lBQzNDLFlBQW1CLEVBQVU7UUFDM0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsaUNBQWlDLEdBQUcsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxZQUFZO0lBRVosaUJBQWlCO0lBRVYsS0FBSztRQUNWLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQsMkNBQTJDO0lBQ3BDLDRCQUE0QixDQUFDLFlBQW9CLEVBQUUsT0FBd0I7UUFDaEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCx1Q0FBdUM7SUFDaEMsNkJBQTZCLENBQUMsWUFBb0IsRUFBRSxPQUEyQztRQUVwRyxtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxRQUFRLEdBQXdCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDdEMsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixTQUFTO2FBQ1Y7WUFFRCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDcEIsSUFBSSxHQUFHLEtBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxLQUFLLEVBQUU7Z0JBQ2xDLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZDO2lCQUFNLElBQUksR0FBRyxLQUFLLFdBQVcsSUFBSSxHQUFHLEtBQUssV0FBVyxFQUFFO2dCQUNyRCxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUM7YUFDakQ7aUJBQU07Z0JBQ0wsVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDbEM7WUFFRCxNQUFNLGVBQWUsR0FBMkIsRUFBRSxDQUFDO1lBRW5ELElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksVUFBVSxFQUFFO2dCQUNuQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO2FBQ25DO1lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDWixPQUFPLENBQUM7d0JBQ04sR0FBRzt3QkFDSCxPQUFPLEVBQUUsR0FBRzt3QkFDWixlQUFlLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQztxQkFDdEMsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzlELGlCQUFpQixDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDNUIsaUJBQWlCLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUNwQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQ3BELFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNsQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCx1RkFBdUY7SUFDaEYsWUFBWSxDQUFDLElBQVksRUFBRSxTQUFnRDtRQUVoRixJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksYUFBYSxHQUEyQixJQUFJLENBQUM7UUFDakQsSUFBSSxTQUFTLFlBQVksU0FBUyxFQUFFO1lBQ2xDLGFBQWEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO1NBQ25DO2FBQU0sSUFBSSxTQUFTLFlBQVksT0FBTyxFQUFFO1lBQ3ZDLGFBQWEsR0FBSSxTQUFxQixDQUFDLE9BQU8sQ0FBQztTQUNoRDthQUFNLElBQUksU0FBUyxZQUFZLGVBQWUsRUFBRTtZQUMvQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1NBQzNCO1FBRUQsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUU7WUFDNUIsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBcUIsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELDRGQUE0RjtJQUNyRixpQ0FBaUMsQ0FBQywyQkFBcUQ7UUFFNUYsSUFBSSxDQUFDLDJCQUEyQixFQUFFO1lBQ2hDLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxFQUFFLENBQUM7WUFDNUMsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLEVBQUMsR0FBRywyQkFBMkIsRUFBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCw0Q0FBNEM7SUFDckMsd0JBQXdCLENBQUMsU0FBNkI7UUFFM0QsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxPQUFPO1NBQ1I7UUFFRCx1QkFBdUI7UUFDdkIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsT0FBTztTQUNSO1FBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtZQUN0QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFjLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7SUFFRCx3QkFBd0I7SUFDakIsbUJBQW1CLENBQUMsT0FBb0M7UUFFN0QsSUFBSTtZQUNGLElBQUksT0FBTyxZQUFZLFdBQVcsRUFBRTtnQkFDbEMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2dCQUN4QyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO2dCQUNsRCxPQUFPLENBQUMsYUFBbUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUVsRSxPQUFPO2FBQ1I7WUFFRCxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUU7Z0JBQ2hDLDJCQUEyQjtnQkFDM0IsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDbEMsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDakM7Z0JBQ0QsT0FBTzthQUNSO1lBRUQsSUFBSSxPQUFPLFlBQVksb0JBQW9CLEVBQUU7Z0JBQzNDLE1BQU0sb0JBQW9CLEdBQUcsT0FBK0IsQ0FBQztnQkFDN0Qsb0JBQW9CLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2dCQUM3RCxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7Z0JBQzNELG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO2dCQUN2RSxvQkFBb0IsQ0FBQyxhQUFtQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDaEY7WUFFRCxJQUFJLE9BQU8sWUFBWSxTQUFTLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN4QztTQUVGO1FBQUMsT0FBTyxTQUFTLEVBQUU7WUFDbEIsa0JBQWtCO1NBQ25CO0lBQ0gsQ0FBQztJQUVELGlDQUFpQztJQUMxQiwyQkFBMkIsQ0FBQyxPQUFvQztRQUVyRSxJQUFJLE9BQU8sWUFBWSxXQUFXLEVBQUU7WUFDbEMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxPQUFPLFlBQVksb0JBQW9CLEVBQUU7WUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxPQUErQixDQUFDO1lBQzdELE9BQU8sb0JBQW9CLENBQUMsTUFBTSxDQUFDO1NBQ3BDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBRTlDLElBQUksT0FBTyxZQUFZLFNBQVMsRUFBRTtZQUNoQyxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztTQUN4RDtRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVELDRDQUE0QztJQUNyQywrQkFBK0IsQ0FBQyxTQUFvQjtRQUV6RCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCx1QkFBdUI7UUFDdkIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3RCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xFLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsQ0FBQztTQUNoRDtRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQVk7SUFFWiwwQkFBMEI7SUFFMUIsc0RBQXNEO0lBQzVDLHNCQUFzQixDQUFDLFlBQW9CLEVBQUUsYUFBcUIsRUFBRSxlQUEyQztRQUN2SCxJQUFJLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFO1lBQzNDLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDdEIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztDQUlGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHttZXJnZSBhcyBsb2Rhc2hNZXJnZX0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUFycmF5LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUNvbnRyb2xEaXJlY3RpdmUsXG4gIEZvcm1Hcm91cCxcbiAgTmdDb250cm9sLFxuICBOZ0Zvcm0sXG4gIE5nTW9kZWwsXG4gIFZhbGlkYXRpb25FcnJvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtWYWxpZGF0aW9uTWVzc2FnZX0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2ltcGxlbWVudGF0aW9ucy92YWxpZGF0aW9uLXN1bW1hcml6ZXJzL3ZhbGlkYXRpb24tbWVzc2FnZSc7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uU3VtbWFyaXplckJhc2VTZXJ2aWNlIHtcblxuICAvLyNyZWdpb24gUHJvcGVydGllc1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByb3RlY3RlZCByZWFkb25seSBfaWQ6IHN0cmluZztcblxuICAvKlxuICAqIE1hcHBpbmcgYmV0d2VlbiB2YWxpZGF0b3IgbmFtZSBhbmQgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAqICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gIHByb3RlY3RlZCBfdmFsaWRhdG9yTmFtZVRvVmFsaWRhdGlvbk1lc3NhZ2U6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZzsgfTtcblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gQ29uc3RydWN0b3JcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSBpZDtcbiAgICB0aGlzLl92YWxpZGF0b3JOYW1lVG9WYWxpZGF0aW9uTWVzc2FnZSA9IHt9O1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIE1ldGhvZHNcblxuICBwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvLyBHZXQgYSBzaW5nbGUgY29udHJvbCB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gIHB1YmxpYyBsb2FkQ29udHJvbFZhbGlkYXRpb25NZXNzYWdlKGNvbnRyb2xMYWJlbDogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uTWVzc2FnZSB8IG51bGwge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5sb2FkQ29udHJvbFZhbGlkYXRpb25NZXNzYWdlcyhjb250cm9sTGFiZWwsIGNvbnRyb2wpO1xuICAgIGlmICghbWVzc2FnZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlc1swXTtcbiAgfVxuXG4gIC8vIEdldCBhbGwgY29udHJvbCB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICBwdWJsaWMgbG9hZENvbnRyb2xWYWxpZGF0aW9uTWVzc2FnZXMoY29udHJvbExhYmVsOiBzdHJpbmcsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IE5nQ29udHJvbCB8IG51bGwpOiBWYWxpZGF0aW9uTWVzc2FnZVtdIHwgbnVsbCB7XG5cbiAgICAvLyBJbnZhbGlkIGNvbnRyb2wuXG4gICAgaWYgKCFjb250cm9sKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBMaXN0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gICAgY29uc3QgbWVzc2FnZXM6IFZhbGlkYXRpb25NZXNzYWdlW10gPSBbXTtcbiAgICBpZiAoIWNvbnRyb2wuZXJyb3JzIHx8ICFjb250cm9sLmVycm9ycykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFjb250cm9sLmhhc0Vycm9yKGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBib3VuZFZhbHVlID0gJyc7XG4gICAgICBpZiAoa2V5ID09PSAnbWluJyB8fCBrZXkgPT09ICdtYXgnKSB7XG4gICAgICAgIGJvdW5kVmFsdWUgPSBjb250cm9sLmVycm9yc1trZXldW2tleV07XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ21pbmxlbmd0aCcgfHwga2V5ID09PSAnbWF4bGVuZ3RoJykge1xuICAgICAgICBib3VuZFZhbHVlID0gY29udHJvbC5lcnJvcnNba2V5XS5yZXF1aXJlZExlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvdW5kVmFsdWUgPSBjb250cm9sLmVycm9yc1trZXldO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGRpdGlvbmFsVmFsdWU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAgICAgaWYgKGtleSAmJiBrZXkubGVuZ3RoICYmIGJvdW5kVmFsdWUpIHtcbiAgICAgICAgYWRkaXRpb25hbFZhbHVlW2tleV0gPSBib3VuZFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5idWlsZFZhbGlkYXRpb25NZXNzYWdlKGNvbnRyb2xMYWJlbCwga2V5LCBhZGRpdGlvbmFsVmFsdWUpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBbe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBjb250ZW50OiBrZXksXG4gICAgICAgICAgYWRkaXRpb25hbFZhbHVlOiBhZGRpdGlvbmFsVmFsdWVba2V5XVxuICAgICAgICB9XTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2UgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2Uoa2V5LCBtZXNzYWdlKTtcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlLmtleSA9IGtleTtcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlLmNvbnRlbnQgPSBtZXNzYWdlO1xuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UuYWRkaXRpb25hbFZhbHVlW2tleV0gPSBib3VuZFZhbHVlO1xuICAgICAgbWVzc2FnZXMucHVzaCh2YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2VzO1xuICB9XG5cbiAgLy8gV2hldGhlciBjb21wb25lbnQgaGFzIGJlZW4gYXR0YWNoZWQgd2l0aCBhbnkgbXVsdGlwbGUtdmFsaWRhdGlvbi1zdW1tYXJpemVycyBvciBub3QuXG4gIHB1YmxpYyBoYXNWYWxpZGF0b3IobmFtZTogc3RyaW5nLCBuZ0NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IE5nQ29udHJvbCB8IE5nTW9kZWwpOiBib29sZWFuIHtcblxuICAgIGlmICghbmdDb250cm9sKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGFjdHVhbENvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgPSBudWxsO1xuICAgIGlmIChuZ0NvbnRyb2wgaW5zdGFuY2VvZiBOZ0NvbnRyb2wpIHtcbiAgICAgIGFjdHVhbENvbnRyb2wgPSBuZ0NvbnRyb2wuY29udHJvbDtcbiAgICB9IGVsc2UgaWYgKG5nQ29udHJvbCBpbnN0YW5jZW9mIE5nTW9kZWwpIHtcbiAgICAgIGFjdHVhbENvbnRyb2wgPSAobmdDb250cm9sIGFzIE5nTW9kZWwpLmNvbnRyb2w7XG4gICAgfSBlbHNlIGlmIChuZ0NvbnRyb2wgaW5zdGFuY2VvZiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICAgIGFjdHVhbENvbnRyb2wgPSBuZ0NvbnRyb2w7XG4gICAgfVxuXG4gICAgaWYgKCFhY3R1YWxDb250cm9sKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFhY3R1YWxDb250cm9sLnZhbGlkYXRvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRvciA9IGFjdHVhbENvbnRyb2wudmFsaWRhdG9yKHt9IGFzIEFic3RyYWN0Q29udHJvbCk7XG4gICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yW25hbWVdO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IHdoaWNoIGlzIHVzZWQgZm9yIG1hcHBpbmcgdmFsaWRhdGlvbiBwcm9wZXJ0eSAmIHZhbGlkYXRpb24gbWVzc2FnZS5cbiAgcHVibGljIHVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlRGljdGlvbmFyeSh2YWxpZGF0aW9uTWVzc2FnZURpY3Rpb25hcnk6IHsgW3A6IHN0cmluZ106IHN0cmluZzsgfSk6IHZvaWQge1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uTWVzc2FnZURpY3Rpb25hcnkpIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRvck5hbWVUb1ZhbGlkYXRpb25NZXNzYWdlID0ge307XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsaWRhdG9yTmFtZVRvVmFsaWRhdGlvbk1lc3NhZ2UgPSB7Li4udmFsaWRhdGlvbk1lc3NhZ2VEaWN0aW9uYXJ5fTtcbiAgfVxuXG4gIC8vIFJ1biB2YWxpZGF0aW9uIG9uIGNvbnRyb2xzIGluc2lkZSBhIGZvcm0uXG4gIHB1YmxpYyBkb0Zvcm1Db250cm9sc1ZhbGlkYXRpb24oZm9ybUdyb3VwOiBGb3JtR3JvdXAgfCBOZ0Zvcm0pOiB2b2lkIHtcblxuICAgIC8vIEZvcm0gZ3JvdXAgaXMgbm90IHZhbGlkLlxuICAgIGlmICghZm9ybUdyb3VwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm8gY29udHJvbCBpcyBmb3VuZC5cbiAgICBjb25zdCBjb250cm9scyA9IGZvcm1Hcm91cC5jb250cm9scztcbiAgICBpZiAoIWNvbnRyb2xzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRyb2xzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmNvbnRyb2xzW2tleV07XG4gICAgICB0aGlzLmRvQ29udHJvbFZhbGlkYXRpb24oY29udHJvbCBhcyBhbnkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERvIGNvbnRyb2wgdmFsaWRhdGlvblxuICBwdWJsaWMgZG9Db250cm9sVmFsaWRhdGlvbihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBGb3JtR3JvdXApOiB2b2lkIHtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSh7b25seVNlbGY6IHRydWV9KTtcbiAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgIChjb250cm9sLnN0YXR1c0NoYW5nZXMgYXMgRXZlbnRFbWl0dGVyPGFueT4pLmVtaXQoY29udHJvbC5zdGF0dXMpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIGNvbnRyb2w7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29udHJvbC5jb250cm9scztcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgIHRoaXMuZG9Db250cm9sVmFsaWRhdGlvbihjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sRGlyZWN0aXZlKSB7XG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sRGlyZWN0aXZlID0gY29udHJvbCBhcyBGb3JtQ29udHJvbERpcmVjdGl2ZTtcbiAgICAgICAgZm9ybUNvbnRyb2xEaXJlY3RpdmUuY29udHJvbC5tYXJrQXNUb3VjaGVkKHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgICBmb3JtQ29udHJvbERpcmVjdGl2ZS5jb250cm9sLm1hcmtBc0RpcnR5KHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgICBmb3JtQ29udHJvbERpcmVjdGl2ZS5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgKGZvcm1Db250cm9sRGlyZWN0aXZlLnN0YXR1c0NoYW5nZXMgYXMgRXZlbnRFbWl0dGVyPGFueT4pLmVtaXQoY29udHJvbC5zdGF0dXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLmRvRm9ybUNvbnRyb2xzVmFsaWRhdGlvbihjb250cm9sKTtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgLy8gU3VwcHJlc3MgZXJyb3IuXG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IGNvbnRyb2wgdmFsaWRhdGlvbiBlcnJvcnMuXG4gIHB1YmxpYyBsb2FkQ29udHJvbFZhbGlkYXRpb25FcnJvcnMoY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgRm9ybUdyb3VwKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgICAgcmV0dXJuIGNvbnRyb2wuZXJyb3JzO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2xEaXJlY3RpdmUpIHtcbiAgICAgIGNvbnN0IGZvcm1Db250cm9sRGlyZWN0aXZlID0gY29udHJvbCBhcyBGb3JtQ29udHJvbERpcmVjdGl2ZTtcbiAgICAgIHJldHVybiBmb3JtQ29udHJvbERpcmVjdGl2ZS5lcnJvcnM7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9yczogVmFsaWRhdGlvbkVycm9ycyA9IHt9O1xuXG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xWYWxpZGF0aW9uRXJyb3JzID0gdGhpcy5sb2FkRm9ybUNvbnRyb2xzVmFsaWRhdGlvbkVycm9yKGNvbnRyb2wpO1xuICAgICAgbG9kYXNoTWVyZ2UodmFsaWRhdGlvbkVycm9ycywgY29udHJvbFZhbGlkYXRpb25FcnJvcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0aW9uRXJyb3JzO1xuICB9XG5cbiAgLy8gUnVuIHZhbGlkYXRpb24gb24gY29udHJvbHMgaW5zaWRlIGEgZm9ybS5cbiAgcHVibGljIGxvYWRGb3JtQ29udHJvbHNWYWxpZGF0aW9uRXJyb3IoZm9ybUdyb3VwOiBGb3JtR3JvdXApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG5cbiAgICAvLyBGb3JtIGdyb3VwIGlzIG5vdCB2YWxpZC5cbiAgICBpZiAoIWZvcm1Hcm91cCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gTm8gY29udHJvbCBpcyBmb3VuZC5cbiAgICBjb25zdCBjb250cm9scyA9IGZvcm1Hcm91cC5jb250cm9scztcbiAgICBpZiAoIWNvbnRyb2xzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzID0ge307XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNvbnRyb2xzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmNvbnRyb2xzW2tleV07XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSB0aGlzLmxvYWRDb250cm9sVmFsaWRhdGlvbkVycm9ycyhjb250cm9sKTtcbiAgICAgIGxvZGFzaE1lcmdlKHZhbGlkYXRpb25FcnJvcnMsIHZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRpb25FcnJvcnM7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW50ZXJuYWwgbWV0aG9kc1xuXG4gIC8vIEJ1aWxkIHZhbGlkYXRpb24gbWVzc2FnZSBmcm9tIHNwZWNpZmljIGluZm9ybWF0aW9uLlxuICBwcm90ZWN0ZWQgYnVpbGRWYWxpZGF0aW9uTWVzc2FnZShjb250cm9sTGFiZWw6IHN0cmluZywgdmFsaWRhdG9yTmFtZTogc3RyaW5nLCBhZGRpdGlvbmFsVmFsdWU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9KTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3ZhbGlkYXRvck5hbWVUb1ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2UgPSB0aGlzLl92YWxpZGF0b3JOYW1lVG9WYWxpZGF0aW9uTWVzc2FnZVt2YWxpZGF0b3JOYW1lXTtcbiAgICBpZiAoIXZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRpb25NZXNzYWdlO1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbn1cbiJdfQ==