@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).
120 lines • 20.8 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Inject, Input, Output, ViewEncapsulation } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { DsfrFormRadioRichComponent } from '../../forms/form-radio-rich';
import { DsfrI18nPipe, LocalStorage, StorageEnum, isOnBrowser } from '../../shared';
import { DSFR_CONFIG_TOKEN } from '../../shared/config/config-token';
import * as i0 from "@angular/core";
import * as i1 from "../../shared";
import * as i2 from "@angular/forms";
export const DISPLAY_MODAL_ID = 'theme-modal-id';
export class DsfrDisplayComponent {
/** @internal */
constructor(config, i18n, elementRef) {
this.config = config;
this.i18n = i18n;
this.elementRef = elementRef;
/**
* l'identifiant de la modale portant les paramètres d'affichage.
*/
this.displayId = DISPLAY_MODAL_ID;
/**
* Événement émis lorsque le thème change avec la valeur du nouveau thème : `light`, `dark` ou `system`.
*/
this.displayChange = new EventEmitter();
/** @internal */
this.themes = [
{
value: 'light',
label: this.i18n.t('display.light.label'),
link: '/pictograms/environment/sun.svg',
deprecatedLink: '/sun.svg',
},
{
value: 'dark',
label: this.i18n.t('display.dark.label'),
link: '/pictograms/environment/moon.svg',
deprecatedLink: '/moon.svg',
},
{
value: 'system',
label: this.i18n.t('display.system.label'),
hint: this.i18n.t('display.system.hint'),
link: '/pictograms/system/system.svg',
deprecatedLink: '/system.svg',
},
];
this._useDeprecatedLink = false;
}
get pictoPath() {
return this.artworkDirPath;
}
/**
* Chemin des pictogrammes (du composant display) renseigné par le développeur.
*
* Note: ce chemin doit permettre de récupérer directement les fichiers SVG suivants : moon.svg, sun.svg, system.svg
*
* @deprecated Use `artworkDirPath` instead.
*/
set pictoPath(path) {
this.artworkDirPath = path;
this._useDeprecatedLink = true;
}
ngOnInit() {
this.initDisplayTheme();
if (this.artworkDirPath === undefined) {
this.artworkDirPath = this.config.artworkDirPath;
}
for (let theme of this.themes) {
theme.artworkFilePath = this.buildSvgPath(theme);
}
}
/** @internal */
onChange() {
this.setHtmlSchemeAttribute(this.currentTheme);
this.displayChange.emit(this.currentTheme);
}
/** @internal */
buildSvgPath(theme) {
return this.artworkDirPath + (this._useDeprecatedLink ? theme.deprecatedLink : theme.link);
}
initDisplayTheme() {
if (!isOnBrowser())
return;
// Si l’utilisateur effectue une modification, son choix est conservé (dans le local storage) pour les visites ultérieures.
let savedTheme = LocalStorage.get(StorageEnum.SCHEME);
if (savedTheme) {
this.setHtmlSchemeAttribute(savedTheme);
}
// Sinon on prend le theme de la balise HTML
else {
const nativeElt = this.elementRef?.nativeElement;
const html = nativeElt?.ownerDocument?.documentElement;
savedTheme = html?.getAttribute('data-fr-scheme');
}
this.currentTheme = savedTheme || 'system';
}
setHtmlSchemeAttribute(value) {
const nativeElt = this.elementRef?.nativeElement;
const html = nativeElt?.ownerDocument?.documentElement;
html?.setAttribute('data-fr-scheme', value);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDisplayComponent, deps: [{ token: DSFR_CONFIG_TOKEN }, { token: i1.DsfrI18nService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DsfrDisplayComponent, isStandalone: true, selector: "dsfr-display", inputs: { displayId: "displayId", artworkDirPath: "artworkDirPath", pictoPath: "pictoPath" }, outputs: { displayChange: "displayChange" }, ngImport: i0, template: "<dialog [id]=\"displayId\" class=\"fr-modal\" role=\"dialog\" [attr.aria-labelledby]=\"displayId + '-title'\">\n <div class=\"fr-container fr-container--fluid fr-container-md\">\n <div class=\"fr-grid-row fr-grid-row--center\">\n <div class=\"fr-col-12 fr-col-md-6 fr-col-lg-4\">\n <div class=\"fr-modal__body\">\n <div class=\"fr-modal__header\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"displayId\"\n [title]=\"'commons.close' | dsfrI18n\">\n {{ 'commons.close' | dsfrI18n }}\n </button>\n </div>\n <div class=\"fr-modal__content\">\n <h1 [id]=\"displayId + '-title'\" class=\"fr-modal__title\">{{ 'display.heading' | dsfrI18n }}</h1>\n <dsfr-form-radio-rich\n [inputId]=\"displayId + '-fieldset'\"\n legend=\" {{ 'display.hint' | dsfrI18n }}\"\n [name]=\"displayId + '-options'\"\n [options]=\"themes\"\n [legendRegular]=\"true\"\n [required]=\"true\"\n (change)=\"onChange()\"\n [(ngModel)]=\"currentTheme\">\n </dsfr-form-radio-rich>\n </div>\n </div>\n </div>\n </div>\n </div>\n</dialog>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }, { kind: "component", type: DsfrFormRadioRichComponent, selector: "dsfr-form-radio-rich", inputs: ["options", "message", "messageSeverity", "radioRich"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrDisplayComponent, decorators: [{
type: Component,
args: [{ selector: 'dsfr-display', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, FormsModule, DsfrI18nPipe, DsfrFormRadioRichComponent], template: "<dialog [id]=\"displayId\" class=\"fr-modal\" role=\"dialog\" [attr.aria-labelledby]=\"displayId + '-title'\">\n <div class=\"fr-container fr-container--fluid fr-container-md\">\n <div class=\"fr-grid-row fr-grid-row--center\">\n <div class=\"fr-col-12 fr-col-md-6 fr-col-lg-4\">\n <div class=\"fr-modal__body\">\n <div class=\"fr-modal__header\">\n <button\n type=\"button\"\n class=\"fr-btn--close fr-btn\"\n [attr.aria-controls]=\"displayId\"\n [title]=\"'commons.close' | dsfrI18n\">\n {{ 'commons.close' | dsfrI18n }}\n </button>\n </div>\n <div class=\"fr-modal__content\">\n <h1 [id]=\"displayId + '-title'\" class=\"fr-modal__title\">{{ 'display.heading' | dsfrI18n }}</h1>\n <dsfr-form-radio-rich\n [inputId]=\"displayId + '-fieldset'\"\n legend=\" {{ 'display.hint' | dsfrI18n }}\"\n [name]=\"displayId + '-options'\"\n [options]=\"themes\"\n [legendRegular]=\"true\"\n [required]=\"true\"\n (change)=\"onChange()\"\n [(ngModel)]=\"currentTheme\">\n </dsfr-form-radio-rich>\n </div>\n </div>\n </div>\n </div>\n </div>\n</dialog>\n" }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [DSFR_CONFIG_TOKEN]
}] }, { type: i1.DsfrI18nService }, { type: i0.ElementRef }], propDecorators: { displayId: [{
type: Input
}], artworkDirPath: [{
type: Input
}], displayChange: [{
type: Output
}], pictoPath: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBbUIsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDckcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7QUFHckUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7QUFXakQsTUFBTSxPQUFPLG9CQUFvQjtJQWtEL0IsZ0JBQWdCO0lBQ2hCLFlBQ3FDLE1BQWtCLEVBQzlDLElBQXFCLEVBQ3BCLFVBQXNCO1FBRkssV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUM5QyxTQUFJLEdBQUosSUFBSSxDQUFpQjtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBckRoQzs7V0FFRztRQUNNLGNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztRQU90Qzs7V0FFRztRQUNPLGtCQUFhLEdB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SUFFTyxzQkFBc0IsQ0FBQyxLQUFtQjtRQUNoRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQztRQUNqRCxNQUFNLElBQUksR0FBRyxTQUFTLEVBQUUsYUFBYSxFQUFFLGVBQWUsQ0FBQztRQUN2RCxJQUFJLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7K0dBdEhVLG9CQUFvQixrQkFvRHJCLGlCQUFpQjttR0FwRGhCLG9CQUFvQixtTkNuQmpDLHV6Q0FnQ0EsMkNEZlksWUFBWSw4QkFBRSxXQUFXLHVqQkFBRSxZQUFZLGlEQUFFLDBCQUEwQjs7NEZBRWxFLG9CQUFvQjtrQkFQaEMsU0FBUzsrQkFDRSxjQUFjLGlCQUVULGlCQUFpQixDQUFDLElBQUksY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsMEJBQTBCLENBQUM7OzBCQXNEM0UsTUFBTTsyQkFBQyxpQkFBaUI7Z0dBaERsQixTQUFTO3NCQUFqQixLQUFLO2dCQUtHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFzRE0sU0FBUztzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERzZnJGb3JtUmFkaW9SaWNoQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZm9ybXMvZm9ybS1yYWRpby1yaWNoJztcbmltcG9ydCB7IERzZnJJMThuUGlwZSwgRHNmckkxOG5TZXJ2aWNlLCBMb2NhbFN0b3JhZ2UsIFN0b3JhZ2VFbnVtLCBpc09uQnJvd3NlciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBEU0ZSX0NPTkZJR19UT0tFTiB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25maWcvY29uZmlnLXRva2VuJztcbmltcG9ydCB7IERzZnJDb25maWcgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uZmlnL2NvbmZpZy5tb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBESVNQTEFZX01PREFMX0lEID0gJ3RoZW1lLW1vZGFsLWlkJztcblxudHlwZSBEaXNwbGF5VGhlbWUgPSAnbGlnaHQnIHwgJ2RhcmsnIHwgJ3N5c3RlbSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItZGlzcGxheScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kaXNwbGF5LmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIERzZnJJMThuUGlwZSwgRHNmckZvcm1SYWRpb1JpY2hDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyRGlzcGxheUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBsJ2lkZW50aWZpYW50IGRlIGxhIG1vZGFsZSBwb3J0YW50IGxlcyBwYXJhbcOodHJlcyBkJ2FmZmljaGFnZS5cbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlJZCA9IERJU1BMQVlfTU9EQUxfSUQ7XG5cbiAgLyoqXG4gICAqIENoZW1pbiB2ZXJzIGxlIHLDqXBlcnRvaXJlIGV4cG9zYW50IGxlcyBwaWN0b2dyYW1tZXMgaWxsdXN0cmF0aWZzIERTRlIuXG4gICAqL1xuICBASW5wdXQoKSBhcnR3b3JrRGlyUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiDDiXbDqW5lbWVudCDDqW1pcyBsb3JzcXVlIGxlIHRow6htZSBjaGFuZ2UgYXZlYyBsYSB2YWxldXIgZHUgbm91dmVhdSB0aMOobWUgOiBgbGlnaHRgLCBgZGFya2Agb3UgYHN5c3RlbWAuXG4gICAqL1xuICBAT3V0cHV0KCkgZGlzcGxheUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBUaMOobWUgY291cmFudCBkdSBjb21wb3NhbnQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY3VycmVudFRoZW1lOiBEaXNwbGF5VGhlbWU7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICB0aGVtZXM6IGFueVtdID0gW1xuICAgIHtcbiAgICAgIHZhbHVlOiAnbGlnaHQnLFxuICAgICAgbGFiZWw6IHRoaXMuaTE4bi50KCdkaXNwbGF5LmxpZ2h0LmxhYmVsJyksXG4gICAgICBsaW5rOiAnL3BpY3RvZ3JhbXMvZW52aXJvbm1lbnQvc3VuLnN2ZycsXG4gICAgICBkZXByZWNhdGVkTGluazogJy9zdW4uc3ZnJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnZGFyaycsXG4gICAgICBsYWJlbDogdGhpcy5pMThuLnQoJ2Rpc3BsYXkuZGFyay5sYWJlbCcpLFxuICAgICAgbGluazogJy9waWN0b2dyYW1zL2Vudmlyb25tZW50L21vb24uc3ZnJyxcbiAgICAgIGRlcHJlY2F0ZWRMaW5rOiAnL21vb24uc3ZnJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnc3lzdGVtJyxcbiAgICAgIGxhYmVsOiB0aGlzLmkxOG4udCgnZGlzcGxheS5zeXN0ZW0ubGFiZWwnKSxcbiAgICAgIGhpbnQ6IHRoaXMuaTE4bi50KCdkaXNwbGF5LnN5c3RlbS5oaW50JyksXG4gICAgICBsaW5rOiAnL3BpY3RvZ3JhbXMvc3lzdGVtL3N5c3RlbS5zdmcnLFxuICAgICAgZGVwcmVjYXRlZExpbms6ICcvc3lzdGVtLnN2ZycsXG4gICAgfSxcbiAgXTtcblxuICAvKiogQGludGVybmFsICovIF9zdmdSb290UGF0aDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX3VzZURlcHJlY2F0ZWRMaW5rID0gZmFsc2U7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERTRlJfQ09ORklHX1RPS0VOKSBwcml2YXRlIGNvbmZpZzogRHNmckNvbmZpZyxcbiAgICBwdWJsaWMgaTE4bjogRHNmckkxOG5TZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgKSB7fVxuXG4gIGdldCBwaWN0b1BhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcnR3b3JrRGlyUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVtaW4gZGVzIHBpY3RvZ3JhbW1lcyAoZHUgY29tcG9zYW50IGRpc3BsYXkpIHJlbnNlaWduw6kgcGFyIGxlIGTDqXZlbG9wcGV1ci5cbiAgICpcbiAgICogTm90ZTogY2UgY2hlbWluIGRvaXQgcGVybWV0dHJlIGRlIHLDqWN1cMOpcmVyIGRpcmVjdGVtZW50IGxlcyBmaWNoaWVycyBTVkcgc3VpdmFudHMgOiBtb29uLnN2Zywgc3VuLnN2Zywgc3lzdGVtLnN2Z1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGFydHdvcmtEaXJQYXRoYCBpbnN0ZWFkLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHBpY3RvUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFydHdvcmtEaXJQYXRoID0gcGF0aDtcbiAgICB0aGlzLl91c2VEZXByZWNhdGVkTGluayA9IHRydWU7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXREaXNwbGF5VGhlbWUoKTtcbiAgICBpZiAodGhpcy5hcnR3b3JrRGlyUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFydHdvcmtEaXJQYXRoID0gdGhpcy5jb25maWcuYXJ0d29ya0RpclBhdGg7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgdGhlbWUgb2YgdGhpcy50aGVtZXMpIHtcbiAgICAgIHRoZW1lLmFydHdvcmtGaWxlUGF0aCA9IHRoaXMuYnVpbGRTdmdQYXRoKHRoZW1lKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG9uQ2hhbmdlKCkge1xuICAgIHRoaXMuc2V0SHRtbFNjaGVtZUF0dHJpYnV0ZSh0aGlzLmN1cnJlbnRUaGVtZSk7XG4gICAgdGhpcy5kaXNwbGF5Q2hhbmdlLmVtaXQodGhpcy5jdXJyZW50VGhlbWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBidWlsZFN2Z1BhdGgodGhlbWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmFydHdvcmtEaXJQYXRoICsgKHRoaXMuX3VzZURlcHJlY2F0ZWRMaW5rID8gdGhlbWUuZGVwcmVjYXRlZExpbmsgOiB0aGVtZS5saW5rKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERpc3BsYXlUaGVtZSgpOiB2b2lkIHtcbiAgICBpZiAoIWlzT25Ccm93c2VyKCkpIHJldHVybjtcblxuICAgIC8vIFNpIGzigJl1dGlsaXNhdGV1ciBlZmZlY3R1ZSB1bmUgbW9kaWZpY2F0aW9uLCBzb24gY2hvaXggZXN0IGNvbnNlcnbDqSAoZGFucyBsZSBsb2NhbCBzdG9yYWdlKSBwb3VyIGxlcyB2aXNpdGVzIHVsdMOpcmlldXJlcy5cbiAgICBsZXQgc2F2ZWRUaGVtZSA9IDxEaXNwbGF5VGhlbWU+TG9jYWxTdG9yYWdlLmdldChTdG9yYWdlRW51bS5TQ0hFTUUpO1xuICAgIGlmIChzYXZlZFRoZW1lKSB7XG4gICAgICB0aGlzLnNldEh0bWxTY2hlbWVBdHRyaWJ1dGUoc2F2ZWRUaGVtZSk7XG4gICAgfVxuXG4gICAgLy8gU2lub24gb24gcHJlbmQgbGUgdGhlbWUgZGUgbGEgYmFsaXNlIEhUTUxcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IG5hdGl2ZUVsdCA9IHRoaXMuZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGh0bWwgPSBuYXRpdmVFbHQ/Lm93bmVyRG9jdW1lbnQ/LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIHNhdmVkVGhlbWUgPSBodG1sPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZnItc2NoZW1lJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50VGhlbWUgPSBzYXZlZFRoZW1lIHx8ICdzeXN0ZW0nO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIdG1sU2NoZW1lQXR0cmlidXRlKHZhbHVlOiBEaXNwbGF5VGhlbWUpIHtcbiAgICBjb25zdCBuYXRpdmVFbHQgPSB0aGlzLmVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaHRtbCA9IG5hdGl2ZUVsdD8ub3duZXJEb2N1bWVudD8uZG9jdW1lbnRFbGVtZW50O1xuICAgIGh0bWw/LnNldEF0dHJpYnV0ZSgnZGF0YS1mci1zY2hlbWUnLCB2YWx1ZSk7XG4gIH1cbn1cbiIsIjxkaWFsb2cgW2lkXT1cImRpc3BsYXlJZFwiIGNsYXNzPVwiZnItbW9kYWxcIiByb2xlPVwiZGlhbG9nXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImRpc3BsYXlJZCArICctdGl0bGUnXCI+XG4gIDxkaXYgY2xhc3M9XCJmci1jb250YWluZXIgZnItY29udGFpbmVyLS1mbHVpZCBmci1jb250YWluZXItbWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZnItZ3JpZC1yb3cgZnItZ3JpZC1yb3ctLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZyLWNvbC0xMiBmci1jb2wtbWQtNiBmci1jb2wtbGctNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnItbW9kYWxfX2JvZHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItbW9kYWxfX2hlYWRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmci1idG4tLWNsb3NlIGZyLWJ0blwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiZGlzcGxheUlkXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidjb21tb25zLmNsb3NlJyB8IGRzZnJJMThuXCI+XG4gICAgICAgICAgICAgIHt7ICdjb21tb25zLmNsb3NlJyB8IGRzZnJJMThuIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnItbW9kYWxfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgIDxoMSBbaWRdPVwiZGlzcGxheUlkICsgJy10aXRsZSdcIiBjbGFzcz1cImZyLW1vZGFsX190aXRsZVwiPnt7ICdkaXNwbGF5LmhlYWRpbmcnIHwgZHNmckkxOG4gfX08L2gxPlxuICAgICAgICAgICAgPGRzZnItZm9ybS1yYWRpby1yaWNoXG4gICAgICAgICAgICAgIFtpbnB1dElkXT1cImRpc3BsYXlJZCArICctZmllbGRzZXQnXCJcbiAgICAgICAgICAgICAgbGVnZW5kPVwiIHt7ICdkaXNwbGF5LmhpbnQnIHwgZHNmckkxOG4gfX1cIlxuICAgICAgICAgICAgICBbbmFtZV09XCJkaXNwbGF5SWQgKyAnLW9wdGlvbnMnXCJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwidGhlbWVzXCJcbiAgICAgICAgICAgICAgW2xlZ2VuZFJlZ3VsYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgpXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50VGhlbWVcIj5cbiAgICAgICAgICAgIDwvZHNmci1mb3JtLXJhZGlvLXJpY2g+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaWFsb2c+XG4iXX0=