@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).
95 lines • 19.5 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { DsfrSeverityConst, DsfrSizeConst } from '../../shared';
import { DsfrAlertSizeConst } from './alert.size';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/common";
export class DsfrAlertComponent {
constructor(i18n, el, renderer) {
this.i18n = i18n;
this.el = el;
this.renderer = renderer;
/** La valeur à utiliser pour le rôle ARIA. 'alert' par défaut. */
this.ariaRoleValue = 'alert';
/** Doit être vrai si l'alerte apparait dynamiquement en cours de navigation. (ajout de role=alert pour l'accessibilité),
* false par défaut */
// https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/alerte
// Pour les développeurs.
// Nous avons retiré l’attribut role="alert" des exemples de code pour les alertes présentes au chargement de la page.
// En effet, l'élément avec un role="alert" sont les premières choses lues par les technologies d'assistance.
// De ce fait, le role="alert" doit être réservé aux alertes ajoutées (/injectées) dynamiquement au cours de la navigation.
// Ex : alertes de notification suite à une action utilisateur ou mise à jour d’un statut.
this.hasAriaRole = false;
/** L'alerte peut être masquée */
this.closeable = false;
/** Signale la fermeture de l'alerte. */
this.conceal = new EventEmitter();
this.closeControlLabel = this.i18n.t('alert.close');
this.severity = DsfrSeverityConst.INFO;
this.size = DsfrAlertSizeConst.MD;
}
/** @deprecated @since 1.7.0 use 'closeable' instead (avec un 'e') */
get closable() {
return this.closeable;
}
/** @deprecated (@since 1.7.0) utiliser `closeable` à la place (avec un 'e') */
set closable(value) {
this.closeable = value;
}
/** @internal */
getClasses() {
const classes = ['fr-alert'];
if (this.severity === DsfrSeverityConst.ERROR)
classes.push('fr-alert--error');
if (this.severity === DsfrSeverityConst.SUCCESS)
classes.push('fr-alert--success');
if (this.severity === DsfrSeverityConst.INFO)
classes.push('fr-alert--info');
if (this.severity === DsfrSeverityConst.WARNING)
classes.push('fr-alert--warning');
if (this.size === DsfrSizeConst.SM)
classes.push('fr-alert--sm');
return classes;
}
/** @internal */
isSmall() {
return this.size == DsfrSizeConst.SM;
}
/** @internal */
onClose(event) {
const parentNode = this.el.nativeElement?.parentNode;
if (parentNode) {
this.renderer.removeChild(parentNode, this.el.nativeElement, true);
}
this.conceal.emit();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrAlertComponent, deps: [{ token: i1.I18nService }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DsfrAlertComponent, selector: "dsfr-alert", inputs: { heading: "heading", headingLevel: "headingLevel", message: "message", severity: "severity", ariaRoleValue: "ariaRoleValue", size: "size", closeControlLabel: "closeControlLabel", hasAriaRole: "hasAriaRole", closeable: "closeable", closable: "closable" }, outputs: { conceal: "conceal" }, ngImport: i0, template: "<div [attr.role]=\"hasAriaRole ? ariaRoleValue : null\" [ngClass]=\"getClasses()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n <p>{{ message }}</p>\n <button\n *ngIf=\"closable\"\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [title]=\"closeControlLabel\"\n (click)=\"onClose($event)\">\n {{ closeControlLabel }}\n </button>\n</div>\n\n<!-- Templates ----------------------------------------------------------------------------------------------------- -->\n<ng-template #headingTemplate>\n <ng-container [ngSwitch]=\"headingLevel\">\n <h2 *ngSwitchCase=\"'H2'\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h2>\n <h3 *ngSwitchCase=\"'H3'\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h3>\n <h4 *ngSwitchCase=\"'H4'\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h4>\n <h5 *ngSwitchCase=\"'H5'\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h5>\n <h6 *ngSwitchCase=\"'H6'\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h6>\n <p *ngSwitchDefault class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </p>\n </ng-container>\n</ng-template>\n\n<ng-template #headingPropTemplate>\n <ng-container *ngIf=\"heading; else headingContentTemplate\"><span outerHTML=\"{{ heading }}\"></span></ng-container>\n</ng-template>\n\n<ng-template #headingContentTemplate>\n <ng-content></ng-content>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DsfrAlertComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-alert', encapsulation: ViewEncapsulation.None, template: "<div [attr.role]=\"hasAriaRole ? ariaRoleValue : null\" [ngClass]=\"getClasses()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\"></ng-container>\n <p>{{ message }}</p>\n <button\n *ngIf=\"closable\"\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [title]=\"closeControlLabel\"\n (click)=\"onClose($event)\">\n {{ closeControlLabel }}\n </button>\n</div>\n\n<!-- Templates ----------------------------------------------------------------------------------------------------- -->\n<ng-template #headingTemplate>\n <ng-container [ngSwitch]=\"headingLevel\">\n <h2 *ngSwitchCase=\"'H2'\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h2>\n <h3 *ngSwitchCase=\"'H3'\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h3>\n <h4 *ngSwitchCase=\"'H4'\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h4>\n <h5 *ngSwitchCase=\"'H5'\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h5>\n <h6 *ngSwitchCase=\"'H6'\" class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </h6>\n <p *ngSwitchDefault class=\"fr-alert__title\">\n <ng-container *ngTemplateOutlet=\"headingPropTemplate\"></ng-container>\n </p>\n </ng-container>\n</ng-template>\n\n<ng-template #headingPropTemplate>\n <ng-container *ngIf=\"heading; else headingContentTemplate\"><span outerHTML=\"{{ heading }}\"></span></ng-container>\n</ng-template>\n\n<ng-template #headingContentTemplate>\n <ng-content></ng-content>\n</ng-template>\n" }]
}], ctorParameters: function () { return [{ type: i1.I18nService }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { heading: [{
type: Input
}], headingLevel: [{
type: Input
}], message: [{
type: Input
}], severity: [{
type: Input
}], ariaRoleValue: [{
type: Input
}], size: [{
type: Input
}], closeControlLabel: [{
type: Input
}], hasAriaRole: [{
type: Input
}], closeable: [{
type: Input
}], conceal: [{
type: Output
}], closable: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYWxlcnQvYWxlcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYWxlcnQvYWxlcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBYSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQWtDLGlCQUFpQixFQUFFLGFBQWEsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQUM3RyxPQUFPLEVBQWlCLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7O0FBT2pFLE1BQU0sT0FBTyxrQkFBa0I7SUFzQzdCLFlBQ1UsSUFBaUIsRUFDakIsRUFBYyxFQUNkLFFBQW1CO1FBRm5CLFNBQUksR0FBSixJQUFJLENBQWE7UUFDakIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUE1QjdCLGtFQUFrRTtRQUN6RCxrQkFBYSxHQUF1QixPQUFPLENBQUM7UUFRckQ7K0JBQ3VCO1FBQ3ZCLCtFQUErRTtRQUMvRSx5QkFBeUI7UUFDekIsc0hBQXNIO1FBQ3RILDZHQUE2RztRQUM3RywySEFBMkg7UUFDM0gsMEZBQTBGO1FBQ2pGLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGlDQUFpQztRQUN4QixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTNCLHdDQUF3QztRQUM5QixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQU8zQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELCtFQUErRTtJQUMvRSxJQUFhLFFBQVEsQ0FBQyxLQUFjO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsVUFBVTtRQUNSLE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGlCQUFpQixDQUFDLEtBQUs7WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0UsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGlCQUFpQixDQUFDLE9BQU87WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkYsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGlCQUFpQixDQUFDLElBQUk7WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0UsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLGlCQUFpQixDQUFDLE9BQU87WUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkYsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxFQUFFO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRSxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLE9BQU8sQ0FBQyxLQUFZO1FBQ2xCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQztRQUNyRCxJQUFJLFVBQVUsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNwRTtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQzsrR0FsRlUsa0JBQWtCO21HQUFsQixrQkFBa0IsMlZDVC9CLGl2REE0Q0E7OzRGRG5DYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsWUFBWSxpQkFFUCxpQkFBaUIsQ0FBQyxJQUFJO21KQUk1QixPQUFPO3NCQUFmLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFHRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBVUcsV0FBVztzQkFBbkIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdJLE9BQU87c0JBQWhCLE1BQU07Z0JBa0JNLFFBQVE7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgUmVuZGVyZXIyLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHNmckhlYWRpbmdMZXZlbCwgRHNmclNldmVyaXR5LCBEc2ZyU2V2ZXJpdHlDb25zdCwgRHNmclNpemVDb25zdCwgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgRHNmckFsZXJ0U2l6ZSwgRHNmckFsZXJ0U2l6ZUNvbnN0IH0gZnJvbSAnLi9hbGVydC5zaXplJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHNmci1hbGVydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbGVydC5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIERzZnJBbGVydENvbXBvbmVudCB7XG4gIC8qKiBMZSB0aXRyZSBkZSBsJ2FsZXJ0ZSAoaHRtbCBhdXRvcmlzw6kpLiAqL1xuICBASW5wdXQoKSBoZWFkaW5nOiBzdHJpbmc7XG5cbiAgLyoqIExlIG5pdmVhdSBkZSB0aXRyZSBkZXZhbnQgw6p0cmUgdXRpbGlzw6ksIHVuZSBiYWxpc2UgPHA+IHNlcmEgdXRpbGlzw6llIHNpIGxhIHByb3ByacOpdMOpIG4nZXN0IHBhcyByZW5zZWlnbsOpZS4gKi9cbiAgQElucHV0KCkgaGVhZGluZ0xldmVsOiBEc2ZySGVhZGluZ0xldmVsO1xuXG4gIC8qKiBMZSBjb3JwcyBkdSBtZXNzYWdlIGRlIGwnYWxlcnRlICh0ZXh0ZXggc2ltcGxlKS4gKi9cbiAgQElucHV0KCkgbWVzc2FnZTogc3RyaW5nO1xuXG4gIC8qKiBMZSBuaXZlYXUgZCdhbGVydGUuICdpbmZvJyBwYXIgZMOpZmF1dC4gKi9cbiAgQElucHV0KCkgc2V2ZXJpdHk6IERzZnJTZXZlcml0eTtcblxuICAvKiogTGEgdmFsZXVyIMOgIHV0aWxpc2VyIHBvdXIgbGUgcsO0bGUgQVJJQS4gJ2FsZXJ0JyBwYXIgZMOpZmF1dC4gKi9cbiAgQElucHV0KCkgYXJpYVJvbGVWYWx1ZTogJ2FsZXJ0JyB8ICdzdGF0dXMnID0gJ2FsZXJ0JztcblxuICAvKiogTGEgdGFpbGxlIGRlIGwnYWxlcnRlLiAnTUQnIHBhciBkw6lmYXV0LiAqL1xuICBASW5wdXQoKSBzaXplOiBEc2ZyQWxlcnRTaXplO1xuXG4gIC8qKiBMZSBsaWJlbGzDqSBhc3NvY2nDqSBhdSBib3V0b24gZGUgZmVybWV0dXJlIGRlIGwnYWxlcnRlLiAqL1xuICBASW5wdXQoKSBjbG9zZUNvbnRyb2xMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBEb2l0IMOqdHJlIHZyYWkgc2kgbCdhbGVydGUgYXBwYXJhaXQgZHluYW1pcXVlbWVudCBlbiBjb3VycyBkZSBuYXZpZ2F0aW9uLiAoYWpvdXQgZGUgcm9sZT1hbGVydCBwb3VyIGwnYWNjZXNzaWJpbGl0w6kpLFxuICAgKiAgZmFsc2UgcGFyIGTDqWZhdXQgKi9cbiAgLy8gaHR0cHM6Ly93d3cuc3lzdGVtZS1kZS1kZXNpZ24uZ291di5mci9lbGVtZW50cy1kLWludGVyZmFjZS9jb21wb3NhbnRzL2FsZXJ0ZVxuICAvLyBQb3VyIGxlcyBkw6l2ZWxvcHBldXJzLlxuICAvLyBOb3VzIGF2b25zIHJldGlyw6kgbOKAmWF0dHJpYnV0IHJvbGU9XCJhbGVydFwiIGRlcyBleGVtcGxlcyBkZSBjb2RlIHBvdXIgbGVzIGFsZXJ0ZXMgcHLDqXNlbnRlcyBhdSBjaGFyZ2VtZW50IGRlIGxhIHBhZ2UuXG4gIC8vIEVuIGVmZmV0LCBsJ8OpbMOpbWVudCBhdmVjIHVuIHJvbGU9XCJhbGVydFwiIHNvbnQgbGVzIHByZW1pw6hyZXMgY2hvc2VzIGx1ZXMgcGFyIGxlcyB0ZWNobm9sb2dpZXMgZCdhc3Npc3RhbmNlLlxuICAvLyBEZSBjZSBmYWl0LCBsZSByb2xlPVwiYWxlcnRcIiBkb2l0IMOqdHJlIHLDqXNlcnbDqSBhdXggYWxlcnRlcyBham91dMOpZXMgKC9pbmplY3TDqWVzKSBkeW5hbWlxdWVtZW50IGF1IGNvdXJzIGRlIGxhIG5hdmlnYXRpb24uXG4gIC8vIEV4IDogYWxlcnRlcyBkZSBub3RpZmljYXRpb24gc3VpdGUgw6AgdW5lIGFjdGlvbiB1dGlsaXNhdGV1ciBvdSBtaXNlIMOgIGpvdXIgZOKAmXVuIHN0YXR1dC5cbiAgQElucHV0KCkgaGFzQXJpYVJvbGUgPSBmYWxzZTtcblxuICAvKiogTCdhbGVydGUgcGV1dCDDqnRyZSBtYXNxdcOpZSAqL1xuICBASW5wdXQoKSBjbG9zZWFibGUgPSBmYWxzZTtcblxuICAvKiogU2lnbmFsZSBsYSBmZXJtZXR1cmUgZGUgbCdhbGVydGUuICovXG4gIEBPdXRwdXQoKSBjb25jZWFsID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICkge1xuICAgIHRoaXMuY2xvc2VDb250cm9sTGFiZWwgPSB0aGlzLmkxOG4udCgnYWxlcnQuY2xvc2UnKTtcbiAgICB0aGlzLnNldmVyaXR5ID0gRHNmclNldmVyaXR5Q29uc3QuSU5GTztcbiAgICB0aGlzLnNpemUgPSBEc2ZyQWxlcnRTaXplQ29uc3QuTUQ7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgQHNpbmNlIDEuNy4wIHVzZSAnY2xvc2VhYmxlJyBpbnN0ZWFkIChhdmVjIHVuICdlJykgKi9cbiAgZ2V0IGNsb3NhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsb3NlYWJsZTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAoQHNpbmNlIDEuNy4wKSB1dGlsaXNlciBgY2xvc2VhYmxlYCDDoCBsYSBwbGFjZSAoYXZlYyB1biAnZScpICovXG4gIEBJbnB1dCgpIHNldCBjbG9zYWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuY2xvc2VhYmxlID0gdmFsdWU7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldENsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbJ2ZyLWFsZXJ0J107XG4gICAgaWYgKHRoaXMuc2V2ZXJpdHkgPT09IERzZnJTZXZlcml0eUNvbnN0LkVSUk9SKSBjbGFzc2VzLnB1c2goJ2ZyLWFsZXJ0LS1lcnJvcicpO1xuICAgIGlmICh0aGlzLnNldmVyaXR5ID09PSBEc2ZyU2V2ZXJpdHlDb25zdC5TVUNDRVNTKSBjbGFzc2VzLnB1c2goJ2ZyLWFsZXJ0LS1zdWNjZXNzJyk7XG4gICAgaWYgKHRoaXMuc2V2ZXJpdHkgPT09IERzZnJTZXZlcml0eUNvbnN0LklORk8pIGNsYXNzZXMucHVzaCgnZnItYWxlcnQtLWluZm8nKTtcbiAgICBpZiAodGhpcy5zZXZlcml0eSA9PT0gRHNmclNldmVyaXR5Q29uc3QuV0FSTklORykgY2xhc3Nlcy5wdXNoKCdmci1hbGVydC0td2FybmluZycpO1xuICAgIGlmICh0aGlzLnNpemUgPT09IERzZnJTaXplQ29uc3QuU00pIGNsYXNzZXMucHVzaCgnZnItYWxlcnQtLXNtJyk7XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGlzU21hbGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PSBEc2ZyU2l6ZUNvbnN0LlNNO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvbkNsb3NlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ/LnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgdGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmNlYWwuZW1pdCgpO1xuICB9XG59XG4iLCI8ZGl2IFthdHRyLnJvbGVdPVwiaGFzQXJpYVJvbGUgPyBhcmlhUm9sZVZhbHVlIDogbnVsbFwiIFtuZ0NsYXNzXT1cImdldENsYXNzZXMoKVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGluZ1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDxwPnt7IG1lc3NhZ2UgfX08L3A+XG4gIDxidXR0b25cbiAgICAqbmdJZj1cImNsb3NhYmxlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cImZyLWJ0bi0tY2xvc2UgZnItYnRuXCJcbiAgICBbdGl0bGVdPVwiY2xvc2VDb250cm9sTGFiZWxcIlxuICAgIChjbGljayk9XCJvbkNsb3NlKCRldmVudClcIj5cbiAgICB7eyBjbG9zZUNvbnRyb2xMYWJlbCB9fVxuICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48IS0tIFRlbXBsYXRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cbjxuZy10ZW1wbGF0ZSAjaGVhZGluZ1RlbXBsYXRlPlxuICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJoZWFkaW5nTGV2ZWxcIj5cbiAgICA8aDIgKm5nU3dpdGNoQ2FzZT1cIidIMidcIiBjbGFzcz1cImZyLWFsZXJ0X190aXRsZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdQcm9wVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2gyPlxuICAgIDxoMyAqbmdTd2l0Y2hDYXNlPVwiJ0gzJ1wiIGNsYXNzPVwiZnItYWxlcnRfX3RpdGxlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGluZ1Byb3BUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvaDM+XG4gICAgPGg0ICpuZ1N3aXRjaENhc2U9XCInSDQnXCIgY2xhc3M9XCJmci1hbGVydF9fdGl0bGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkaW5nUHJvcFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9oND5cbiAgICA8aDUgKm5nU3dpdGNoQ2FzZT1cIidINSdcIiBjbGFzcz1cImZyLWFsZXJ0X190aXRsZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdQcm9wVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2g1PlxuICAgIDxoNiAqbmdTd2l0Y2hDYXNlPVwiJ0g2J1wiIGNsYXNzPVwiZnItYWxlcnRfX3RpdGxlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGluZ1Byb3BUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvaDY+XG4gICAgPHAgKm5nU3dpdGNoRGVmYXVsdCBjbGFzcz1cImZyLWFsZXJ0X190aXRsZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRpbmdQcm9wVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L3A+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNoZWFkaW5nUHJvcFRlbXBsYXRlPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGluZzsgZWxzZSBoZWFkaW5nQ29udGVudFRlbXBsYXRlXCI+PHNwYW4gb3V0ZXJIVE1MPVwie3sgaGVhZGluZyB9fVwiPjwvc3Bhbj48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaGVhZGluZ0NvbnRlbnRUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==