@firestitch/markdown-editor 18.0.0 → 18.0.1

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,219 @@
1
+ @import '@milkdown/kit/prose/tables/style/tables.css';
2
+
3
+ .milkdown .milkdown-table-block {
4
+ display: block;
5
+ margin: 4px 0;
6
+ }
7
+
8
+ .milkdown .milkdown-table-block th,
9
+ .milkdown .milkdown-table-block td {
10
+ border: 1px solid
11
+ color-mix(in srgb, var(--crepe-color-outline), transparent 80%);
12
+ padding: 4px 16px;
13
+ }
14
+
15
+ .milkdown .milkdown-table-block th .ProseMirror-selectednode, .milkdown .milkdown-table-block td .ProseMirror-selectednode {
16
+ background-color: transparent !important;
17
+ }
18
+
19
+ .milkdown .milkdown-table-block th:has(.ProseMirror-selectednode), .milkdown .milkdown-table-block td:has(.ProseMirror-selectednode) {
20
+ outline: 1px solid var(--crepe-color-primary);
21
+ outline-offset: -1px;
22
+ }
23
+
24
+ .milkdown .milkdown-table-block .selectedCell::after {
25
+ background-color: var(--crepe-color-selected);
26
+ opacity: 0.4;
27
+ }
28
+
29
+ .milkdown .milkdown-table-block .selectedCell ::-moz-selection {
30
+ background: transparent;
31
+ }
32
+
33
+ .milkdown .milkdown-table-block .selectedCell ::selection {
34
+ background: transparent;
35
+ }
36
+
37
+ .milkdown .milkdown-table-block .drag-preview {
38
+ background-color: var(--crepe-color-surface);
39
+ opacity: 0.4;
40
+ position: absolute;
41
+ z-index: 100;
42
+ display: flex;
43
+ flex-direction: column;
44
+ outline: 1px solid var(--crepe-color-primary);
45
+ outline-offset: -1px;
46
+ }
47
+
48
+ .milkdown .milkdown-table-block .drag-preview[data-show='false'] {
49
+ display: none;
50
+ }
51
+
52
+ .milkdown .milkdown-table-block .drag-preview th:has(.ProseMirror-selectednode), .milkdown .milkdown-table-block .drag-preview td:has(.ProseMirror-selectednode) {
53
+ outline: none;
54
+ }
55
+
56
+ .milkdown .milkdown-table-block .handle {
57
+ position: absolute;
58
+ font-size: 14px;
59
+ transition: opacity ease-in-out 0.2s;
60
+ }
61
+
62
+ .milkdown .milkdown-table-block .handle[data-show='false'] {
63
+ opacity: 0;
64
+ }
65
+
66
+ .milkdown .milkdown-table-block svg {
67
+ fill: var(--crepe-color-outline);
68
+ }
69
+
70
+ .milkdown .milkdown-table-block .cell-handle {
71
+ z-index: 50;
72
+ left: -999px;
73
+ top: -999px;
74
+ cursor: grab;
75
+ background-color: var(--crepe-color-surface);
76
+ color: var(--crepe-color-outline);
77
+ border-radius: 100px;
78
+ box-shadow: var(--crepe-shadow-1);
79
+ transition: background-color 0.2s ease-in-out;
80
+ }
81
+
82
+ .milkdown .milkdown-table-block .cell-handle:hover {
83
+ background-color: var(--crepe-color-hover);
84
+ }
85
+
86
+ .milkdown .milkdown-table-block .cell-handle:has(.button-group:hover) {
87
+ background-color: var(--crepe-color-surface);
88
+ }
89
+
90
+ .milkdown .milkdown-table-block .cell-handle[data-role='col-drag-handle'] {
91
+ transform: translateY(50%);
92
+ padding: 0 6px;
93
+ width: 28px;
94
+ height: 16px;
95
+ }
96
+
97
+ .milkdown .milkdown-table-block .cell-handle[data-role='row-drag-handle'] {
98
+ transform: translateX(50%);
99
+ padding: 6px 0;
100
+ width: 16px;
101
+ height: 28px;
102
+ }
103
+
104
+ .milkdown .milkdown-table-block .cell-handle .button-group {
105
+ position: absolute;
106
+ transform: translateX(-50%);
107
+ left: 50%;
108
+ top: -52px;
109
+ display: flex;
110
+ background-color: var(--crepe-color-surface);
111
+ border-radius: 8px;
112
+ box-shadow: var(--crepe-shadow-1);
113
+ }
114
+
115
+ .milkdown .milkdown-table-block .cell-handle .button-group::after {
116
+ content: '';
117
+ position: absolute;
118
+ bottom: -8px;
119
+ height: 8px;
120
+ background-color: transparent;
121
+ width: 100%;
122
+ }
123
+
124
+ .milkdown .milkdown-table-block .cell-handle .button-group[data-show='false'] {
125
+ display: none;
126
+ }
127
+
128
+ .milkdown .milkdown-table-block .cell-handle .button-group button {
129
+ cursor: pointer;
130
+ margin: 6px;
131
+ padding: 4px;
132
+ display: flex;
133
+ justify-content: center;
134
+ align-items: center;
135
+ border-radius: 4px;
136
+ }
137
+
138
+ .milkdown .milkdown-table-block .cell-handle .button-group button svg {
139
+ width: 24px;
140
+ height: 24px;
141
+ }
142
+
143
+ .milkdown .milkdown-table-block .cell-handle .button-group button:hover {
144
+ border-radius: 8px;
145
+ background-color: var(--crepe-color-hover);
146
+ }
147
+
148
+ .milkdown .milkdown-table-block .cell-handle .button-group button:active {
149
+ background: var(--crepe-color-selected);
150
+ }
151
+
152
+ .milkdown .milkdown-table-block .cell-handle:hover {
153
+ opacity: 1;
154
+ }
155
+
156
+ .milkdown .milkdown-table-block .line-handle {
157
+ z-index: 20;
158
+ background-color: var(--crepe-color-primary);
159
+ }
160
+
161
+ .milkdown .milkdown-table-block .line-handle:hover {
162
+ opacity: 1;
163
+ }
164
+
165
+ .milkdown .milkdown-table-block .line-handle .add-button {
166
+ cursor: pointer;
167
+ background-color: var(--crepe-color-surface);
168
+ color: var(--crepe-color-outline);
169
+ border-radius: 100px;
170
+ box-shadow: var(--crepe-shadow-1);
171
+ transition: background-color 0.2s ease-in-out;
172
+ }
173
+
174
+ .milkdown .milkdown-table-block .line-handle .add-button svg {
175
+ width: 16px;
176
+ height: 16px;
177
+ }
178
+
179
+ .milkdown .milkdown-table-block .line-handle .add-button:hover {
180
+ background-color: var(--crepe-color-hover);
181
+ }
182
+
183
+ .milkdown .milkdown-table-block .line-handle .add-button:active {
184
+ background: var(--crepe-color-selected);
185
+ }
186
+
187
+ .milkdown .milkdown-table-block .line-handle[data-role='x-line-drag-handle'] {
188
+ height: 1px;
189
+ z-index: 2;
190
+ }
191
+
192
+ .milkdown .milkdown-table-block .line-handle[data-role='x-line-drag-handle'] .add-button {
193
+ position: absolute;
194
+ transform: translateX(-50%) translateY(-50%);
195
+ padding: 6px 0;
196
+ width: 16px;
197
+ height: 28px;
198
+ }
199
+
200
+ .milkdown .milkdown-table-block .line-handle[data-role='y-line-drag-handle'] {
201
+ width: 1px;
202
+ z-index: 1;
203
+ }
204
+
205
+ .milkdown .milkdown-table-block .line-handle[data-role='y-line-drag-handle'] .add-button {
206
+ position: absolute;
207
+ transform: translateY(-50%) translateX(-50%);
208
+ padding: 0 6px;
209
+ width: 28px;
210
+ height: 16px;
211
+ }
212
+
213
+ .milkdown .milkdown-table-block .line-handle[data-display-type='indicator'] .add-button {
214
+ display: none;
215
+ }
216
+
217
+ .milkdown .milkdown-table-block.readonly .handle {
218
+ display: none;
219
+ }
@@ -0,0 +1,50 @@
1
+ .milkdown:has(.milkdown-link-preview[data-show='true']) .milkdown-toolbar,
2
+ .milkdown:has(.milkdown-link-edit[data-show='true']) .milkdown-toolbar {
3
+ display: none;
4
+ }
5
+ .milkdown .milkdown-toolbar[data-show='false'] {
6
+ display: none;
7
+ }
8
+ .milkdown .milkdown-toolbar {
9
+ z-index: 10;
10
+ position: absolute;
11
+ display: flex;
12
+ background: var(--crepe-color-surface);
13
+ box-shadow: var(--crepe-shadow-1);
14
+ border-radius: 8px;
15
+ overflow: hidden;
16
+ }
17
+ .milkdown .milkdown-toolbar .divider {
18
+ width: 1px;
19
+ background: color-mix(
20
+ in srgb,
21
+ var(--crepe-color-outline),
22
+ transparent 80%
23
+ );
24
+ height: 24px;
25
+ margin: 10px;
26
+ }
27
+ .milkdown .milkdown-toolbar .toolbar-item {
28
+ width: 32px;
29
+ height: 32px;
30
+ margin: 6px;
31
+ padding: 4px;
32
+ cursor: pointer;
33
+ border-radius: 4px;
34
+ }
35
+ .milkdown .milkdown-toolbar .toolbar-item:hover {
36
+ background: var(--crepe-color-hover);
37
+ }
38
+ .milkdown .milkdown-toolbar .toolbar-item:active {
39
+ background: var(--crepe-color-selected);
40
+ }
41
+ .milkdown .milkdown-toolbar .toolbar-item svg {
42
+ height: 24px;
43
+ width: 24px;
44
+ color: var(--crepe-color-outline);
45
+ fill: var(--crepe-color-outline);
46
+ }
47
+ .milkdown .milkdown-toolbar .toolbar-item.active svg {
48
+ color: var(--crepe-color-primary);
49
+ fill: var(--crepe-color-primary);
50
+ }
@@ -0,0 +1,29 @@
1
+ .milkdown {
2
+ --crepe-color-background: #fdfcff;
3
+ --crepe-color-on-background: #1b1c1d;
4
+ --crepe-color-surface: #f8f9ff;
5
+ --crepe-color-surface-low: #f2f3fa;
6
+ --crepe-color-on-surface: #191c20;
7
+ --crepe-color-on-surface-variant: #43474e;
8
+ --crepe-color-outline: #73777f;
9
+ --crepe-color-primary: #37618e;
10
+ --crepe-color-secondary: #d7e3f8;
11
+ --crepe-color-on-secondary: #101c2b;
12
+ --crepe-color-inverse: #2e3135;
13
+ --crepe-color-on-inverse: #eff0f7;
14
+ --crepe-color-inline-code: #ba1a1a;
15
+ --crepe-color-error: #ba1a1a;
16
+ --crepe-color-hover: #eceef4;
17
+ --crepe-color-selected: #e1e2e8;
18
+ --crepe-color-inline-area: #d8dae0;
19
+
20
+ --crepe-font-title: Rubik, Cambria, 'Times New Roman', Times, serif;
21
+ --crepe-font-default: Inter, Arial, Helvetica, sans-serif;
22
+ --crepe-font-code:
23
+ 'JetBrains Mono', Menlo, Monaco, 'Courier New', Courier, monospace;
24
+
25
+ --crepe-shadow-1:
26
+ 0px 1px 3px 1px rgba(0, 0, 0, 0.15), 0px 1px 2px 0px rgba(0, 0, 0, 0.3);
27
+ --crepe-shadow-2:
28
+ 0px 2px 6px 2px rgba(0, 0, 0, 0.15), 0px 1px 2px 0px rgba(0, 0, 0, 0.3);
29
+ }
@@ -9,10 +9,6 @@ import { FsMilkdownLoaderService } from '../../services/milkdown-loader.service'
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@firestitch/label";
11
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
12
  editorRef;
