@firestitch/content 18.0.10 → 18.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,133 +1,148 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, inject } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, input, model, signal, } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { FsFormModule } from '@firestitch/form';
2
5
  import { FsMessage } from '@firestitch/message';
6
+ import { FsSkeletonModule } from '@firestitch/skeleton';
3
7
  import { FsTextEditorModule } from '@firestitch/text-editor';
4
- import { Subject } from 'rxjs';
5
- import { tap } from 'rxjs/operators';
6
- import { EditorType } from '../../../../enums';
7
8
  import { AngularSplitModule } from 'angular-split';
9
+ import { EMPTY, concat } from 'rxjs';
10
+ import { finalize, last, tap } from 'rxjs/operators';
11
+ import { EditorType } from '../../../../enums';
8
12
  import { EditorLabelComponent } from '../editor-label/editor-label.component';
9
- import { FormsModule } from '@angular/forms';
10
- import { FsFormModule } from '@firestitch/form';
11
- import { FsCommonModule } from '@firestitch/common';
12
- import { FsSkeletonModule } from '@firestitch/skeleton';
13
13
  import * as i0 from "@angular/core";
14
14
  import * as i1 from "angular-split";
15
15
  import * as i2 from "@firestitch/text-editor";
16
16
  import * as i3 from "@angular/forms";
17
17
  import * as i4 from "@firestitch/form";
18
- import * as i5 from "@firestitch/common";
19
- import * as i6 from "@firestitch/skeleton";
18
+ import * as i5 from "@firestitch/skeleton";
20
19
  export class EditorComponent {
21
- _cdRef = inject(ChangeDetectorRef);
22
- _message = inject(FsMessage);
23
- showHtml = false;
24
- showScss = false;
25
- showJs = false;
26
- showGlobalScss = false;
27
- html;
28
- scss;
29
- js;
30
- contentConfig;
31
- changed = new EventEmitter();
32
- focused = new EventEmitter();
33
- blured = new EventEmitter();
34
- changes = {};
20
+ showHtml = input(false);
21
+ showScss = input(false);
22
+ showJs = input(false);
23
+ showGlobalScss = input(false);
24
+ contentConfig = input();
25
+ // Two-way bound to the text editors, so each holds exactly what is on screen. Nothing sits
26
+ // between a keystroke and a save: the fsModelChange this replaced debounced every pane by
27
+ // 300 ms (its `debounce: 0` falls back to 300), so a quick Ctrl+S posted text without its
28
+ // last keystrokes (IEB-T292).
29
+ html = model();
30
+ scss = model();
31
+ js = model();
32
+ globalScss = signal(null);
33
+ contentStyle = signal(null);
34
+ focusedArea = signal(null);
35
+ saving = signal(false);
36
+ // A pane is changed when its text differs from what the server last confirmed. A pane
37
+ // cleared to '' counts; one typed back to its original text does not (IEB-T292).
38
+ changedTypes = computed(() => {
39
+ const saved = this._saved();
40
+ return Object.values(EditorType)
41
+ .filter((type) => type in saved && this.value(type) !== saved[type]);
42
+ });
43
+ hasChanges = computed(() => this.changedTypes().length !== 0);
35
44
  EditorType = EditorType;
36
- focusedArea;
37
- contentStyle;
38
- resizing = false;
39
- title;
40
45
  scssConfig;
41
46
  globalScssConfig;
42
47
  htmlConfig;
43
48
  jsConfig;
44
- _destroy$ = new Subject();
49
+ _saved = signal({});
50
+ _message = inject(FsMessage);
51
+ _destroyRef = inject(DestroyRef);
45
52
  ngOnInit() {
46
- this.initTextEditors();
47
- this.initGlobalContentStyle();
53
+ this._initTextEditors();
54
+ this._saved.set({
55
+ [EditorType.Html]: this.html() ?? '',
56
+ [EditorType.Scss]: this.scss() ?? '',
57
+ [EditorType.Js]: this.js() ?? '',
58
+ });
59
+ this._initGlobalContentStyle();
48
60
  }
49
- ngOnDestroy() {
50
- this._destroy$.next(null);
51
- this._destroy$.complete();
61
+ value(type) {
62
+ const panes = {
63
+ [EditorType.Html]: this.html,
64
+ [EditorType.Scss]: this.scss,
65
+ [EditorType.Js]: this.js,
66
+ [EditorType.GlobalScss]: this.globalScss,
67
+ };
68
+ return panes[type]() ?? '';
52
69
  }
53
- change(type, value) {
54
- this.changed.emit({ type, value });
55
- this.changes[type] = value;
70
+ /**
71
+ * Saves every changed pane, not just the one last focused, and records what was sent as
72
+ * the new baseline, so anything typed while the request is in flight stays changed. With
73
+ * nothing changed it sends nothing and shows no toast. Ctrl+S reaches this through fsForm's
74
+ * [submit], so it shares the Save button's gate (IEB-T292).
75
+ *
76
+ * `fields` maps a pane to its property on the record (html → content); `saveRecord` posts
77
+ * those properties.
78
+ */
79
+ save$(fields, saveRecord) {
80
+ const sent = Object.fromEntries(this.changedTypes().map((type) => [type, this.value(type)]));
81
+ const saves = [
82
+ this._saveRecord$(fields, sent, saveRecord),
83
+ this._saveGlobalScss$(sent),
84
+ ].filter((save) => !!save);
85
+ if (!saves.length) {
86
+ return EMPTY;
87
+ }
88
+ this.saving.set(true);
89
+ return concat(...saves)
90
+ .pipe(last(), tap(() => this._message.success('Saved Changes')), finalize(() => this.saving.set(false)));
56
91
  }
57
- get hasChanges() {
58
- return Object.keys(this.changes)
59
- .filter((name) => !!this.changes[name])
60
- .length !== 0;
92
+ _saveRecord$(fields, sent, saveRecord) {
93
+ const types = Object.keys(sent)
94
+ .filter((type) => fields[type]);
95
+ if (!types.length) {
96
+ return null;
97
+ }
98
+ return saveRecord(Object.fromEntries(types.map((type) => [fields[type], sent[type]])))
99
+ .pipe(tap(() => this._markSaved(types, sent)));
61
100
  }
62
- clearChange(type) {
63
- this.changes[type] = undefined;
64
- this._cdRef.markForCheck();
101
+ _saveGlobalScss$(sent) {
102
+ if (!(EditorType.GlobalScss in sent)) {
103
+ return null;
104
+ }
105
+ const contentStyle = { ...this.contentStyle(), scss: sent[EditorType.GlobalScss] };
106
+ return this.contentConfig().saveContentStyle(contentStyle)
107
+ .pipe(tap(() => {
108
+ this.contentStyle.set(contentStyle);
109
+ this._markSaved([EditorType.GlobalScss], sent);
110
+ }));
65
111
  }
66
- initTextEditors() {
67
- this.scssConfig = {
68
- tabSize: 2,
69
- language: 'scss',
70
- height: '100%',
71
- focus: () => {
72
- this._onFocus(EditorType.Scss);
73
- },
74
- blur: () => {
75
- this.blured.emit(EditorType.Scss);
76
- },
77
- };
78
- this.jsConfig = {
79
- tabSize: 2,
80
- language: 'js',
81
- height: '100%',
82
- focus: () => {
83
- this._onFocus(EditorType.Js);
84
- },
85
- blur: () => {
86
- this.blured.emit(EditorType.Js);
87
- },
88
- };
89
- this.htmlConfig = {
90
- tabSize: 2,
91
- language: 'html',
92
- height: '100%',
93
- focus: () => {
94
- this._onFocus(EditorType.Html);
95
- },
96
- blur: () => {
97
- this.blured.emit(EditorType.Html);
98
- },
99
- };
100
- this.globalScssConfig = {
112
+ _markSaved(types, sent) {
113
+ this._saved.update((saved) => ({
114
+ ...saved,
115
+ ...Object.fromEntries(types.map((type) => [type, sent[type]])),
116
+ }));
117
+ }
118
+ _initTextEditors() {
119
+ this.scssConfig = this._createTextEditorConfig(EditorType.Scss, 'scss');
120
+ this.jsConfig = this._createTextEditorConfig(EditorType.Js, 'js');
121
+ this.htmlConfig = this._createTextEditorConfig(EditorType.Html, 'html');
122
+ this.globalScssConfig = this._createTextEditorConfig(EditorType.GlobalScss, 'scss');
123
+ }
124
+ _createTextEditorConfig(type, language) {
125
+ return {
101
126
  tabSize: 2,
102
- language: 'scss',
127
+ language,
103
128
  height: '100%',
104
129
  focus: () => {
105
- this._onFocus(EditorType.GlobalScss);
106
- },
107
- blur: () => {
108
- this.blured.emit(EditorType.GlobalScss);
130
+ this.focusedArea.set(type);
109
131
  },
110
132
  };
111
133
  }
112
- initGlobalContentStyle() {
113
- this.contentConfig.loadContentStyle()
114
- .subscribe((contentStyle) => {
115
- this.contentStyle = contentStyle || {};
116
- this._cdRef.markForCheck();
117
- });
118
- }
119
- saveGlobalScss() {
120
- return this.contentConfig.saveContentStyle(this.contentStyle)
121
- .pipe(tap(() => {
122
- this._message.success('Saved Changes');
123
- }));
124
- }
125
- _onFocus(type) {
126
- this.focusedArea = type;
127
- this.focused.emit(type);
134
+ _initGlobalContentStyle() {
135
+ this.contentConfig().loadContentStyle()
136
+ .pipe(tap((contentStyle) => {
137
+ const scss = contentStyle?.scss ?? '';
138
+ this.contentStyle.set(contentStyle || {});
139
+ this.globalScss.set(scss);
140
+ this._saved.update((saved) => ({ ...saved, [EditorType.GlobalScss]: scss }));
141
+ }), takeUntilDestroyed(this._destroyRef))
142
+ .subscribe();
128
143
  }
129
144
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: EditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
130
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: EditorComponent, isStandalone: true, selector: "app-editor", inputs: { showHtml: "showHtml", showScss: "showScss", showJs: "showJs", showGlobalScss: "showGlobalScss", html: "html", scss: "scss", js: "js", contentConfig: "contentConfig" }, outputs: { changed: "changed", focused: "focused", blured: "blured" }, ngImport: i0, template: "<as-split [unit]=\"'percent'\" [gutterSize]=\"25\"> \n <as-split-area [size]=\"70\" [visible]=\"showHtml\" [order]=\"1\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changes.html !== undefined\"\n [focused]=\"focusedArea === 'html'\">\n HTML\n </app-editor-label>\n <fs-text-editor \n [(ngModel)]=\"html\" \n name=\"html\"\n [fsModelChangeOptions]=\"{ debounce: 0 }\"\n (fsModelChange)=\"change(EditorType.Html, $event)\"\n [config]=\"htmlConfig\">\n </fs-text-editor> \n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showScss\" [order]=\"2\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changes.scss !== undefined\"\n [focused]=\"focusedArea === 'scss'\">\n SCSS\n </app-editor-label>\n <fs-text-editor \n [(ngModel)]=\"scss\" \n name=\"scss\"\n [fsModelChangeOptions]=\"{ debounce: 0 }\"\n (fsModelChange)=\"change(EditorType.Scss, $event)\"\n [config]=\"scssConfig\">\n </fs-text-editor> \n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showJs\" [order]=\"3\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changes.js !== undefined\"\n [focused]=\"focusedArea === 'js'\">\n JS\n </app-editor-label>\n <fs-text-editor \n [(ngModel)]=\"js\" \n name=\"js\"\n [fsModelChangeOptions]=\"{ debounce: 0 }\"\n (fsModelChange)=\"change(EditorType.Js, $event)\"\n [config]=\"jsConfig\">\n </fs-text-editor> \n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showGlobalScss\" [order]=\"4\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changes.globalScss !== undefined\"\n [focused]=\"focusedArea === 'globalScss'\">\n Global SCSS\n </app-editor-label>\n <ng-container *fsSkeleton=\"contentStyle\">\n <fs-text-editor \n [(ngModel)]=\"contentStyle.scss\" \n name=\"globalScss\"\n [fsModelChangeOptions]=\"{ debounce: 300 }\"\n (fsModelChange)=\"change(EditorType.GlobalScss, $event)\"\n [config]=\"globalScssConfig\">\n </fs-text-editor> \n </ng-container> \n </div>\n </as-split-area>\n</as-split>\n", styles: [":host{display:block;flex:1;height:100%;min-height:0}as-split{height:100%}:host ::ng-deep .as-split-gutter{background-color:unset!important}.editor-container{height:100%;border-radius:5px;display:flex;flex-direction:column}.editor-container fs-text-editor{flex:1}\n"], dependencies: [{ kind: "ngmodule", type: AngularSplitModule }, { kind: "component", type: i1.SplitComponent, selector: "as-split", inputs: ["direction", "unit", "gutterSize", "gutterStep", "restrictMove", "useTransition", "disabled", "dir", "gutterDblClickDuration", "gutterClickDeltaPx", "gutterAriaLabel"], outputs: ["transitionEnd", "dragStart", "dragEnd", "gutterClick", "gutterDblClick"], exportAs: ["asSplit"] }, { kind: "directive", type: i1.SplitAreaDirective, selector: "as-split-area, [as-split-area]", inputs: ["order", "size", "minSize", "maxSize", "lockSize", "visible"], exportAs: ["asSplitArea"] }, { kind: "component", type: EditorLabelComponent, selector: "app-editor-label", inputs: ["changed", "focused"] }, { kind: "ngmodule", type: FsTextEditorModule }, { kind: "component", type: i2.FsTextEditorComponent, selector: "fs-text-editor", inputs: ["config", "scrollable"], outputs: ["ready", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i4.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "ngmodule", type: FsCommonModule }, { kind: "directive", type: i5.FsModelChangeDirective, selector: "[fsModelChange]", inputs: ["fsModelChangeOptions"], outputs: ["fsModelChange"] }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i6.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
145
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.7", type: EditorComponent, isStandalone: true, selector: "app-editor", inputs: { showHtml: { classPropertyName: "showHtml", publicName: "showHtml", isSignal: true, isRequired: false, transformFunction: null }, showScss: { classPropertyName: "showScss", publicName: "showScss", isSignal: true, isRequired: false, transformFunction: null }, showJs: { classPropertyName: "showJs", publicName: "showJs", isSignal: true, isRequired: false, transformFunction: null }, showGlobalScss: { classPropertyName: "showGlobalScss", publicName: "showGlobalScss", isSignal: true, isRequired: false, transformFunction: null }, contentConfig: { classPropertyName: "contentConfig", publicName: "contentConfig", isSignal: true, isRequired: false, transformFunction: null }, html: { classPropertyName: "html", publicName: "html", isSignal: true, isRequired: false, transformFunction: null }, scss: { classPropertyName: "scss", publicName: "scss", isSignal: true, isRequired: false, transformFunction: null }, js: { classPropertyName: "js", publicName: "js", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { html: "htmlChange", scss: "scssChange", js: "jsChange" }, ngImport: i0, template: "<as-split [unit]=\"'percent'\" [gutterSize]=\"25\">\n <as-split-area [size]=\"70\" [visible]=\"showHtml()\" [order]=\"1\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Html)\"\n [focused]=\"focusedArea() === EditorType.Html\">\n HTML\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"html\"\n name=\"html\"\n [config]=\"htmlConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showScss()\" [order]=\"2\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Scss)\"\n [focused]=\"focusedArea() === EditorType.Scss\">\n SCSS\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"scss\"\n name=\"scss\"\n [config]=\"scssConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showJs()\" [order]=\"3\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Js)\"\n [focused]=\"focusedArea() === EditorType.Js\">\n JS\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"js\"\n name=\"js\"\n [config]=\"jsConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showGlobalScss()\" [order]=\"4\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.GlobalScss)\"\n [focused]=\"focusedArea() === EditorType.GlobalScss\">\n Global SCSS\n </app-editor-label>\n <ng-container *fsSkeleton=\"contentStyle()\">\n <fs-text-editor\n [(ngModel)]=\"globalScss\"\n name=\"globalScss\"\n [config]=\"globalScssConfig\">\n </fs-text-editor>\n </ng-container>\n </div>\n </as-split-area>\n</as-split>\n", styles: [":host{display:block;flex:1;height:100%;min-height:0}as-split{height:100%}:host ::ng-deep .as-split-gutter{background-color:unset!important}.editor-container{height:100%;border-radius:5px;display:flex;flex-direction:column}.editor-container fs-text-editor{flex:1}\n"], dependencies: [{ kind: "ngmodule", type: AngularSplitModule }, { kind: "component", type: i1.SplitComponent, selector: "as-split", inputs: ["direction", "unit", "gutterSize", "gutterStep", "restrictMove", "useTransition", "disabled", "dir", "gutterDblClickDuration", "gutterClickDeltaPx", "gutterAriaLabel"], outputs: ["transitionEnd", "dragStart", "dragEnd", "gutterClick", "gutterDblClick"], exportAs: ["asSplit"] }, { kind: "directive", type: i1.SplitAreaDirective, selector: "as-split-area, [as-split-area]", inputs: ["order", "size", "minSize", "maxSize", "lockSize", "visible"], exportAs: ["asSplitArea"] }, { kind: "component", type: EditorLabelComponent, selector: "app-editor-label", inputs: ["changed", "focused"] }, { kind: "ngmodule", type: FsTextEditorModule }, { kind: "component", type: i2.FsTextEditorComponent, selector: "fs-text-editor", inputs: ["config", "scrollable"], outputs: ["ready", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i4.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i5.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
131
146
  }
132
147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: EditorComponent, decorators: [{
133
148
  type: Component,
@@ -137,30 +152,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
137
152
  FsTextEditorModule,
138
153
  FormsModule,
139
154
  FsFormModule,
140
- FsCommonModule,
141
155
  FsSkeletonModule,
142
- ], template: "<as-split [unit]=\"'percent'\" [gutterSize]=\"25\"> \n <as-split-area [size]=\"70\" [visible]=\"showHtml\" [order]=\"1\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changes.html !== undefined\"\n [focused]=\"focusedArea === 'html'\">\n HTML\n </app-editor-label>\n <fs-text-editor \n [(ngModel)]=\"html\" \n name=\"html\"\n [fsModelChangeOptions]=\"{ debounce: 0 }\"\n (fsModelChange)=\"change(EditorType.Html, $event)\"\n [config]=\"htmlConfig\">\n </fs-text-editor> \n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showScss\" [order]=\"2\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changes.scss !== undefined\"\n [focused]=\"focusedArea === 'scss'\">\n SCSS\n </app-editor-label>\n <fs-text-editor \n [(ngModel)]=\"scss\" \n name=\"scss\"\n [fsModelChangeOptions]=\"{ debounce: 0 }\"\n (fsModelChange)=\"change(EditorType.Scss, $event)\"\n [config]=\"scssConfig\">\n </fs-text-editor> \n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showJs\" [order]=\"3\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changes.js !== undefined\"\n [focused]=\"focusedArea === 'js'\">\n JS\n </app-editor-label>\n <fs-text-editor \n [(ngModel)]=\"js\" \n name=\"js\"\n [fsModelChangeOptions]=\"{ debounce: 0 }\"\n (fsModelChange)=\"change(EditorType.Js, $event)\"\n [config]=\"jsConfig\">\n </fs-text-editor> \n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showGlobalScss\" [order]=\"4\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changes.globalScss !== undefined\"\n [focused]=\"focusedArea === 'globalScss'\">\n Global SCSS\n </app-editor-label>\n <ng-container *fsSkeleton=\"contentStyle\">\n <fs-text-editor \n [(ngModel)]=\"contentStyle.scss\" \n name=\"globalScss\"\n [fsModelChangeOptions]=\"{ debounce: 300 }\"\n (fsModelChange)=\"change(EditorType.GlobalScss, $event)\"\n [config]=\"globalScssConfig\">\n </fs-text-editor> \n </ng-container> \n </div>\n </as-split-area>\n</as-split>\n", styles: [":host{display:block;flex:1;height:100%;min-height:0}as-split{height:100%}:host ::ng-deep .as-split-gutter{background-color:unset!important}.editor-container{height:100%;border-radius:5px;display:flex;flex-direction:column}.editor-container fs-text-editor{flex:1}\n"] }]
143
- }], propDecorators: { showHtml: [{
144
- type: Input
145
- }], showScss: [{
146
- type: Input
147
- }], showJs: [{
148
- type: Input
149
- }], showGlobalScss: [{
150
- type: Input
151
- }], html: [{
152
- type: Input
153
- }], scss: [{
154
- type: Input
155
- }], js: [{
156
- type: Input
157
- }], contentConfig: [{
158
- type: Input
159
- }], changed: [{
160
- type: Output
161
- }], focused: [{
162
- type: Output
163
- }], blured: [{
164
- type: Output
165
- }] } });
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc5SSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFzQixrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWpGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7O0FBbUJ4RCxNQUFNLE9BQU8sZUFBZTtJQUNsQixNQUFNLEdBQUcsTUFBTSxDQUFD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SUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFTyxRQUFRLENBQUMsSUFBSTtRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO3VHQWxJVSxlQUFlOzJGQUFmLGVBQWUsK1RDbkM1QixzNUVBb0VBLGlVRDFDUSxrQkFBa0Isc2tCQUNsQixvQkFBb0IsNEZBQ3BCLGtCQUFrQiwrS0FDbEIsV0FBVyw4VkFDWCxZQUFZLHlnQkFDWixjQUFjLGlMQUNkLGdCQUFnQjs7MkZBR1gsZUFBZTtrQkFoQjNCLFNBQVM7K0JBQ0ksWUFBWSxtQkFHTCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDTCxrQkFBa0I7d0JBQ2xCLG9CQUFvQjt3QkFDcEIsa0JBQWtCO3dCQUNsQixXQUFXO3dCQUNYLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ25COzhCQU9hLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxNQUFNO3NCQUFyQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBRVUsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLEVBQUU7c0JBQWpCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFFVyxPQUFPO3NCQUF2QixNQUFNO2dCQUNVLE9BQU87c0JBQXZCLE1BQU07Z0JBQ1UsTUFBTTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IEZzVGV4dEVkaXRvckNvbmZpZywgRnNUZXh0RWRpdG9yTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvdGV4dC1lZGl0b3InO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEVkaXRvclR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9lbnVtcyc7XG5pbXBvcnQgeyBGc0NvbnRlbnRDb25maWcgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFuZ3VsYXJTcGxpdE1vZHVsZSB9IGZyb20gJ2FuZ3VsYXItc3BsaXQnO1xuaW1wb3J0IHsgRWRpdG9yTGFiZWxDb21wb25lbnQgfSBmcm9tICcuLi9lZGl0b3ItbGFiZWwvZWRpdG9yLWxhYmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZzRm9ybU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2Zvcm0nO1xuaW1wb3J0IHsgRnNDb21tb25Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1lZGl0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2VkaXRvci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBBbmd1bGFyU3BsaXRNb2R1bGUsXG4gICAgICAgIEVkaXRvckxhYmVsQ29tcG9uZW50LFxuICAgICAgICBGc1RleHRFZGl0b3JNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBGc0Zvcm1Nb2R1bGUsXG4gICAgICAgIEZzQ29tbW9uTW9kdWxlLFxuICAgICAgICBGc1NrZWxldG9uTW9kdWxlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfY2RSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG5cblxuICBASW5wdXQoKSBwdWJsaWMgc2hvd0h0bWwgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHNob3dTY3NzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93SnMgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHNob3dHbG9iYWxTY3NzID0gZmFsc2U7XG5cbiAgQElucHV0KCkgcHVibGljIGh0bWw7XG4gIEBJbnB1dCgpIHB1YmxpYyBzY3NzO1xuICBASW5wdXQoKSBwdWJsaWMganM7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb250ZW50Q29uZmlnOiBGc0NvbnRlbnRDb25maWc7XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHR5cGU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgcHVibGljIGZvY3VzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBibHVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwdWJsaWMgY2hhbmdlczogYW55ID0ge307XG4gIHB1YmxpYyBFZGl0b3JUeXBlID0gRWRpdG9yVHlwZTtcbiAgcHVibGljIGZvY3VzZWRBcmVhOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnRlbnRTdHlsZToge1xuICAgIHNjc3M/OiBzdHJpbmc7XG4gIH07XG5cbiAgcHVibGljIHJlc2l6aW5nID0gZmFsc2U7XG4gIHB1YmxpYyB0aXRsZTtcblxuICBwdWJsaWMgc2Nzc0NvbmZpZzogRnNUZXh0RWRpdG9yQ29uZmlnO1xuICBwdWJsaWMgZ2xvYmFsU2Nzc0NvbmZpZzogRnNUZXh0RWRpdG9yQ29uZmlnO1xuICBwdWJsaWMgaHRtbENvbmZpZzogRnNUZXh0RWRpdG9yQ29uZmlnO1xuICBwdWJsaWMganNDb25maWc6IEZzVGV4dEVkaXRvckNvbmZpZztcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFRleHRFZGl0b3JzKCk7XG4gICAgdGhpcy5pbml0R2xvYmFsQ29udGVudFN0eWxlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dChudWxsKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZSh0eXBlLCB2YWx1ZSkge1xuICAgIHRoaXMuY2hhbmdlZC5lbWl0KHsgdHlwZSwgdmFsdWUgfSk7XG4gICAgdGhpcy5jaGFuZ2VzW3R5cGVdID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2hhbmdlcylcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICEhdGhpcy5jaGFuZ2VzW25hbWVdKVxuICAgICAgLmxlbmd0aCAhPT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckNoYW5nZSh0eXBlKSB7XG4gICAgdGhpcy5jaGFuZ2VzW3R5cGVdID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGluaXRUZXh0RWRpdG9ycygpIHtcbiAgICB0aGlzLnNjc3NDb25maWcgPSB7XG4gICAgICB0YWJTaXplOiAyLFxuICAgICAgbGFuZ3VhZ2U6ICdzY3NzJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgdGhpcy5fb25Gb2N1cyhFZGl0b3JUeXBlLlNjc3MpO1xuICAgICAgfSxcbiAgICAgIGJsdXI6ICgpID0+IHtcbiAgICAgICAgdGhpcy5ibHVyZWQuZW1pdChFZGl0b3JUeXBlLlNjc3MpO1xuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuanNDb25maWcgPSB7XG4gICAgICB0YWJTaXplOiAyLFxuICAgICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIGZvY3VzOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29uRm9jdXMoRWRpdG9yVHlwZS5Kcyk7XG4gICAgICB9LFxuICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICB0aGlzLmJsdXJlZC5lbWl0KEVkaXRvclR5cGUuSnMpO1xuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuaHRtbENvbmZpZyA9IHtcbiAgICAgIHRhYlNpemU6IDIsXG4gICAgICBsYW5ndWFnZTogJ2h0bWwnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICBmb2N1czogKCkgPT4ge1xuICAgICAgICB0aGlzLl9vbkZvY3VzKEVkaXRvclR5cGUuSHRtbCk7XG4gICAgICB9LFxuICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICB0aGlzLmJsdXJlZC5lbWl0KEVkaXRvclR5cGUuSHRtbCk7XG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5nbG9iYWxTY3NzQ29uZmlnID0ge1xuICAgICAgdGFiU2l6ZTogMixcbiAgICAgIGxhbmd1YWdlOiAnc2NzcycsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIGZvY3VzOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29uRm9jdXMoRWRpdG9yVHlwZS5HbG9iYWxTY3NzKTtcbiAgICAgIH0sXG4gICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuYmx1cmVkLmVtaXQoRWRpdG9yVHlwZS5HbG9iYWxTY3NzKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0R2xvYmFsQ29udGVudFN0eWxlKCkge1xuICAgIHRoaXMuY29udGVudENvbmZpZy5sb2FkQ29udGVudFN0eWxlKClcbiAgICAgIC5zdWJzY3JpYmUoKGNvbnRlbnRTdHlsZSkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRlbnRTdHlsZSA9IGNvbnRlbnRTdHlsZSB8fCB7fTtcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlR2xvYmFsU2NzcygpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50Q29uZmlnLnNhdmVDb250ZW50U3R5bGUodGhpcy5jb250ZW50U3R5bGUpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1NhdmVkIENoYW5nZXMnKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Gb2N1cyh0eXBlKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQXJlYSA9IHR5cGU7XG4gICAgdGhpcy5mb2N1c2VkLmVtaXQodHlwZSk7XG4gIH1cblxufVxuIiwiPGFzLXNwbGl0IFt1bml0XT1cIidwZXJjZW50J1wiIFtndXR0ZXJTaXplXT1cIjI1XCI+IFxuICA8YXMtc3BsaXQtYXJlYSBbc2l6ZV09XCI3MFwiIFt2aXNpYmxlXT1cInNob3dIdG1sXCIgW29yZGVyXT1cIjFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLWNvbnRhaW5lclwiPlxuICAgICAgPGFwcC1lZGl0b3ItbGFiZWxcbiAgICAgICAgICBbY2hhbmdlZF09XCJjaGFuZ2VzLmh0bWwgIT09IHVuZGVmaW5lZFwiXG4gICAgICAgICAgW2ZvY3VzZWRdPVwiZm9jdXNlZEFyZWEgPT09ICdodG1sJ1wiPlxuICAgICAgICBIVE1MXG4gICAgICA8L2FwcC1lZGl0b3ItbGFiZWw+XG4gICAgICA8ZnMtdGV4dC1lZGl0b3IgXG4gICAgICAgIFsobmdNb2RlbCldPVwiaHRtbFwiIFxuICAgICAgICBuYW1lPVwiaHRtbFwiXG4gICAgICAgIFtmc01vZGVsQ2hhbmdlT3B0aW9uc109XCJ7IGRlYm91bmNlOiAwIH1cIlxuICAgICAgICAoZnNNb2RlbENoYW5nZSk9XCJjaGFuZ2UoRWRpdG9yVHlwZS5IdG1sLCAkZXZlbnQpXCJcbiAgICAgICAgW2NvbmZpZ109XCJodG1sQ29uZmlnXCI+XG4gICAgICA8L2ZzLXRleHQtZWRpdG9yPiAgICAgICAgICAgICAgXG4gICAgPC9kaXY+XG4gIDwvYXMtc3BsaXQtYXJlYT5cbiAgPGFzLXNwbGl0LWFyZWEgW3NpemVdPVwiMzBcIiBbdmlzaWJsZV09XCJzaG93U2Nzc1wiIFtvcmRlcl09XCIyXCI+XG4gICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDxhcHAtZWRpdG9yLWxhYmVsXG4gICAgICAgICAgW2NoYW5nZWRdPVwiY2hhbmdlcy5zY3NzICE9PSB1bmRlZmluZWRcIlxuICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRBcmVhID09PSAnc2NzcydcIj5cbiAgICAgICAgU0NTU1xuICAgICAgPC9hcHAtZWRpdG9yLWxhYmVsPlxuICAgICAgPGZzLXRleHQtZWRpdG9yIFxuICAgICAgICBbKG5nTW9kZWwpXT1cInNjc3NcIiBcbiAgICAgICAgbmFtZT1cInNjc3NcIlxuICAgICAgICBbZnNNb2RlbENoYW5nZU9wdGlvbnNdPVwieyBkZWJvdW5jZTogMCB9XCJcbiAgICAgICAgKGZzTW9kZWxDaGFuZ2UpPVwiY2hhbmdlKEVkaXRvclR5cGUuU2NzcywgJGV2ZW50KVwiXG4gICAgICAgIFtjb25maWddPVwic2Nzc0NvbmZpZ1wiPlxuICAgICAgPC9mcy10ZXh0LWVkaXRvcj4gICAgXG4gICAgPC9kaXY+XG4gIDwvYXMtc3BsaXQtYXJlYT5cbiAgPGFzLXNwbGl0LWFyZWEgW3NpemVdPVwiMzBcIiAgW3Zpc2libGVdPVwic2hvd0pzXCIgW29yZGVyXT1cIjNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLWNvbnRhaW5lclwiPlxuICAgICAgPGFwcC1lZGl0b3ItbGFiZWxcbiAgICAgICAgICBbY2hhbmdlZF09XCJjaGFuZ2VzLmpzICE9PSB1bmRlZmluZWRcIlxuICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRBcmVhID09PSAnanMnXCI+XG4gICAgICAgIEpTXG4gICAgICA8L2FwcC1lZGl0b3ItbGFiZWw+XG4gICAgICA8ZnMtdGV4dC1lZGl0b3IgXG4gICAgICAgIFsobmdNb2RlbCldPVwianNcIiBcbiAgICAgICAgbmFtZT1cImpzXCJcbiAgICAgICAgW2ZzTW9kZWxDaGFuZ2VPcHRpb25zXT1cInsgZGVib3VuY2U6IDAgfVwiXG4gICAgICAgIChmc01vZGVsQ2hhbmdlKT1cImNoYW5nZShFZGl0b3JUeXBlLkpzLCAkZXZlbnQpXCJcbiAgICAgICAgW2NvbmZpZ109XCJqc0NvbmZpZ1wiPlxuICAgICAgPC9mcy10ZXh0LWVkaXRvcj4gICAgXG4gICAgPC9kaXY+XG4gIDwvYXMtc3BsaXQtYXJlYT5cbiAgPGFzLXNwbGl0LWFyZWEgW3NpemVdPVwiMzBcIiBbdmlzaWJsZV09XCJzaG93R2xvYmFsU2Nzc1wiIFtvcmRlcl09XCI0XCI+XG4gICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDxhcHAtZWRpdG9yLWxhYmVsXG4gICAgICAgICAgW2NoYW5nZWRdPVwiY2hhbmdlcy5nbG9iYWxTY3NzICE9PSB1bmRlZmluZWRcIlxuICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRBcmVhID09PSAnZ2xvYmFsU2NzcydcIj5cbiAgICAgICAgR2xvYmFsIFNDU1NcbiAgICAgIDwvYXBwLWVkaXRvci1sYWJlbD5cbiAgICAgIDxuZy1jb250YWluZXIgKmZzU2tlbGV0b249XCJjb250ZW50U3R5bGVcIj5cbiAgICAgICAgPGZzLXRleHQtZWRpdG9yIFxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY29udGVudFN0eWxlLnNjc3NcIiBcbiAgICAgICAgICBuYW1lPVwiZ2xvYmFsU2Nzc1wiXG4gICAgICAgICAgW2ZzTW9kZWxDaGFuZ2VPcHRpb25zXT1cInsgZGVib3VuY2U6IDMwMCB9XCJcbiAgICAgICAgICAoZnNNb2RlbENoYW5nZSk9XCJjaGFuZ2UoRWRpdG9yVHlwZS5HbG9iYWxTY3NzLCAkZXZlbnQpXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdsb2JhbFNjc3NDb25maWdcIj5cbiAgICAgICAgPC9mcy10ZXh0LWVkaXRvcj4gXG4gICAgICA8L25nLWNvbnRhaW5lcj4gICBcbiAgICA8L2Rpdj5cbiAgPC9hcy1zcGxpdC1hcmVhPlxuPC9hcy1zcGxpdD5cbiJdfQ==
156
+ ], template: "<as-split [unit]=\"'percent'\" [gutterSize]=\"25\">\n <as-split-area [size]=\"70\" [visible]=\"showHtml()\" [order]=\"1\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Html)\"\n [focused]=\"focusedArea() === EditorType.Html\">\n HTML\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"html\"\n name=\"html\"\n [config]=\"htmlConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showScss()\" [order]=\"2\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Scss)\"\n [focused]=\"focusedArea() === EditorType.Scss\">\n SCSS\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"scss\"\n name=\"scss\"\n [config]=\"scssConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showJs()\" [order]=\"3\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Js)\"\n [focused]=\"focusedArea() === EditorType.Js\">\n JS\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"js\"\n name=\"js\"\n [config]=\"jsConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showGlobalScss()\" [order]=\"4\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.GlobalScss)\"\n [focused]=\"focusedArea() === EditorType.GlobalScss\">\n Global SCSS\n </app-editor-label>\n <ng-container *fsSkeleton=\"contentStyle()\">\n <fs-text-editor\n [(ngModel)]=\"globalScss\"\n name=\"globalScss\"\n [config]=\"globalScssConfig\">\n </fs-text-editor>\n </ng-container>\n </div>\n </as-split-area>\n</as-split>\n", styles: [":host{display:block;flex:1;height:100%;min-height:0}as-split{height:100%}:host ::ng-deep .as-split-gutter{background-color:unset!important}.editor-container{height:100%;border-radius:5px;display:flex;flex-direction:column}.editor-container fs-text-editor{flex:1}\n"] }]
157
+ }] });
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFFVixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBc0Isa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVqRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLEtBQUssRUFBYyxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7Ozs7O0FBcUI5RSxN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SSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxFQUNGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDckM7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO3VHQTFLVSxlQUFlOzJGQUFmLGVBQWUsZ3BDQzlDNUIsNGdFQTREQSxpVUR0QlEsa0JBQWtCLHNrQkFDbEIsb0JBQW9CLDRGQUNwQixrQkFBa0IsK0tBQ2xCLFdBQVcsOFZBQ1gsWUFBWSx5Z0JBQ1osZ0JBQWdCOzsyRkFHWCxlQUFlO2tCQWYzQixTQUFTOytCQUNJLFlBQVksbUJBR0wsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ0wsa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLGtCQUFrQjt3QkFDbEIsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLGdCQUFnQjtxQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBPbkluaXQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBtb2RlbCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBGc0Zvcm1Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9mb3JtJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7IEZzVGV4dEVkaXRvckNvbmZpZywgRnNUZXh0RWRpdG9yTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvdGV4dC1lZGl0b3InO1xuXG5pbXBvcnQgeyBBbmd1bGFyU3BsaXRNb2R1bGUgfSBmcm9tICdhbmd1bGFyLXNwbGl0JztcbmltcG9ydCB7IEVNUFRZLCBPYnNlcnZhYmxlLCBjb25jYXQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplLCBsYXN0LCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEVkaXRvclR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9lbnVtcyc7XG5pbXBvcnQgeyBGc0NvbnRlbnRDb25maWcsIEZzQ29udGVudFN0eWxlIH0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFZGl0b3JMYWJlbENvbXBvbmVudCB9IGZyb20gJy4uL2VkaXRvci1sYWJlbC9lZGl0b3ItbGFiZWwuY29tcG9uZW50JztcblxuXG50eXBlIEVkaXRvclZhbHVlcyA9IFBhcnRpYWw8UmVjb3JkPEVkaXRvclR5cGUsIHN0cmluZz4+O1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWVkaXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEFuZ3VsYXJTcGxpdE1vZHVsZSxcbiAgICAgICAgRWRpdG9yTGFiZWxDb21wb25lbnQsXG4gICAgICAgIEZzVGV4dEVkaXRvck1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIEZzRm9ybU1vZHVsZSxcbiAgICAgICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzaG93SHRtbCA9IGlucHV0KGZhbHNlKTtcbiAgcHVibGljIHNob3dTY3NzID0gaW5wdXQoZmFsc2UpO1xuICBwdWJsaWMgc2hvd0pzID0gaW5wdXQoZmFsc2UpO1xuICBwdWJsaWMgc2hvd0dsb2JhbFNjc3MgPSBpbnB1dChmYWxzZSk7XG4gIHB1YmxpYyBjb250ZW50Q29uZmlnID0gaW5wdXQ8RnNDb250ZW50Q29uZmlnPigpO1xuXG4gIC8vIFR3by13YXkgYm91bmQgdG8gdGhlIHRleHQgZWRpdG9ycywgc28gZWFjaCBob2xkcyBleGFjdGx5IHdoYXQgaXMgb24gc2NyZWVuLiBOb3RoaW5nIHNpdHNcbiAgLy8gYmV0d2VlbiBhIGtleXN0cm9rZSBhbmQgYSBzYXZlOiB0aGUgZnNNb2RlbENoYW5nZSB0aGlzIHJlcGxhY2VkIGRlYm91bmNlZCBldmVyeSBwYW5lIGJ5XG4gIC8vIDMwMCBtcyAoaXRzIGBkZWJvdW5jZTogMGAgZmFsbHMgYmFjayB0byAzMDApLCBzbyBhIHF1aWNrIEN0cmwrUyBwb3N0ZWQgdGV4dCB3aXRob3V0IGl0c1xuICAvLyBsYXN0IGtleXN0cm9rZXMgKElFQi1UMjkyKS5cbiAgcHVibGljIGh0bWwgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHB1YmxpYyBzY3NzID0gbW9kZWw8c3RyaW5nPigpO1xuICBwdWJsaWMganMgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHB1YmxpYyBnbG9iYWxTY3NzID0gc2lnbmFsPHN0cmluZz4obnVsbCk7XG5cbiAgcHVibGljIGNvbnRlbnRTdHlsZSA9IHNpZ25hbDxGc0NvbnRlbnRTdHlsZT4obnVsbCk7XG4gIHB1YmxpYyBmb2N1c2VkQXJlYSA9IHNpZ25hbDxFZGl0b3JUeXBlPihudWxsKTtcbiAgcHVibGljIHNhdmluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gQSBwYW5lIGlzIGNoYW5nZWQgd2hlbiBpdHMgdGV4dCBkaWZmZXJzIGZyb20gd2hhdCB0aGUgc2VydmVyIGxhc3QgY29uZmlybWVkLiBBIHBhbmVcbiAgLy8gY2xlYXJlZCB0byAnJyBjb3VudHM7IG9uZSB0eXBlZCBiYWNrIHRvIGl0cyBvcmlnaW5hbCB0ZXh0IGRvZXMgbm90IChJRUItVDI5MikuXG4gIHB1YmxpYyBjaGFuZ2VkVHlwZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2F2ZWQgPSB0aGlzLl9zYXZlZCgpO1xuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoRWRpdG9yVHlwZSlcbiAgICAgIC5maWx0ZXIoKHR5cGUpID0+IHR5cGUgaW4gc2F2ZWQgJiYgdGhpcy52YWx1ZSh0eXBlKSAhPT0gc2F2ZWRbdHlwZV0pO1xuICB9KTtcbiAgcHVibGljIGhhc0NoYW5nZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNoYW5nZWRUeXBlcygpLmxlbmd0aCAhPT0gMCk7XG5cbiAgcHVibGljIEVkaXRvclR5cGUgPSBFZGl0b3JUeXBlO1xuXG4gIHB1YmxpYyBzY3NzQ29uZmlnOiBGc1RleHRFZGl0b3JDb25maWc7XG4gIHB1YmxpYyBnbG9iYWxTY3NzQ29uZmlnOiBGc1RleHRFZGl0b3JDb25maWc7XG4gIHB1YmxpYyBodG1sQ29uZmlnOiBGc1RleHRFZGl0b3JDb25maWc7XG4gIHB1YmxpYyBqc0NvbmZpZzogRnNUZXh0RWRpdG9yQ29uZmlnO1xuXG4gIHByaXZhdGUgX3NhdmVkID0gc2lnbmFsPEVkaXRvclZhbHVlcz4oe30pO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRUZXh0RWRpdG9ycygpO1xuICAgIHRoaXMuX3NhdmVkLnNldCh7XG4gICAgICBbRWRpdG9yVHlwZS5IdG1sXTogdGhpcy5odG1sKCkgPz8gJycsXG4gICAgICBbRWRpdG9yVHlwZS5TY3NzXTogdGhpcy5zY3NzKCkgPz8gJycsXG4gICAgICBbRWRpdG9yVHlwZS5Kc106IHRoaXMuanMoKSA/PyAnJyxcbiAgICB9KTtcbiAgICB0aGlzLl9pbml0R2xvYmFsQ29udGVudFN0eWxlKCk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWUodHlwZTogRWRpdG9yVHlwZSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFuZXMgPSB7XG4gICAgICBbRWRpdG9yVHlwZS5IdG1sXTogdGhpcy5odG1sLFxuICAgICAgW0VkaXRvclR5cGUuU2Nzc106IHRoaXMuc2NzcyxcbiAgICAgIFtFZGl0b3JUeXBlLkpzXTogdGhpcy5qcyxcbiAgICAgIFtFZGl0b3JUeXBlLkdsb2JhbFNjc3NdOiB0aGlzLmdsb2JhbFNjc3MsXG4gICAgfTtcblxuICAgIHJldHVybiBwYW5lc1t0eXBlXSgpID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGV2ZXJ5IGNoYW5nZWQgcGFuZSwgbm90IGp1c3QgdGhlIG9uZSBsYXN0IGZvY3VzZWQsIGFuZCByZWNvcmRzIHdoYXQgd2FzIHNlbnQgYXNcbiAgICogdGhlIG5ldyBiYXNlbGluZSwgc28gYW55dGhpbmcgdHlwZWQgd2hpbGUgdGhlIHJlcXVlc3QgaXMgaW4gZmxpZ2h0IHN0YXlzIGNoYW5nZWQuIFdpdGhcbiAgICogbm90aGluZyBjaGFuZ2VkIGl0IHNlbmRzIG5vdGhpbmcgYW5kIHNob3dzIG5vIHRvYXN0LiBDdHJsK1MgcmVhY2hlcyB0aGlzIHRocm91Z2ggZnNGb3JtJ3NcbiAgICogW3N1Ym1pdF0sIHNvIGl0IHNoYXJlcyB0aGUgU2F2ZSBidXR0b24ncyBnYXRlIChJRUItVDI5MikuXG4gICAqXG4gICAqIGBmaWVsZHNgIG1hcHMgYSBwYW5lIHRvIGl0cyBwcm9wZXJ0eSBvbiB0aGUgcmVjb3JkIChodG1sIOKGkiBjb250ZW50KTsgYHNhdmVSZWNvcmRgIHBvc3RzXG4gICAqIHRob3NlIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgc2F2ZSQoXG4gICAgZmllbGRzOiBFZGl0b3JWYWx1ZXMsXG4gICAgc2F2ZVJlY29yZDogKHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gT2JzZXJ2YWJsZTx1bmtub3duPixcbiAgKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3Qgc2VudDogRWRpdG9yVmFsdWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgdGhpcy5jaGFuZ2VkVHlwZXMoKS5tYXAoKHR5cGUpID0+IFt0eXBlLCB0aGlzLnZhbHVlKHR5cGUpXSksXG4gICAgKTtcbiAgICBjb25zdCBzYXZlcyA9IFtcbiAgICAgIHRoaXMuX3NhdmVSZWNvcmQkKGZpZWxkcywgc2VudCwgc2F2ZVJlY29yZCksXG4gICAgICB0aGlzLl9zYXZlR2xvYmFsU2NzcyQoc2VudCksXG4gICAgXS5maWx0ZXIoKHNhdmUpID0+ICEhc2F2ZSk7XG5cbiAgICBpZiAoIXNhdmVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIHRoaXMuc2F2aW5nLnNldCh0cnVlKTtcblxuICAgIHJldHVybiBjb25jYXQoLi4uc2F2ZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbGFzdCgpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTYXZlZCBDaGFuZ2VzJykpLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLnNhdmluZy5zZXQoZmFsc2UpKSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9zYXZlUmVjb3JkJChcbiAgICBmaWVsZHM6IEVkaXRvclZhbHVlcyxcbiAgICBzZW50OiBFZGl0b3JWYWx1ZXMsXG4gICAgc2F2ZVJlY29yZDogKHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gT2JzZXJ2YWJsZTx1bmtub3duPixcbiAgKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3QgdHlwZXMgPSAoT2JqZWN0LmtleXMoc2VudCkgYXMgRWRpdG9yVHlwZVtdKVxuICAgICAgLmZpbHRlcigodHlwZSkgPT4gZmllbGRzW3R5cGVdKTtcblxuICAgIGlmICghdHlwZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2F2ZVJlY29yZChPYmplY3QuZnJvbUVudHJpZXModHlwZXMubWFwKCh0eXBlKSA9PiBbZmllbGRzW3R5cGVdLCBzZW50W3R5cGVdXSkpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9tYXJrU2F2ZWQodHlwZXMsIHNlbnQpKSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9zYXZlR2xvYmFsU2NzcyQoc2VudDogRWRpdG9yVmFsdWVzKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgaWYgKCEoRWRpdG9yVHlwZS5HbG9iYWxTY3NzIGluIHNlbnQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50U3R5bGUgPSB7IC4uLnRoaXMuY29udGVudFN0eWxlKCksIHNjc3M6IHNlbnRbRWRpdG9yVHlwZS5HbG9iYWxTY3NzXSB9O1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGVudENvbmZpZygpLnNhdmVDb250ZW50U3R5bGUoY29udGVudFN0eWxlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb250ZW50U3R5bGUuc2V0KGNvbnRlbnRTdHlsZSk7XG4gICAgICAgICAgdGhpcy5fbWFya1NhdmVkKFtFZGl0b3JUeXBlLkdsb2JhbFNjc3NdLCBzZW50KTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFya1NhdmVkKHR5cGVzOiBFZGl0b3JUeXBlW10sIHNlbnQ6IEVkaXRvclZhbHVlcyk6IHZvaWQge1xuICAgIHRoaXMuX3NhdmVkLnVwZGF0ZSgoc2F2ZWQpID0+ICh7XG4gICAgICAuLi5zYXZlZCxcbiAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyh0eXBlcy5tYXAoKHR5cGUpID0+IFt0eXBlLCBzZW50W3R5cGVdXSkpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRUZXh0RWRpdG9ycygpOiB2b2lkIHtcbiAgICB0aGlzLnNjc3NDb25maWcgPSB0aGlzLl9jcmVhdGVUZXh0RWRpdG9yQ29uZmlnKEVkaXRvclR5cGUuU2NzcywgJ3Njc3MnKTtcbiAgICB0aGlzLmpzQ29uZmlnID0gdGhpcy5fY3JlYXRlVGV4dEVkaXRvckNvbmZpZyhFZGl0b3JUeXBlLkpzLCAnanMnKTtcbiAgICB0aGlzLmh0bWxDb25maWcgPSB0aGlzLl9jcmVhdGVUZXh0RWRpdG9yQ29uZmlnKEVkaXRvclR5cGUuSHRtbCwgJ2h0bWwnKTtcbiAgICB0aGlzLmdsb2JhbFNjc3NDb25maWcgPSB0aGlzLl9jcmVhdGVUZXh0RWRpdG9yQ29uZmlnKEVkaXRvclR5cGUuR2xvYmFsU2NzcywgJ3Njc3MnKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVRleHRFZGl0b3JDb25maWcodHlwZTogRWRpdG9yVHlwZSwgbGFuZ3VhZ2U6IHN0cmluZyk6IEZzVGV4dEVkaXRvckNvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYlNpemU6IDIsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQXJlYS5zZXQodHlwZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9pbml0R2xvYmFsQ29udGVudFN0eWxlKCk6IHZvaWQge1xuICAgIHRoaXMuY29udGVudENvbmZpZygpLmxvYWRDb250ZW50U3R5bGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoY29udGVudFN0eWxlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NzcyA9IGNvbnRlbnRTdHlsZT8uc2NzcyA/PyAnJztcblxuICAgICAgICAgIHRoaXMuY29udGVudFN0eWxlLnNldChjb250ZW50U3R5bGUgfHwge30pO1xuICAgICAgICAgIHRoaXMuZ2xvYmFsU2Nzcy5zZXQoc2Nzcyk7XG4gICAgICAgICAgdGhpcy5fc2F2ZWQudXBkYXRlKChzYXZlZCkgPT4gKHsgLi4uc2F2ZWQsIFtFZGl0b3JUeXBlLkdsb2JhbFNjc3NdOiBzY3NzIH0pKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG59XG4iLCI8YXMtc3BsaXQgW3VuaXRdPVwiJ3BlcmNlbnQnXCIgW2d1dHRlclNpemVdPVwiMjVcIj5cbiAgPGFzLXNwbGl0LWFyZWEgW3NpemVdPVwiNzBcIiBbdmlzaWJsZV09XCJzaG93SHRtbCgpXCIgW29yZGVyXT1cIjFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLWNvbnRhaW5lclwiPlxuICAgICAgPGFwcC1lZGl0b3ItbGFiZWxcbiAgICAgICAgICBbY2hhbmdlZF09XCJjaGFuZ2VkVHlwZXMoKS5pbmNsdWRlcyhFZGl0b3JUeXBlLkh0bWwpXCJcbiAgICAgICAgICBbZm9jdXNlZF09XCJmb2N1c2VkQXJlYSgpID09PSBFZGl0b3JUeXBlLkh0bWxcIj5cbiAgICAgICAgSFRNTFxuICAgICAgPC9hcHAtZWRpdG9yLWxhYmVsPlxuICAgICAgPGZzLXRleHQtZWRpdG9yXG4gICAgICAgIFsobmdNb2RlbCldPVwiaHRtbFwiXG4gICAgICAgIG5hbWU9XCJodG1sXCJcbiAgICAgICAgW2NvbmZpZ109XCJodG1sQ29uZmlnXCI+XG4gICAgICA8L2ZzLXRleHQtZWRpdG9yPlxuICAgIDwvZGl2PlxuICA8L2FzLXNwbGl0LWFyZWE+XG4gIDxhcy1zcGxpdC1hcmVhIFtzaXplXT1cIjMwXCIgW3Zpc2libGVdPVwic2hvd1Njc3MoKVwiIFtvcmRlcl09XCIyXCI+XG4gICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDxhcHAtZWRpdG9yLWxhYmVsXG4gICAgICAgICAgW2NoYW5nZWRdPVwiY2hhbmdlZFR5cGVzKCkuaW5jbHVkZXMoRWRpdG9yVHlwZS5TY3NzKVwiXG4gICAgICAgICAgW2ZvY3VzZWRdPVwiZm9jdXNlZEFyZWEoKSA9PT0gRWRpdG9yVHlwZS5TY3NzXCI+XG4gICAgICAgIFNDU1NcbiAgICAgIDwvYXBwLWVkaXRvci1sYWJlbD5cbiAgICAgIDxmcy10ZXh0LWVkaXRvclxuICAgICAgICBbKG5nTW9kZWwpXT1cInNjc3NcIlxuICAgICAgICBuYW1lPVwic2Nzc1wiXG4gICAgICAgIFtjb25maWddPVwic2Nzc0NvbmZpZ1wiPlxuICAgICAgPC9mcy10ZXh0LWVkaXRvcj5cbiAgICA8L2Rpdj5cbiAgPC9hcy1zcGxpdC1hcmVhPlxuICA8YXMtc3BsaXQtYXJlYSBbc2l6ZV09XCIzMFwiICBbdmlzaWJsZV09XCJzaG93SnMoKVwiIFtvcmRlcl09XCIzXCI+XG4gICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDxhcHAtZWRpdG9yLWxhYmVsXG4gICAgICAgICAgW2NoYW5nZWRdPVwiY2hhbmdlZFR5cGVzKCkuaW5jbHVkZXMoRWRpdG9yVHlwZS5KcylcIlxuICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRBcmVhKCkgPT09IEVkaXRvclR5cGUuSnNcIj5cbiAgICAgICAgSlNcbiAgICAgIDwvYXBwLWVkaXRvci1sYWJlbD5cbiAgICAgIDxmcy10ZXh0LWVkaXRvclxuICAgICAgICBbKG5nTW9kZWwpXT1cImpzXCJcbiAgICAgICAgbmFtZT1cImpzXCJcbiAgICAgICAgW2NvbmZpZ109XCJqc0NvbmZpZ1wiPlxuICAgICAgPC9mcy10ZXh0LWVkaXRvcj5cbiAgICA8L2Rpdj5cbiAgPC9hcy1zcGxpdC1hcmVhPlxuICA8YXMtc3BsaXQtYXJlYSBbc2l6ZV09XCIzMFwiIFt2aXNpYmxlXT1cInNob3dHbG9iYWxTY3NzKClcIiBbb3JkZXJdPVwiNFwiPlxuICAgIDxkaXYgY2xhc3M9XCJlZGl0b3ItY29udGFpbmVyXCI+XG4gICAgICA8YXBwLWVkaXRvci1sYWJlbFxuICAgICAgICAgIFtjaGFuZ2VkXT1cImNoYW5nZWRUeXBlcygpLmluY2x1ZGVzKEVkaXRvclR5cGUuR2xvYmFsU2NzcylcIlxuICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRBcmVhKCkgPT09IEVkaXRvclR5cGUuR2xvYmFsU2Nzc1wiPlxuICAgICAgICBHbG9iYWwgU0NTU1xuICAgICAgPC9hcHAtZWRpdG9yLWxhYmVsPlxuICAgICAgPG5nLWNvbnRhaW5lciAqZnNTa2VsZXRvbj1cImNvbnRlbnRTdHlsZSgpXCI+XG4gICAgICAgIDxmcy10ZXh0LWVkaXRvclxuICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsU2Nzc1wiXG4gICAgICAgICAgbmFtZT1cImdsb2JhbFNjc3NcIlxuICAgICAgICAgIFtjb25maWddPVwiZ2xvYmFsU2Nzc0NvbmZpZ1wiPlxuICAgICAgICA8L2ZzLXRleHQtZWRpdG9yPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvYXMtc3BsaXQtYXJlYT5cbjwvYXMtc3BsaXQ+XG4iXX0=