@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).
75 lines • 15.3 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, inject, Input, Output, Renderer2, ViewChild, ViewEncapsulation, } from '@angular/core';
import { DsfrHeadingLevelConst, HeadingComponent, newUniqueId } from '../../shared';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class DsfrAccordionComponent {
constructor() {
/**
* Indique si l'accordéon doit être ouvert initialement.
*/
this.expanded = false;
/**
* Le niveau du titre dans la structure, ne change pas l'apparence, `<h3>` par défaut.
*/
this.headingLevel = DsfrHeadingLevelConst.H3;
/**
* Événement présentant le nouvel état de l'accordéon.
*/
this.expandedChange = new EventEmitter();
this._unlisten = [];
this.renderer2 = inject(Renderer2);
}
ngOnInit() {
this.accordionId = newUniqueId();
}
/**
* Ecouter les events scripts dsfr conceal/disclose sur l'accordéon
*/
ngAfterViewInit() {
this._unlisten.push(this.renderer2.listen(this.accordion.nativeElement, 'dsfr.conceal', (e) => {
// requestAnimationFrame > permet d'améliorer la cohabitation avec l'instrumentation DSFR (le cas échéant)
// cf. https://github.com/GouvernementFR/dsfr/issues/1099
window.requestAnimationFrame(() => {
if (this.expanded && e.target === this.accordion.nativeElement) {
this.expanded = false;
this.expandedChange.emit(this.expanded);
}
});
}), this.renderer2.listen(this.accordion.nativeElement, 'dsfr.disclose', (e) => {
window.requestAnimationFrame(() => {
if (!this.expanded && e.target === this.accordion.nativeElement) {
this.expanded = true;
this.expandedChange.emit(this.expanded);
}
});
}));
}
ngOnDestroy() {
this._unlisten.forEach((unlistenFunc) => unlistenFunc());
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrAccordionComponent, isStandalone: true, selector: "dsfr-accordion", inputs: { content: "content", expanded: "expanded", heading: "heading", headingLevel: "headingLevel", index: "index", headingAriaLabel: "headingAriaLabel" }, outputs: { expandedChange: "expandedChange" }, viewQueries: [{ propertyName: "accordion", first: true, predicate: ["dsfrAccordion"], descendants: true }], ngImport: i0, template: "<section class=\"fr-accordion\">\n <!-- Titre obligatoire -->\n <edu-heading [level]=\"headingLevel\" defaultLevel=\"H3\" customClass=\"fr-accordion__title\">\n <ng-container *ngTemplateOutlet=\"accordionButton\"></ng-container>\n </edu-heading>\n\n <div #dsfrAccordion class=\"fr-collapse\" [id]=\"accordionId\">\n <!-- La propri\u00E9t\u00E9 content est prioritaire sur le slot -->\n @if (content) {\n {{ content }}\n } @else {\n <ng-content></ng-content>\n <!-- TODO @deprecated \u00E0 supprimer en v2 au profit du slot par d\u00E9faut -->\n <ng-content select=\"[content]\"></ng-content>\n <!-- TODO @deprecated \u00E0 supprimer en v2 au profit du slot par d\u00E9faut -->\n <ng-content select=\"[body]\"></ng-content>\n }\n </div>\n</section>\n\n<ng-template #accordionButton>\n <button\n type=\"button\"\n class=\"fr-accordion__btn\"\n [attr.aria-expanded]=\"expanded\"\n [attr.aria-controls]=\"accordionId\"\n [attr.aria-label]=\"headingAriaLabel\">\n <!-- La propri\u00E9t\u00E9 heading est prioritaire sur le slot de m\u00EAme nom -->\n @if (heading) {\n {{ heading }}\n } @else {\n <ng-content select=\"[heading]\"></ng-content>\n }\n </button>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: HeadingComponent, selector: "edu-heading", inputs: ["customClass", "heading", "headingId", "level", "defaultLevel"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrAccordionComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-accordion', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, HeadingComponent], template: "<section class=\"fr-accordion\">\n <!-- Titre obligatoire -->\n <edu-heading [level]=\"headingLevel\" defaultLevel=\"H3\" customClass=\"fr-accordion__title\">\n <ng-container *ngTemplateOutlet=\"accordionButton\"></ng-container>\n </edu-heading>\n\n <div #dsfrAccordion class=\"fr-collapse\" [id]=\"accordionId\">\n <!-- La propri\u00E9t\u00E9 content est prioritaire sur le slot -->\n @if (content) {\n {{ content }}\n } @else {\n <ng-content></ng-content>\n <!-- TODO @deprecated \u00E0 supprimer en v2 au profit du slot par d\u00E9faut -->\n <ng-content select=\"[content]\"></ng-content>\n <!-- TODO @deprecated \u00E0 supprimer en v2 au profit du slot par d\u00E9faut -->\n <ng-content select=\"[body]\"></ng-content>\n }\n </div>\n</section>\n\n<ng-template #accordionButton>\n <button\n type=\"button\"\n class=\"fr-accordion__btn\"\n [attr.aria-expanded]=\"expanded\"\n [attr.aria-controls]=\"accordionId\"\n [attr.aria-label]=\"headingAriaLabel\">\n <!-- La propri\u00E9t\u00E9 heading est prioritaire sur le slot de m\u00EAme nom -->\n @if (heading) {\n {{ heading }}\n } @else {\n <ng-content select=\"[heading]\"></ng-content>\n }\n </button>\n</ng-template>\n" }]
}], propDecorators: { content: [{
type: Input
}], expanded: [{
type: Input
}], heading: [{
type: Input
}], headingLevel: [{
type: Input
}], index: [{
type: Input
}], headingAriaLabel: [{
type: Input
}], expandedChange: [{
type: Output
}], accordion: [{
type: ViewChild,
args: ['dsfrAccordion']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2FjY29yZGlvbi9hY2NvcmRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYWNjb3JkaW9uL2FjY29yZGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFvQixxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7OztBQVN0RyxNQUFNLE9BQU8sc0JBQXNCO0lBUG5DO1FBYUU7O1dBRUc7UUFDTSxhQUFRLEdBQVksS0FBSyxDQUFDO1FBT25DOztXQUVHO1FBQ00saUJBQVksR0FBcUIscUJBQXFCLENBQUMsRUFBRSxDQUFDO1FBY25FOztXQUVHO1FBQ08sbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBUS9DLGNBQVMsR0FBbUIsRUFBRSxDQUFDO1FBQy9CLGNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7S0FtQ3ZDO0lBakNDLFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBYyxFQUFFLEVBQUU7WUFDckYsMEdBQTBHO1lBQzFHLHlEQUF5RDtZQUN6RCxNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFO2dCQUNoQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUMvRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztvQkFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFjLEVBQUUsRUFBRTtZQUN0RixNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO29CQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7K0dBL0VVLHNCQUFzQjttR0FBdEIsc0JBQXNCLG1ZQ3hCbkMsK3VDQW1DQSwyQ0RiWSxZQUFZLHNNQUFFLGdCQUFnQjs7NEZBRTdCLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxnQkFBZ0IsaUJBRVgsaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7OEJBTWhDLE9BQU87c0JBQWYsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQU9HLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0ksY0FBYztzQkFBdkIsTUFBTTtnQkFHcUIsU0FBUztzQkFBcEMsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHNmckhlYWRpbmdMZXZlbCwgRHNmckhlYWRpbmdMZXZlbENvbnN0LCBIZWFkaW5nQ29tcG9uZW50LCBuZXdVbmlxdWVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItYWNjb3JkaW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FjY29yZGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEhlYWRpbmdDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyQWNjb3JkaW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogQ29udGVudSBkZSBsJ2FjY29yZMOpb24sIHRleHRlIHNpbXBsZS4gUHJpb3JpdGFpcmUgc3VyIGxlIHNsb3QgcGFyIGTDqWZhdXQuXG4gICAqL1xuICBASW5wdXQoKSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGlxdWUgc2kgbCdhY2NvcmTDqW9uIGRvaXQgw6p0cmUgb3V2ZXJ0IGluaXRpYWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIExlIHRpdHJlIGRlIGwnYWNjb3Jkw6lvbiBlc3QgZHUgdGV4dGUgc2ltcGxlLiBVdGlsaXNlciBsZSBzbG90IFtoZWFkaW5nXSBzaW5vbi5cbiAgICovXG4gIEBJbnB1dCgpIGhlYWRpbmc6IHN0cmluZztcblxuICAvKipcbiAgICogTGUgbml2ZWF1IGR1IHRpdHJlIGRhbnMgbGEgc3RydWN0dXJlLCBuZSBjaGFuZ2UgcGFzIGwnYXBwYXJlbmNlLCBgPGgzPmAgcGFyIGTDqWZhdXQuXG4gICAqL1xuICBASW5wdXQoKSBoZWFkaW5nTGV2ZWw6IERzZnJIZWFkaW5nTGV2ZWwgPSBEc2ZySGVhZGluZ0xldmVsQ29uc3QuSDM7XG5cbiAgLyoqXG4gICAqIEluZGV4IHF1aSBpZGVudGlmaWUgbCdhY2NvcmTDqW9uIHN1ciBsYSBwYWdlLiBJZGVudGlmaWFudCB1bmlxdWUgZ8OpbsOpcsOpIHBhciBkw6lmYXV0LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCAoc2luY2UgMS44LjApIGphbWFpcyB1dGlsaXPDqVxuICAgKi9cbiAgQElucHV0KCkgaW5kZXg6IHN0cmluZztcblxuICAvKipcbiAgICogQXR0cmlidXQgZCdhY2Nlc3NpYmlsaXTDqSBwb3VyIGwnZW50w6p0ZSBkZSBsJ2FjY29yZMOpb24uXG4gICAqL1xuICBASW5wdXQoKSBoZWFkaW5nQXJpYUxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIMOJdsOpbmVtZW50IHByw6lzZW50YW50IGxlIG5vdXZlbCDDqXRhdCBkZSBsJ2FjY29yZMOpb24uXG4gICAqL1xuICBAT3V0cHV0KCkgZXhwYW5kZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBAVmlld0NoaWxkKCdkc2ZyQWNjb3JkaW9uJykgYWNjb3JkaW9uOiBFbGVtZW50UmVmO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYWNjb3JkaW9uSWQ6IHN0cmluZztcblxuICBwcml2YXRlIF91bmxpc3RlbjogeyAoKTogdm9pZCB9W10gPSBbXTtcbiAgcHJpdmF0ZSByZW5kZXJlcjIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmFjY29yZGlvbklkID0gbmV3VW5pcXVlSWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFY291dGVyIGxlcyBldmVudHMgc2NyaXB0cyBkc2ZyIGNvbmNlYWwvZGlzY2xvc2Ugc3VyIGwnYWNjb3Jkw6lvblxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX3VubGlzdGVuLnB1c2goXG4gICAgICB0aGlzLnJlbmRlcmVyMi5saXN0ZW4odGhpcy5hY2NvcmRpb24ubmF0aXZlRWxlbWVudCwgJ2RzZnIuY29uY2VhbCcsIChlOiBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPiBwZXJtZXQgZCdhbcOpbGlvcmVyIGxhIGNvaGFiaXRhdGlvbiBhdmVjIGwnaW5zdHJ1bWVudGF0aW9uIERTRlIgKGxlIGNhcyDDqWNow6lhbnQpXG4gICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vR291dmVybmVtZW50RlIvZHNmci9pc3N1ZXMvMTA5OVxuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5leHBhbmRlZCAmJiBlLnRhcmdldCA9PT0gdGhpcy5hY2NvcmRpb24ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZENoYW5nZS5lbWl0KHRoaXMuZXhwYW5kZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLmFjY29yZGlvbi5uYXRpdmVFbGVtZW50LCAnZHNmci5kaXNjbG9zZScsIChlOiBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuZXhwYW5kZWQgJiYgZS50YXJnZXQgPT09IHRoaXMuYWNjb3JkaW9uLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZENoYW5nZS5lbWl0KHRoaXMuZXhwYW5kZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fdW5saXN0ZW4uZm9yRWFjaCgodW5saXN0ZW5GdW5jKSA9PiB1bmxpc3RlbkZ1bmMoKSk7XG4gIH1cbn1cbiIsIjxzZWN0aW9uIGNsYXNzPVwiZnItYWNjb3JkaW9uXCI+XG4gIDwhLS0gVGl0cmUgb2JsaWdhdG9pcmUgLS0+XG4gIDxlZHUtaGVhZGluZyBbbGV2ZWxdPVwiaGVhZGluZ0xldmVsXCIgZGVmYXVsdExldmVsPVwiSDNcIiBjdXN0b21DbGFzcz1cImZyLWFjY29yZGlvbl9fdGl0bGVcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWNjb3JkaW9uQnV0dG9uXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZWR1LWhlYWRpbmc+XG5cbiAgPGRpdiAjZHNmckFjY29yZGlvbiBjbGFzcz1cImZyLWNvbGxhcHNlXCIgW2lkXT1cImFjY29yZGlvbklkXCI+XG4gICAgPCEtLSBMYSBwcm9wcmnDqXTDqSBjb250ZW50IGVzdCBwcmlvcml0YWlyZSBzdXIgbGUgc2xvdCAtLT5cbiAgICBAaWYgKGNvbnRlbnQpIHtcbiAgICAgIHt7IGNvbnRlbnQgfX1cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwhLS0gVE9ETyBAZGVwcmVjYXRlZCDDoCBzdXBwcmltZXIgZW4gdjIgYXUgcHJvZml0IGR1IHNsb3QgcGFyIGTDqWZhdXQgLS0+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbY29udGVudF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8IS0tIFRPRE8gQGRlcHJlY2F0ZWQgw6Agc3VwcHJpbWVyIGVuIHYyIGF1IHByb2ZpdCBkdSBzbG90IHBhciBkw6lmYXV0IC0tPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2JvZHldXCI+PC9uZy1jb250ZW50PlxuICAgIH1cbiAgPC9kaXY+XG48L3NlY3Rpb24+XG5cbjxuZy10ZW1wbGF0ZSAjYWNjb3JkaW9uQnV0dG9uPlxuICA8YnV0dG9uXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJmci1hY2NvcmRpb25fX2J0blwiXG4gICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJleHBhbmRlZFwiXG4gICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJhY2NvcmRpb25JZFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJoZWFkaW5nQXJpYUxhYmVsXCI+XG4gICAgPCEtLSBMYSBwcm9wcmnDqXTDqSBoZWFkaW5nIGVzdCBwcmlvcml0YWlyZSBzdXIgbGUgc2xvdCBkZSBtw6ptZSBub20gLS0+XG4gICAgQGlmIChoZWFkaW5nKSB7XG4gICAgICB7eyBoZWFkaW5nIH19XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbaGVhZGluZ11cIj48L25nLWNvbnRlbnQ+XG4gICAgfVxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=