@edugouvfr/ngx-dsfr
Version:
NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).
132 lines • 21.8 kB
JavaScript
import { Component, EventEmitter, forwardRef, Input, Output, ViewEncapsulation } from '@angular/core';
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
import { DefaultValueAccessorComponent } from '../../shared';
import { DateModel } from './date.model';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "../../shared/services/logger.service";
import * as i3 from "@angular/forms";
import * as i4 from "../../forms/fieldset/form-fieldset.component";
import * as i5 from "../../forms/fieldset/form-fieldset-element.directive";
import * as i6 from "../../forms/form-input/form-input.component";
const PATH_ERR_I18N = {
err_invalid_format: 'date.error.invalid.format',
err_invalid_day: 'date.error.invalid.day',
err_invalid_month: 'date.error.invalid.month',
err_invalid_date: 'date.error.invalid.date',
err_required: 'date.error.required',
};
export class DsfrDateComponent extends DefaultValueAccessorComponent {
/** @internal */
constructor(i18n, logger) {
super();
this.i18n = i18n;
this.logger = logger;
/**
* Indique si les champs de saisie doivent être auto-complétés à partir de la date de naissance de l'utilisateur.
*/
this.autocomplete = false;
/**
* Indique si la date est obligatoire.
*/
this.required = false;
/**
* Signale le changement de date.
*/
// Certainement inutile vs ngModelChange, à voir !
this.dateChange = new EventEmitter();
/** @internal */ this.dateModel = new DateModel(); // View-Model
/** @internal */ this.validationErrors = null;
/** Permet de stocker la fonction pouvant être appelée pour forcer une revalidation. */
this.fnOnValidatorChange = () => { };
}
get errors() {
const internalError = this.validationErrors === null ? [] : this.validationErrors.map((err) => Object.values(err)[0]);
return internalError.length > 0 ? internalError : this.error;
}
// Sur changement de la date, on réécrit jour mois année
/** @internal */
writeValue(value) {
// Bien que la value soit de type date, le développeur peut, à notre insu, nous envoyer une chaine ou un nombre (comme Storybook), ex : Date.now()
this.dateModel = DateModel.of(value, this.logger);
super.writeValue(this.dateModel.toDate());
this.dateChange.emit(this.value);
}
// Sur changement du modèle, c.-à-d. jour, mois ou année, on récrit la date
/** @internal */
onFocusOut() {
this.validationErrors = this.internalValidate();
this.value = this.dateModel.toDate();
this.dateChange.emit(this.value);
}
/** @internal */
registerOnValidatorChange(fn) {
this.fnOnValidatorChange = fn;
}
/** @internal */
validate(control) {
return this.internalValidate();
}
/**
* Valide le composant et retourne ValidationErrors
*/
internalValidate() {
const errors = this.dateModel.validate(this.required);
// Pas d'erreur, on retourne null
if (errors.length === 0)
return null;
// On transforme la liste des codes d'erreur en ValidationErrors
return errors.map((codeErr) => {
// @ts-ignore
const pathErr = PATH_ERR_I18N[codeErr];
const labelErr = this.i18n.t(pathErr);
const validationErr = {};
// @ts-ignore
validationErr[codeErr] = labelErr;
return validationErr;
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrDateComponent, deps: [{ token: i1.I18nService }, { token: i2.LoggerService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrDateComponent, selector: "dsfr-date", inputs: { autocomplete: "autocomplete", error: "error", hint: "hint", legend: "legend", required: "required", valid: "valid" }, outputs: { dateChange: "dateChange" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrDateComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => DsfrDateComponent),
multi: true,
},
], usesInheritance: true, ngImport: i0, template: "<dsfr-fieldset [legend]=\"legend\" [hint]=\"hint\" [error]=\"errors\" [valid]=\"valid\">\n <!-- Day -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--number'\"\n [label]=\"i18n.t('date.day.label')\"\n [maxLength]=\"2\"\n [hint]=\"i18n.t('date.day.hint')\"\n [autocomplete]=\"autocomplete ? 'bday-day' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"dateModel.dayNum\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n <!-- Month -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--number'\"\n [label]=\"i18n.t('date.month.label')\"\n [maxLength]=\"2\"\n [hint]=\"i18n.t('date.month.hint')\"\n [autocomplete]=\"autocomplete ? 'bday-month' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"dateModel.monthNum\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n <!-- Year -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year'\"\n [label]=\"i18n.t('date.year.label')\"\n [maxLength]=\"4\"\n [hint]=\"i18n.t('date.year.hint')\"\n [autocomplete]=\"autocomplete ? 'bday-year' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"dateModel.fullYear\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n</dsfr-fieldset>\n", dependencies: [{ kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.DsfrFormFieldsetComponent, selector: "dsfr-fieldset, dsfr-form-fieldset", inputs: ["inline"] }, { kind: "directive", type: i5.DsfrFormFieldsetElementDirective, selector: "[fieldsetElement]", inputs: ["fieldsetElement"] }, { kind: "component", type: i6.DsfrFormInputComponent, selector: "dsfr-form-input", inputs: ["rows", "width", "textarea"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrDateComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-date', encapsulation: ViewEncapsulation.None, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DsfrDateComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => DsfrDateComponent),
multi: true,
},
], template: "<dsfr-fieldset [legend]=\"legend\" [hint]=\"hint\" [error]=\"errors\" [valid]=\"valid\">\n <!-- Day -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--number'\"\n [label]=\"i18n.t('date.day.label')\"\n [maxLength]=\"2\"\n [hint]=\"i18n.t('date.day.hint')\"\n [autocomplete]=\"autocomplete ? 'bday-day' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"dateModel.dayNum\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n <!-- Month -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--number'\"\n [label]=\"i18n.t('date.month.label')\"\n [maxLength]=\"2\"\n [hint]=\"i18n.t('date.month.hint')\"\n [autocomplete]=\"autocomplete ? 'bday-month' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"dateModel.monthNum\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n <!-- Year -->\n <dsfr-form-input\n *fieldsetElement=\"'fr-fieldset__element--inline fr-fieldset__element--inline-grow fr-fieldset__element--year'\"\n [label]=\"i18n.t('date.year.label')\"\n [maxLength]=\"4\"\n [hint]=\"i18n.t('date.year.hint')\"\n [autocomplete]=\"autocomplete ? 'bday-year' : undefined\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n [(ngModel)]=\"dateModel.fullYear\"\n (focusout)=\"onFocusOut()\"></dsfr-form-input>\n</dsfr-fieldset>\n" }]
}], ctorParameters: function () { return [{ type: i1.I18nService }, { type: i2.LoggerService }]; }, propDecorators: { autocomplete: [{
type: Input
}], error: [{
type: Input
}], hint: [{
type: Input
}], legend: [{
type: Input
}], required: [{
type: Input
}], valid: [{
type: Input
}], dateChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvcGF0dGVybnMvZGF0ZS9kYXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9wYXR0ZXJucy9kYXRlL2RhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEcsT0FBTyxFQUFtQixhQUFhLEVBQUUsaUJBQWlCLEVBQStCLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEgsT0FBTyxFQUFFLDZCQUE2QixFQUFlLE1BQU0sY0FBYyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7O0FBRXpDLE1BQU0sYUFBYSxHQUFHO0lBQ3BCLGtCQUFrQixFQUFFLDJCQUEyQjtJQUMvQyxlQUFlLEVBQUUsd0JBQXdCO0lBQ3pDLGlCQUFpQixFQUFFLDBCQUEwQjtJQUM3QyxnQkFBZ0IsRUFBRSx5QkFBeUI7SUFDM0MsWUFBWSxFQUFFLHFCQUFxQjtDQUNwQyxDQUFDO0FBbUJGLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSw2QkFBbUM7SUF3Q3hFLGdCQUFnQjtJQUNoQixZQUNTLElBQWlCLEVBQ2hCLE1BQXFCO1FBRTdCLEtBQUssRUFBRSxDQUFDO1FBSEQsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBMUMvQjs7V0FFRztRQUNNLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBaUI5Qjs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFPMUI7O1dB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LENBQUM7Z0JBQ2hELEtBQUssRUFBRSxJQUFJO2FBQ1o7WUFDRDtnQkFDRSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDaEQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLGlEQzdCSCw2N0NBbUNBOzs0RkRKYSxpQkFBaUI7a0JBakI3QixTQUFTOytCQUNFLFdBQVcsaUJBRU4saUJBQWlCLENBQUMsSUFBSSxhQUMxQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzs0QkFDaEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjs4SEFNUSxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQU1JLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERlZmF1bHRWYWx1ZUFjY2Vzc29yQ29tcG9uZW50LCBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVNb2RlbCB9IGZyb20gJy4vZGF0ZS5tb2RlbCc7XG5cbmNvbnN0IFBBVEhfRVJSX0kxOE4gPSB7XG4gIGVycl9pbnZhbGlkX2Zvcm1hdDogJ2RhdGUuZXJyb3IuaW52YWxpZC5mb3JtYXQnLFxuICBlcnJfaW52YWxpZF9kYXk6ICdkYXRlLmVycm9yLmludmFsaWQuZGF5JyxcbiAgZXJyX2ludmFsaWRfbW9udGg6ICdkYXRlLmVycm9yLmludmFsaWQubW9udGgnLFxuICBlcnJfaW52YWxpZF9kYXRlOiAnZGF0ZS5lcnJvci5pbnZhbGlkLmRhdGUnLFxuICBlcnJfcmVxdWlyZWQ6ICdkYXRlLmVycm9yLnJlcXVpcmVkJyxcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEc2ZyRGF0ZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEc2ZyRGF0ZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyRGF0ZUNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRWYWx1ZUFjY2Vzc29yQ29tcG9uZW50PERhdGU+IGltcGxlbWVudHMgVmFsaWRhdG9yIHtcbiAgLyoqXG4gICAqIEluZGlxdWUgc2kgbGVzIGNoYW1wcyBkZSBzYWlzaWUgZG9pdmVudCDDqnRyZSBhdXRvLWNvbXBsw6l0w6lzIMOgIHBhcnRpciBkZSBsYSBkYXRlIGRlIG5haXNzYW5jZSBkZSBsJ3V0aWxpc2F0ZXVyLlxuICAgKi9cbiAgQElucHV0KCkgYXV0b2NvbXBsZXRlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1vZMOobGUgZGUgcHLDqXNlbnRhdGlvbiBkZSBkb25uw6llcyBpbnRlcm5lcy5cbiAgICovXG4gIEBJbnB1dCgpIGVycm9yOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGV4dGUgZGUgZGVzY3JpcHRpb24gYWRkaXRpb25uZWwgZHUgZmllbGRzZXQuXG4gICAqL1xuICBASW5wdXQoKSBoaW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEzDqWdlbmRlIGR1IGZpZWxkc2V0LlxuICAgKi9cbiAgQElucHV0KCkgbGVnZW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGlxdWUgc2kgbGEgZGF0ZSBlc3Qgb2JsaWdhdG9pcmUuXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUZXh0ZSBkZSBzdWNjw6hzLlxuICAgKi9cbiAgQElucHV0KCkgdmFsaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU2lnbmFsZSBsZSBjaGFuZ2VtZW50IGRlIGRhdGUuXG4gICAqL1xuICAvLyBDZXJ0YWluZW1lbnQgaW51dGlsZSB2cyBuZ01vZGVsQ2hhbmdlLCDDoCB2b2lyICFcbiAgQE91dHB1dCgpIGRhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKiogQGludGVybmFsICovIGRhdGVNb2RlbCA9IG5ldyBEYXRlTW9kZWwoKTsgLy8gVmlldy1Nb2RlbFxuICAvKiogQGludGVybmFsICovIHZhbGlkYXRpb25FcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcblxuICAvKiogQGludGVybmFsICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpMThuOiBJMThuU2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldCBlcnJvcnMoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGNvbnN0IGludGVybmFsRXJyb3IgPVxuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzID09PSBudWxsID8gW10gOiB0aGlzLnZhbGlkYXRpb25FcnJvcnMubWFwKChlcnI6IHt9KSA9PiBPYmplY3QudmFsdWVzKGVycilbMF0pO1xuICAgIHJldHVybiBpbnRlcm5hbEVycm9yLmxlbmd0aCA+IDAgPyBpbnRlcm5hbEVycm9yIDogdGhpcy5lcnJvcjtcbiAgfVxuXG4gIC8vIFN1ciBjaGFuZ2VtZW50IGRlIGxhIGRhdGUsIG9uIHLDqcOpY3JpdCBqb3VyIG1vaXMgYW5uw6llXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIC8vIEJpZW4gcXVlIGxhIHZhbHVlIHNvaXQgZGUgdHlwZSBkYXRlLCBsZSBkw6l2ZWxvcHBldXIgcGV1dCwgw6Agbm90cmUgaW5zdSwgbm91cyBlbnZveWVyIHVuZSBjaGFpbmUgb3UgdW4gbm9tYnJlIChjb21tZSBTdG9yeWJvb2spLCBleCA6IERhdGUubm93KClcbiAgICB0aGlzLmRhdGVNb2RlbCA9IERhdGVNb2RlbC5vZih2YWx1ZSwgdGhpcy5sb2dnZXIpO1xuICAgIHN1cGVyLndyaXRlVmFsdWUodGhpcy5kYXRlTW9kZWwudG9EYXRlKCkpO1xuICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICB9XG5cbiAgLy8gU3VyIGNoYW5nZW1lbnQgZHUgbW9kw6hsZSwgYy4tw6AtZC4gam91ciwgbW9pcyBvdSBhbm7DqWUsIG9uIHLDqWNyaXQgbGEgZGF0ZVxuICAvKiogQGludGVybmFsICovXG4gIG9uRm9jdXNPdXQoKSB7XG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzID0gdGhpcy5pbnRlcm5hbFZhbGlkYXRlKCk7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZGF0ZU1vZGVsLnRvRGF0ZSgpO1xuICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5mbk9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFZhbGlkYXRlKCk7XG4gIH1cblxuICAvKiogUGVybWV0IGRlIHN0b2NrZXIgbGEgZm9uY3Rpb24gcG91dmFudCDDqnRyZSBhcHBlbMOpZSBwb3VyIGZvcmNlciB1bmUgcmV2YWxpZGF0aW9uLiAqL1xuICBwcml2YXRlIGZuT25WYWxpZGF0b3JDaGFuZ2UgPSAoKSA9PiB7fTtcblxuICAvKipcbiAgICogVmFsaWRlIGxlIGNvbXBvc2FudCBldCByZXRvdXJuZSBWYWxpZGF0aW9uRXJyb3JzXG4gICAqL1xuICBwcml2YXRlIGludGVybmFsVmFsaWRhdGUoKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZGF0ZU1vZGVsLnZhbGlkYXRlKHRoaXMucmVxdWlyZWQpO1xuXG4gICAgLy8gUGFzIGQnZXJyZXVyLCBvbiByZXRvdXJuZSBudWxsXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgLy8gT24gdHJhbnNmb3JtZSBsYSBsaXN0ZSBkZXMgY29kZXMgZCdlcnJldXIgZW4gVmFsaWRhdGlvbkVycm9yc1xuICAgIHJldHVybiBlcnJvcnMubWFwKChjb2RlRXJyKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBwYXRoRXJyID0gUEFUSF9FUlJfSTE4Tltjb2RlRXJyXTtcbiAgICAgIGNvbnN0IGxhYmVsRXJyID0gdGhpcy5pMThuLnQocGF0aEVycik7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRXJyID0ge307XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB2YWxpZGF0aW9uRXJyW2NvZGVFcnJdID0gbGFiZWxFcnI7XG4gICAgICByZXR1cm4gdmFsaWRhdGlvbkVycjtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRzZnItZmllbGRzZXQgW2xlZ2VuZF09XCJsZWdlbmRcIiBbaGludF09XCJoaW50XCIgW2Vycm9yXT1cImVycm9yc1wiIFt2YWxpZF09XCJ2YWxpZFwiPlxuICA8IS0tIERheSAtLT5cbiAgPGRzZnItZm9ybS1pbnB1dFxuICAgICpmaWVsZHNldEVsZW1lbnQ9XCInZnItZmllbGRzZXRfX2VsZW1lbnQtLWlubGluZSBmci1maWVsZHNldF9fZWxlbWVudC0tbnVtYmVyJ1wiXG4gICAgW2xhYmVsXT1cImkxOG4udCgnZGF0ZS5kYXkubGFiZWwnKVwiXG4gICAgW21heExlbmd0aF09XCIyXCJcbiAgICBbaGludF09XCJpMThuLnQoJ2RhdGUuZGF5LmhpbnQnKVwiXG4gICAgW2F1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGUgPyAnYmRheS1kYXknIDogdW5kZWZpbmVkXCJcbiAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgWyhuZ01vZGVsKV09XCJkYXRlTW9kZWwuZGF5TnVtXCJcbiAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCI+PC9kc2ZyLWZvcm0taW5wdXQ+XG4gIDwhLS0gTW9udGggLS0+XG4gIDxkc2ZyLWZvcm0taW5wdXRcbiAgICAqZmllbGRzZXRFbGVtZW50PVwiJ2ZyLWZpZWxkc2V0X19lbGVtZW50LS1pbmxpbmUgZnItZmllbGRzZXRfX2VsZW1lbnQtLW51bWJlcidcIlxuICAgIFtsYWJlbF09XCJpMThuLnQoJ2RhdGUubW9udGgubGFiZWwnKVwiXG4gICAgW21heExlbmd0aF09XCIyXCJcbiAgICBbaGludF09XCJpMThuLnQoJ2RhdGUubW9udGguaGludCcpXCJcbiAgICBbYXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZSA/ICdiZGF5LW1vbnRoJyA6IHVuZGVmaW5lZFwiXG4gICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFsobmdNb2RlbCldPVwiZGF0ZU1vZGVsLm1vbnRoTnVtXCJcbiAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCI+PC9kc2ZyLWZvcm0taW5wdXQ+XG4gIDwhLS0gWWVhciAtLT5cbiAgPGRzZnItZm9ybS1pbnB1dFxuICAgICpmaWVsZHNldEVsZW1lbnQ9XCInZnItZmllbGRzZXRfX2VsZW1lbnQtLWlubGluZSBmci1maWVsZHNldF9fZWxlbWVudC0taW5saW5lLWdyb3cgZnItZmllbGRzZXRfX2VsZW1lbnQtLXllYXInXCJcbiAgICBbbGFiZWxdPVwiaTE4bi50KCdkYXRlLnllYXIubGFiZWwnKVwiXG4gICAgW21heExlbmd0aF09XCI0XCJcbiAgICBbaGludF09XCJpMThuLnQoJ2RhdGUueWVhci5oaW50JylcIlxuICAgIFthdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlID8gJ2JkYXkteWVhcicgOiB1bmRlZmluZWRcIlxuICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbKG5nTW9kZWwpXT1cImRhdGVNb2RlbC5mdWxsWWVhclwiXG4gICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoKVwiPjwvZHNmci1mb3JtLWlucHV0PlxuPC9kc2ZyLWZpZWxkc2V0PlxuIl19