design-angular-kit
Version:
Un toolkit Angular conforme alle linee guida di design per i servizi web della PA
156 lines • 19.1 kB
JavaScript
import { Validators } from '@angular/forms';
import { CAP_REGEX, EMAIL_REGEX, IBAN_REGEX, ITALIAN_TAX_CODE_REGEX, PHONE_NUMBER_REGEX, PLATE_REGEX, URL_REGEX, VAT_NUMBER_REGEX, } from '../utils/regex';
export class ItValidators {
static { this.SpecialCharacterPattern = '!@#$%&*_+=;:|,.'; }
/**
* Static pattern validator with custom error
* @param regex
* @param error
*/
static customPattern(regex, error) {
return (control) => {
if (!control.value) {
// if control is empty return no error
return null;
}
// test the value of the control against the regexp supplied
const valid = regex.test(control.value);
// if true, return no error (no error), else return error passed in the second parameter
return valid ? null : error;
};
}
/**
* Set Validator if the condition is satisfied
* @param validator the validator to apply if the condition is true
* @param condition the condition
*/
static conditional(validator, condition) {
return formControl => {
if (!formControl.parent) {
return null;
}
if (condition(formControl)) {
return validator(formControl);
}
return null;
};
}
/**
* Check whether our password and confirm password are a match
* @param control
* @param passwordControlName the password formControlName
* @param confirmControlName the confirmPassword formControlName
*/
static passwordMatch(control, passwordControlName = 'password', confirmControlName = 'confirmPassword') {
const confirmControl = control.get(confirmControlName); // confirmPassword form control
if (!confirmControl) {
return null;
}
const passwordControl = control.get(passwordControlName); // password form control
const password = passwordControl?.value; // get password from our password form control
// compare is the password match
if ((password && !confirmControl.value) || (confirmControl.value && password !== confirmControl.value)) {
// if they don't match, set an error in our confirmPassword form control
confirmControl?.setErrors({ noPasswordMatch: true });
confirmControl?.markAsTouched();
return control;
}
if (password && passwordControl?.touched) {
confirmControl?.markAsTouched();
}
return null;
}
/**
* Password validator
* @param minLength minimum password length - default 10
* @param hasNumber check whether the entered password has a number - default true
* @param hasCapitalCase check whether the entered password has upper case letter - default true
* @param hasSmallCase check whether the entered password has a lower-case letter - default true
* @param hasSpecialCharacters check whether the entered password has a special character - default true
* @param required the field is required - default true
*/
static password(minLength = 10, hasNumber = true, hasCapitalCase = true, hasSmallCase = true, hasSpecialCharacters = true, required = true) {
const validators = [Validators.minLength(minLength)];
if (hasNumber) {
validators.push(ItValidators.customPattern(/\d/, { hasNumber }));
}
if (hasCapitalCase) {
validators.push(ItValidators.customPattern(/[A-Z]/, { hasCapitalCase }));
}
if (hasSmallCase) {
validators.push(ItValidators.customPattern(/[a-z]/, { hasSmallCase }));
}
if (hasSpecialCharacters) {
validators.push(ItValidators.customPattern(new RegExp(`[${ItValidators.SpecialCharacterPattern}]`), { hasSpecialCharacters }));
}
if (required) {
validators.push(Validators.required);
}
return Validators.compose(validators);
}
/**
* Email validator
*/
static get email() {
return Validators.compose([Validators.email, ItValidators.customPattern(EMAIL_REGEX, { invalidEmail: true })]);
}
/**
* Phone number validator
*/
static get tel() {
return ItValidators.customPattern(PHONE_NUMBER_REGEX, { invalidTel: true });
}
/**
* URL validator
*/
static get url() {
return ItValidators.customPattern(URL_REGEX, { invalidUrl: true });
}
/**
* Italian Tax Code validator
*/
static get taxCode() {
return ItValidators.customPattern(ITALIAN_TAX_CODE_REGEX, { invalidTaxCode: true });
}
/**
* VAT Number validator
*/
static get vatNumber() {
return ItValidators.customPattern(VAT_NUMBER_REGEX, { invalidVatNumber: true });
}
/**
* Italian Postal Code validator (CAP)
*/
static get cap() {
return ItValidators.customPattern(CAP_REGEX, { invalidCap: true });
}
/**
* IBAN validator
*/
static get iban() {
return ItValidators.customPattern(IBAN_REGEX, { invalidIban: true });
}
/**
* Italian plate validator
*/
static get plate() {
return ItValidators.customPattern(PLATE_REGEX, { invalidPlate: true });
}
/**
* Check if value is a valid RegExp
*/
static get regExp() {
return (control) => {
try {
if (control?.value) {
new RegExp(control.value);
}
}
catch (e) {
return { invalidRegex: true };
}
return null;
};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXQtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL3ZhbGlkYXRvcnMvaXQtdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtELFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLFVBQVUsRUFDVixzQkFBc0IsRUFDdEIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEdBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxPQUFPLFlBQVk7YUFDVCw0QkFBdUIsR0FBRyxpQkFBaUIsQ0FBQztJQUUxRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFhLEVBQUUsS0FBdUI7UUFDaEUsT0FBTyxDQUFDLE9BQXdCLEVBQTJCLEVBQUU7WUFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsc0NBQXNDO2dCQUN0QyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCw0REFBNEQ7WUFDNUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEMsd0ZBQXdGO1lBQ3hGLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUM5QixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBc0IsRUFBRSxTQUFnRDtRQUNoRyxPQUFPLFdBQVcsQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELElB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LFlBQVksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxLQUFLLE1BQU07UUFDdEIsT0FBTyxDQUFDLE9BQXdCLEVBQTJCLEVBQUU7WUFDM0QsSUFBSSxDQUFDO2dCQUNILElBQUksT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUNuQixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVCLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2hDLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztJQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQ0FQX1JFR0VYLFxuICBFTUFJTF9SRUdFWCxcbiAgSUJBTl9SRUdFWCxcbiAgSVRBTElBTl9UQVhfQ09ERV9SRUdFWCxcbiAgUEhPTkVfTlVNQkVSX1JFR0VYLFxuICBQTEFURV9SRUdFWCxcbiAgVVJMX1JFR0VYLFxuICBWQVRfTlVNQkVSX1JFR0VYLFxufSBmcm9tICcuLi91dGlscy9yZWdleCc7XG5cbmV4cG9ydCBjbGFzcyBJdFZhbGlkYXRvcnMge1xuICBwdWJsaWMgc3RhdGljIFNwZWNpYWxDaGFyYWN0ZXJQYXR0ZXJuID0gJyFAIyQlJipfKz07OnwsLic7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBwYXR0ZXJuIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvclxuICAgKiBAcGFyYW0gcmVnZXhcbiAgICogQHBhcmFtIGVycm9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGN1c3RvbVBhdHRlcm4ocmVnZXg6IFJlZ0V4cCwgZXJyb3I6IFZhbGlkYXRpb25FcnJvcnMpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgLy8gaWYgY29udHJvbCBpcyBlbXB0eSByZXR1cm4gbm8gZXJyb3JcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIHRlc3QgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIGFnYWluc3QgdGhlIHJlZ2V4cCBzdXBwbGllZFxuICAgICAgY29uc3QgdmFsaWQgPSByZWdleC50ZXN0KGNvbnRyb2wudmFsdWUpO1xuXG4gICAgICAvLyBpZiB0cnVlLCByZXR1cm4gbm8gZXJyb3IgKG5vIGVycm9yKSwgZWxzZSByZXR1cm4gZXJyb3IgcGFzc2VkIGluIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgICByZXR1cm4gdmFsaWQgPyBudWxsIDogZXJyb3I7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgVmFsaWRhdG9yIGlmIHRoZSBjb25kaXRpb24gaXMgc2F0aXNmaWVkXG4gICAqIEBwYXJhbSB2YWxpZGF0b3IgdGhlIHZhbGlkYXRvciB0byBhcHBseSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWVcbiAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvbmRpdGlvbmFsKHZhbGlkYXRvcjogVmFsaWRhdG9yRm4sIGNvbmRpdGlvbjogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbik6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gZm9ybUNvbnRyb2wgPT4ge1xuICAgICAgaWYgKCFmb3JtQ29udHJvbC5wYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uKGZvcm1Db250cm9sKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdG9yKGZvcm1Db250cm9sKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciBvdXIgcGFzc3dvcmQgYW5kIGNvbmZpcm0gcGFzc3dvcmQgYXJlIGEgbWF0Y2hcbiAgICogQHBhcmFtIGNvbnRyb2xcbiAgICogQHBhcmFtIHBhc3N3b3JkQ29udHJvbE5hbWUgdGhlIHBhc3N3b3JkIGZvcm1Db250cm9sTmFtZVxuICAgKiBAcGFyYW0gY29uZmlybUNvbnRyb2xOYW1lIHRoZSBjb25maXJtUGFzc3dvcmQgZm9ybUNvbnRyb2xOYW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHBhc3N3b3JkTWF0Y2goXG4gICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sLFxuICAgIHBhc3N3b3JkQ29udHJvbE5hbWUgPSAncGFzc3dvcmQnLFxuICAgIGNvbmZpcm1Db250cm9sTmFtZSA9ICdjb25maXJtUGFzc3dvcmQnXG4gICk6IEFic3RyYWN0Q29udHJvbCB8IG51bGwge1xuICAgIGNvbnN0IGNvbmZpcm1Db250cm9sID0gY29udHJvbC5nZXQoY29uZmlybUNvbnRyb2xOYW1lKTsgLy8gY29uZmlybVBhc3N3b3JkIGZvcm0gY29udHJvbFxuICAgIGlmICghY29uZmlybUNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3N3b3JkQ29udHJvbCA9IGNvbnRyb2wuZ2V0KHBhc3N3b3JkQ29udHJvbE5hbWUpOyAvLyBwYXNzd29yZCBmb3JtIGNvbnRyb2xcbiAgICBjb25zdCBwYXNzd29yZCA9IHBhc3N3b3JkQ29udHJvbD8udmFsdWU7IC8vIGdldCBwYXNzd29yZCBmcm9tIG91ciBwYXNzd29yZCBmb3JtIGNvbnRyb2xcblxuICAgIC8vIGNvbXBhcmUgaXMgdGhlIHBhc3N3b3JkIG1hdGNoXG4gICAgaWYgKChwYXNzd29yZCAmJiAhY29uZmlybUNvbnRyb2wudmFsdWUpIHx8IChjb25maXJtQ29udHJvbC52YWx1ZSAmJiBwYXNzd29yZCAhPT0gY29uZmlybUNvbnRyb2wudmFsdWUpKSB7XG4gICAgICAvLyBpZiB0aGV5IGRvbid0IG1hdGNoLCBzZXQgYW4gZXJyb3IgaW4gb3VyIGNvbmZpcm1QYXNzd29yZCBmb3JtIGNvbnRyb2xcbiAgICAgIGNvbmZpcm1Db250cm9sPy5zZXRFcnJvcnMoeyBub1Bhc3N3b3JkTWF0Y2g6IHRydWUgfSk7XG4gICAgICBjb25maXJtQ29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuIGNvbnRyb2w7XG4gICAgfVxuXG4gICAgaWYgKHBhc3N3b3JkICYmIHBhc3N3b3JkQ29udHJvbD8udG91Y2hlZCkge1xuICAgICAgY29uZmlybUNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGFzc3dvcmQgdmFsaWRhdG9yXG4gICAqIEBwYXJhbSBtaW5MZW5ndGggbWluaW11bSBwYXNzd29yZCBsZW5ndGggLSBkZWZhdWx0IDEwXG4gICAqIEBwYXJhbSBoYXNOdW1iZXIgY2hlY2sgd2hldGhlciB0aGUgZW50ZXJlZCBwYXNzd29yZCBoYXMgYSBudW1iZXIgLSBkZWZhdWx0IHRydWVcbiAgICogQHBhcmFtIGhhc0NhcGl0YWxDYXNlIGNoZWNrIHdoZXRoZXIgdGhlIGVudGVyZWQgcGFzc3dvcmQgaGFzIHVwcGVyIGNhc2UgbGV0dGVyIC0gZGVmYXVsdCB0cnVlXG4gICAqIEBwYXJhbSBoYXNTbWFsbENhc2UgY2hlY2sgd2hldGhlciB0aGUgZW50ZXJlZCBwYXNzd29yZCBoYXMgYSBsb3dlci1jYXNlIGxldHRlciAtIGRlZmF1bHQgdHJ1ZVxuICAgKiBAcGFyYW0gaGFzU3BlY2lhbENoYXJhY3RlcnMgY2hlY2sgd2hldGhlciB0aGUgZW50ZXJlZCBwYXNzd29yZCBoYXMgYSBzcGVjaWFsIGNoYXJhY3RlciAtIGRlZmF1bHQgdHJ1ZVxuICAgKiBAcGFyYW0gcmVxdWlyZWQgdGhlIGZpZWxkIGlzIHJlcXVpcmVkIC0gZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHBhc3N3b3JkKFxuICAgIG1pbkxlbmd0aCA9IDEwLFxuICAgIGhhc051bWJlciA9IHRydWUsXG4gICAgaGFzQ2FwaXRhbENhc2UgPSB0cnVlLFxuICAgIGhhc1NtYWxsQ2FzZSA9IHRydWUsXG4gICAgaGFzU3BlY2lhbENoYXJhY3RlcnMgPSB0cnVlLFxuICAgIHJlcXVpcmVkID0gdHJ1ZVxuICApOiBWYWxpZGF0b3JGbiB7XG4gICAgY29uc3QgdmFsaWRhdG9yczogQXJyYXk8VmFsaWRhdG9yRm4+ID0gW1ZhbGlkYXRvcnMubWluTGVuZ3RoKG1pbkxlbmd0aCldO1xuICAgIGlmIChoYXNOdW1iZXIpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChJdFZhbGlkYXRvcnMuY3VzdG9tUGF0dGVybigvXFxkLywgeyBoYXNOdW1iZXIgfSkpO1xuICAgIH1cbiAgICBpZiAoaGFzQ2FwaXRhbENhc2UpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChJdFZhbGlkYXRvcnMuY3VzdG9tUGF0dGVybigvW0EtWl0vLCB7IGhhc0NhcGl0YWxDYXNlIH0pKTtcbiAgICB9XG4gICAgaWYgKGhhc1NtYWxsQ2FzZSkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKEl0VmFsaWRhdG9ycy5jdXN0b21QYXR0ZXJuKC9bYS16XS8sIHsgaGFzU21hbGxDYXNlIH0pKTtcbiAgICB9XG4gICAgaWYgKGhhc1NwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goSXRWYWxpZGF0b3JzLmN1c3RvbVBhdHRlcm4obmV3IFJlZ0V4cChgWyR7SXRWYWxpZGF0b3JzLlNwZWNpYWxDaGFyYWN0ZXJQYXR0ZXJufV1gKSwgeyBoYXNTcGVjaWFsQ2hhcmFjdGVycyB9KSk7XG4gICAgfVxuICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIH1cbiAgICByZXR1cm4gPFZhbGlkYXRvckZuPlZhbGlkYXRvcnMuY29tcG9zZSh2YWxpZGF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWFpbCB2YWxpZGF0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGVtYWlsKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gPFZhbGlkYXRvckZuPlZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5lbWFpbCwgSXRWYWxpZGF0b3JzLmN1c3RvbVBhdHRlcm4oRU1BSUxfUkVHRVgsIHsgaW52YWxpZEVtYWlsOiB0cnVlIH0pXSk7XG4gIH1cblxuICAvKipcbiAgICogUGhvbmUgbnVtYmVyIHZhbGlkYXRvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQgdGVsKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gSXRWYWxpZGF0b3JzLmN1c3RvbVBhdHRlcm4oUEhPTkVfTlVNQkVSX1JFR0VYLCB7IGludmFsaWRUZWw6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogVVJMIHZhbGlkYXRvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQgdXJsKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gSXRWYWxpZGF0b3JzLmN1c3RvbVBhdHRlcm4oVVJMX1JFR0VYLCB7IGludmFsaWRVcmw6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXRhbGlhbiBUYXggQ29kZSB2YWxpZGF0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IHRheENvZGUoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiBJdFZhbGlkYXRvcnMuY3VzdG9tUGF0dGVybihJVEFMSUFOX1RBWF9DT0RFX1JFR0VYLCB7IGludmFsaWRUYXhDb2RlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZBVCBOdW1iZXIgdmFsaWRhdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldCB2YXROdW1iZXIoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiBJdFZhbGlkYXRvcnMuY3VzdG9tUGF0dGVybihWQVRfTlVNQkVSX1JFR0VYLCB7IGludmFsaWRWYXROdW1iZXI6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXRhbGlhbiBQb3N0YWwgQ29kZSB2YWxpZGF0b3IgKENBUClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGNhcCgpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIEl0VmFsaWRhdG9ycy5jdXN0b21QYXR0ZXJuKENBUF9SRUdFWCwgeyBpbnZhbGlkQ2FwOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElCQU4gdmFsaWRhdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldCBpYmFuKCk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gSXRWYWxpZGF0b3JzLmN1c3RvbVBhdHRlcm4oSUJBTl9SRUdFWCwgeyBpbnZhbGlkSWJhbjogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGFsaWFuIHBsYXRlIHZhbGlkYXRvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQgcGxhdGUoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiBJdFZhbGlkYXRvcnMuY3VzdG9tUGF0dGVybihQTEFURV9SRUdFWCwgeyBpbnZhbGlkUGxhdGU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdmFsdWUgaXMgYSB2YWxpZCBSZWdFeHBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IHJlZ0V4cCgpOiBWYWxpZGF0b3JGbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoY29udHJvbD8udmFsdWUpIHtcbiAgICAgICAgICBuZXcgUmVnRXhwKGNvbnRyb2wudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IGludmFsaWRSZWdleDogdHJ1ZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgfVxufVxuIl19