@firestitch/markdown-editor 18.0.0

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.
@@ -0,0 +1,43 @@
1
+ import { AfterViewInit, ElementRef, OnDestroy, OnInit } from '@angular/core';
2
+ import { ControlValueAccessor, ValidationErrors, Validator } from '@angular/forms';
3
+ import { FsMarkdownEditorConfig } from '../../interfaces/markdown-editor-config';
4
+ import * as i0 from "@angular/core";
5
+ export declare class FsMarkdownEditorComponent implements OnInit, AfterViewInit, ControlValueAccessor, Validator, OnDestroy {
6
+ private _defaultConfig;
7
+ private _cdRef;
8
+ private _loader;
9
+ private _zone;
10
+ editorRef: ElementRef;
11
+ classFocused: boolean;
12
+ config: FsMarkdownEditorConfig;
13
+ disabled: boolean;
14
+ initialized: boolean;
15
+ readonly containerID: string;
16
+ onTouched: () => void;
17
+ onChange: (data: any) => void;
18
+ private _crepe;
19
+ private _editorViewCtx;
20
+ private _parserCtx;
21
+ private _markdown;
22
+ private _editorReady;
23
+ private _destroy$;
24
+ get markdown(): string;
25
+ ngOnInit(): void;
26
+ ngAfterViewInit(): void;
27
+ writeValue(markdown: string): void;
28
+ registerOnChange(fn: (data: any) => void): void;
29
+ registerOnTouched(fn: () => void): void;
30
+ setDisabledState(isDisabled: boolean): void;
31
+ validate(): ValidationErrors | null;
32
+ clear(): void;
33
+ setMarkdown(markdown: string): void;
34
+ getMarkdown(): string;
35
+ focus(): void;
36
+ disable(): void;
37
+ destroy(): void;
38
+ ngOnDestroy(): void;
39
+ private _initEditor;
40
+ private _setEditorContent;
41
+ static ɵfac: i0.ɵɵFactoryDeclaration<FsMarkdownEditorComponent, never>;
42
+ static ɵcmp: i0.ɵɵComponentDeclaration<FsMarkdownEditorComponent, "fs-markdown-editor", never, { "config": { "alias": "config"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, true, never>;
43
+ }
@@ -0,0 +1,22 @@
1
+ import { ModuleWithProviders } from '@angular/core';
2
+ import { FsMarkdownEditorConfig } from './interfaces/markdown-editor-config';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@firestitch/label";
6
+ import * as i3 from "./components/markdown-editor/markdown-editor.component";
7
+ export declare class FsMarkdownEditorModule {
8
+ static forRoot(config?: FsMarkdownEditorConfig): ModuleWithProviders<FsMarkdownEditorModule>;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<FsMarkdownEditorModule, never>;
10
+ static ɵmod: i0.ɵɵNgModuleDeclaration<FsMarkdownEditorModule, never, [typeof i1.CommonModule, typeof i2.FsLabelModule, typeof i3.FsMarkdownEditorComponent], [typeof i3.FsMarkdownEditorComponent]>;
11
+ static ɵinj: i0.ɵɵInjectorDeclaration<FsMarkdownEditorModule>;
12
+ }
13
+ export declare function markdownEditorConfigFactory(config: FsMarkdownEditorConfig): {
14
+ label?: string;
15
+ hint?: string;
16
+ placeholder?: string;
17
+ maxLength?: number;
18
+ autofocus?: boolean;
19
+ disabled?: boolean;
20
+ padless?: boolean;
21
+ initialized?: () => void;
22
+ };
@@ -0,0 +1,3 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export declare const FS_MARKDOWN_EDITOR_DEFAULT_CONFIG: InjectionToken<any[]>;
3
+ export declare const FS_MARKDOWN_EDITOR_CONFIG: InjectionToken<any[]>;
@@ -0,0 +1,10 @@
1
+ export interface FsMarkdownEditorConfig {
2
+ label?: string;
3
+ hint?: string;
4
+ placeholder?: string;
5
+ maxLength?: number;
6
+ autofocus?: boolean;
7
+ disabled?: boolean;
8
+ padless?: boolean;
9
+ initialized?: () => void;
10
+ }
@@ -0,0 +1,12 @@
1
+ import { Observable } from 'rxjs';
2
+ import * as i0 from "@angular/core";
3
+ export declare class FsMilkdownLoaderService {
4
+ private _document;
5
+ private _loaded;
6
+ private _stylesLoaded;
7
+ private _loaded$;
8
+ get loaded$(): Observable<boolean>;
9
+ loadStyles(): void;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<FsMilkdownLoaderService, never>;
11
+ static ɵprov: i0.ɵɵInjectableDeclaration<FsMilkdownLoaderService>;
12
+ }
@@ -0,0 +1,13 @@
1
+ import { SafeHtml } from '@angular/platform-browser';
2
+ import * as i0 from "@angular/core";
3
+ export declare class FsMarkdownRendererComponent {
4
+ private _sanitizer;
5
+ private _cdRef;
6
+ set setMarkdown(markdown: string);
7
+ renderedHtml: SafeHtml;
8
+ private _rawMarkdown;
9
+ private _renderMarkdown;
10
+ private _markdownToHtml;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<FsMarkdownRendererComponent, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<FsMarkdownRendererComponent, "fs-markdown-renderer", never, { "setMarkdown": { "alias": "markdown"; "required": false; }; }, {}, never, never, true, never>;
13
+ }
@@ -0,0 +1,42 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
5
+ width="408px" height="408px" viewBox="0 0 408 408" style="enable-background:new 0 0 408 408;" xml:space="preserve">
6
+ <g>
7
+ <g id="crop-square">
8
+ <path d="M357,0H51C22.95,0,0,22.95,0,51v306c0,28.05,22.95,51,51,51h306c28.05,0,51-22.95,51-51V51C408,22.95,385.05,0,357,0z
9
+ M357,357H51V51h306V357z"/>
10
+ </g>
11
+ </g>
12
+ <g>
13
+ </g>
14
+ <g>
15
+ </g>
16
+ <g>
17
+ </g>
18
+ <g>
19
+ </g>
20
+ <g>
21
+ </g>
22
+ <g>
23
+ </g>
24
+ <g>
25
+ </g>
26
+ <g>
27
+ </g>
28
+ <g>
29
+ </g>
30
+ <g>
31
+ </g>
32
+ <g>
33
+ </g>
34
+ <g>
35
+ </g>
36
+ <g>
37
+ </g>
38
+ <g>
39
+ </g>
40
+ <g>
41
+ </g>
42
+ </svg>
@@ -0,0 +1,238 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, forwardRef, HostBinding, inject, Input, NgZone, Optional, ViewChild, } from '@angular/core';
2
+ import { ControlContainer, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgForm, } from '@angular/forms';
3
+ import { guid } from '@firestitch/common';
4
+ import { FsLabelModule } from '@firestitch/label';
5
+ import { Subject } from 'rxjs';
6
+ import { takeUntil } from 'rxjs/operators';
7
+ import { FS_MARKDOWN_EDITOR_CONFIG } from '../../injects/config.inject';
8
+ import { FsMilkdownLoaderService } from '../../services/milkdown-loader.service';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@firestitch/label";
11
+ export class FsMarkdownEditorComponent {
12
+ _defaultConfig = inject(FS_MARKDOWN_EDITOR_CONFIG, { optional: true });
13
+ _cdRef = inject(ChangeDetectorRef);
14
+ _loader = inject(FsMilkdownLoaderService);
15
+ _zone = inject(NgZone);
16
+ editorRef;
17
+ classFocused = false;
18
+ config = {};
19
+ disabled = false;
20
+ initialized = false;
21
+ containerID = `fs-markdown-editor-${guid('xxx')}`;
22
+ onTouched;
23
+ onChange;
24
+ _crepe;
25
+ _editorViewCtx;
26
+ _parserCtx;
27
+ _markdown = '';
28
+ _editorReady = false;
29
+ _destroy$ = new Subject();
30
+ get markdown() {
31
+ return this._markdown;
32
+ }
33
+ ngOnInit() {
34
+ this.config = { ...(this._defaultConfig || {}), ...(this.config || {}) };
35
+ this._loader.loadStyles();
36
+ }
37
+ ngAfterViewInit() {
38
+ this._loader.loaded$
39
+ .pipe(takeUntil(this._destroy$))
40
+ .subscribe((loaded) => {
41
+ if (loaded) {
42
+ this._initEditor();
43
+ }
44
+ });
45
+ }
46
+ writeValue(markdown) {
47
+ this._markdown = markdown || '';
48
+ if (this._editorReady) {
49
+ this._setEditorContent(this._markdown);
50
+ }
51
+ this._cdRef.markForCheck();
52
+ }
53
+ registerOnChange(fn) {
54
+ this.onChange = fn;
55
+ }
56
+ registerOnTouched(fn) {
57
+ this.onTouched = fn;
58
+ }
59
+ setDisabledState(isDisabled) {
60
+ this.disabled = isDisabled;
61
+ }
62
+ validate() {
63
+ const err = {};
64
+ if (this.config.maxLength && this._markdown) {
65
+ const length = this._markdown.length;
66
+ if (length > this.config.maxLength) {
67
+ err.maxLengthError = `Must be ${this.config.maxLength} characters or fewer. You entered ${length} characters.`;
68
+ }
69
+ }
70
+ return Object.keys(err).length ? err : null;
71
+ }
72
+ clear() {
73
+ this.writeValue('');
74
+ if (this.onChange) {
75
+ this.onChange('');
76
+ }
77
+ }
78
+ setMarkdown(markdown) {
79
+ this.writeValue(markdown);
80
+ }
81
+ getMarkdown() {
82
+ if (!this._crepe) {
83
+ return this._markdown;
84
+ }
85
+ return this._crepe.getMarkdown();
86
+ }
87
+ focus() {
88
+ if (this._crepe && this._editorViewCtx) {
89
+ this._crepe.editor.action((ctx) => {
90
+ const view = ctx.get(this._editorViewCtx);
91
+ view.focus();
92
+ });
93
+ }
94
+ }
95
+ disable() {
96
+ this.disabled = true;
97
+ this._cdRef.markForCheck();
98
+ }
99
+ destroy() {
100
+ if (this._crepe) {
101
+ this._crepe.destroy();
102
+ this._crepe = null;
103
+ }
104
+ this._editorReady = false;
105
+ this.initialized = false;
106
+ this._cdRef.markForCheck();
107
+ }
108
+ ngOnDestroy() {
109
+ this._destroy$.next();
110
+ this._destroy$.complete();
111
+ this.destroy();
112
+ }
113
+ _initEditor() {
114
+ if (this._crepe || !this.editorRef) {
115
+ return;
116
+ }
117
+ this._zone.runOutsideAngular(async () => {
118
+ const [{ Crepe }, { editorViewCtx, parserCtx }] = await Promise.all([
119
+ import('@milkdown/crepe'),
120
+ import('@milkdown/kit/core'),
121
+ ]);
122
+ this._editorViewCtx = editorViewCtx;
123
+ this._parserCtx = parserCtx;
124
+ this._crepe = new Crepe({
125
+ root: this.editorRef.nativeElement,
126
+ defaultValue: this._markdown,
127
+ features: {},
128
+ featureConfigs: {
129
+ [Crepe.Feature.Placeholder]: {
130
+ text: this.config.placeholder || 'Start typing...',
131
+ },
132
+ },
133
+ });
134
+ this._crepe.on((listener) => {
135
+ listener.markdownUpdated((_ctx, markdown, prevMarkdown) => {
136
+ if (markdown !== prevMarkdown) {
137
+ this._zone.run(() => {
138
+ this._markdown = markdown;
139
+ if (this.onChange) {
140
+ this.onChange(markdown);
141
+ }
142
+ if (this.onTouched) {
143
+ this.onTouched();
144
+ }
145
+ this._cdRef.markForCheck();
146
+ });
147
+ }
148
+ });
149
+ });
150
+ this._crepe.create().then(() => {
151
+ this._zone.run(() => {
152
+ this._editorReady = true;
153
+ this.initialized = true;
154
+ if (this._markdown) {
155
+ this._setEditorContent(this._markdown);
156
+ }
157
+ this._cdRef.markForCheck();
158
+ if (this.config.autofocus) {
159
+ this.focus();
160
+ }
161
+ if (this.config.initialized) {
162
+ this.config.initialized();
163
+ }
164
+ });
165
+ });
166
+ });
167
+ }
168
+ _setEditorContent(markdown) {
169
+ this._crepe.editor.action((ctx) => {
170
+ const view = ctx.get(this._editorViewCtx);
171
+ const parser = ctx.get(this._parserCtx);
172
+ const doc = parser(markdown);
173
+ if (doc) {
174
+ const tr = view.state.tr.replaceWith(0, view.state.doc.content.size, doc.content);
175
+ view.dispatch(tr);
176
+ }
177
+ });
178
+ }
179
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsMarkdownEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
180
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsMarkdownEditorComponent, isStandalone: true, selector: "fs-markdown-editor", inputs: { config: "config", disabled: "disabled" }, host: { properties: { "class.focused": "this.classFocused", "class.disabled": "this.disabled", "class.initialized": "this.initialized" } }, providers: [
181
+ {
182
+ provide: NG_VALUE_ACCESSOR,
183
+ useExisting: forwardRef(() => FsMarkdownEditorComponent),
184
+ multi: true,
185
+ },
186
+ {
187
+ provide: NG_VALIDATORS,
188
+ useExisting: forwardRef(() => FsMarkdownEditorComponent),
189
+ multi: true,
190
+ },
191
+ ], viewQueries: [{ propertyName: "editorRef", first: true, predicate: ["editorRef"], descendants: true }], ngImport: i0, template: "<fs-label-field\n [appearance]=\"'outline'\"\n [hoverable]=\"true\"\n [showOutline]=\"initialized\"\n [disabled]=\"disabled\"\n [padless]=\"config.padless\"\n [class.initialized]=\"initialized\">\n @if (config.label) {\n <fs-label>\n {{ config.label }}\n </fs-label>\n }\n <div\n class=\"markdown-editor-container\"\n [id]=\"containerID\">\n <div #editorRef></div>\n </div>\n <fs-label-message>\n <div class=\"fs-form-message\">\n <div class=\"fs-form-hint\">\n {{ config.hint }}\n </div>\n </div>\n </fs-label-message>\n</fs-label-field>\n", styles: [":host{position:relative;display:block}:host ::ng-deep fs-label-field.initialized.appearance-outline .field-wrap{padding-top:6px;padding-bottom:4px}:host ::ng-deep .markdown-editor-container{position:relative;min-height:100px}:host ::ng-deep .milkdown{--crepe-color-background: transparent;--crepe-color-on-background: #1b1c1d;--crepe-color-surface: #f8f9ff;--crepe-color-surface-low: #f2f3fa;--crepe-color-on-surface: #191c20;--crepe-color-on-surface-variant: #43474e;--crepe-color-outline: #73777f;--crepe-color-primary: #37618e;--crepe-color-secondary: #d7e3f8;--crepe-color-on-secondary: #101c2b;--crepe-color-inverse: #2e3135;--crepe-color-on-inverse: #eff0f7;--crepe-color-inline-code: #ba1a1a;--crepe-color-error: #ba1a1a;--crepe-color-hover: #eceef4;--crepe-color-selected: #e1e2e8;--crepe-color-inline-area: #d8dae0;--crepe-font-title: Rubik, Cambria, \"Times New Roman\", Times, serif;--crepe-font-default: Inter, Arial, Helvetica, sans-serif;--crepe-font-code: \"JetBrains Mono\", Menlo, Monaco, \"Courier New\", Courier, monospace;--crepe-shadow-1: 0px 1px 3px 1px rgba(0, 0, 0, .15), 0px 1px 2px 0px rgba(0, 0, 0, .3);--crepe-shadow-2: 0px 2px 6px 2px rgba(0, 0, 0, .15), 0px 1px 2px 0px rgba(0, 0, 0, .3)}:host ::ng-deep .milkdown{position:relative;color:var(--crepe-color-on-background);background:var(--crepe-color-background)}:host ::ng-deep .milkdown *{margin:0;padding:0;box-sizing:border-box}:host ::ng-deep .milkdown button,:host ::ng-deep .milkdown input{border:none;background:none;box-shadow:none}:host ::ng-deep .milkdown button:focus,:host ::ng-deep .milkdown input:focus{outline:none}:host ::ng-deep .milkdown :focus-visible{outline:none}:host ::ng-deep .milkdown .milkdown-icon{display:inline-flex;align-items:center;justify-content:center}:host ::ng-deep .milkdown .ProseMirror-focused{outline:none}:host ::ng-deep .milkdown .ProseMirror{padding:10px 0}:host ::ng-deep .milkdown .ProseMirror *::selection{background:var(--crepe-color-selected)}:host ::ng-deep .milkdown .ProseMirror li.ProseMirror-selectednode{background:var(--crepe-color-selected);outline:none}:host ::ng-deep .milkdown .ProseMirror li.ProseMirror-selectednode::selection,:host ::ng-deep .milkdown .ProseMirror li.ProseMirror-selectednode ::selection{background:transparent}:host ::ng-deep .milkdown .ProseMirror li.ProseMirror-selectednode:after{all:unset}:host ::ng-deep .milkdown .ProseMirror .ProseMirror-selectednode{background:color-mix(in srgb,var(--crepe-color-selected),transparent 60%);outline:none}:host ::ng-deep .milkdown .ProseMirror .ProseMirror-selectednode::selection,:host ::ng-deep .milkdown .ProseMirror .ProseMirror-selectednode ::selection{background:transparent}:host ::ng-deep .milkdown .ProseMirror[data-dragging=true]::selection,:host ::ng-deep .milkdown .ProseMirror[data-dragging=true] *::selection,:host ::ng-deep .milkdown .ProseMirror[data-dragging=true] .ProseMirror-selectednode{background:transparent}:host ::ng-deep .milkdown .ProseMirror[data-dragging=true] input::selection{background:var(--crepe-color-selected)}:host ::ng-deep .milkdown .ProseMirror img{vertical-align:bottom;max-width:100%}:host ::ng-deep .milkdown .ProseMirror img.ProseMirror-selectednode{background:none;outline:2px solid var(--crepe-color-primary)}:host ::ng-deep .milkdown .ProseMirror h1,:host ::ng-deep .milkdown .ProseMirror h2,:host ::ng-deep .milkdown .ProseMirror h3,:host ::ng-deep .milkdown .ProseMirror h4,:host ::ng-deep .milkdown .ProseMirror h5,:host ::ng-deep .milkdown .ProseMirror h6{font-weight:400;padding:2px 0}:host ::ng-deep .milkdown .ProseMirror h1{font-size:42px;line-height:50px;margin-top:32px}:host ::ng-deep .milkdown .ProseMirror h2{font-size:36px;line-height:44px;margin-top:28px}:host ::ng-deep .milkdown .ProseMirror h3{font-size:32px;line-height:40px;margin-top:24px}:host ::ng-deep .milkdown .ProseMirror h4{font-size:28px;line-height:36px;margin-top:20px}:host ::ng-deep .milkdown .ProseMirror h5{font-size:24px;line-height:32px;margin-top:16px}:host ::ng-deep .milkdown .ProseMirror h6{font-size:18px;font-weight:700;line-height:28px;margin-top:16px}:host ::ng-deep .milkdown .ProseMirror p{font-size:16px;line-height:24px;padding:4px 0}:host ::ng-deep .milkdown .ProseMirror code{color:var(--crepe-color-inline-code);background:color-mix(in srgb,var(--crepe-color-inline-area),transparent 40%);padding:0 2px;border-radius:4px;font-size:87.5%;display:inline-block;line-height:1.4286}:host ::ng-deep .milkdown .ProseMirror a{color:var(--crepe-color-primary);text-decoration:underline}:host ::ng-deep .milkdown .ProseMirror pre{background:color-mix(in srgb,var(--crepe-color-inline-area),transparent 40%);padding:10px;border-radius:4px}:host ::ng-deep .milkdown .ProseMirror pre code{padding:0;background:transparent}:host ::ng-deep .milkdown .ProseMirror blockquote{position:relative;padding-left:40px;padding-top:0;padding-bottom:0;box-sizing:content-box;margin:4px 0}:host ::ng-deep .milkdown .ProseMirror blockquote:before{content:\"\";width:4px;left:0;top:4px;bottom:4px;position:absolute;background:var(--crepe-color-selected);border-radius:100px}:host ::ng-deep .milkdown .ProseMirror blockquote hr{margin-bottom:16px}:host ::ng-deep .milkdown .ProseMirror hr{border:none;background-color:color-mix(in srgb,var(--crepe-color-outline),transparent 80%);background-clip:content-box;padding:6px 0;height:13px;position:relative}:host ::ng-deep .milkdown .ProseMirror hr.ProseMirror-selectednode{outline:none;background-color:color-mix(in srgb,var(--crepe-color-outline),transparent 20%);background-clip:content-box}:host ::ng-deep .milkdown .ProseMirror hr.ProseMirror-selectednode:before{content:\"\";position:absolute;inset:0;background-color:color-mix(in srgb,var(--crepe-color-outline),transparent 80%);pointer-events:none}:host ::ng-deep .milkdown .ProseMirror ul,:host ::ng-deep .milkdown .ProseMirror ol{padding:0}:host ::ng-deep .milkdown .milkdown-code-block{--crepe-color-background: #1b1c1d;--crepe-color-on-background: #f8f9ff;--crepe-color-surface: #111418;--crepe-color-surface-low: #191c20;--crepe-color-on-surface: #e1e2e8;--crepe-color-on-surface-variant: #c3c6cf;--crepe-color-outline: #8d9199;--crepe-color-primary: #a1c9fd;--crepe-color-secondary: #3c4858;--crepe-color-on-secondary: #d7e3f8;--crepe-color-inverse: #e1e2e8;--crepe-color-on-inverse: #2e3135;--crepe-color-inline-code: #ffb4ab;--crepe-color-error: #ffb4ab;--crepe-color-hover: #1d2024;--crepe-color-selected: #32353a;--crepe-color-inline-area: #111418;--crepe-shadow-1: 0px 1px 2px 0px rgba(255, 255, 255, .3), 0px 1px 3px 1px rgba(255, 255, 255, .15);--crepe-shadow-2: 0px 1px 2px 0px rgba(255, 255, 255, .3), 0px 2px 6px 2px rgba(255, 255, 255, .15);background:var(--crepe-color-surface);border-radius:6px}:host.disabled ::ng-deep .markdown-editor-container{opacity:.5;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FsLabelModule }, { kind: "component", type: i1.FsLabelComponent, selector: "fs-label" }, { kind: "component", type: i1.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["appearance", "showOutline", "disabled", "focused", "hoverable", "padless"] }, { kind: "component", type: i1.FsLabelMessageComponent, selector: "fs-label-message" }], viewProviders: [
192
+ {
193
+ provide: ControlContainer,
194
+ deps: [[Optional, NgForm]],
195
+ useFactory: (ngForm) => ngForm,
196
+ },
197
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
198
+ }
199
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsMarkdownEditorComponent, decorators: [{
200
+ type: Component,
201
+ args: [{ selector: 'fs-markdown-editor', providers: [
202
+ {
203
+ provide: NG_VALUE_ACCESSOR,
204
+ useExisting: forwardRef(() => FsMarkdownEditorComponent),
205
+ multi: true,
206
+ },
207
+ {
208
+ provide: NG_VALIDATORS,
209
+ useExisting: forwardRef(() => FsMarkdownEditorComponent),
210
+ multi: true,
211
+ },
212
+ ], changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [
213
+ {
214
+ provide: ControlContainer,
215
+ deps: [[Optional, NgForm]],
216
+ useFactory: (ngForm) => ngForm,
217
+ },
218
+ ], standalone: true, imports: [
219
+ FsLabelModule,
220
+ ], template: "<fs-label-field\n [appearance]=\"'outline'\"\n [hoverable]=\"true\"\n [showOutline]=\"initialized\"\n [disabled]=\"disabled\"\n [padless]=\"config.padless\"\n [class.initialized]=\"initialized\">\n @if (config.label) {\n <fs-label>\n {{ config.label }}\n </fs-label>\n }\n <div\n class=\"markdown-editor-container\"\n [id]=\"containerID\">\n <div #editorRef></div>\n </div>\n <fs-label-message>\n <div class=\"fs-form-message\">\n <div class=\"fs-form-hint\">\n {{ config.hint }}\n </div>\n </div>\n </fs-label-message>\n</fs-label-field>\n", styles: [":host{position:relative;display:block}:host ::ng-deep fs-label-field.initialized.appearance-outline .field-wrap{padding-top:6px;padding-bottom:4px}:host ::ng-deep .markdown-editor-container{position:relative;min-height:100px}:host ::ng-deep .milkdown{--crepe-color-background: transparent;--crepe-color-on-background: #1b1c1d;--crepe-color-surface: #f8f9ff;--crepe-color-surface-low: #f2f3fa;--crepe-color-on-surface: #191c20;--crepe-color-on-surface-variant: #43474e;--crepe-color-outline: #73777f;--crepe-color-primary: #37618e;--crepe-color-secondary: #d7e3f8;--crepe-color-on-secondary: #101c2b;--crepe-color-inverse: #2e3135;--crepe-color-on-inverse: #eff0f7;--crepe-color-inline-code: #ba1a1a;--crepe-color-error: #ba1a1a;--crepe-color-hover: #eceef4;--crepe-color-selected: #e1e2e8;--crepe-color-inline-area: #d8dae0;--crepe-font-title: Rubik, Cambria, \"Times New Roman\", Times, serif;--crepe-font-default: Inter, Arial, Helvetica, sans-serif;--crepe-font-code: \"JetBrains Mono\", Menlo, Monaco, \"Courier New\", Courier, monospace;--crepe-shadow-1: 0px 1px 3px 1px rgba(0, 0, 0, .15), 0px 1px 2px 0px rgba(0, 0, 0, .3);--crepe-shadow-2: 0px 2px 6px 2px rgba(0, 0, 0, .15), 0px 1px 2px 0px rgba(0, 0, 0, .3)}:host ::ng-deep .milkdown{position:relative;color:var(--crepe-color-on-background);background:var(--crepe-color-background)}:host ::ng-deep .milkdown *{margin:0;padding:0;box-sizing:border-box}:host ::ng-deep .milkdown button,:host ::ng-deep .milkdown input{border:none;background:none;box-shadow:none}:host ::ng-deep .milkdown button:focus,:host ::ng-deep .milkdown input:focus{outline:none}:host ::ng-deep .milkdown :focus-visible{outline:none}:host ::ng-deep .milkdown .milkdown-icon{display:inline-flex;align-items:center;justify-content:center}:host ::ng-deep .milkdown .ProseMirror-focused{outline:none}:host ::ng-deep .milkdown .ProseMirror{padding:10px 0}:host ::ng-deep .milkdown .ProseMirror *::selection{background:var(--crepe-color-selected)}:host ::ng-deep .milkdown .ProseMirror li.ProseMirror-selectednode{background:var(--crepe-color-selected);outline:none}:host ::ng-deep .milkdown .ProseMirror li.ProseMirror-selectednode::selection,:host ::ng-deep .milkdown .ProseMirror li.ProseMirror-selectednode ::selection{background:transparent}:host ::ng-deep .milkdown .ProseMirror li.ProseMirror-selectednode:after{all:unset}:host ::ng-deep .milkdown .ProseMirror .ProseMirror-selectednode{background:color-mix(in srgb,var(--crepe-color-selected),transparent 60%);outline:none}:host ::ng-deep .milkdown .ProseMirror .ProseMirror-selectednode::selection,:host ::ng-deep .milkdown .ProseMirror .ProseMirror-selectednode ::selection{background:transparent}:host ::ng-deep .milkdown .ProseMirror[data-dragging=true]::selection,:host ::ng-deep .milkdown .ProseMirror[data-dragging=true] *::selection,:host ::ng-deep .milkdown .ProseMirror[data-dragging=true] .ProseMirror-selectednode{background:transparent}:host ::ng-deep .milkdown .ProseMirror[data-dragging=true] input::selection{background:var(--crepe-color-selected)}:host ::ng-deep .milkdown .ProseMirror img{vertical-align:bottom;max-width:100%}:host ::ng-deep .milkdown .ProseMirror img.ProseMirror-selectednode{background:none;outline:2px solid var(--crepe-color-primary)}:host ::ng-deep .milkdown .ProseMirror h1,:host ::ng-deep .milkdown .ProseMirror h2,:host ::ng-deep .milkdown .ProseMirror h3,:host ::ng-deep .milkdown .ProseMirror h4,:host ::ng-deep .milkdown .ProseMirror h5,:host ::ng-deep .milkdown .ProseMirror h6{font-weight:400;padding:2px 0}:host ::ng-deep .milkdown .ProseMirror h1{font-size:42px;line-height:50px;margin-top:32px}:host ::ng-deep .milkdown .ProseMirror h2{font-size:36px;line-height:44px;margin-top:28px}:host ::ng-deep .milkdown .ProseMirror h3{font-size:32px;line-height:40px;margin-top:24px}:host ::ng-deep .milkdown .ProseMirror h4{font-size:28px;line-height:36px;margin-top:20px}:host ::ng-deep .milkdown .ProseMirror h5{font-size:24px;line-height:32px;margin-top:16px}:host ::ng-deep .milkdown .ProseMirror h6{font-size:18px;font-weight:700;line-height:28px;margin-top:16px}:host ::ng-deep .milkdown .ProseMirror p{font-size:16px;line-height:24px;padding:4px 0}:host ::ng-deep .milkdown .ProseMirror code{color:var(--crepe-color-inline-code);background:color-mix(in srgb,var(--crepe-color-inline-area),transparent 40%);padding:0 2px;border-radius:4px;font-size:87.5%;display:inline-block;line-height:1.4286}:host ::ng-deep .milkdown .ProseMirror a{color:var(--crepe-color-primary);text-decoration:underline}:host ::ng-deep .milkdown .ProseMirror pre{background:color-mix(in srgb,var(--crepe-color-inline-area),transparent 40%);padding:10px;border-radius:4px}:host ::ng-deep .milkdown .ProseMirror pre code{padding:0;background:transparent}:host ::ng-deep .milkdown .ProseMirror blockquote{position:relative;padding-left:40px;padding-top:0;padding-bottom:0;box-sizing:content-box;margin:4px 0}:host ::ng-deep .milkdown .ProseMirror blockquote:before{content:\"\";width:4px;left:0;top:4px;bottom:4px;position:absolute;background:var(--crepe-color-selected);border-radius:100px}:host ::ng-deep .milkdown .ProseMirror blockquote hr{margin-bottom:16px}:host ::ng-deep .milkdown .ProseMirror hr{border:none;background-color:color-mix(in srgb,var(--crepe-color-outline),transparent 80%);background-clip:content-box;padding:6px 0;height:13px;position:relative}:host ::ng-deep .milkdown .ProseMirror hr.ProseMirror-selectednode{outline:none;background-color:color-mix(in srgb,var(--crepe-color-outline),transparent 20%);background-clip:content-box}:host ::ng-deep .milkdown .ProseMirror hr.ProseMirror-selectednode:before{content:\"\";position:absolute;inset:0;background-color:color-mix(in srgb,var(--crepe-color-outline),transparent 80%);pointer-events:none}:host ::ng-deep .milkdown .ProseMirror ul,:host ::ng-deep .milkdown .ProseMirror ol{padding:0}:host ::ng-deep .milkdown .milkdown-code-block{--crepe-color-background: #1b1c1d;--crepe-color-on-background: #f8f9ff;--crepe-color-surface: #111418;--crepe-color-surface-low: #191c20;--crepe-color-on-surface: #e1e2e8;--crepe-color-on-surface-variant: #c3c6cf;--crepe-color-outline: #8d9199;--crepe-color-primary: #a1c9fd;--crepe-color-secondary: #3c4858;--crepe-color-on-secondary: #d7e3f8;--crepe-color-inverse: #e1e2e8;--crepe-color-on-inverse: #2e3135;--crepe-color-inline-code: #ffb4ab;--crepe-color-error: #ffb4ab;--crepe-color-hover: #1d2024;--crepe-color-selected: #32353a;--crepe-color-inline-area: #111418;--crepe-shadow-1: 0px 1px 2px 0px rgba(255, 255, 255, .3), 0px 1px 3px 1px rgba(255, 255, 255, .15);--crepe-shadow-2: 0px 1px 2px 0px rgba(255, 255, 255, .3), 0px 2px 6px 2px rgba(255, 255, 255, .15);background:var(--crepe-color-surface);border-radius:6px}:host.disabled ::ng-deep .markdown-editor-container{opacity:.5;pointer-events:none}\n"] }]
221
+ }], propDecorators: { editorRef: [{
222
+ type: ViewChild,
223
+ args: ['editorRef']
224
+ }], classFocused: [{
225
+ type: HostBinding,
226
+ args: ['class.focused']
227
+ }], config: [{
228
+ type: Input
229
+ }], disabled: [{
230
+ type: Input
231
+ }, {
232
+ type: HostBinding,
233
+ args: ['class.disabled']
234
+ }], initialized: [{
235
+ type: HostBinding,
236
+ args: ['class.initialized']
237
+ }] } });
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tYXJrZG93bi1lZGl0b3IvY29tcG9uZW50cy9tYXJrZG93bi1lZGl0b3IvbWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tYXJrZG93bi1lZGl0b3IvY29tcG9uZW50cy9tYXJrZG93bi1lZGl0b3IvbWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixNQUFNLEdBR1AsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTNDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXhFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7QUFnQ2pGLE1BQU0sT0FBTyx5QkFBeUI7SUFHNUIsY0FBYyxHQUFHLE1BQU0sQ0FBeUIseUJBQXlCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvRixNQUFNLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDbkMsT0FBTyxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFQSxTQUFTLENBQWE7SUFFaEIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUUxQyxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJQUk3QyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBR2pCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFWCxXQUFXLEdBQUcsc0JBQXNCLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzNELFNBQVMsQ0FBYTtJQUN0QixRQUFRLENBQXNCO0lBRTdCLE1BQU0sQ0FBUTtJQUNkLGNBQWMsQ0FBTTtJQUNwQixVQUFVLENBQU07SUFDaEIsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUNmLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFeEMsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2FBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQy9CLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3BCLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxVQUFVLENBQUMsUUFBZ0I7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDO1FBRWhDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVNLGdCQUFnQixDQUFDLEVBQXVCO1FBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxFQUFjO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRU0sUUFBUTtRQUNiLE1BQU0sR0FBRyxHQUFRLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUNyQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQyxHQUFHLENBQUMsY0FBYyxHQUFHLFdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLHFDQUFxQyxNQUFNLGNBQWMsQ0FBQztZQUNqSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlDLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRU0sV0FBVyxDQUFDLFFBQWdCO1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2hDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBUSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVNLE9BQU87UUFDWixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25DLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN0QyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDbEUsTUFBTSxDQUFDLGlCQUFpQixDQUFDO2dCQUN6QixNQUFNLENBQUMsb0JBQW9CLENBQUM7YUFDN0IsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7WUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFFNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQztnQkFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYTtnQkFDbEMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUM1QixRQUFRLEVBQUUsRUFBRTtnQkFDWixjQUFjLEVBQUU7b0JBQ2QsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksaUJBQWlCO3FCQUNuRDtpQkFDRjthQUNGLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQzFCLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxFQUFFO29CQUN4RCxJQUFJLFFBQVEsS0FBSyxZQUFZLEVBQUUsQ0FBQzt3QkFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFOzRCQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQzs0QkFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0NBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQzFCLENBQUM7NEJBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0NBQ25CLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDbkIsQ0FBQzs0QkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUM3QixDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO29CQUV4QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDekMsQ0FBQztvQkFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUUzQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQzFCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZixDQUFDO29CQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDNUIsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8saUJBQWlCLENBQUMsUUFBZ0I7UUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFRLENBQUM7WUFDakQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFRLENBQUM7WUFDL0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdCLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUNsQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTyxDQUM1QyxDQUFDO2dCQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt1R0FuTlUseUJBQXlCOzJGQUF6Qix5QkFBeUIsaVFBekJ6QjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMseUJBQXlCLENBQUM7Z0JBQ3hELEtBQUssRUFBRSxJQUFJO2FBQ1o7WUFDRDtnQkFDRSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztnQkFDeEQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLGtJQ3RESCxxbEJBeUJBLCt0TkR3Q0ksYUFBYSw0VkFUQTtZQUNiO2dCQUNFLE9BQU8sRUFBRSxnQkFBZ0I7Z0JBQ3pCLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQixVQUFVLEVBQUUsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU07YUFDdkM7U0FDRjs7MkZBTVUseUJBQXlCO2tCQTdCckMsU0FBUzsrQkFDRSxvQkFBb0IsYUFHbkI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUM7NEJBQ3hELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDO3dCQUNiOzRCQUNFLE9BQU8sRUFBRSxnQkFBZ0I7NEJBQ3pCLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDOzRCQUMxQixVQUFVLEVBQUUsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU07eUJBQ3ZDO3FCQUNGLGNBQ1csSUFBSSxXQUNQO3dCQUNQLGFBQWE7cUJBQ2Q7OEJBVThCLFNBQVM7c0JBQXZDLFNBQVM7dUJBQUMsV0FBVztnQkFFZSxZQUFZO3NCQUFoRCxXQUFXO3VCQUFDLGVBQWU7Z0JBRVosTUFBTTtzQkFBckIsS0FBSztnQkFJQyxRQUFRO3NCQUZkLEtBQUs7O3NCQUNMLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQUl0QixXQUFXO3NCQURqQixXQUFXO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb250cm9sQ29udGFpbmVyLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nRm9ybSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IGd1aWQgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRnNMYWJlbE1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2xhYmVsJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgdHlwZSB7IENyZXBlIH0gZnJvbSAnQG1pbGtkb3duL2NyZXBlJztcblxuaW1wb3J0IHsgRlNfTUFSS0RPV05fRURJVE9SX0NPTkZJRyB9IGZyb20gJy4uLy4uL2luamVjdHMvY29uZmlnLmluamVjdCc7XG5pbXBvcnQgeyBGc01hcmtkb3duRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9tYXJrZG93bi1lZGl0b3ItY29uZmlnJztcbmltcG9ydCB7IEZzTWlsa2Rvd25Mb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWlsa2Rvd24tbG9hZGVyLnNlcnZpY2UnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLW1hcmtkb3duLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXJrZG93bi1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXJrZG93bi1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGc01hcmtkb3duRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZzTWFya2Rvd25FZGl0b3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHZpZXdQcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLFxuICAgICAgZGVwczogW1tPcHRpb25hbCwgTmdGb3JtXV0sXG4gICAgICB1c2VGYWN0b3J5OiAobmdGb3JtOiBOZ0Zvcm0pID0+IG5nRm9ybSxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRnNMYWJlbE1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNNYXJrZG93bkVkaXRvckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9kZWZhdWx0Q29uZmlnID0gaW5qZWN0PEZzTWFya2Rvd25FZGl0b3JDb25maWc+KEZTX01BUktET1dOX0VESVRPUl9DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgX2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSBfbG9hZGVyID0gaW5qZWN0KEZzTWlsa2Rvd25Mb2FkZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvclJlZicpIHB1YmxpYyBlZGl0b3JSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mb2N1c2VkJykgcHVibGljIGNsYXNzRm9jdXNlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IEZzTWFya2Rvd25FZGl0b3JDb25maWcgPSB7fTtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRpc2FibGVkJylcbiAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pbml0aWFsaXplZCcpXG4gIHB1YmxpYyBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJJRCA9IGBmcy1tYXJrZG93bi1lZGl0b3ItJHtndWlkKCd4eHgnKX1gO1xuICBwdWJsaWMgb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgb25DaGFuZ2U6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBfY3JlcGU6IENyZXBlO1xuICBwcml2YXRlIF9lZGl0b3JWaWV3Q3R4OiBhbnk7XG4gIHByaXZhdGUgX3BhcnNlckN0eDogYW55O1xuICBwcml2YXRlIF9tYXJrZG93biA9ICcnO1xuICBwcml2YXRlIF9lZGl0b3JSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHVibGljIGdldCBtYXJrZG93bigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tYXJrZG93bjtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uKHRoaXMuX2RlZmF1bHRDb25maWcgfHwge30pLCAuLi4odGhpcy5jb25maWcgfHwge30pIH07XG4gICAgdGhpcy5fbG9hZGVyLmxvYWRTdHlsZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbG9hZGVyLmxvYWRlZCRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChsb2FkZWQpID0+IHtcbiAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgIHRoaXMuX2luaXRFZGl0b3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZShtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fbWFya2Rvd24gPSBtYXJrZG93biB8fCAnJztcblxuICAgIGlmICh0aGlzLl9lZGl0b3JSZWFkeSkge1xuICAgICAgdGhpcy5fc2V0RWRpdG9yQ29udGVudCh0aGlzLl9tYXJrZG93bik7XG4gICAgfVxuXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgaWYgKHRoaXMuY29uZmlnLm1heExlbmd0aCAmJiB0aGlzLl9tYXJrZG93bikge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fbWFya2Rvd24ubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IHRoaXMuY29uZmlnLm1heExlbmd0aCkge1xuICAgICAgICBlcnIubWF4TGVuZ3RoRXJyb3IgPSBgTXVzdCBiZSAke3RoaXMuY29uZmlnLm1heExlbmd0aH0gY2hhcmFjdGVycyBvciBmZXdlci4gWW91IGVudGVyZWQgJHtsZW5ndGh9IGNoYXJhY3RlcnMuYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyKS5sZW5ndGggPyBlcnIgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMud3JpdGVWYWx1ZSgnJyk7XG4gICAgaWYgKHRoaXMub25DaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UoJycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRNYXJrZG93bihtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53cml0ZVZhbHVlKG1hcmtkb3duKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXJrZG93bigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fY3JlcGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXJrZG93bjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY3JlcGUuZ2V0TWFya2Rvd24oKTtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3JlcGUgJiYgdGhpcy5fZWRpdG9yVmlld0N0eCkge1xuICAgICAgdGhpcy5fY3JlcGUuZWRpdG9yLmFjdGlvbigoY3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBjdHguZ2V0KHRoaXMuX2VkaXRvclZpZXdDdHgpIGFzIGFueTtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3JlcGUpIHtcbiAgICAgIHRoaXMuX2NyZXBlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2NyZXBlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fZWRpdG9yUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0RWRpdG9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jcmVwZSB8fCAhdGhpcy5lZGl0b3JSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IFt7IENyZXBlIH0sIHsgZWRpdG9yVmlld0N0eCwgcGFyc2VyQ3R4IH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBpbXBvcnQoJ0BtaWxrZG93bi9jcmVwZScpLFxuICAgICAgICBpbXBvcnQoJ0BtaWxrZG93bi9raXQvY29yZScpLFxuICAgICAgXSk7XG5cbiAgICAgIHRoaXMuX2VkaXRvclZpZXdDdHggPSBlZGl0b3JWaWV3Q3R4O1xuICAgICAgdGhpcy5fcGFyc2VyQ3R4ID0gcGFyc2VyQ3R4O1xuXG4gICAgICB0aGlzLl9jcmVwZSA9IG5ldyBDcmVwZSh7XG4gICAgICAgIHJvb3Q6IHRoaXMuZWRpdG9yUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5fbWFya2Rvd24sXG4gICAgICAgIGZlYXR1cmVzOiB7fSxcbiAgICAgICAgZmVhdHVyZUNvbmZpZ3M6IHtcbiAgICAgICAgICBbQ3JlcGUuRmVhdHVyZS5QbGFjZWhvbGRlcl06IHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuY29uZmlnLnBsYWNlaG9sZGVyIHx8ICdTdGFydCB0eXBpbmcuLi4nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fY3JlcGUub24oKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyLm1hcmtkb3duVXBkYXRlZCgoX2N0eCwgbWFya2Rvd24sIHByZXZNYXJrZG93bikgPT4ge1xuICAgICAgICAgIGlmIChtYXJrZG93biAhPT0gcHJldk1hcmtkb3duKSB7XG4gICAgICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX21hcmtkb3duID0gbWFya2Rvd247XG4gICAgICAgICAgICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShtYXJrZG93bik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHRoaXMub25Ub3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fY3JlcGUuY3JlYXRlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9lZGl0b3JSZWFkeSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAodGhpcy5fbWFya2Rvd24pIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEVkaXRvckNvbnRlbnQodGhpcy5fbWFya2Rvd24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcuaW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRFZGl0b3JDb250ZW50KG1hcmtkb3duOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jcmVwZS5lZGl0b3IuYWN0aW9uKChjdHgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBjdHguZ2V0KHRoaXMuX2VkaXRvclZpZXdDdHgpIGFzIGFueTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IGN0eC5nZXQodGhpcy5fcGFyc2VyQ3R4KSBhcyBhbnk7XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZXIobWFya2Rvd24pO1xuICAgICAgaWYgKGRvYykge1xuICAgICAgICBjb25zdCB0ciA9IHZpZXcuc3RhdGUudHIucmVwbGFjZVdpdGgoXG4gICAgICAgICAgMCwgdmlldy5zdGF0ZS5kb2MuY29udGVudC5zaXplLCBkb2MuY29udGVudCxcbiAgICAgICAgKTtcbiAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxmcy1sYWJlbC1maWVsZFxuICBbYXBwZWFyYW5jZV09XCInb3V0bGluZSdcIlxuICBbaG92ZXJhYmxlXT1cInRydWVcIlxuICBbc2hvd091dGxpbmVdPVwiaW5pdGlhbGl6ZWRcIlxuICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbcGFkbGVzc109XCJjb25maWcucGFkbGVzc1wiXG4gIFtjbGFzcy5pbml0aWFsaXplZF09XCJpbml0aWFsaXplZFwiPlxuICBAaWYgKGNvbmZpZy5sYWJlbCkge1xuICAgIDxmcy1sYWJlbD5cbiAgICAgIHt7IGNvbmZpZy5sYWJlbCB9fVxuICAgIDwvZnMtbGFiZWw+XG4gIH1cbiAgPGRpdlxuICAgIGNsYXNzPVwibWFya2Rvd24tZWRpdG9yLWNvbnRhaW5lclwiXG4gICAgW2lkXT1cImNvbnRhaW5lcklEXCI+XG4gICAgPGRpdiAjZWRpdG9yUmVmPjwvZGl2PlxuICA8L2Rpdj5cbiAgPGZzLWxhYmVsLW1lc3NhZ2U+XG4gICAgPGRpdiBjbGFzcz1cImZzLWZvcm0tbWVzc2FnZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taGludFwiPlxuICAgICAgICB7eyBjb25maWcuaGludCB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZnMtbGFiZWwtbWVzc2FnZT5cbjwvZnMtbGFiZWwtZmllbGQ+XG4iXX0=
@@ -0,0 +1,47 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { FsLabelModule } from '@firestitch/label';
4
+ import { FsMarkdownEditorComponent } from './components/markdown-editor/markdown-editor.component';
5
+ import { FS_MARKDOWN_EDITOR_CONFIG, FS_MARKDOWN_EDITOR_DEFAULT_CONFIG } from './injects/config.inject';
6
+ import * as i0 from "@angular/core";
7
+ export class FsMarkdownEditorModule {
8
+ static forRoot(config = {}) {
9
+ return {
10
+ ngModule: FsMarkdownEditorModule,
11
+ providers: [
12
+ { provide: FS_MARKDOWN_EDITOR_DEFAULT_CONFIG, useValue: config },
13
+ {
14
+ provide: FS_MARKDOWN_EDITOR_CONFIG,
15
+ useFactory: markdownEditorConfigFactory,
16
+ deps: [FS_MARKDOWN_EDITOR_DEFAULT_CONFIG],
17
+ },
18
+ ],
19
+ };
20
+ }
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsMarkdownEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
22
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.7", ngImport: i0, type: FsMarkdownEditorModule, imports: [CommonModule,
23
+ FsLabelModule,
24
+ FsMarkdownEditorComponent], exports: [FsMarkdownEditorComponent] });
25
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsMarkdownEditorModule, imports: [CommonModule,
26
+ FsLabelModule,
27
+ FsMarkdownEditorComponent] });
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsMarkdownEditorModule, decorators: [{
30
+ type: NgModule,
31
+ args: [{
32
+ imports: [
33
+ CommonModule,
34
+ FsLabelModule,
35
+ FsMarkdownEditorComponent,
36
+ ],
37
+ exports: [
38
+ FsMarkdownEditorComponent,
39
+ ],
40
+ }]
41
+ }] });
42
+ export function markdownEditorConfigFactory(config) {
43
+ return {
44
+ ...config,
45
+ };
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtbWFya2Rvd24tZWRpdG9yLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tYXJrZG93bi1lZGl0b3IvZnMtbWFya2Rvd24tZWRpdG9yLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ25HLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQWN2RyxNQUFNLE9BQU8sc0JBQXNCO0lBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBaUMsRUFBRTtRQUN2RCxPQUFPO1lBQ0wsUUFBUSxFQUFFLHNCQUFzQjtZQUNoQyxTQUFTLEVBQUU7Z0JBQ1QsRUFBRSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTtnQkFDaEU7b0JBQ0UsT0FBTyxFQUFFLHlCQUF5QjtvQkFDbEMsVUFBVSxFQUFFLDJCQUEyQjtvQkFDdkMsSUFBSSxFQUFFLENBQUMsaUNBQWlDLENBQUM7aUJBQzFDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzt1R0FiVSxzQkFBc0I7d0dBQXRCLHNCQUFzQixZQVIvQixZQUFZO1lBQ1osYUFBYTtZQUNiLHlCQUF5QixhQUd6Qix5QkFBeUI7d0dBR2hCLHNCQUFzQixZQVIvQixZQUFZO1lBQ1osYUFBYTtZQUNiLHlCQUF5Qjs7MkZBTWhCLHNCQUFzQjtrQkFWbEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixhQUFhO3dCQUNiLHlCQUF5QjtxQkFDMUI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHlCQUF5QjtxQkFDMUI7aUJBQ0Y7O0FBaUJELE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxNQUE4QjtJQUN4RSxPQUFPO1FBQ0wsR0FBRyxNQUFNO0tBQ1YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRnNMYWJlbE1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2xhYmVsJztcblxuaW1wb3J0IHsgRnNNYXJrZG93bkVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9tYXJrZG93bi1lZGl0b3IvbWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGU19NQVJLRE9XTl9FRElUT1JfQ09ORklHLCBGU19NQVJLRE9XTl9FRElUT1JfREVGQVVMVF9DT05GSUcgfSBmcm9tICcuL2luamVjdHMvY29uZmlnLmluamVjdCc7XG5pbXBvcnQgeyBGc01hcmtkb3duRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL21hcmtkb3duLWVkaXRvci1jb25maWcnO1xuXG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRnNMYWJlbE1vZHVsZSxcbiAgICBGc01hcmtkb3duRWRpdG9yQ29tcG9uZW50LFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRnNNYXJrZG93bkVkaXRvckNvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNNYXJrZG93bkVkaXRvck1vZHVsZSB7XG4gIHB1YmxpYyBzdGF0aWMgZm9yUm9vdChjb25maWc6IEZzTWFya2Rvd25FZGl0b3JDb25maWcgPSB7fSk6IE1vZHVsZVdpdGhQcm92aWRlcnM8RnNNYXJrZG93bkVkaXRvck1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogRnNNYXJrZG93bkVkaXRvck1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IEZTX01BUktET1dOX0VESVRPUl9ERUZBVUxUX0NPTkZJRywgdXNlVmFsdWU6IGNvbmZpZyB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogRlNfTUFSS0RPV05fRURJVE9SX0NPTkZJRyxcbiAgICAgICAgICB1c2VGYWN0b3J5OiBtYXJrZG93bkVkaXRvckNvbmZpZ0ZhY3RvcnksXG4gICAgICAgICAgZGVwczogW0ZTX01BUktET1dOX0VESVRPUl9ERUZBVUxUX0NPTkZJR10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtkb3duRWRpdG9yQ29uZmlnRmFjdG9yeShjb25maWc6IEZzTWFya2Rvd25FZGl0b3JDb25maWcpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5jb25maWcsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const FS_MARKDOWN_EDITOR_DEFAULT_CONFIG = new InjectionToken('fs-markdown-editor.default-config');
3
+ export const FS_MARKDOWN_EDITOR_CONFIG = new InjectionToken('fs-markdown-editor.config');
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmluamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tYXJrZG93bi1lZGl0b3IvaW5qZWN0cy9jb25maWcuaW5qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUcsSUFBSSxjQUFjLENBQVEsbUNBQW1DLENBQUMsQ0FBQztBQUNoSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLGNBQWMsQ0FBUSwyQkFBMkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNvbnN0IEZTX01BUktET1dOX0VESVRPUl9ERUZBVUxUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxhbnlbXT4oJ2ZzLW1hcmtkb3duLWVkaXRvci5kZWZhdWx0LWNvbmZpZycpO1xuZXhwb3J0IGNvbnN0IEZTX01BUktET1dOX0VESVRPUl9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48YW55W10+KCdmcy1tYXJrZG93bi1lZGl0b3IuY29uZmlnJyk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tZWRpdG9yLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tYXJrZG93bi1lZGl0b3IvaW50ZXJmYWNlcy9tYXJrZG93bi1lZGl0b3ItY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEZzTWFya2Rvd25FZGl0b3JDb25maWcge1xuICBsYWJlbD86IHN0cmluZztcbiAgaGludD86IHN0cmluZztcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgYXV0b2ZvY3VzPzogYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBwYWRsZXNzPzogYm9vbGVhbjtcbiAgaW5pdGlhbGl6ZWQ/OiAoKSA9PiB2b2lkO1xufVxuIl19
@@ -0,0 +1,78 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { Injectable, inject } from '@angular/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { shareReplay } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ const THEME_BASE = '/assets/milkdown/theme/';
7
+ const STYLESHEETS = [
8
+ `${THEME_BASE}common/block-edit.css`,
9
+ `${THEME_BASE}common/code-mirror.css`,
10
+ `${THEME_BASE}common/cursor.css`,
11
+ `${THEME_BASE}common/image-block.css`,
12
+ `${THEME_BASE}common/latex.css`,
13
+ `${THEME_BASE}common/link-tooltip.css`,
14
+ `${THEME_BASE}common/list-item.css`,
15
+ `${THEME_BASE}common/placeholder.css`,
16
+ `${THEME_BASE}common/toolbar.css`,
17
+ `${THEME_BASE}common/table.css`,
18
+ ];
19
+ export class FsMilkdownLoaderService {
20
+ _document = inject(DOCUMENT);
21
+ _loaded = new BehaviorSubject(false);
22
+ _stylesLoaded = false;
23
+ _loaded$ = this._loaded.asObservable()
24
+ .pipe(shareReplay(1));
25
+ get loaded$() {
26
+ return this._loaded$;
27
+ }
28
+ loadStyles() {
29
+ if (this._stylesLoaded) {
30
+ this._loaded.next(true);
31
+ return;
32
+ }
33
+ let remaining = STYLESHEETS.length;
34
+ if (remaining === 0) {
35
+ this._stylesLoaded = true;
36
+ this._loaded.next(true);
37
+ return;
38
+ }
39
+ STYLESHEETS.forEach((href) => {
40
+ const existing = this._document.querySelector(`link[href="${href}"]`);
41
+ if (existing) {
42
+ remaining--;
43
+ if (remaining === 0) {
44
+ this._stylesLoaded = true;
45
+ this._loaded.next(true);
46
+ }
47
+ return;
48
+ }
49
+ const link = this._document.createElement('link');
50
+ link.rel = 'stylesheet';
51
+ link.href = href;
52
+ link.onload = () => {
53
+ remaining--;
54
+ if (remaining === 0) {
55
+ this._stylesLoaded = true;
56
+ this._loaded.next(true);
57
+ }
58
+ };
59
+ link.onerror = () => {
60
+ remaining--;
61
+ if (remaining === 0) {
62
+ this._stylesLoaded = true;
63
+ this._loaded.next(true);
64
+ }
65
+ };
66
+ this._document.head.appendChild(link);
67
+ });
68
+ }
69
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsMilkdownLoaderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
70
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsMilkdownLoaderService, providedIn: 'root' });
71
+ }
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsMilkdownLoaderService, decorators: [{
73
+ type: Injectable,
74
+ args: [{
75
+ providedIn: 'root',
76
+ }]
77
+ }] });
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlsa2Rvd24tbG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvbWFya2Rvd24tZWRpdG9yL3NlcnZpY2VzL21pbGtkb3duLWxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFN0MsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUM7QUFFN0MsTUFBTSxXQUFXLEdBQUc7SUFDbEIsR0FBRyxVQUFVLHVCQUF1QjtJQUNwQyxHQUFHLFVBQVUsd0JBQXdCO0lBQ3JDLEdBQUcsVUFBVSxtQkFBbUI7SUFDaEMsR0FBRyxVQUFVLHdCQUF3QjtJQUNyQyxHQUFHLFVBQVUsa0JBQWtCO0lBQy9CLEdBQUcsVUFBVSx5QkFBeUI7SUFDdEMsR0FBRyxVQUFVLHNCQUFzQjtJQUNuQyxHQUFHLFVBQVUsd0JBQXdCO0lBQ3JDLEdBQUcsVUFBVSxvQkFBb0I7SUFDakMsR0FBRyxVQUFVLGtCQUFrQjtDQUNoQyxDQUFDO0FBS0YsTUFBTSxPQUFPLHVCQUF1QjtJQUMxQixTQUFTLEdBQUcsTUFBTSxDQUFXLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRXRCLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtTQUMzQyxJQUFJLENBQ0gsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7SUFFSixJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxVQUFVO1FBQ2YsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFeEIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBRW5DLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXhCLE9BQU87UUFDVCxDQUFDO1FBRUQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUN0RSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLFNBQVMsRUFBRSxDQUFDO2dCQUNaLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztvQkFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLENBQUM7Z0JBRUQsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDakIsU0FBUyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxTQUFTLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO2dCQUNsQixTQUFTLEVBQUUsQ0FBQztnQkFDWixJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7b0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt1R0E5RFUsdUJBQXVCOzJHQUF2Qix1QkFBdUIsY0FGdEIsTUFBTTs7MkZBRVAsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5jb25zdCBUSEVNRV9CQVNFID0gJy9hc3NldHMvbWlsa2Rvd24vdGhlbWUvJztcblxuY29uc3QgU1RZTEVTSEVFVFMgPSBbXG4gIGAke1RIRU1FX0JBU0V9Y29tbW9uL2Jsb2NrLWVkaXQuY3NzYCxcbiAgYCR7VEhFTUVfQkFTRX1jb21tb24vY29kZS1taXJyb3IuY3NzYCxcbiAgYCR7VEhFTUVfQkFTRX1jb21tb24vY3Vyc29yLmNzc2AsXG4gIGAke1RIRU1FX0JBU0V9Y29tbW9uL2ltYWdlLWJsb2NrLmNzc2AsXG4gIGAke1RIRU1FX0JBU0V9Y29tbW9uL2xhdGV4LmNzc2AsXG4gIGAke1RIRU1FX0JBU0V9Y29tbW9uL2xpbmstdG9vbHRpcC5jc3NgLFxuICBgJHtUSEVNRV9CQVNFfWNvbW1vbi9saXN0LWl0ZW0uY3NzYCxcbiAgYCR7VEhFTUVfQkFTRX1jb21tb24vcGxhY2Vob2xkZXIuY3NzYCxcbiAgYCR7VEhFTUVfQkFTRX1jb21tb24vdG9vbGJhci5jc3NgLFxuICBgJHtUSEVNRV9CQVNFfWNvbW1vbi90YWJsZS5jc3NgLFxuXTtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEZzTWlsa2Rvd25Mb2FkZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfZG9jdW1lbnQgPSBpbmplY3Q8RG9jdW1lbnQ+KERPQ1VNRU5UKTtcbiAgcHJpdmF0ZSBfbG9hZGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgX3N0eWxlc0xvYWRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2xvYWRlZCQgPSB0aGlzLl9sb2FkZWQuYXNPYnNlcnZhYmxlKClcbiAgICAucGlwZShcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICk7XG5cbiAgcHVibGljIGdldCBsb2FkZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWQkO1xuICB9XG5cbiAgcHVibGljIGxvYWRTdHlsZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0eWxlc0xvYWRlZCkge1xuICAgICAgdGhpcy5fbG9hZGVkLm5leHQodHJ1ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVtYWluaW5nID0gU1RZTEVTSEVFVFMubGVuZ3RoO1xuXG4gICAgaWYgKHJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgdGhpcy5fc3R5bGVzTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2xvYWRlZC5uZXh0KHRydWUpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgU1RZTEVTSEVFVFMuZm9yRWFjaCgoaHJlZikgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBsaW5rW2hyZWY9XCIke2hyZWZ9XCJdYCk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgcmVtYWluaW5nLS07XG4gICAgICAgIGlmIChyZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9zdHlsZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZC5uZXh0KHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5rID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICBsaW5rLmhyZWYgPSBocmVmO1xuICAgICAgbGluay5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHJlbWFpbmluZy0tO1xuICAgICAgICBpZiAocmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fc3R5bGVzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9sb2FkZWQubmV4dCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGxpbmsub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVtYWluaW5nLS07XG4gICAgICAgIGlmIChyZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9zdHlsZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZC5uZXh0KHRydWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgIH0pO1xuICB9XG59XG4iXX0=