17
13
  classFocused = false;
18
14
  config = {};
@@ -27,12 +23,16 @@ export class FsMarkdownEditorComponent {
27
23
  _markdown = '';
28
24
  _editorReady = false;
29
25
  _destroy$ = new Subject();
26
+ _defaultConfig = inject(FS_MARKDOWN_EDITOR_CONFIG, { optional: true });
27
+ _cdRef = inject(ChangeDetectorRef);
28
+ _loader = inject(FsMilkdownLoaderService);
29
+ _zone = inject(NgZone);
30
30
  get markdown() {
31
31
  return this._markdown;
32
32
  }
33
33
  ngOnInit() {
34
34
  this.config = { ...(this._defaultConfig || {}), ...(this.config || {}) };
35
- this._loader.loadStyles();
35
+ this._loader.load();
36
36
  }
37
37
  ngAfterViewInit() {
38
38
  this._loader.loaded$
@@ -114,19 +114,20 @@ export class FsMarkdownEditorComponent {
114
114
  if (this._crepe || !this.editorRef) {
115
115
  return;
116
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({
117
+ const milkdown = window.__MILKDOWN__;
118
+ if (!milkdown) {
119
+ console.error('Milkdown not loaded. Ensure assets are configured.');
120
+ return;
121
+ }
122
+ this._editorViewCtx = milkdown.editorViewCtx;
123
+ this._parserCtx = milkdown.parserCtx;
124
+ this._zone.runOutsideAngular(() => {
125
+ this._crepe = new milkdown.Crepe({
125
126
  root: this.editorRef.nativeElement,
126
127
  defaultValue: this._markdown,
127
128
  features: {},
128
129
  featureConfigs: {
129
- [Crepe.Feature.Placeholder]: {
130
+ [milkdown.Crepe.Feature.Placeholder]: {
130
131
  text: this.config.placeholder || 'Start typing...',
131
132
  },
132
133
  },
@@ -235,4 +236,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
235
236
  type: HostBinding,
236
237
  args: ['class.initialized']
237
238
  }] } });
238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tYXJrZG93bi1lZGl0b3IvY29tcG9uZW50cy9tYXJrZG93bi1lZGl0b3IvbWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tYXJrZG93bi1lZGl0b3IvY29tcG9uZW50cy9tYXJrZG93bi1lZGl0b3IvbWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixNQUFNLEdBR1AsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTNDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXhFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7QUFnQ2pGLE1BQU0sT0FBTyx5QkFBeUI7SUFHNUIsY0FBYyxHQUFHLE1BQU0sQ0FBeUIseUJBQXlCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFF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dXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb250cm9sQ29udGFpbmVyLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nRm9ybSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IGd1aWQgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRnNMYWJlbE1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2xhYmVsJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgdHlwZSB7IENyZXBlIH0gZnJvbSAnQG1pbGtkb3duL2NyZXBlJztcblxuaW1wb3J0IHsgRlNfTUFSS0RPV05fRURJVE9SX0NPTkZJRyB9IGZyb20gJy4uLy4uL2luamVjdHMvY29uZmlnLmluamVjdCc7XG5pbXBvcnQgeyBGc01hcmtkb3duRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9tYXJrZG93bi1lZGl0b3ItY29uZmlnJztcbmltcG9ydCB7IEZzTWlsa2Rvd25Mb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWlsa2Rvd24tbG9hZGVyLnNlcnZpY2UnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLW1hcmtkb3duLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXJrZG93bi1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXJrZG93bi1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGc01hcmtkb3duRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZzTWFya2Rvd25FZGl0b3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHZpZXdQcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLFxuICAgICAgZGVwczogW1tPcHRpb25hbCwgTmdGb3JtXV0sXG4gICAgICB1c2VGYWN0b3J5OiAobmdGb3JtOiBOZ0Zvcm0pID0+IG5nRm9ybSxcbiAgICB9LFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRnNMYWJlbE1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNNYXJrZG93bkVkaXRvckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9kZWZhdWx0Q29uZmlnID0gaW5qZWN0PEZzTWFya2Rvd25FZGl0b3JDb25maWc+KEZTX01BUktET1dOX0VESVRPUl9DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgX2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSBfbG9hZGVyID0gaW5qZWN0KEZzTWlsa2Rvd25Mb2FkZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvclJlZicpIHB1YmxpYyBlZGl0b3JSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mb2N1c2VkJykgcHVibGljIGNsYXNzRm9jdXNlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IEZzTWFya2Rvd25FZGl0b3JDb25maWcgPSB7fTtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRpc2FibGVkJylcbiAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pbml0aWFsaXplZCcpXG4gIHB1YmxpYyBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJJRCA9IGBmcy1tYXJrZG93bi1lZGl0b3ItJHtndWlkKCd4eHgnKX1gO1xuICBwdWJsaWMgb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgb25DaGFuZ2U6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBfY3JlcGU6IENyZXBlO1xuICBwcml2YXRlIF9lZGl0b3JWaWV3Q3R4OiBhbnk7XG4gIHByaXZhdGUgX3BhcnNlckN0eDogYW55O1xuICBwcml2YXRlIF9tYXJrZG93biA9ICcnO1xuICBwcml2YXRlIF9lZGl0b3JSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHVibGljIGdldCBtYXJrZG93bigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tYXJrZG93bjtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uKHRoaXMuX2RlZmF1bHRDb25maWcgfHwge30pLCAuLi4odGhpcy5jb25maWcgfHwge30pIH07XG4gICAgdGhpcy5fbG9hZGVyLmxvYWRTdHlsZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbG9hZGVyLmxvYWRlZCRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChsb2FkZWQpID0+IHtcbiAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgIHRoaXMuX2luaXRFZGl0b3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZShtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fbWFya2Rvd24gPSBtYXJrZG93biB8fCAnJztcblxuICAgIGlmICh0aGlzLl9lZGl0b3JSZWFkeSkge1xuICAgICAgdGhpcy5fc2V0RWRpdG9yQ29udGVudCh0aGlzLl9tYXJrZG93bik7XG4gICAgfVxuXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgaWYgKHRoaXMuY29uZmlnLm1heExlbmd0aCAmJiB0aGlzLl9tYXJrZG93bikge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fbWFya2Rvd24ubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IHRoaXMuY29uZmlnLm1heExlbmd0aCkge1xuICAgICAgICBlcnIubWF4TGVuZ3RoRXJyb3IgPSBgTXVzdCBiZSAke3RoaXMuY29uZmlnLm1heExlbmd0aH0gY2hhcmFjdGVycyBvciBmZXdlci4gWW91IGVudGVyZWQgJHtsZW5ndGh9IGNoYXJhY3RlcnMuYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyKS5sZW5ndGggPyBlcnIgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMud3JpdGVWYWx1ZSgnJyk7XG4gICAgaWYgKHRoaXMub25DaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UoJycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRNYXJrZG93bihtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53cml0ZVZhbHVlKG1hcmtkb3duKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXJrZG93bigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fY3JlcGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXJrZG93bjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY3JlcGUuZ2V0TWFya2Rvd24oKTtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3JlcGUgJiYgdGhpcy5fZWRpdG9yVmlld0N0eCkge1xuICAgICAgdGhpcy5fY3JlcGUuZWRpdG9yLmFjdGlvbigoY3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBjdHguZ2V0KHRoaXMuX2VkaXRvclZpZXdDdHgpIGFzIGFueTtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3JlcGUpIHtcbiAgICAgIHRoaXMuX2NyZXBlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2NyZXBlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fZWRpdG9yUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0RWRpdG9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jcmVwZSB8fCAhdGhpcy5lZGl0b3JSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IFt7IENyZXBlIH0sIHsgZWRpdG9yVmlld0N0eCwgcGFyc2VyQ3R4IH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBpbXBvcnQoJ0BtaWxrZG93bi9jcmVwZScpLFxuICAgICAgICBpbXBvcnQoJ0BtaWxrZG93bi9raXQvY29yZScpLFxuICAgICAgXSk7XG5cbiAgICAgIHRoaXMuX2VkaXRvclZpZXdDdHggPSBlZGl0b3JWaWV3Q3R4O1xuICAgICAgdGhpcy5fcGFyc2VyQ3R4ID0gcGFyc2VyQ3R4O1xuXG4gICAgICB0aGlzLl9jcmVwZSA9IG5ldyBDcmVwZSh7XG4gICAgICAgIHJvb3Q6IHRoaXMuZWRpdG9yUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5fbWFya2Rvd24sXG4gICAgICAgIGZlYXR1cmVzOiB7fSxcbiAgICAgICAgZmVhdHVyZUNvbmZpZ3M6IHtcbiAgICAgICAgICBbQ3JlcGUuRmVhdHVyZS5QbGFjZWhvbGRlcl06IHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuY29uZmlnLnBsYWNlaG9sZGVyIHx8ICdTdGFydCB0eXBpbmcuLi4nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fY3JlcGUub24oKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyLm1hcmtkb3duVXBkYXRlZCgoX2N0eCwgbWFya2Rvd24sIHByZXZNYXJrZG93bikgPT4ge1xuICAgICAgICAgIGlmIChtYXJrZG93biAhPT0gcHJldk1hcmtkb3duKSB7XG4gICAgICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX21hcmtkb3duID0gbWFya2Rvd247XG4gICAgICAgICAgICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShtYXJrZG93bik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHRoaXMub25Ub3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fY3JlcGUuY3JlYXRlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9lZGl0b3JSZWFkeSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAodGhpcy5fbWFya2Rvd24pIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEVkaXRvckNvbnRlbnQodGhpcy5fbWFya2Rvd24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcuaW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRFZGl0b3JDb250ZW50KG1hcmtkb3duOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jcmVwZS5lZGl0b3IuYWN0aW9uKChjdHgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBjdHguZ2V0KHRoaXMuX2VkaXRvclZpZXdDdHgpIGFzIGFueTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IGN0eC5nZXQodGhpcy5fcGFyc2VyQ3R4KSBhcyBhbnk7XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZXIobWFya2Rvd24pO1xuICAgICAgaWYgKGRvYykge1xuICAgICAgICBjb25zdCB0ciA9IHZpZXcuc3RhdGUudHIucmVwbGFjZVdpdGgoXG4gICAgICAgICAgMCwgdmlldy5zdGF0ZS5kb2MuY29udGVudC5zaXplLCBkb2MuY29udGVudCxcbiAgICAgICAgKTtcbiAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxmcy1sYWJlbC1maWVsZFxuICBbYXBwZWFyYW5jZV09XCInb3V0bGluZSdcIlxuICBbaG92ZXJhYmxlXT1cInRydWVcIlxuICBbc2hvd091dGxpbmVdPVwiaW5pdGlhbGl6ZWRcIlxuICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICBbcGFkbGVzc109XCJjb25maWcucGFkbGVzc1wiXG4gIFtjbGFzcy5pbml0aWFsaXplZF09XCJpbml0aWFsaXplZFwiPlxuICBAaWYgKGNvbmZpZy5sYWJlbCkge1xuICAgIDxmcy1sYWJlbD5cbiAgICAgIHt7IGNvbmZpZy5sYWJlbCB9fVxuICAgIDwvZnMtbGFiZWw+XG4gIH1cbiAgPGRpdlxuICAgIGNsYXNzPVwibWFya2Rvd24tZWRpdG9yLWNvbnRhaW5lclwiXG4gICAgW2lkXT1cImNvbnRhaW5lcklEXCI+XG4gICAgPGRpdiAjZWRpdG9yUmVmPjwvZGl2PlxuICA8L2Rpdj5cbiAgPGZzLWxhYmVsLW1lc3NhZ2U+XG4gICAgPGRpdiBjbGFzcz1cImZzLWZvcm0tbWVzc2FnZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLWZvcm0taGludFwiPlxuICAgICAgICB7eyBjb25maWcuaGludCB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZnMtbGFiZWwtbWVzc2FnZT5cbjwvZnMtbGFiZWwtZmllbGQ+XG4iXX0=
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tYXJrZG93bi1lZGl0b3IvY29tcG9uZW50cy9tYXJrZG93bi1lZGl0b3IvbWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9tYXJrZG93bi1lZGl0b3IvY29tcG9uZW50cy9tYXJrZG93bi1lZGl0b3IvbWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixNQUFNLEdBR1AsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXhFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7QUFnQ2pGLE1BQU0sT0FBTyx5QkFBeUI7SUFHTCxTQUFTLENBQWE7SUFFaEIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUUxQyxNQUFNLEdBQTJCLEVBQUUs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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbnRyb2xDb250YWluZXIsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdGb3JtLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgZ3VpZCB9IGZyb20gJ0BmaXJlc3RpdGNoL2NvbW1vbic7XG5pbXBvcnQgeyBGc0xhYmVsTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGFiZWwnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEZTX01BUktET1dOX0VESVRPUl9DT05GSUcgfSBmcm9tICcuLi8uLi9pbmplY3RzL2NvbmZpZy5pbmplY3QnO1xuaW1wb3J0IHsgRnNNYXJrZG93bkVkaXRvckNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvbWFya2Rvd24tZWRpdG9yLWNvbmZpZyc7XG5pbXBvcnQgeyBGc01pbGtkb3duTG9hZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21pbGtkb3duLWxvYWRlci5zZXJ2aWNlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1tYXJrZG93bi1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWFya2Rvd24tZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRnNNYXJrZG93bkVkaXRvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGc01hcmtkb3duRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB2aWV3UHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lcixcbiAgICAgIGRlcHM6IFtbT3B0aW9uYWwsIE5nRm9ybV1dLFxuICAgICAgdXNlRmFjdG9yeTogKG5nRm9ybTogTmdGb3JtKSA9PiBuZ0Zvcm0sXG4gICAgfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZzTGFiZWxNb2R1bGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZzTWFya2Rvd25FZGl0b3JDb21wb25lbnRcbmltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBPbkRlc3Ryb3kge1xuXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvclJlZicpIHB1YmxpYyBlZGl0b3JSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mb2N1c2VkJykgcHVibGljIGNsYXNzRm9jdXNlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IEZzTWFya2Rvd25FZGl0b3JDb25maWcgPSB7fTtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRpc2FibGVkJylcbiAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pbml0aWFsaXplZCcpXG4gIHB1YmxpYyBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJJRCA9IGBmcy1tYXJrZG93bi1lZGl0b3ItJHtndWlkKCd4eHgnKX1gO1xuICBwdWJsaWMgb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgb25DaGFuZ2U6IChkYXRhOiBhbnkpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBfY3JlcGU6IGFueTtcbiAgcHJpdmF0ZSBfZWRpdG9yVmlld0N0eDogYW55O1xuICBwcml2YXRlIF9wYXJzZXJDdHg6IGFueTtcbiAgcHJpdmF0ZSBfbWFya2Rvd24gPSAnJztcbiAgcHJpdmF0ZSBfZWRpdG9yUmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9kZWZhdWx0Q29uZmlnID0gaW5qZWN0PEZzTWFya2Rvd25FZGl0b3JDb25maWc+KEZTX01BUktET1dOX0VESVRPUl9DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgX2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSBfbG9hZGVyID0gaW5qZWN0KEZzTWlsa2Rvd25Mb2FkZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG5cbiAgcHVibGljIGdldCBtYXJrZG93bigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tYXJrZG93bjtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uKHRoaXMuX2RlZmF1bHRDb25maWcgfHwge30pLCAuLi4odGhpcy5jb25maWcgfHwge30pIH07XG4gICAgdGhpcy5fbG9hZGVyLmxvYWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbG9hZGVyLmxvYWRlZCRcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChsb2FkZWQpID0+IHtcbiAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgIHRoaXMuX2luaXRFZGl0b3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZShtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fbWFya2Rvd24gPSBtYXJrZG93biB8fCAnJztcblxuICAgIGlmICh0aGlzLl9lZGl0b3JSZWFkeSkge1xuICAgICAgdGhpcy5fc2V0RWRpdG9yQ29udGVudCh0aGlzLl9tYXJrZG93bik7XG4gICAgfVxuXG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgaWYgKHRoaXMuY29uZmlnLm1heExlbmd0aCAmJiB0aGlzLl9tYXJrZG93bikge1xuICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fbWFya2Rvd24ubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IHRoaXMuY29uZmlnLm1heExlbmd0aCkge1xuICAgICAgICBlcnIubWF4TGVuZ3RoRXJyb3IgPSBgTXVzdCBiZSAke3RoaXMuY29uZmlnLm1heExlbmd0aH0gY2hhcmFjdGVycyBvciBmZXdlci4gWW91IGVudGVyZWQgJHtsZW5ndGh9IGNoYXJhY3RlcnMuYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyKS5sZW5ndGggPyBlcnIgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMud3JpdGVWYWx1ZSgnJyk7XG4gICAgaWYgKHRoaXMub25DaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UoJycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRNYXJrZG93bihtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53cml0ZVZhbHVlKG1hcmtkb3duKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXJrZG93bigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fY3JlcGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXJrZG93bjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY3JlcGUuZ2V0TWFya2Rvd24oKTtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3JlcGUgJiYgdGhpcy5fZWRpdG9yVmlld0N0eCkge1xuICAgICAgdGhpcy5fY3JlcGUuZWRpdG9yLmFjdGlvbigoY3R4OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdmlldyA9IGN0eC5nZXQodGhpcy5fZWRpdG9yVmlld0N0eCk7XG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NyZXBlKSB7XG4gICAgICB0aGlzLl9jcmVwZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9jcmVwZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX2VkaXRvclJlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEVkaXRvcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3JlcGUgfHwgIXRoaXMuZWRpdG9yUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWlsa2Rvd24gPSAod2luZG93IGFzIGFueSkuX19NSUxLRE9XTl9fO1xuICAgIGlmICghbWlsa2Rvd24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ01pbGtkb3duIG5vdCBsb2FkZWQuIEVuc3VyZSBhc3NldHMgYXJlIGNvbmZpZ3VyZWQuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9lZGl0b3JWaWV3Q3R4ID0gbWlsa2Rvd24uZWRpdG9yVmlld0N0eDtcbiAgICB0aGlzLl9wYXJzZXJDdHggPSBtaWxrZG93bi5wYXJzZXJDdHg7XG5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX2NyZXBlID0gbmV3IG1pbGtkb3duLkNyZXBlKHtcbiAgICAgICAgcm9vdDogdGhpcy5lZGl0b3JSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLl9tYXJrZG93bixcbiAgICAgICAgZmVhdHVyZXM6IHt9LFxuICAgICAgICBmZWF0dXJlQ29uZmlnczoge1xuICAgICAgICAgIFttaWxrZG93bi5DcmVwZS5GZWF0dXJlLlBsYWNlaG9sZGVyXToge1xuICAgICAgICAgICAgdGV4dDogdGhpcy5jb25maWcucGxhY2Vob2xkZXIgfHwgJ1N0YXJ0IHR5cGluZy4uLicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9jcmVwZS5vbigobGlzdGVuZXI6IGFueSkgPT4ge1xuICAgICAgICBsaXN0ZW5lci5tYXJrZG93blVwZGF0ZWQoKF9jdHg6IGFueSwgbWFya2Rvd246IHN0cmluZywgcHJldk1hcmtkb3duOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAobWFya2Rvd24gIT09IHByZXZNYXJrZG93bikge1xuICAgICAgICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLl9tYXJrZG93biA9IG1hcmtkb3duO1xuICAgICAgICAgICAgICBpZiAodGhpcy5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UobWFya2Rvd24pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0aGlzLm9uVG91Y2hlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2NyZXBlLmNyZWF0ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZWRpdG9yUmVhZHkgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuX21hcmtkb3duKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRFZGl0b3JDb250ZW50KHRoaXMuX21hcmtkb3duKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvZm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5jb25maWcuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmluaXRpYWxpemVkKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RWRpdG9yQ29udGVudChtYXJrZG93bjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fY3JlcGUuZWRpdG9yLmFjdGlvbigoY3R4OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBjdHguZ2V0KHRoaXMuX2VkaXRvclZpZXdDdHgpO1xuICAgICAgY29uc3QgcGFyc2VyID0gY3R4LmdldCh0aGlzLl9wYXJzZXJDdHgpO1xuICAgICAgY29uc3QgZG9jID0gcGFyc2VyKG1hcmtkb3duKTtcbiAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgY29uc3QgdHIgPSB2aWV3LnN0YXRlLnRyLnJlcGxhY2VXaXRoKFxuICAgICAgICAgIDAsIHZpZXcuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSwgZG9jLmNvbnRlbnQsXG4gICAgICAgICk7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8ZnMtbGFiZWwtZmllbGRcbiAgW2FwcGVhcmFuY2VdPVwiJ291dGxpbmUnXCJcbiAgW2hvdmVyYWJsZV09XCJ0cnVlXCJcbiAgW3Nob3dPdXRsaW5lXT1cImluaXRpYWxpemVkXCJcbiAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgW3BhZGxlc3NdPVwiY29uZmlnLnBhZGxlc3NcIlxuICBbY2xhc3MuaW5pdGlhbGl6ZWRdPVwiaW5pdGlhbGl6ZWRcIj5cbiAgQGlmIChjb25maWcubGFiZWwpIHtcbiAgICA8ZnMtbGFiZWw+XG4gICAgICB7eyBjb25maWcubGFiZWwgfX1cbiAgICA8L2ZzLWxhYmVsPlxuICB9XG4gIDxkaXZcbiAgICBjbGFzcz1cIm1hcmtkb3duLWVkaXRvci1jb250YWluZXJcIlxuICAgIFtpZF09XCJjb250YWluZXJJRFwiPlxuICAgIDxkaXYgI2VkaXRvclJlZj48L2Rpdj5cbiAgPC9kaXY+XG4gIDxmcy1sYWJlbC1tZXNzYWdlPlxuICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLW1lc3NhZ2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWhpbnRcIj5cbiAgICAgICAge3sgY29uZmlnLmhpbnQgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2ZzLWxhYmVsLW1lc3NhZ2U+XG48L2ZzLWxhYmVsLWZpZWxkPlxuIl19
@@ -3,68 +3,77 @@ import { Injectable, inject } from '@angular/core';
3
3
  import { BehaviorSubject } from 'rxjs';
4
4
  import { shareReplay } from 'rxjs/operators';
5
5
  import * as i0 from "@angular/core";
6
- const THEME_BASE = '/assets/milkdown/theme/';
6
+ const ASSET_BASE = '/assets/markdown-editor/';
7
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`,
8
+ `${ASSET_BASE}theme/common/block-edit.css`,
9
+ `${ASSET_BASE}theme/common/code-mirror.css`,
10
+ `${ASSET_BASE}theme/common/cursor.css`,
11
+ `${ASSET_BASE}theme/common/image-block.css`,
12
+ `${ASSET_BASE}theme/common/latex.css`,
13
+ `${ASSET_BASE}theme/common/link-tooltip.css`,
14
+ `${ASSET_BASE}theme/common/list-item.css`,
15
+ `${ASSET_BASE}theme/common/placeholder.css`,
16
+ `${ASSET_BASE}theme/common/toolbar.css`,
17
+ `${ASSET_BASE}theme/common/table.css`,
18
18
  ];
19
+ const SCRIPT = `${ASSET_BASE}milkdown.js`;
19
20
  export class FsMilkdownLoaderService {
20
21
  _document = inject(DOCUMENT);
21
22
  _loaded = new BehaviorSubject(false);
22
- _stylesLoaded = false;
23
+ _loading = false;
23
24
  _loaded$ = this._loaded.asObservable()
24
25
  .pipe(shareReplay(1));
25
26
  get loaded$() {
26
27
  return this._loaded$;
27
28
  }
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);
29
+ load() {
30
+ if (this._loaded.value || this._loading) {
31
+ if (this._loaded.value) {
32
+ this._loaded.next(true);
33
+ }
37
34
  return;
38
35
  }
36
+ this._loading = true;
37
+ let stylesRemaining = STYLESHEETS.length;
38
+ let scriptDone = false;
39
+ const checkComplete = () => {
40
+ if (stylesRemaining === 0 && scriptDone) {
41
+ this._loading = false;
42
+ this._loaded.next(true);
43
+ }
44
+ };
45
+ const onStyleDone = () => {
46
+ stylesRemaining--;
47
+ checkComplete();
48
+ };
39
49
  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
- }
50
+ if (this._document.querySelector(`link[href="${href}"]`)) {
51
+ onStyleDone();
47
52
  return;
48
53
  }
49
54
  const link = this._document.createElement('link');
50
55
  link.rel = 'stylesheet';
51
56
  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
- };
57
+ link.onload = onStyleDone;
58
+ link.onerror = onStyleDone;
66
59
  this._document.head.appendChild(link);
67
60
  });
61
+ if (this._document.querySelector(`script[src="${SCRIPT}"]`)) {
62
+ scriptDone = true;
63
+ checkComplete();
64
+ return;
65
+ }
66
+ const script = this._document.createElement('script');
67
+ script.src = SCRIPT;
68
+ script.onload = () => {
69
+ scriptDone = true;
70
+ checkComplete();
71
+ };
72
+ script.onerror = () => {
73
+ scriptDone = true;
74
+ checkComplete();
75
+ };
76
+ this._document.head.appendChild(script);
68
77
  }
69
78
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsMilkdownLoaderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
70
79
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsMilkdownLoaderService, providedIn: 'root' });
@@ -75,4 +84,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
75
84
  providedIn: 'root',
76
85
  }]
77
86
  }] });
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlsa2Rvd24tbG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvbWFya2Rvd24tZWRpdG9yL3NlcnZpY2VzL21pbGtkb3duLWxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFN0MsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUM7QUFFN0MsTUFBTSxXQUFXLEdBQUc7SUFDbEIsR0FBRyxVQUFVLHVCQUF1QjtJQUNwQyxHQUFHLFVBQVUsd0JBQXdCO0lBQ3JDLEdBQUcsVUFBVSxtQkFBbUI7SUFDaEMsR0FBRyxVQUFVLHdCQUF3QjtJQUNyQyxHQUFHLFVBQVUsa0JBQWtCO0lBQy9CLEdBQUcsVUFBVSx5QkFBeUI7SUFDdEMsR0FBRyxVQUFVLHNCQUFzQjtJQUNuQyxHQUFHLFVBQVUsd0JBQXdCO0lBQ3JDLEdBQUcsVUFBVSxvQkFBb0I7SUFDakMsR0FBRyxVQUFVLGtCQUFrQjtDQUNoQyxDQUFDO0FBS0YsTUFBTSxPQUFPLHVCQUF1QjtJQUMxQixTQUFTLEdBQUcsTUFBTSxDQUFXLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRXRCLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtTQUMzQyxJQUFJLENBQ0gsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7SUFFSixJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxVQUFVO1FBQ2YsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFeEIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBRW5DLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXhCLE9BQU87UUFDVCxDQUFDO1FBRUQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUN0RSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLFNBQVMsRUFBRSxDQUFDO2dCQUNaLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztvQkFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLENBQUM7Z0JBRUQsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDakIsU0FBUyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxTQUFTLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO2dCQUNsQixTQUFTLEVBQUUsQ0FBQztnQkFDWixJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7b0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt1R0E5RFUsdUJBQXVCOzJHQUF2Qix1QkFBdUIsY0FGdEIsTUFBTTs7MkZBRVAsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5jb25zdCBUSEVNRV9CQVNFID0gJy9hc3NldHMvbWlsa2Rvd24vdGhlbWUvJztcblxuY29uc3QgU1RZTEVTSEVFVFMgPSBbXG4gIGAke1RIRU1FX0JBU0V9Y29tbW9uL2Jsb2NrLWVkaXQuY3NzYCxcbiAgYCR7VEhFTUVfQkFTRX1jb21tb24vY29kZS1taXJyb3IuY3NzYCxcbiAgYCR7VEhFTUVfQkFTRX1jb21tb24vY3Vyc29yLmNzc2AsXG4gIGAke1RIRU1FX0JBU0V9Y29tbW9uL2ltYWdlLWJsb2NrLmNzc2AsXG4gIGAke1RIRU1FX0JBU0V9Y29tbW9uL2xhdGV4LmNzc2AsXG4gIGAke1RIRU1FX0JBU0V9Y29tbW9uL2xpbmstdG9vbHRpcC5jc3NgLFxuICBgJHtUSEVNRV9CQVNFfWNvbW1vbi9saXN0LWl0ZW0uY3NzYCxcbiAgYCR7VEhFTUVfQkFTRX1jb21tb24vcGxhY2Vob2xkZXIuY3NzYCxcbiAgYCR7VEhFTUVfQkFTRX1jb21tb24vdG9vbGJhci5jc3NgLFxuICBgJHtUSEVNRV9CQVNFfWNvbW1vbi90YWJsZS5jc3NgLFxuXTtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEZzTWlsa2Rvd25Mb2FkZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfZG9jdW1lbnQgPSBpbmplY3Q8RG9jdW1lbnQ+KERPQ1VNRU5UKTtcbiAgcHJpdmF0ZSBfbG9hZGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgX3N0eWxlc0xvYWRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2xvYWRlZCQgPSB0aGlzLl9sb2FkZWQuYXNPYnNlcnZhYmxlKClcbiAgICAucGlwZShcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICk7XG5cbiAgcHVibGljIGdldCBsb2FkZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWQkO1xuICB9XG5cbiAgcHVibGljIGxvYWRTdHlsZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0eWxlc0xvYWRlZCkge1xuICAgICAgdGhpcy5fbG9hZGVkLm5leHQodHJ1ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVtYWluaW5nID0gU1RZTEVTSEVFVFMubGVuZ3RoO1xuXG4gICAgaWYgKHJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgdGhpcy5fc3R5bGVzTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2xvYWRlZC5uZXh0KHRydWUpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgU1RZTEVTSEVFVFMuZm9yRWFjaCgoaHJlZikgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBsaW5rW2hyZWY9XCIke2hyZWZ9XCJdYCk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgcmVtYWluaW5nLS07XG4gICAgICAgIGlmIChyZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9zdHlsZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZC5uZXh0KHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5rID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICBsaW5rLmhyZWYgPSBocmVmO1xuICAgICAgbGluay5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHJlbWFpbmluZy0tO1xuICAgICAgICBpZiAocmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fc3R5bGVzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9sb2FkZWQubmV4dCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGxpbmsub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVtYWluaW5nLS07XG4gICAgICAgIGlmIChyZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9zdHlsZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX2xvYWRlZC5uZXh0KHRydWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlsa2Rvd24tbG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvbWFya2Rvd24tZWRpdG9yL3NlcnZpY2VzL21pbGtkb3duLWxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFN0MsTUFBTSxVQUFVLEdBQUcsMEJBQTBCLENBQUM7QUFFOUMsTUFBTSxXQUFXLEdBQUc7SUFDbEIsR0FBRyxVQUFVLDZCQUE2QjtJQUMxQyxHQUFHLFVBQVUsOEJBQThCO0lBQzNDLEdBQUcsVUFBVSx5QkFBeUI7SUFDdEMsR0FBRyxVQUFVLDhCQUE4QjtJQUMzQyxHQUFHLFVBQVUsd0JBQXdCO0lBQ3JDLEdBQUcsVUFBVSwrQkFBK0I7SUFDNUMsR0FBRyxVQUFVLDRCQUE0QjtJQUN6QyxHQUFHLFVBQVUsOEJBQThCO0lBQzNDLEdBQUcsVUFBVSwwQkFBMEI7SUFDdkMsR0FBRyxVQUFVLHdCQUF3QjtDQUN0QyxDQUFDO0FBRUYsTUFBTSxNQUFNLEdBQUcsR0FBRyxVQUFVLGFBQWEsQ0FBQztBQUsxQyxNQUFNLE9BQU8sdUJBQXVCO0lBQzFCLFNBQVMsR0FBRyxNQUFNLENBQVcsUUFBUSxDQUFDLENBQUM7SUFDdkMsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFakIsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1NBQzNDLElBQUksQ0FDSCxX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cG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5jb25zdCBBU1NFVF9CQVNFID0gJy9hc3NldHMvbWFya2Rvd24tZWRpdG9yLyc7XG5cbmNvbnN0IFNUWUxFU0hFRVRTID0gW1xuICBgJHtBU1NFVF9CQVNFfXRoZW1lL2NvbW1vbi9ibG9jay1lZGl0LmNzc2AsXG4gIGAke0FTU0VUX0JBU0V9dGhlbWUvY29tbW9uL2NvZGUtbWlycm9yLmNzc2AsXG4gIGAke0FTU0VUX0JBU0V9dGhlbWUvY29tbW9uL2N1cnNvci5jc3NgLFxuICBgJHtBU1NFVF9CQVNFfXRoZW1lL2NvbW1vbi9pbWFnZS1ibG9jay5jc3NgLFxuICBgJHtBU1NFVF9CQVNFfXRoZW1lL2NvbW1vbi9sYXRleC5jc3NgLFxuICBgJHtBU1NFVF9CQVNFfXRoZW1lL2NvbW1vbi9saW5rLXRvb2x0aXAuY3NzYCxcbiAgYCR7QVNTRVRfQkFTRX10aGVtZS9jb21tb24vbGlzdC1pdGVtLmNzc2AsXG4gIGAke0FTU0VUX0JBU0V9dGhlbWUvY29tbW9uL3BsYWNlaG9sZGVyLmNzc2AsXG4gIGAke0FTU0VUX0JBU0V9dGhlbWUvY29tbW9uL3Rvb2xiYXIuY3NzYCxcbiAgYCR7QVNTRVRfQkFTRX10aGVtZS9jb21tb24vdGFibGUuY3NzYCxcbl07XG5cbmNvbnN0IFNDUklQVCA9IGAke0FTU0VUX0JBU0V9bWlsa2Rvd24uanNgO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRnNNaWxrZG93bkxvYWRlclNlcnZpY2Uge1xuICBwcml2YXRlIF9kb2N1bWVudCA9IGluamVjdDxEb2N1bWVudD4oRE9DVU1FTlQpO1xuICBwcml2YXRlIF9sb2FkZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBfbG9hZGluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2xvYWRlZCQgPSB0aGlzLl9sb2FkZWQuYXNPYnNlcnZhYmxlKClcbiAgICAucGlwZShcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICk7XG5cbiAgcHVibGljIGdldCBsb2FkZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9sb2FkZWQkO1xuICB9XG5cbiAgcHVibGljIGxvYWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvYWRlZC52YWx1ZSB8fCB0aGlzLl9sb2FkaW5nKSB7XG4gICAgICBpZiAodGhpcy5fbG9hZGVkLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2xvYWRlZC5uZXh0KHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9hZGluZyA9IHRydWU7XG5cbiAgICBsZXQgc3R5bGVzUmVtYWluaW5nID0gU1RZTEVTSEVFVFMubGVuZ3RoO1xuICAgIGxldCBzY3JpcHREb25lID0gZmFsc2U7XG5cbiAgICBjb25zdCBjaGVja0NvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKHN0eWxlc1JlbWFpbmluZyA9PT0gMCAmJiBzY3JpcHREb25lKSB7XG4gICAgICAgIHRoaXMuX2xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbG9hZGVkLm5leHQodHJ1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3R5bGVEb25lID0gKCkgPT4ge1xuICAgICAgc3R5bGVzUmVtYWluaW5nLS07XG4gICAgICBjaGVja0NvbXBsZXRlKCk7XG4gICAgfTtcblxuICAgIFNUWUxFU0hFRVRTLmZvckVhY2goKGhyZWYpID0+IHtcbiAgICAgIGlmICh0aGlzLl9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBsaW5rW2hyZWY9XCIke2hyZWZ9XCJdYCkpIHtcbiAgICAgICAgb25TdHlsZURvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgIGxpbmsuaHJlZiA9IGhyZWY7XG4gICAgICBsaW5rLm9ubG9hZCA9IG9uU3R5bGVEb25lO1xuICAgICAgbGluay5vbmVycm9yID0gb25TdHlsZURvbmU7XG4gICAgICB0aGlzLl9kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuX2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHNjcmlwdFtzcmM9XCIke1NDUklQVH1cIl1gKSkge1xuICAgICAgc2NyaXB0RG9uZSA9IHRydWU7XG4gICAgICBjaGVja0NvbXBsZXRlKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JpcHQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc3JjID0gU0NSSVBUO1xuICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBzY3JpcHREb25lID0gdHJ1ZTtcbiAgICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgICB9O1xuICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgc2NyaXB0RG9uZSA9IHRydWU7XG4gICAgICBjaGVja0NvbXBsZXRlKCk7XG4gICAgfTtcbiAgICB0aGlzLl9kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gIH1cbn1cbiJdfQ==