solid-mds 0.3.2 → 0.4.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.
- package/README.md +167 -245
- package/dist/index.d.ts +50 -2
- package/dist/index.jsx +29 -197
- package/package.json +7 -19
package/README.md
CHANGED
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
# solid-mds
|
|
2
2
|
|
|
3
|
-
A SolidJS library for
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
A SolidJS library for transforming MDS (Markdown Steps) HAST to Solid components.
|
|
4
|
+
|
|
5
|
+
This package works with [hast-mds](https://www.npmjs.com/package/hast-mds) to render step-based Markdown content in SolidJS applications.
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm install solid-mds
|
|
10
|
+
npm install solid-mds hast-mds
|
|
11
11
|
# or
|
|
12
|
-
pnpm add solid-mds
|
|
12
|
+
pnpm add solid-mds hast-mds
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
**Peer
|
|
15
|
+
**Peer dependencies:**
|
|
16
|
+
- `solid-js` ^1.9.0
|
|
17
|
+
- `hast-mds` ^0.1.0
|
|
16
18
|
|
|
17
19
|
## Quick Start
|
|
18
20
|
|
|
19
21
|
```tsx
|
|
20
|
-
import { parse } from "
|
|
22
|
+
import { parse } from "hast-mds";
|
|
23
|
+
import { transform } from "solid-mds";
|
|
21
24
|
|
|
22
25
|
const markdown = `
|
|
23
26
|
# Hello World
|
|
@@ -26,238 +29,106 @@ This is **bold** and *italic* text.
|
|
|
26
29
|
`;
|
|
27
30
|
|
|
28
31
|
function App() {
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Opinionated Plugin Configuration
|
|
35
|
-
|
|
36
|
-
solid-mds comes pre-configured with an opinionated set of remark/rehype plugins:
|
|
37
|
-
|
|
38
|
-
- **[remark-gfm](https://github.com/remarkjs/remark-gfm)** — GitHub Flavored
|
|
39
|
-
Markdown (tables, strikethrough, autolinks, task lists)
|
|
40
|
-
- **[remark-math](https://github.com/remarkjs/remark-math)** +
|
|
41
|
-
**[rehype-katex](https://github.com/remarkjs/rehype-katex)** — LaTeX math
|
|
42
|
-
rendering
|
|
43
|
-
|
|
44
|
-
These plugins are always enabled and cannot be configured. This ensures
|
|
45
|
-
consistent rendering across all use cases.
|
|
46
|
-
|
|
47
|
-
**Note:** To display math properly, include the KaTeX CSS in your app:
|
|
48
|
-
|
|
49
|
-
```html
|
|
50
|
-
<link
|
|
51
|
-
rel="stylesheet"
|
|
52
|
-
href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css"
|
|
53
|
-
/>
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## Supported Markdown Features
|
|
57
|
-
|
|
58
|
-
### Standard Markdown
|
|
59
|
-
|
|
60
|
-
```markdown
|
|
61
|
-
# Heading 1
|
|
62
|
-
|
|
63
|
-
## Heading 2
|
|
64
|
-
|
|
65
|
-
### Heading 3
|
|
66
|
-
|
|
67
|
-
**bold** and _italic_ and ~~strikethrough~~
|
|
68
|
-
|
|
69
|
-
- Unordered list
|
|
70
|
-
- Another item
|
|
71
|
-
|
|
72
|
-
1. Ordered list
|
|
73
|
-
2. Second item
|
|
74
|
-
|
|
75
|
-
> Blockquotes
|
|
76
|
-
|
|
77
|
-
`inline code`
|
|
78
|
-
|
|
79
|
-
[Links](https://example.com)
|
|
80
|
-
|
|
81
|
-

|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### GFM Extensions
|
|
85
|
-
|
|
86
|
-
#### Tables
|
|
87
|
-
|
|
88
|
-
```markdown
|
|
89
|
-
| Header 1 | Header 2 |
|
|
90
|
-
| -------- | -------- |
|
|
91
|
-
| Cell 1 | Cell 2 |
|
|
92
|
-
| Cell 3 | Cell 4 |
|
|
93
|
-
```
|
|
32
|
+
const parsed = parse(markdown);
|
|
33
|
+
const result = transform(parsed);
|
|
94
34
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
```markdown
|
|
98
|
-
- [x] Completed task
|
|
99
|
-
- [ ] Incomplete task
|
|
35
|
+
return <div>{result.steps.default.Body()}</div>;
|
|
36
|
+
}
|
|
100
37
|
```
|
|
101
38
|
|
|
102
|
-
|
|
39
|
+
## Architecture
|
|
103
40
|
|
|
104
|
-
|
|
105
|
-
Visit https://example.com automatically linked.
|
|
106
|
-
```
|
|
41
|
+
solid-mds is designed as a thin transformation layer:
|
|
107
42
|
|
|
108
|
-
|
|
43
|
+
1. **hast-mds** parses your MDS content into HAST (Hypertext Abstract Syntax Tree)
|
|
44
|
+
2. **solid-mds** transforms HAST into renderable Solid components
|
|
109
45
|
|
|
110
|
-
|
|
46
|
+
This separation allows:
|
|
47
|
+
- Framework-agnostic parsing (use hast-mds with React, Vue, etc.)
|
|
48
|
+
- Optimized Solid rendering with SSR support
|
|
111
49
|
|
|
112
|
-
|
|
113
|
-
The equation $E = mc^2$ is famous.
|
|
114
|
-
```
|
|
50
|
+
## MDS Format
|
|
115
51
|
|
|
116
|
-
|
|
52
|
+
MDS (Markdown Steps) extends Markdown with step-based structure.
|
|
117
53
|
|
|
118
|
-
|
|
119
|
-
$$
|
|
120
|
-
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
|
|
121
|
-
$$
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
## MDS Format: Steps
|
|
125
|
-
|
|
126
|
-
MDS extends Markdown with a step-based structure using `+++stepId` separators:
|
|
54
|
+
### Step Separators
|
|
127
55
|
|
|
128
56
|
```markdown
|
|
129
57
|
+++intro
|
|
130
58
|
# Welcome
|
|
131
59
|
|
|
132
|
-
This is the introduction
|
|
133
|
-
|
|
134
|
-
+++
|
|
135
|
-
|
|
136
|
-
main
|
|
60
|
+
This is the introduction.
|
|
137
61
|
|
|
62
|
+
+++main
|
|
138
63
|
# Main Content
|
|
139
64
|
|
|
140
|
-
This is the main step.
|
|
141
|
-
|
|
142
65
|
+++conclusion
|
|
143
|
-
|
|
144
66
|
# Summary
|
|
145
|
-
|
|
146
|
-
This is the conclusion.
|
|
147
67
|
```
|
|
148
68
|
|
|
149
|
-
###
|
|
150
|
-
|
|
151
|
-
```tsx
|
|
152
|
-
import { parse } from "solid-mds";
|
|
153
|
-
|
|
154
|
-
const result = parse(markdown);
|
|
155
|
-
|
|
156
|
-
// result.first → "intro" (first step ID)
|
|
157
|
-
// result.count → 3 (number of steps)
|
|
158
|
-
// result.steps.intro.body → JSX.Element
|
|
159
|
-
// result.steps.intro.next → "main"
|
|
160
|
-
// result.steps.main.prev → "intro"
|
|
161
|
-
// result.steps.main.next → "conclusion"
|
|
162
|
-
// result.steps.conclusion.prev → "main"
|
|
163
|
-
// result.steps.conclusion.next → null
|
|
164
|
-
```
|
|
69
|
+
### Metadata Blocks
|
|
165
70
|
|
|
166
|
-
|
|
71
|
+
#### Global Metadata
|
|
167
72
|
|
|
168
|
-
|
|
73
|
+
```markdown
|
|
74
|
+
\`\`\`yaml @@
|
|
75
|
+
title: My Presentation
|
|
76
|
+
author: Jane Doe
|
|
77
|
+
\`\`\`
|
|
169
78
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
id: string; // Step identifier
|
|
173
|
-
body: JSX.Element; // Rendered markdown content
|
|
174
|
-
local: object; // Local metadata (see below)
|
|
175
|
-
prev: string | null; // Previous step ID
|
|
176
|
-
next: string | null; // Next step ID
|
|
177
|
-
current: number; // 1-based position
|
|
178
|
-
}
|
|
79
|
+
+++intro
|
|
80
|
+
# Content
|
|
179
81
|
```
|
|
180
82
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
### Local Metadata (per step)
|
|
83
|
+
Access via `result.global.title`.
|
|
184
84
|
|
|
185
|
-
|
|
85
|
+
#### Global Markdown Blocks
|
|
186
86
|
|
|
187
|
-
|
|
188
|
-
|
|
87
|
+
```markdown
|
|
88
|
+
\`\`\`md @@/footer
|
|
89
|
+
Made with **love**
|
|
90
|
+
\`\`\`
|
|
189
91
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
speaker: John Doe
|
|
92
|
+
+++intro
|
|
93
|
+
# Content
|
|
193
94
|
```
|
|
194
95
|
|
|
195
|
-
|
|
196
|
-
````
|
|
197
|
-
|
|
198
|
-
Access via `result.steps.slide1.local.title`.
|
|
199
|
-
|
|
200
|
-
### Local Markdown Blocks
|
|
96
|
+
Access via `result.global.footer` (returns Solid component).
|
|
201
97
|
|
|
202
|
-
|
|
98
|
+
#### Local Metadata (per step)
|
|
203
99
|
|
|
204
|
-
|
|
100
|
+
```markdown
|
|
205
101
|
+++slide1
|
|
102
|
+
\`\`\`yaml @
|
|
103
|
+
layout: centered
|
|
104
|
+
transition: fade
|
|
105
|
+
\`\`\`
|
|
206
106
|
|
|
207
|
-
|
|
208
|
-
These are speaker notes with **formatting**.
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
# Main Slide Content
|
|
212
|
-
````
|
|
213
|
-
|
|
214
|
-
Access via `result.steps.slide1.local.notes` (returns `JSX.Element`).
|
|
215
|
-
|
|
216
|
-
### Global Metadata
|
|
217
|
-
|
|
218
|
-
Use ` ```@@| ` for document-wide metadata:
|
|
219
|
-
|
|
220
|
-
````markdown
|
|
221
|
-
```@@|
|
|
222
|
-
author: Jane Smith
|
|
223
|
-
version: 1.0
|
|
107
|
+
# Slide Content
|
|
224
108
|
```
|
|
225
109
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
# First Step
|
|
229
|
-
````
|
|
230
|
-
|
|
231
|
-
Access via `result.global.author`.
|
|
110
|
+
Access via `result.steps.slide1.local.layout`.
|
|
232
111
|
|
|
233
|
-
|
|
112
|
+
#### Local Markdown Blocks
|
|
234
113
|
|
|
235
|
-
|
|
114
|
+
```markdown
|
|
115
|
+
+++slide1
|
|
116
|
+
\`\`\`md @/notes
|
|
117
|
+
Speaker **notes** here.
|
|
118
|
+
\`\`\`
|
|
236
119
|
|
|
237
|
-
|
|
238
|
-
```@@/footer
|
|
239
|
-
Made with ❤️ by **Our Team**
|
|
120
|
+
# Main Content
|
|
240
121
|
```
|
|
241
122
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
# Content
|
|
245
|
-
````
|
|
246
|
-
|
|
247
|
-
Access via `result.global.footer` (returns `JSX.Element`).
|
|
123
|
+
Access via `result.steps.slide1.local.notes` (returns Solid component).
|
|
248
124
|
|
|
249
125
|
## Custom Components
|
|
250
126
|
|
|
251
|
-
Override default HTML elements or create custom block components:
|
|
252
|
-
|
|
253
127
|
### Override Standard Elements
|
|
254
128
|
|
|
255
129
|
```tsx
|
|
256
|
-
import {
|
|
257
|
-
|
|
258
|
-
ComponentMap,
|
|
259
|
-
StandardComponentProps,
|
|
260
|
-
} from "solid-mds";
|
|
130
|
+
import { parse } from "hast-mds";
|
|
131
|
+
import { transform, ComponentMap, StandardComponentProps } from "solid-mds";
|
|
261
132
|
|
|
262
133
|
const CustomHeading = (props: StandardComponentProps) => (
|
|
263
134
|
<h1 class="text-4xl font-bold text-blue-600">{props.children}</h1>
|
|
@@ -267,17 +138,18 @@ const components: ComponentMap = {
|
|
|
267
138
|
h1: CustomHeading,
|
|
268
139
|
};
|
|
269
140
|
|
|
270
|
-
const
|
|
141
|
+
const parsed = parse(markdown);
|
|
142
|
+
const result = transform(parsed, components);
|
|
271
143
|
```
|
|
272
144
|
|
|
273
|
-
### Custom
|
|
145
|
+
### Custom Block Components
|
|
274
146
|
|
|
275
|
-
Create custom components
|
|
147
|
+
Create custom components using `yaml componentName` or `md componentName/path` syntax:
|
|
276
148
|
|
|
277
149
|
```tsx
|
|
278
|
-
import { parse
|
|
150
|
+
import { parse } from "hast-mds";
|
|
151
|
+
import { transform, ComponentMap, CustomBlockProps } from "solid-mds";
|
|
279
152
|
|
|
280
|
-
// Define a custom component
|
|
281
153
|
const Alert = (props: CustomBlockProps) => (
|
|
282
154
|
<div class={`alert alert-${props.payload[0] || "info"}`}>
|
|
283
155
|
{props.children}
|
|
@@ -289,25 +161,17 @@ const components: ComponentMap = {
|
|
|
289
161
|
};
|
|
290
162
|
|
|
291
163
|
const markdown = `
|
|
292
|
-
\`\`\`alert/warning
|
|
164
|
+
\`\`\`md alert/warning
|
|
293
165
|
This is a **warning** message!
|
|
294
166
|
\`\`\`
|
|
295
167
|
`;
|
|
296
168
|
|
|
297
|
-
|
|
169
|
+
// Register component names when parsing
|
|
170
|
+
const parsed = parse(markdown, new Set(["alert"]));
|
|
171
|
+
const result = transform(parsed, components);
|
|
298
172
|
```
|
|
299
173
|
|
|
300
|
-
|
|
301
|
-
with:
|
|
302
|
-
|
|
303
|
-
- `props.payload` → `["warning"]` (path segments after component name)
|
|
304
|
-
- `props.raw` → `"This is a **warning** message!"` (raw content as string if you
|
|
305
|
-
need it)
|
|
306
|
-
- `props.children` → Rendered markdown as JSX
|
|
307
|
-
|
|
308
|
-
### Custom Blocks with Data
|
|
309
|
-
|
|
310
|
-
Use the `|` suffix for YAML data instead of markdown content:
|
|
174
|
+
### Custom Blocks with YAML Data
|
|
311
175
|
|
|
312
176
|
```tsx
|
|
313
177
|
const Card = (props: CustomBlockProps) => (
|
|
@@ -317,30 +181,25 @@ const Card = (props: CustomBlockProps) => (
|
|
|
317
181
|
</div>
|
|
318
182
|
);
|
|
319
183
|
|
|
320
|
-
const components: ComponentMap = { Card };
|
|
184
|
+
const components: ComponentMap = { card: Card };
|
|
321
185
|
|
|
322
186
|
const markdown = `
|
|
323
|
-
\`\`\`
|
|
324
|
-
title: My Card
|
|
325
|
-
description:
|
|
187
|
+
\`\`\`yaml card
|
|
188
|
+
title: My Card
|
|
189
|
+
description: Card content here
|
|
326
190
|
\`\`\`
|
|
327
191
|
`;
|
|
328
192
|
|
|
329
|
-
const
|
|
193
|
+
const parsed = parse(markdown, new Set(["card"]));
|
|
194
|
+
const result = transform(parsed, components);
|
|
330
195
|
```
|
|
331
196
|
|
|
332
|
-
With ` ```Card| `, the content is parsed as YAML and available via `props.data`.
|
|
333
|
-
|
|
334
197
|
## Complete Example
|
|
335
198
|
|
|
336
199
|
```tsx
|
|
337
|
-
import { createSignal, Show
|
|
338
|
-
import {
|
|
339
|
-
|
|
340
|
-
ComponentMap,
|
|
341
|
-
CustomBlockProps,
|
|
342
|
-
StandardComponentProps,
|
|
343
|
-
} from "solid-mds";
|
|
200
|
+
import { createSignal, Show } from "solid-js";
|
|
201
|
+
import { parse } from "hast-mds";
|
|
202
|
+
import { transform, ComponentMap, CustomBlockProps, StandardComponentProps } from "solid-mds";
|
|
344
203
|
|
|
345
204
|
// Custom components
|
|
346
205
|
const Slide = (props: CustomBlockProps) => (
|
|
@@ -356,19 +215,18 @@ const Code = (props: StandardComponentProps) => (
|
|
|
356
215
|
);
|
|
357
216
|
|
|
358
217
|
const components: ComponentMap = {
|
|
359
|
-
Slide,
|
|
218
|
+
slide: Slide,
|
|
360
219
|
code: Code,
|
|
361
220
|
};
|
|
362
221
|
|
|
363
|
-
// Markdown content
|
|
364
222
|
const content = `
|
|
365
|
-
|
|
223
|
+
\`\`\`yaml @@
|
|
366
224
|
title: My Presentation
|
|
367
225
|
author: Developer
|
|
368
226
|
\`\`\`
|
|
369
227
|
|
|
370
228
|
+++intro
|
|
371
|
-
|
|
229
|
+
\`\`\`yaml @
|
|
372
230
|
transition: fade
|
|
373
231
|
\`\`\`
|
|
374
232
|
|
|
@@ -377,24 +235,19 @@ transition: fade
|
|
|
377
235
|
Introduction slide content.
|
|
378
236
|
|
|
379
237
|
+++demo
|
|
380
|
-
\`\`\`
|
|
238
|
+
\`\`\`md slide/centered
|
|
381
239
|
# Demo Time
|
|
382
240
|
|
|
383
|
-
Check out this code
|
|
384
|
-
|
|
385
|
-
\`\`\`js
|
|
386
|
-
console.log("Hello!");
|
|
387
|
-
\`\`\`
|
|
241
|
+
Check out this code!
|
|
388
242
|
\`\`\`
|
|
389
243
|
|
|
390
244
|
+++end
|
|
391
245
|
# Thank You!
|
|
392
|
-
|
|
393
|
-
Questions?
|
|
394
246
|
`;
|
|
395
247
|
|
|
396
248
|
function Presentation() {
|
|
397
|
-
const
|
|
249
|
+
const parsed = parse(content, new Set(["slide"]));
|
|
250
|
+
const result = transform(parsed, components);
|
|
398
251
|
const [currentId, setCurrentId] = createSignal(result.first);
|
|
399
252
|
|
|
400
253
|
const currentStep = () => result.steps[currentId()!];
|
|
@@ -417,7 +270,9 @@ function Presentation() {
|
|
|
417
270
|
</header>
|
|
418
271
|
|
|
419
272
|
<main>
|
|
420
|
-
<Show when={currentStep()}>
|
|
273
|
+
<Show when={currentStep()}>
|
|
274
|
+
{currentStep().Body()}
|
|
275
|
+
</Show>
|
|
421
276
|
</main>
|
|
422
277
|
|
|
423
278
|
<footer>
|
|
@@ -438,24 +293,32 @@ function Presentation() {
|
|
|
438
293
|
|
|
439
294
|
## API Reference
|
|
440
295
|
|
|
441
|
-
### `
|
|
296
|
+
### `transform<TGlobal, TLocal>(parsed, components?): ParseResult`
|
|
442
297
|
|
|
443
|
-
|
|
444
|
-
for your global and local scope to receive a properly typed result.
|
|
298
|
+
Transforms parsed MDS content (HAST) into Solid components.
|
|
445
299
|
|
|
446
300
|
**Parameters:**
|
|
447
301
|
|
|
448
|
-
- `
|
|
449
|
-
- `components` — Optional map of custom components
|
|
302
|
+
- `parsed` — Result from `hast-mds` parse() function
|
|
303
|
+
- `components` — Optional map of custom Solid components
|
|
450
304
|
|
|
451
305
|
**Returns:**
|
|
452
306
|
|
|
453
307
|
```ts
|
|
454
308
|
interface ParseResult<TGlobal, TLocal> {
|
|
455
|
-
first: string | null;
|
|
309
|
+
first: string | null; // First step ID
|
|
456
310
|
steps: Record<string, Step<TLocal>>; // All steps by ID
|
|
457
|
-
count: number;
|
|
458
|
-
global: TGlobal | null;
|
|
311
|
+
count: number; // Total number of steps
|
|
312
|
+
global: TGlobal | null; // Global metadata
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
interface Step<TLocal> {
|
|
316
|
+
id: string;
|
|
317
|
+
local: TLocal;
|
|
318
|
+
Body: Component; // Call as Body() to render
|
|
319
|
+
prev: string | null;
|
|
320
|
+
next: string | null;
|
|
321
|
+
current: number;
|
|
459
322
|
}
|
|
460
323
|
```
|
|
461
324
|
|
|
@@ -468,9 +331,68 @@ import type {
|
|
|
468
331
|
StandardComponentProps,
|
|
469
332
|
ParseResult,
|
|
470
333
|
Step,
|
|
334
|
+
// Re-exported from hast-mds
|
|
335
|
+
HastParseResult,
|
|
336
|
+
HastStep,
|
|
337
|
+
HastBody,
|
|
338
|
+
CustomComponents,
|
|
471
339
|
} from "solid-mds";
|
|
472
340
|
```
|
|
473
341
|
|
|
342
|
+
## Migration from v0.3.x
|
|
343
|
+
|
|
344
|
+
### Breaking Changes
|
|
345
|
+
|
|
346
|
+
1. **New API**: `parse()` is replaced by `transform()`
|
|
347
|
+
2. **Requires hast-mds**: Install and use `hast-mds` for parsing
|
|
348
|
+
3. **Syntax changes**: Old block syntax is no longer supported
|
|
349
|
+
|
|
350
|
+
### Before (v0.3.x)
|
|
351
|
+
|
|
352
|
+
```tsx
|
|
353
|
+
import { parse } from "solid-mds";
|
|
354
|
+
|
|
355
|
+
const result = parse(markdown, components);
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### After (v0.4.0)
|
|
359
|
+
|
|
360
|
+
```tsx
|
|
361
|
+
import { parse } from "hast-mds";
|
|
362
|
+
import { transform } from "solid-mds";
|
|
363
|
+
|
|
364
|
+
const parsed = parse(markdown, new Set(Object.keys(components)));
|
|
365
|
+
const result = transform(parsed, components);
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Syntax Changes
|
|
369
|
+
|
|
370
|
+
| Old Syntax | New Syntax |
|
|
371
|
+
|------------|------------|
|
|
372
|
+
| ` ```@@\| ` | ` ```yaml @@ ` |
|
|
373
|
+
| ` ```@\| ` | ` ```yaml @ ` |
|
|
374
|
+
| ` ```@@/name ` | ` ```md @@/name ` |
|
|
375
|
+
| ` ```@/name ` | ` ```md @/name ` |
|
|
376
|
+
| ` ```componentName\| ` | ` ```yaml componentName ` |
|
|
377
|
+
| ` ```componentName/path ` | ` ```md componentName/path ` |
|
|
378
|
+
|
|
379
|
+
## Markdown Features
|
|
380
|
+
|
|
381
|
+
solid-mds (via hast-mds) supports:
|
|
382
|
+
|
|
383
|
+
- **Standard Markdown**: Headings, bold, italic, links, images, lists, blockquotes, code
|
|
384
|
+
- **GFM**: Tables, task lists, strikethrough, autolinks
|
|
385
|
+
- **Math**: LaTeX via KaTeX (`$inline$` and `$$block$$`)
|
|
386
|
+
|
|
387
|
+
For math rendering, include KaTeX CSS:
|
|
388
|
+
|
|
389
|
+
```html
|
|
390
|
+
<link
|
|
391
|
+
rel="stylesheet"
|
|
392
|
+
href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css"
|
|
393
|
+
/>
|
|
394
|
+
```
|
|
395
|
+
|
|
474
396
|
## License
|
|
475
397
|
|
|
476
398
|
MIT
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { HastParseResult } from 'hast-mds';
|
|
2
|
+
export { CustomComponents, HastBody, HastParseResult, HastStep } from 'hast-mds';
|
|
1
3
|
import { Component, JSX } from 'solid-js';
|
|
2
4
|
|
|
3
5
|
/**
|
|
@@ -24,27 +26,73 @@ type ComponentMap = {
|
|
|
24
26
|
[tagName: string]: Component<CustomBlockProps> | Component<StandardComponentProps>;
|
|
25
27
|
};
|
|
26
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Base interface for step-local metadata.
|
|
31
|
+
* Users can extend this with their own types.
|
|
32
|
+
*/
|
|
27
33
|
interface StepLocalBase {
|
|
28
34
|
[key: string]: unknown;
|
|
29
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Base interface for global metadata.
|
|
38
|
+
* Users can extend this with their own types.
|
|
39
|
+
*/
|
|
30
40
|
interface GlobalMetaBase {
|
|
31
41
|
[key: string]: unknown;
|
|
32
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* A single step in the MDS document with Solid components.
|
|
45
|
+
*/
|
|
33
46
|
interface Step<TLocal = StepLocalBase> {
|
|
47
|
+
/** Unique identifier for the step */
|
|
34
48
|
id: string;
|
|
49
|
+
/** Step-specific metadata (YAML values and markdown blocks as Components) */
|
|
35
50
|
local: TLocal;
|
|
36
51
|
/** Component function that renders the step body. Call it to get JSX: {step.Body()} */
|
|
37
52
|
Body: Component;
|
|
53
|
+
/** ID of the previous step, or null if first */
|
|
38
54
|
prev: string | null;
|
|
55
|
+
/** ID of the next step, or null if last */
|
|
39
56
|
next: string | null;
|
|
57
|
+
/** 1-based position of this step */
|
|
40
58
|
current: number;
|
|
41
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Result of transforming an MDS document to Solid components.
|
|
62
|
+
*/
|
|
42
63
|
interface ParseResult<TGlobal = GlobalMetaBase, TLocal = StepLocalBase> {
|
|
64
|
+
/** ID of the first step, or null if no steps */
|
|
43
65
|
first: string | null;
|
|
66
|
+
/** Map of step IDs to step objects */
|
|
44
67
|
steps: Record<string, Step<TLocal>>;
|
|
68
|
+
/** Total number of steps */
|
|
45
69
|
count: number;
|
|
70
|
+
/** Global metadata (YAML values and markdown blocks as Components) */
|
|
46
71
|
global: TGlobal | null;
|
|
47
72
|
}
|
|
48
|
-
declare function parse<TGlobal = GlobalMetaBase, TLocal = StepLocalBase>(input: string, components?: ComponentMap): ParseResult<TGlobal, TLocal>;
|
|
49
73
|
|
|
50
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Transform a parsed MDS document (HAST) into Solid components.
|
|
76
|
+
*
|
|
77
|
+
* This function takes the output from `hast-mds` parse() and converts all
|
|
78
|
+
* HAST trees into renderable Solid components.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* import { parse } from "hast-mds";
|
|
83
|
+
* import { transform } from "solid-mds";
|
|
84
|
+
*
|
|
85
|
+
* const parsed = parse(mdsString, new Set(["quiz", "card"]));
|
|
86
|
+
* const result = transform(parsed, { quiz: QuizComponent, card: CardComponent });
|
|
87
|
+
*
|
|
88
|
+
* // Use in Solid component:
|
|
89
|
+
* <div>{result.steps.intro.Body()}</div>
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
92
|
+
* @param parsed - The result from hast-mds parse() function
|
|
93
|
+
* @param components - Optional map of custom Solid components
|
|
94
|
+
* @returns ParseResult with Solid components
|
|
95
|
+
*/
|
|
96
|
+
declare function transform<TGlobal = GlobalMetaBase, TLocal = StepLocalBase>(parsed: HastParseResult<TGlobal, TLocal>, components?: ComponentMap): ParseResult<TGlobal, TLocal>;
|
|
97
|
+
|
|
98
|
+
export { type ComponentMap, type CustomBlockProps, type GlobalMetaBase, type ParseResult, type StandardComponentProps, type Step, type StepLocalBase, transform };
|
package/dist/index.jsx
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
// src/index.tsx
|
|
2
|
-
import { unified } from "unified";
|
|
3
|
-
import remarkParse from "remark-parse";
|
|
4
|
-
import remarkGfm from "remark-gfm";
|
|
5
|
-
import remarkMath from "remark-math";
|
|
6
|
-
import remarkRehype from "remark-rehype";
|
|
7
|
-
import rehypeKatex from "rehype-katex";
|
|
8
|
-
import { parse as parseYaml2 } from "yaml";
|
|
9
|
-
|
|
10
1
|
// src/hast-to-solid.tsx
|
|
11
2
|
function convertProperties(properties) {
|
|
12
3
|
if (!properties) return {};
|
|
@@ -196,207 +187,48 @@ function hastToSolidComponent(hastTree, components = {}) {
|
|
|
196
187
|
};
|
|
197
188
|
}
|
|
198
189
|
|
|
199
|
-
// src/remark-custom-blocks.ts
|
|
200
|
-
import { visit } from "unist-util-visit";
|
|
201
|
-
import { parse as parseYaml } from "yaml";
|
|
202
|
-
function remarkCustomBlocks(options) {
|
|
203
|
-
const { components, processor } = options;
|
|
204
|
-
return (tree) => {
|
|
205
|
-
visit(tree, "code", (node, index, parent) => {
|
|
206
|
-
if (!parent || index === void 0) return;
|
|
207
|
-
const lang = node.lang;
|
|
208
|
-
if (!lang) return;
|
|
209
|
-
const isDataBlock = lang.endsWith("|");
|
|
210
|
-
const cleanLang = isDataBlock ? lang.slice(0, -1) : lang;
|
|
211
|
-
const segments = cleanLang.split("/");
|
|
212
|
-
const componentName = segments[0];
|
|
213
|
-
const raw = node.value;
|
|
214
|
-
if (!components.has(componentName)) return;
|
|
215
|
-
const payload = segments.slice(1);
|
|
216
|
-
if (isDataBlock) {
|
|
217
|
-
const data = parseYaml(raw);
|
|
218
|
-
const customNode2 = {
|
|
219
|
-
type: "customBlock",
|
|
220
|
-
data: {
|
|
221
|
-
hName: componentName,
|
|
222
|
-
hProperties: {
|
|
223
|
-
payload: JSON.stringify(payload),
|
|
224
|
-
raw,
|
|
225
|
-
data: JSON.stringify(data)
|
|
226
|
-
}
|
|
227
|
-
},
|
|
228
|
-
children: []
|
|
229
|
-
};
|
|
230
|
-
parent.children[index] = customNode2;
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
const contentMdast = processor.parse(raw);
|
|
234
|
-
const customNode = {
|
|
235
|
-
type: "customBlock",
|
|
236
|
-
data: {
|
|
237
|
-
hName: componentName,
|
|
238
|
-
hProperties: {
|
|
239
|
-
payload: JSON.stringify(payload),
|
|
240
|
-
raw
|
|
241
|
-
}
|
|
242
|
-
},
|
|
243
|
-
children: contentMdast.children
|
|
244
|
-
};
|
|
245
|
-
parent.children[index] = customNode;
|
|
246
|
-
});
|
|
247
|
-
};
|
|
248
|
-
}
|
|
249
|
-
|
|
250
190
|
// src/index.tsx
|
|
251
|
-
function
|
|
252
|
-
|
|
253
|
-
let match;
|
|
254
|
-
let local = {};
|
|
255
|
-
let body = content;
|
|
256
|
-
while ((match = metaPattern.exec(content)) !== null) {
|
|
257
|
-
const parsed = parseYaml2(match[1]);
|
|
258
|
-
local = { ...local, ...parsed };
|
|
259
|
-
}
|
|
260
|
-
body = content.replace(metaPattern, "").trim();
|
|
261
|
-
const localMdPattern = /```@\/(\w+)\s*\n([\s\S]*?)```\s*\n?/g;
|
|
262
|
-
const localMdBlocks = {};
|
|
263
|
-
while ((match = localMdPattern.exec(body)) !== null) {
|
|
264
|
-
const name = match[1];
|
|
265
|
-
const content2 = match[2].trim();
|
|
266
|
-
if (localMdBlocks[name]) {
|
|
267
|
-
localMdBlocks[name] += "\n\n" + content2;
|
|
268
|
-
} else {
|
|
269
|
-
localMdBlocks[name] = content2;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
body = body.replace(localMdPattern, "").trim();
|
|
273
|
-
for (const [name, mdContent] of Object.entries(localMdBlocks)) {
|
|
274
|
-
const mdast = processor.parse(mdContent);
|
|
275
|
-
const hastTree = processor.runSync(mdast);
|
|
276
|
-
local[name] = hastToSolidComponent(hastTree, components);
|
|
277
|
-
}
|
|
278
|
-
return { local, body };
|
|
191
|
+
function isHastBody(value) {
|
|
192
|
+
return typeof value === "object" && value !== null && "type" in value && value.type === "hast" && "node" in value;
|
|
279
193
|
}
|
|
280
|
-
function
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
const globalMdPattern = /```@@\/(\w+)\s*\n([\s\S]*?)```/g;
|
|
289
|
-
const globalMdBlocks = {};
|
|
290
|
-
while ((match = globalMdPattern.exec(input)) !== null) {
|
|
291
|
-
const name = match[1];
|
|
292
|
-
const content = match[2].trim();
|
|
293
|
-
if (globalMdBlocks[name]) {
|
|
294
|
-
globalMdBlocks[name] += "\n\n" + content;
|
|
194
|
+
function transformMetadata(metadata, components) {
|
|
195
|
+
if (metadata === null) return null;
|
|
196
|
+
const result = {};
|
|
197
|
+
for (const [key, value] of Object.entries(
|
|
198
|
+
metadata
|
|
199
|
+
)) {
|
|
200
|
+
if (isHastBody(value)) {
|
|
201
|
+
result[key] = hastToSolidComponent(value.node, components);
|
|
295
202
|
} else {
|
|
296
|
-
|
|
203
|
+
result[key] = value;
|
|
297
204
|
}
|
|
298
205
|
}
|
|
299
|
-
|
|
300
|
-
const mdast = processor.parse(mdContent);
|
|
301
|
-
const hastTree = processor.runSync(mdast);
|
|
302
|
-
global[name] = hastToSolidComponent(hastTree, components);
|
|
303
|
-
}
|
|
304
|
-
return Object.keys(global).length > 0 ? global : null;
|
|
305
|
-
}
|
|
306
|
-
function isInsideCodeBlock(input, position) {
|
|
307
|
-
const beforeText = input.slice(0, position);
|
|
308
|
-
const fencePattern = /^```/gm;
|
|
309
|
-
let fenceCount = 0;
|
|
310
|
-
let match;
|
|
311
|
-
while ((match = fencePattern.exec(beforeText)) !== null) {
|
|
312
|
-
fenceCount++;
|
|
313
|
-
}
|
|
314
|
-
return fenceCount % 2 === 1;
|
|
315
|
-
}
|
|
316
|
-
var VALID_ID_PATTERN = /^[a-z0-9-]+$/;
|
|
317
|
-
function validateStepId(id, lineNumber) {
|
|
318
|
-
if (!VALID_ID_PATTERN.test(id)) {
|
|
319
|
-
throw new Error(
|
|
320
|
-
`Invalid step ID "${id}" at line ${lineNumber}. Step IDs must only contain lowercase letters (a-z), numbers (0-9), and hyphens (-).`
|
|
321
|
-
);
|
|
322
|
-
}
|
|
206
|
+
return result;
|
|
323
207
|
}
|
|
324
|
-
function
|
|
325
|
-
const stepPattern = /^\+\+\+(.+)$/gm;
|
|
208
|
+
function transform(parsed, components = {}) {
|
|
326
209
|
const steps = {};
|
|
327
|
-
const
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
let match;
|
|
335
|
-
const matches = [];
|
|
336
|
-
while ((match = stepPattern.exec(input)) !== null) {
|
|
337
|
-
if (!isInsideCodeBlock(input, match.index)) {
|
|
338
|
-
const id = match[1].trim();
|
|
339
|
-
const lineNumber = input.slice(0, match.index).split("\n").length;
|
|
340
|
-
validateStepId(id, lineNumber);
|
|
341
|
-
matches.push({ id, index: match.index });
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
if (matches.length === 0) {
|
|
345
|
-
const { local, body: markdown } = parseLocalMeta(
|
|
346
|
-
input.trim(),
|
|
347
|
-
processor,
|
|
348
|
-
components
|
|
349
|
-
);
|
|
350
|
-
const mdast = processor.parse(markdown);
|
|
351
|
-
const hastTree = processor.runSync(mdast);
|
|
352
|
-
const Body = hastToSolidComponent(hastTree, components);
|
|
353
|
-
steps["default"] = {
|
|
354
|
-
id: "default",
|
|
355
|
-
local,
|
|
356
|
-
Body,
|
|
357
|
-
prev: null,
|
|
358
|
-
next: null,
|
|
359
|
-
current: 1
|
|
360
|
-
};
|
|
361
|
-
return {
|
|
362
|
-
first: "default",
|
|
363
|
-
steps,
|
|
364
|
-
count: 1,
|
|
365
|
-
global
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
for (let i = 0; i < matches.length; i++) {
|
|
369
|
-
const current = matches[i];
|
|
370
|
-
const nextMatch = matches[i + 1];
|
|
371
|
-
const prevMatch = matches[i - 1];
|
|
372
|
-
const startIndex = current.index + `+++${current.id}`.length;
|
|
373
|
-
const endIndex = nextMatch ? nextMatch.index : input.length;
|
|
374
|
-
const rawContent = input.slice(startIndex, endIndex).trim();
|
|
375
|
-
const { local, body: markdown } = parseLocalMeta(
|
|
376
|
-
rawContent,
|
|
377
|
-
processor,
|
|
378
|
-
components
|
|
379
|
-
);
|
|
380
|
-
const mdast = processor.parse(markdown);
|
|
381
|
-
const hastTree = processor.runSync(mdast);
|
|
382
|
-
const Body = hastToSolidComponent(hastTree, components);
|
|
383
|
-
steps[current.id] = {
|
|
384
|
-
id: current.id,
|
|
385
|
-
local,
|
|
210
|
+
for (const id of Object.keys(parsed.steps)) {
|
|
211
|
+
const hastStep = parsed.steps[id];
|
|
212
|
+
const Body = hastToSolidComponent(hastStep.body.node, components);
|
|
213
|
+
const transformedLocal = transformMetadata(hastStep.local, components);
|
|
214
|
+
steps[id] = {
|
|
215
|
+
id: hastStep.id,
|
|
216
|
+
local: transformedLocal,
|
|
386
217
|
Body,
|
|
387
|
-
prev:
|
|
388
|
-
next:
|
|
389
|
-
current:
|
|
218
|
+
prev: hastStep.prev,
|
|
219
|
+
next: hastStep.next,
|
|
220
|
+
current: hastStep.current
|
|
390
221
|
};
|
|
391
222
|
}
|
|
223
|
+
const transformedGlobal = transformMetadata(parsed.global, components);
|
|
392
224
|
return {
|
|
393
|
-
first:
|
|
225
|
+
first: parsed.first,
|
|
394
226
|
steps,
|
|
395
|
-
count:
|
|
396
|
-
global
|
|
227
|
+
count: parsed.count,
|
|
228
|
+
global: transformedGlobal
|
|
397
229
|
};
|
|
398
230
|
}
|
|
399
231
|
export {
|
|
400
|
-
|
|
232
|
+
transform
|
|
401
233
|
};
|
|
402
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzeCIsICIuLi9zcmMvaGFzdC10by1zb2xpZC50c3giLCAiLi4vc3JjL3JlbWFyay1jdXN0b20tYmxvY2tzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb21wb25lbnQsIEpTWCB9IGZyb20gXCJzb2xpZC1qc1wiO1xuaW1wb3J0IHsgdW5pZmllZCwgdHlwZSBQcm9jZXNzb3IgfSBmcm9tIFwidW5pZmllZFwiO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gXCJyZW1hcmstcGFyc2VcIjtcbmltcG9ydCByZW1hcmtHZm0gZnJvbSBcInJlbWFyay1nZm1cIjtcbmltcG9ydCByZW1hcmtNYXRoIGZyb20gXCJyZW1hcmstbWF0aFwiO1xuaW1wb3J0IHJlbWFya1JlaHlwZSBmcm9tIFwicmVtYXJrLXJlaHlwZVwiO1xuaW1wb3J0IHJlaHlwZUthdGV4IGZyb20gXCJyZWh5cGUta2F0ZXhcIjtcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlWWFtbCB9IGZyb20gXCJ5YW1sXCI7XG5pbXBvcnQgdHlwZSB7IFJvb3QgfSBmcm9tIFwiaGFzdFwiO1xuaW1wb3J0IHtcbiAgaGFzdFRvU29saWRKc3gsXG4gIGhhc3RUb1NvbGlkQ29tcG9uZW50LFxuICBDb21wb25lbnRNYXAsXG59IGZyb20gXCIuL2hhc3QtdG8tc29saWRcIjtcbmltcG9ydCB7IHJlbWFya0N1c3RvbUJsb2NrcyB9IGZyb20gXCIuL3JlbWFyay1jdXN0b20tYmxvY2tzXCI7XG5cbmV4cG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50TWFwLFxuICBDdXN0b21CbG9ja1Byb3BzLFxuICBTdGFuZGFyZENvbXBvbmVudFByb3BzLFxufSBmcm9tIFwiLi9oYXN0LXRvLXNvbGlkXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcExvY2FsQmFzZSB7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2xvYmFsTWV0YUJhc2Uge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXA8VExvY2FsID0gU3RlcExvY2FsQmFzZT4ge1xuICBpZDogc3RyaW5nO1xuICBsb2NhbDogVExvY2FsO1xuICAvKiogQ29tcG9uZW50IGZ1bmN0aW9uIHRoYXQgcmVuZGVycyB0aGUgc3RlcCBib2R5LiBDYWxsIGl0IHRvIGdldCBKU1g6IHtzdGVwLkJvZHkoKX0gKi9cbiAgQm9keTogQ29tcG9uZW50O1xuICBwcmV2OiBzdHJpbmcgfCBudWxsO1xuICBuZXh0OiBzdHJpbmcgfCBudWxsO1xuICBjdXJyZW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VSZXN1bHQ8VEdsb2JhbCA9IEdsb2JhbE1ldGFCYXNlLCBUTG9jYWwgPSBTdGVwTG9jYWxCYXNlPiB7XG4gIGZpcnN0OiBzdHJpbmcgfCBudWxsO1xuICBzdGVwczogUmVjb3JkPHN0cmluZywgU3RlcDxUTG9jYWw+PjtcbiAgY291bnQ6IG51bWJlcjtcbiAgZ2xvYmFsOiBUR2xvYmFsIHwgbnVsbDtcbn1cblxuXG5mdW5jdGlvbiBwYXJzZUxvY2FsTWV0YShcbiAgY29udGVudDogc3RyaW5nLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcm9jZXNzb3I6IFByb2Nlc3NvcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4sXG4gIGNvbXBvbmVudHM6IENvbXBvbmVudE1hcCxcbik6IHsgbG9jYWw6IFN0ZXBMb2NhbEJhc2U7IGJvZHk6IHN0cmluZyB9IHtcbiAgLy8gTWF0Y2ggYWxsIGxvY2FsIG1ldGFkYXRhIGJsb2NrczogYGBgQHwgLi4uIGBgYFxuICAvLyBNdWx0aXBsZSBibG9ja3MgYXJlIG1lcmdlZCwgbGF0ZXIgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgb25lc1xuICBjb25zdCBtZXRhUGF0dGVybiA9IC9gYGBAXFx8XFxzKlxcbihbXFxzXFxTXSo/KWBgYFxccypcXG4/L2c7XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgbGV0IGxvY2FsOiBTdGVwTG9jYWxCYXNlID0ge307XG4gIGxldCBib2R5ID0gY29udGVudDtcblxuICB3aGlsZSAoKG1hdGNoID0gbWV0YVBhdHRlcm4uZXhlYyhjb250ZW50KSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVlhbWwobWF0Y2hbMV0pO1xuICAgIGxvY2FsID0geyAuLi5sb2NhbCwgLi4ucGFyc2VkIH07XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIG1ldGFkYXRhIGJsb2NrcyBmcm9tIGJvZHlcbiAgYm9keSA9IGNvbnRlbnQucmVwbGFjZShtZXRhUGF0dGVybiwgXCJcIikudHJpbSgpO1xuXG4gIC8vIE1hdGNoIGxvY2FsIG1kIGJsb2NrczogYGBgQC9uYW1lIC4uLiBgYGBcbiAgLy8gVGhlc2UgYXJlIG1hcmtkb3duIGJsb2NrcyB0aGF0IGdldCByZW5kZXJlZCBhbmQgc3RvcmVkIGluIGxvY2FsW25hbWVdXG4gIGNvbnN0IGxvY2FsTWRQYXR0ZXJuID0gL2BgYEBcXC8oXFx3KylcXHMqXFxuKFtcXHNcXFNdKj8pYGBgXFxzKlxcbj8vZztcbiAgY29uc3QgbG9jYWxNZEJsb2NrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIHdoaWxlICgobWF0Y2ggPSBsb2NhbE1kUGF0dGVybi5leGVjKGJvZHkpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IG5hbWUgPSBtYXRjaFsxXTtcbiAgICBjb25zdCBjb250ZW50ID0gbWF0Y2hbMl0udHJpbSgpO1xuICAgIC8vIENvbmNhdGVuYXRlIGlmIG11bHRpcGxlIGJsb2NrcyB3aXRoIHNhbWUgbmFtZVxuICAgIGlmIChsb2NhbE1kQmxvY2tzW25hbWVdKSB7XG4gICAgICBsb2NhbE1kQmxvY2tzW25hbWVdICs9IFwiXFxuXFxuXCIgKyBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbE1kQmxvY2tzW25hbWVdID0gY29udGVudDtcbiAgICB9XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIGxvY2FsIG1kIGJsb2NrcyBmcm9tIGJvZHlcbiAgYm9keSA9IGJvZHkucmVwbGFjZShsb2NhbE1kUGF0dGVybiwgXCJcIikudHJpbSgpO1xuXG4gIC8vIENvbnZlcnQgYWxsIGxvY2FsIG1kIGJsb2NrcyB0byBKU1hcbiAgZm9yIChjb25zdCBbbmFtZSwgbWRDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhsb2NhbE1kQmxvY2tzKSkge1xuICAgIGNvbnN0IG1kYXN0ID0gcHJvY2Vzc29yLnBhcnNlKG1kQ29udGVudCk7XG4gICAgY29uc3QgaGFzdFRyZWUgPSBwcm9jZXNzb3IucnVuU3luYyhtZGFzdCkgYXMgUm9vdDtcbiAgICBsb2NhbFtuYW1lXSA9IGhhc3RUb1NvbGlkQ29tcG9uZW50KGhhc3RUcmVlLCBjb21wb25lbnRzKTtcbiAgfVxuXG4gIHJldHVybiB7IGxvY2FsLCBib2R5IH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlR2xvYmFsTWV0YShcbiAgaW5wdXQ6IHN0cmluZyxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvY2Vzc29yOiBQcm9jZXNzb3I8YW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXAsXG4pOiBHbG9iYWxNZXRhQmFzZSB8IG51bGwge1xuICAvLyBNYXRjaCBnbG9iYWwgZGF0YSBibG9ja3M6IGBgYEBAfCAuLi4gYGBgXG4gIC8vIENhbiBhcHBlYXIgYW55d2hlcmUgaW4gdGhlIGRvY3VtZW50LCBtYXkgaGF2ZSBtdWx0aXBsZSBibG9ja3NcbiAgY29uc3QgZ2xvYmFsRGF0YVBhdHRlcm4gPSAvYGBgQEBcXHxcXHMqXFxuKFtcXHNcXFNdKj8pYGBgL2c7XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgbGV0IGdsb2JhbDogR2xvYmFsTWV0YUJhc2UgPSB7fTtcblxuICB3aGlsZSAoKG1hdGNoID0gZ2xvYmFsRGF0YVBhdHRlcm4uZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VZYW1sKG1hdGNoWzFdKTtcbiAgICBnbG9iYWwgPSB7IC4uLmdsb2JhbCwgLi4ucGFyc2VkIH07XG4gIH1cblxuICAvLyBNYXRjaCBnbG9iYWwgbWQgYmxvY2tzOiBgYGBAQC9uYW1lIC4uLiBgYGBcbiAgLy8gVGhlc2UgYXJlIG1hcmtkb3duIGJsb2NrcyB0aGF0IGdldCByZW5kZXJlZCBhbmQgc3RvcmVkIGluIGdsb2JhbFtuYW1lXVxuICBjb25zdCBnbG9iYWxNZFBhdHRlcm4gPSAvYGBgQEBcXC8oXFx3KylcXHMqXFxuKFtcXHNcXFNdKj8pYGBgL2c7XG4gIGNvbnN0IGdsb2JhbE1kQmxvY2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgd2hpbGUgKChtYXRjaCA9IGdsb2JhbE1kUGF0dGVybi5leGVjKGlucHV0KSkgIT09IG51bGwpIHtcbiAgICBjb25zdCBuYW1lID0gbWF0Y2hbMV07XG4gICAgY29uc3QgY29udGVudCA9IG1hdGNoWzJdLnRyaW0oKTtcbiAgICAvLyBDb25jYXRlbmF0ZSBpZiBtdWx0aXBsZSBibG9ja3Mgd2l0aCBzYW1lIG5hbWVcbiAgICBpZiAoZ2xvYmFsTWRCbG9ja3NbbmFtZV0pIHtcbiAgICAgIGdsb2JhbE1kQmxvY2tzW25hbWVdICs9IFwiXFxuXFxuXCIgKyBjb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iYWxNZEJsb2Nrc1tuYW1lXSA9IGNvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29udmVydCBhbGwgZ2xvYmFsIG1kIGJsb2NrcyB0byBDb21wb25lbnRzXG4gIGZvciAoY29uc3QgW25hbWUsIG1kQ29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZ2xvYmFsTWRCbG9ja3MpKSB7XG4gICAgY29uc3QgbWRhc3QgPSBwcm9jZXNzb3IucGFyc2UobWRDb250ZW50KTtcbiAgICBjb25zdCBoYXN0VHJlZSA9IHByb2Nlc3Nvci5ydW5TeW5jKG1kYXN0KSBhcyBSb290O1xuICAgIGdsb2JhbFtuYW1lXSA9IGhhc3RUb1NvbGlkQ29tcG9uZW50KGhhc3RUcmVlLCBjb21wb25lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhnbG9iYWwpLmxlbmd0aCA+IDAgPyBnbG9iYWwgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBpc0luc2lkZUNvZGVCbG9jayhpbnB1dDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gIC8vIEZpbmQgYWxsIGNvZGUgYmxvY2sgZmVuY2VzIGJlZm9yZSB0aGlzIHBvc2l0aW9uXG4gIGNvbnN0IGJlZm9yZVRleHQgPSBpbnB1dC5zbGljZSgwLCBwb3NpdGlvbik7XG4gIGNvbnN0IGZlbmNlUGF0dGVybiA9IC9eYGBgL2dtO1xuICBsZXQgZmVuY2VDb3VudCA9IDA7XG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcblxuICB3aGlsZSAoKG1hdGNoID0gZmVuY2VQYXR0ZXJuLmV4ZWMoYmVmb3JlVGV4dCkpICE9PSBudWxsKSB7XG4gICAgZmVuY2VDb3VudCsrO1xuICB9XG5cbiAgLy8gSWYgb2RkIG51bWJlciBvZiBmZW5jZXMsIHdlJ3JlIGluc2lkZSBhIGNvZGUgYmxvY2tcbiAgcmV0dXJuIGZlbmNlQ291bnQgJSAyID09PSAxO1xufVxuXG5jb25zdCBWQUxJRF9JRF9QQVRURVJOID0gL15bYS16MC05LV0rJC87XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RlcElkKGlkOiBzdHJpbmcsIGxpbmVOdW1iZXI6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIVZBTElEX0lEX1BBVFRFUk4udGVzdChpZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBzdGVwIElEIFwiJHtpZH1cIiBhdCBsaW5lICR7bGluZU51bWJlcn0uIGAgK1xuICAgICAgICBgU3RlcCBJRHMgbXVzdCBvbmx5IGNvbnRhaW4gbG93ZXJjYXNlIGxldHRlcnMgKGEteiksIG51bWJlcnMgKDAtOSksIGFuZCBoeXBoZW5zICgtKS5gLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlPFRHbG9iYWwgPSBHbG9iYWxNZXRhQmFzZSwgVExvY2FsID0gU3RlcExvY2FsQmFzZT4oXG4gIGlucHV0OiBzdHJpbmcsXG4gIGNvbXBvbmVudHM6IENvbXBvbmVudE1hcCA9IHt9LFxuKTogUGFyc2VSZXN1bHQ8VEdsb2JhbCwgVExvY2FsPiB7XG4gIC8vIENhcHR1cmUgZXZlcnl0aGluZyBhZnRlciArKysgdW50aWwgZW5kIG9mIGxpbmVcbiAgY29uc3Qgc3RlcFBhdHRlcm4gPSAvXlxcK1xcK1xcKyguKykkL2dtO1xuICBjb25zdCBzdGVwczogUmVjb3JkPHN0cmluZywgU3RlcDxUTG9jYWw+PiA9IHt9O1xuICBjb25zdCBjb21wb25lbnROYW1lcyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoY29tcG9uZW50cykpO1xuICBjb25zdCBiYXNlUHJvY2Vzc29yID0gdW5pZmllZCgpXG4gICAgLnVzZShyZW1hcmtQYXJzZSlcbiAgICAudXNlKHJlbWFya0dmbSlcbiAgICAudXNlKHJlbWFya01hdGgpO1xuICBjb25zdCBwcm9jZXNzb3IgPSB1bmlmaWVkKClcbiAgICAudXNlKHJlbWFya1BhcnNlKVxuICAgIC51c2UocmVtYXJrR2ZtKVxuICAgIC51c2UocmVtYXJrTWF0aClcbiAgICAudXNlKHJlbWFya0N1c3RvbUJsb2Nrcywge1xuICAgICAgY29tcG9uZW50czogY29tcG9uZW50TmFtZXMsXG4gICAgICBwcm9jZXNzb3I6IGJhc2VQcm9jZXNzb3IsXG4gICAgfSlcbiAgICAudXNlKHJlbWFya1JlaHlwZSwgeyBhbGxvd0Rhbmdlcm91c0h0bWw6IHRydWUgfSlcbiAgICAudXNlKHJlaHlwZUthdGV4KTtcbiAgY29uc3QgZ2xvYmFsID0gcGFyc2VHbG9iYWxNZXRhKGlucHV0LCBwcm9jZXNzb3IsIGNvbXBvbmVudHMpO1xuXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgY29uc3QgbWF0Y2hlczogeyBpZDogc3RyaW5nOyBpbmRleDogbnVtYmVyIH1bXSA9IFtdO1xuXG4gIHdoaWxlICgobWF0Y2ggPSBzdGVwUGF0dGVybi5leGVjKGlucHV0KSkgIT09IG51bGwpIHtcbiAgICAvLyBTa2lwIHRoaXMgbWF0Y2ggaWYgaXQncyBpbnNpZGUgYSBjb2RlIGJsb2NrXG4gICAgaWYgKCFpc0luc2lkZUNvZGVCbG9jayhpbnB1dCwgbWF0Y2guaW5kZXgpKSB7XG4gICAgICBjb25zdCBpZCA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgIC8vIENhbGN1bGF0ZSBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2FnZXNcbiAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBpbnB1dC5zbGljZSgwLCBtYXRjaC5pbmRleCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xuICAgICAgdmFsaWRhdGVTdGVwSWQoaWQsIGxpbmVOdW1iZXIpO1xuICAgICAgbWF0Y2hlcy5wdXNoKHsgaWQsIGluZGV4OiBtYXRjaC5pbmRleCB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBJZiBubyBzZXBhcmF0b3JzIGZvdW5kLCB0cmVhdCB0aGUgZW50aXJlIGlucHV0IGFzIGEgc2luZ2xlIFwiZGVmYXVsdFwiIHN0ZXBcbiAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc3QgeyBsb2NhbCwgYm9keTogbWFya2Rvd24gfSA9IHBhcnNlTG9jYWxNZXRhKFxuICAgICAgaW5wdXQudHJpbSgpLFxuICAgICAgcHJvY2Vzc29yLFxuICAgICAgY29tcG9uZW50cyxcbiAgICApO1xuXG4gICAgY29uc3QgbWRhc3QgPSBwcm9jZXNzb3IucGFyc2UobWFya2Rvd24pO1xuICAgIGNvbnN0IGhhc3RUcmVlID0gcHJvY2Vzc29yLnJ1blN5bmMobWRhc3QpIGFzIFJvb3Q7XG4gICAgY29uc3QgQm9keSA9IGhhc3RUb1NvbGlkQ29tcG9uZW50KGhhc3RUcmVlLCBjb21wb25lbnRzKTtcblxuICAgIHN0ZXBzW1wiZGVmYXVsdFwiXSA9IHtcbiAgICAgIGlkOiBcImRlZmF1bHRcIixcbiAgICAgIGxvY2FsOiBsb2NhbCBhcyBUTG9jYWwsXG4gICAgICBCb2R5LFxuICAgICAgcHJldjogbnVsbCxcbiAgICAgIG5leHQ6IG51bGwsXG4gICAgICBjdXJyZW50OiAxLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlyc3Q6IFwiZGVmYXVsdFwiLFxuICAgICAgc3RlcHMsXG4gICAgICBjb3VudDogMSxcbiAgICAgIGdsb2JhbDogZ2xvYmFsIGFzIFRHbG9iYWwgfCBudWxsLFxuICAgIH07XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXJyZW50ID0gbWF0Y2hlc1tpXTtcbiAgICBjb25zdCBuZXh0TWF0Y2ggPSBtYXRjaGVzW2kgKyAxXTtcbiAgICBjb25zdCBwcmV2TWF0Y2ggPSBtYXRjaGVzW2kgLSAxXTtcblxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50LmluZGV4ICsgYCsrKyR7Y3VycmVudC5pZH1gLmxlbmd0aDtcbiAgICBjb25zdCBlbmRJbmRleCA9IG5leHRNYXRjaCA/IG5leHRNYXRjaC5pbmRleCA6IGlucHV0Lmxlbmd0aDtcblxuICAgIGNvbnN0IHJhd0NvbnRlbnQgPSBpbnB1dC5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCkudHJpbSgpO1xuICAgIGNvbnN0IHsgbG9jYWwsIGJvZHk6IG1hcmtkb3duIH0gPSBwYXJzZUxvY2FsTWV0YShcbiAgICAgIHJhd0NvbnRlbnQsXG4gICAgICBwcm9jZXNzb3IsXG4gICAgICBjb21wb25lbnRzLFxuICAgICk7XG5cbiAgICBjb25zdCBtZGFzdCA9IHByb2Nlc3Nvci5wYXJzZShtYXJrZG93bik7XG4gICAgY29uc3QgaGFzdFRyZWUgPSBwcm9jZXNzb3IucnVuU3luYyhtZGFzdCkgYXMgUm9vdDtcbiAgICBjb25zdCBCb2R5ID0gaGFzdFRvU29saWRDb21wb25lbnQoaGFzdFRyZWUsIGNvbXBvbmVudHMpO1xuXG4gICAgc3RlcHNbY3VycmVudC5pZF0gPSB7XG4gICAgICBpZDogY3VycmVudC5pZCxcbiAgICAgIGxvY2FsOiBsb2NhbCBhcyBUTG9jYWwsXG4gICAgICBCb2R5LFxuICAgICAgcHJldjogcHJldk1hdGNoID8gcHJldk1hdGNoLmlkIDogbnVsbCxcbiAgICAgIG5leHQ6IG5leHRNYXRjaCA/IG5leHRNYXRjaC5pZCA6IG51bGwsXG4gICAgICBjdXJyZW50OiBpICsgMSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmaXJzdDogbWF0Y2hlcy5sZW5ndGggPiAwID8gbWF0Y2hlc1swXS5pZCA6IG51bGwsXG4gICAgc3RlcHMsXG4gICAgY291bnQ6IG1hdGNoZXMubGVuZ3RoLFxuICAgIGdsb2JhbDogZ2xvYmFsIGFzIFRHbG9iYWwgfCBudWxsLFxuICB9O1xufVxuIiwgImltcG9ydCB7IEpTWCwgQ29tcG9uZW50LCBjaGlsZHJlbiBhcyByZXNvbHZlQ2hpbGRyZW4gfSBmcm9tIFwic29saWQtanNcIjtcbmltcG9ydCB0eXBlIHsgUm9vdCwgRWxlbWVudCwgVGV4dCwgUm9vdENvbnRlbnQgfSBmcm9tIFwiaGFzdFwiO1xuXG4vKipcbiAqIFByb3BzIGZvciBjdXN0b20gYmxvY2sgY29tcG9uZW50cyAoY29kZSBibG9ja3Mgd2l0aCBuYW1lL3N1Yi9wYXRoIHN5bnRheClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21CbG9ja1Byb3BzIHtcbiAgLyoqIFRoZSBwYXRoIHNlZ21lbnRzIGFmdGVyIHRoZSBjb21wb25lbnQgbmFtZSwgZS5nLiBbJ3N1YnN0cnVjdHVyZScsICdzdWJzdWInXSAqL1xuICBwYXlsb2FkOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSByYXcgY29udGVudCBvZiB0aGUgY29kZSBibG9jayBhcyBwbGFpbiB0ZXh0ICovXG4gIHJhdzogc3RyaW5nO1xuICAvKiogUGFyc2VkIFlBTUwgZGF0YSB3aGVuIHVzaW5nIGNvbXBvbmVudE5hbWV8IHN5bnRheCAqL1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICAvKiogVGhlIG1hcmtkb3duLXJlbmRlcmVkIGNvbnRlbnQgYXMgY2hpbGRyZW4gKi9cbiAgY2hpbGRyZW4/OiBKU1guRWxlbWVudDtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBjb21wb25lbnQgcHJvcHMgZm9yIHJlZ3VsYXIgSFRNTCBlbGVtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkQ29tcG9uZW50UHJvcHMge1xuICBjaGlsZHJlbj86IEpTWC5FbGVtZW50O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgdHlwZSBDb21wb25lbnRNYXAgPSB7XG4gIFt0YWdOYW1lOiBzdHJpbmddOiBDb21wb25lbnQ8Q3VzdG9tQmxvY2tQcm9wcz4gfCBDb21wb25lbnQ8U3RhbmRhcmRDb21wb25lbnRQcm9wcz47XG59O1xuXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydGllcyhcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCFwcm9wZXJ0aWVzKSByZXR1cm4ge307XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpKSB7XG4gICAgaWYgKGtleSA9PT0gXCJjbGFzc05hbWVcIikge1xuICAgICAgcmVzdWx0LmNsYXNzID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgcmVzdWx0LmNsYXNzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKFwiIFwiKSA6IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckVsZW1lbnQoXG4gIHRhZ05hbWU6IHN0cmluZyxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjaGlsZHJlbjogSlNYLkVsZW1lbnRcbik6IEpTWC5FbGVtZW50IHtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcInBcIjpcbiAgICAgIHJldHVybiA8cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3A+O1xuICAgIGNhc2UgXCJoMVwiOlxuICAgICAgcmV0dXJuIDxoMSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2gxPjtcbiAgICBjYXNlIFwiaDJcIjpcbiAgICAgIHJldHVybiA8aDIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9oMj47XG4gICAgY2FzZSBcImgzXCI6XG4gICAgICByZXR1cm4gPGgzIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvaDM+O1xuICAgIGNhc2UgXCJoNFwiOlxuICAgICAgcmV0dXJuIDxoNCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2g0PjtcbiAgICBjYXNlIFwiaDVcIjpcbiAgICAgIHJldHVybiA8aDUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9oNT47XG4gICAgY2FzZSBcImg2XCI6XG4gICAgICByZXR1cm4gPGg2IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvaDY+O1xuICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgIHJldHVybiA8ZGl2IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZGl2PjtcbiAgICBjYXNlIFwic3BhblwiOlxuICAgICAgcmV0dXJuIDxzcGFuIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc3Bhbj47XG4gICAgY2FzZSBcImFcIjpcbiAgICAgIHJldHVybiA8YSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2E+O1xuICAgIGNhc2UgXCJzdHJvbmdcIjpcbiAgICAgIHJldHVybiA8c3Ryb25nIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc3Ryb25nPjtcbiAgICBjYXNlIFwiYlwiOlxuICAgICAgcmV0dXJuIDxiIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvYj47XG4gICAgY2FzZSBcImVtXCI6XG4gICAgICByZXR1cm4gPGVtIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZW0+O1xuICAgIGNhc2UgXCJpXCI6XG4gICAgICByZXR1cm4gPGkgey4uLnByb3BzfT57Y2hpbGRyZW59PC9pPjtcbiAgICBjYXNlIFwiY29kZVwiOlxuICAgICAgcmV0dXJuIDxjb2RlIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvY29kZT47XG4gICAgY2FzZSBcInByZVwiOlxuICAgICAgcmV0dXJuIDxwcmUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9wcmU+O1xuICAgIGNhc2UgXCJibG9ja3F1b3RlXCI6XG4gICAgICByZXR1cm4gPGJsb2NrcXVvdGUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9ibG9ja3F1b3RlPjtcbiAgICBjYXNlIFwidWxcIjpcbiAgICAgIHJldHVybiA8dWwgey4uLnByb3BzfT57Y2hpbGRyZW59PC91bD47XG4gICAgY2FzZSBcIm9sXCI6XG4gICAgICByZXR1cm4gPG9sIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvb2w+O1xuICAgIGNhc2UgXCJsaVwiOlxuICAgICAgcmV0dXJuIDxsaSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2xpPjtcbiAgICBjYXNlIFwiaHJcIjpcbiAgICAgIHJldHVybiA8aHIgey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwiYnJcIjpcbiAgICAgIHJldHVybiA8YnIgey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwiaW1nXCI6XG4gICAgICByZXR1cm4gPGltZyB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJ0YWJsZVwiOlxuICAgICAgcmV0dXJuIDx0YWJsZSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3RhYmxlPjtcbiAgICBjYXNlIFwidGhlYWRcIjpcbiAgICAgIHJldHVybiA8dGhlYWQgey4uLnByb3BzfT57Y2hpbGRyZW59PC90aGVhZD47XG4gICAgY2FzZSBcInRib2R5XCI6XG4gICAgICByZXR1cm4gPHRib2R5IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvdGJvZHk+O1xuICAgIGNhc2UgXCJ0clwiOlxuICAgICAgcmV0dXJuIDx0ciB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3RyPjtcbiAgICBjYXNlIFwidGhcIjpcbiAgICAgIHJldHVybiA8dGggey4uLnByb3BzfT57Y2hpbGRyZW59PC90aD47XG4gICAgY2FzZSBcInRkXCI6XG4gICAgICByZXR1cm4gPHRkIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvdGQ+O1xuICAgIGNhc2UgXCJkZWxcIjpcbiAgICAgIHJldHVybiA8ZGVsIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZGVsPjtcbiAgICBjYXNlIFwic3VwXCI6XG4gICAgICByZXR1cm4gPHN1cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3N1cD47XG4gICAgY2FzZSBcInN1YlwiOlxuICAgICAgcmV0dXJuIDxzdWIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9zdWI+O1xuICAgIC8vIEdGTSBlbGVtZW50c1xuICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgcmV0dXJuIDxpbnB1dCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJzZWN0aW9uXCI6XG4gICAgICByZXR1cm4gPHNlY3Rpb24gey4uLnByb3BzfT57Y2hpbGRyZW59PC9zZWN0aW9uPjtcbiAgICAvLyBLYVRlWCBtYXRoIGVsZW1lbnRzXG4gICAgY2FzZSBcIm1hdGhcIjpcbiAgICAgIHJldHVybiA8bWF0aCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21hdGg+O1xuICAgIGNhc2UgXCJzZW1hbnRpY3NcIjpcbiAgICAgIHJldHVybiA8c2VtYW50aWNzIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc2VtYW50aWNzPjtcbiAgICBjYXNlIFwibXJvd1wiOlxuICAgICAgcmV0dXJuIDxtcm93IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXJvdz47XG4gICAgY2FzZSBcIm1pXCI6XG4gICAgICByZXR1cm4gPG1pIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbWk+O1xuICAgIGNhc2UgXCJtb1wiOlxuICAgICAgcmV0dXJuIDxtbyB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21vPjtcbiAgICBjYXNlIFwibW5cIjpcbiAgICAgIHJldHVybiA8bW4gey4uLnByb3BzfT57Y2hpbGRyZW59PC9tbj47XG4gICAgY2FzZSBcIm1mcmFjXCI6XG4gICAgICByZXR1cm4gPG1mcmFjIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbWZyYWM+O1xuICAgIGNhc2UgXCJtc3VwXCI6XG4gICAgICByZXR1cm4gPG1zdXAgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tc3VwPjtcbiAgICBjYXNlIFwibXN1YlwiOlxuICAgICAgcmV0dXJuIDxtc3ViIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXN1Yj47XG4gICAgY2FzZSBcIm1zdWJzdXBcIjpcbiAgICAgIHJldHVybiA8bXN1YnN1cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21zdWJzdXA+O1xuICAgIGNhc2UgXCJtc3FydFwiOlxuICAgICAgcmV0dXJuIDxtc3FydCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21zcXJ0PjtcbiAgICBjYXNlIFwibXJvb3RcIjpcbiAgICAgIHJldHVybiA8bXJvb3Qgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tcm9vdD47XG4gICAgY2FzZSBcIm11bmRlclwiOlxuICAgICAgcmV0dXJuIDxtdW5kZXIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tdW5kZXI+O1xuICAgIGNhc2UgXCJtb3ZlclwiOlxuICAgICAgcmV0dXJuIDxtb3ZlciB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21vdmVyPjtcbiAgICBjYXNlIFwibXVuZGVyb3ZlclwiOlxuICAgICAgcmV0dXJuIDxtdW5kZXJvdmVyIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXVuZGVyb3Zlcj47XG4gICAgY2FzZSBcIm10YWJsZVwiOlxuICAgICAgcmV0dXJuIDxtdGFibGUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tdGFibGU+O1xuICAgIGNhc2UgXCJtdHJcIjpcbiAgICAgIHJldHVybiA8bXRyIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXRyPjtcbiAgICBjYXNlIFwibXRkXCI6XG4gICAgICByZXR1cm4gPG10ZCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L210ZD47XG4gICAgY2FzZSBcIm10ZXh0XCI6XG4gICAgICByZXR1cm4gPG10ZXh0IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXRleHQ+O1xuICAgIGNhc2UgXCJtc3BhY2VcIjpcbiAgICAgIHJldHVybiA8bXNwYWNlIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXNwYWNlPjtcbiAgICBjYXNlIFwiYW5ub3RhdGlvblwiOlxuICAgICAgcmV0dXJuIDxhbm5vdGF0aW9uIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvYW5ub3RhdGlvbj47XG4gICAgY2FzZSBcInN2Z1wiOlxuICAgICAgcmV0dXJuIDxzdmcgey4uLnByb3BzfT57Y2hpbGRyZW59PC9zdmc+O1xuICAgIGNhc2UgXCJwYXRoXCI6XG4gICAgICByZXR1cm4gPHBhdGggey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwibGluZVwiOlxuICAgICAgcmV0dXJuIDxsaW5lIHsuLi5wcm9wc30gLz47XG4gICAgY2FzZSBcInJlY3RcIjpcbiAgICAgIHJldHVybiA8cmVjdCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJjaXJjbGVcIjpcbiAgICAgIHJldHVybiA8Y2lyY2xlIHsuLi5wcm9wc30gLz47XG4gICAgY2FzZSBcImdcIjpcbiAgICAgIHJldHVybiA8ZyB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2c+O1xuICAgIGNhc2UgXCJkZWZzXCI6XG4gICAgICByZXR1cm4gPGRlZnMgey4uLnByb3BzfT57Y2hpbGRyZW59PC9kZWZzPjtcbiAgICBjYXNlIFwiY2xpcFBhdGhcIjpcbiAgICAgIHJldHVybiA8Y2xpcFBhdGggey4uLnByb3BzfT57Y2hpbGRyZW59PC9jbGlwUGF0aD47XG4gICAgY2FzZSBcInVzZVwiOlxuICAgICAgcmV0dXJuIDx1c2Ugey4uLnByb3BzfSAvPjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDxkaXYgey4uLnByb3BzfT57Y2hpbGRyZW59PC9kaXY+O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5vZGUoXG4gIG5vZGU6IFJvb3RDb250ZW50LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXBcbik6IEpTWC5FbGVtZW50IHwgc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChub2RlLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgcmV0dXJuIChub2RlIGFzIFRleHQpLnZhbHVlO1xuICB9XG5cbiAgaWYgKG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBFbGVtZW50O1xuICAgIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWU7XG4gICAgY29uc3QgcmF3UHJvcHMgPSBjb252ZXJ0UHJvcGVydGllcyhlbGVtZW50LnByb3BlcnRpZXMpO1xuICAgIGNvbnN0IEN1c3RvbUNvbXBvbmVudCA9IGNvbXBvbmVudHNbdGFnTmFtZV07XG5cbiAgICBjb25zdCBjaGlsZEVsZW1lbnRzID1cbiAgICAgIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMFxuICAgICAgICA/IGVsZW1lbnQuY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gcmVuZGVyTm9kZShjaGlsZCwgY29tcG9uZW50cykpXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmIChDdXN0b21Db21wb25lbnQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjdXN0b20gYmxvY2sgY29tcG9uZW50IChoYXMgcGF5bG9hZCBhbmQgcmF3IHByb3BzKVxuICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5wYXlsb2FkID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiByYXdQcm9wcy5yYXcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gRGVzZXJpYWxpemUgcGF5bG9hZCBmcm9tIEpTT04gc3RyaW5nXG4gICAgICAgIGNvbnN0IGN1c3RvbUJsb2NrUHJvcHM6IEN1c3RvbUJsb2NrUHJvcHMgPSB7XG4gICAgICAgICAgcGF5bG9hZDogSlNPTi5wYXJzZShyYXdQcm9wcy5wYXlsb2FkIGFzIHN0cmluZyksXG4gICAgICAgICAgcmF3OiByYXdQcm9wcy5yYXcgYXMgc3RyaW5nLFxuICAgICAgICB9O1xuICAgICAgICAvLyBBZGQgZGF0YSBpZiBwcmVzZW50IChmb3IgY29tcG9uZW50TmFtZXwgc3ludGF4KVxuICAgICAgICBpZiAodHlwZW9mIHJhd1Byb3BzLmRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjdXN0b21CbG9ja1Byb3BzLmRhdGEgPSBKU09OLnBhcnNlKHJhd1Byb3BzLmRhdGEgYXMgc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBDb21wID0gQ3VzdG9tQ29tcG9uZW50IGFzIENvbXBvbmVudDxDdXN0b21CbG9ja1Byb3BzPjtcbiAgICAgICAgcmV0dXJuIDxDb21wIHsuLi5jdXN0b21CbG9ja1Byb3BzfT57Y2hpbGRFbGVtZW50c308L0NvbXA+O1xuICAgICAgfVxuICAgICAgY29uc3QgQ29tcCA9IEN1c3RvbUNvbXBvbmVudCBhcyBDb21wb25lbnQ8U3RhbmRhcmRDb21wb25lbnRQcm9wcz47XG4gICAgICByZXR1cm4gPENvbXAgey4uLnJhd1Byb3BzfT57Y2hpbGRFbGVtZW50c308L0NvbXA+O1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJFbGVtZW50KHRhZ05hbWUsIHJhd1Byb3BzLCBjaGlsZEVsZW1lbnRzIGFzIEpTWC5FbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzdFRvU29saWRKc3goXG4gIGhhc3RUcmVlOiBSb290LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXAgPSB7fVxuKTogSlNYLkVsZW1lbnQge1xuICBjb25zdCBlbGVtZW50cyA9IGhhc3RUcmVlLmNoaWxkcmVuLm1hcCgobm9kZSkgPT4gcmVuZGVyTm9kZShub2RlLCBjb21wb25lbnRzKSk7XG4gIHJldHVybiA8PntlbGVtZW50c308Lz47XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNvbXBvbmVudCBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIEhBU1QgdHJlZSB3aGVuIGNhbGxlZC5cbiAqIFRoaXMgZGVmZXJzIEpTWCBlbGVtZW50IGNyZWF0aW9uIHVudGlsIHJlbmRlciB0aW1lLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAqIGZvciBTU1IgaHlkcmF0aW9uIHRvIHdvcmsgY29ycmVjdGx5LlxuICpcbiAqIFdlIHNlcmlhbGl6ZSB0aGUgSEFTVCB0cmVlIGFuZCBjb21wb25lbnRzIGluZm8gc28gdGhhdCB0aGUgZXhhY3Qgc2FtZVxuICogcmVuZGVyaW5nIGxvZ2ljIHJ1bnMgb24gYm90aCBzZXJ2ZXIgYW5kIGNsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc3RUb1NvbGlkQ29tcG9uZW50KFxuICBoYXN0VHJlZTogUm9vdCxcbiAgY29tcG9uZW50czogQ29tcG9uZW50TWFwID0ge31cbik6ICgpID0+IEpTWC5FbGVtZW50IHtcbiAgLy8gU3RvcmUgdGhlIHRyZWUgZGF0YSwgbm90IHByZS1yZW5kZXJlZCBlbGVtZW50c1xuICBjb25zdCB0cmVlRGF0YSA9IGhhc3RUcmVlO1xuICBjb25zdCBjb21wb25lbnRNYXAgPSBjb21wb25lbnRzO1xuXG4gIHJldHVybiBmdW5jdGlvbiBIYXN0Qm9keSgpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRyZWVEYXRhLmNoaWxkcmVuLm1hcCgobm9kZSkgPT4gcmVuZGVyTm9kZShub2RlLCBjb21wb25lbnRNYXApKTtcbiAgICByZXR1cm4gPD57ZWxlbWVudHN9PC8+O1xuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgUm9vdCwgQ29kZSwgUGFyZW50LCBSb290Q29udGVudCB9IGZyb20gXCJtZGFzdFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzb3IgfSBmcm9tIFwidW5pZmllZFwiO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tIFwidW5pc3QtdXRpbC12aXNpdFwiO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYW1sIH0gZnJvbSBcInlhbWxcIjtcblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCByZWNlaXZlcyBjdXN0b20gYmxvY2sgcHJvcHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21CbG9ja0NvbXBvbmVudFByb3BzIHtcbiAgLyoqIFRoZSBwYXRoIHNlZ21lbnRzIGFmdGVyIHRoZSBjb21wb25lbnQgbmFtZSwgZS5nLiBbJ3N1YnN0cnVjdHVyZScsICdzdWJzdWInXSAqL1xuICBwYXlsb2FkOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSByYXcgY29udGVudCBvZiB0aGUgY29kZSBibG9jayBhcyBwbGFpbiB0ZXh0ICovXG4gIHJhdzogc3RyaW5nO1xuICAvKiogUGFyc2VkIFlBTUwgZGF0YSB3aGVuIHVzaW5nIGNvbXBvbmVudE5hbWV8IHN5bnRheCAqL1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBUaGUgbWFya2Rvd24tcmVuZGVyZWQgY29udGVudCBhcyBjaGlsZHJlbiAqL1xuICBjaGlsZHJlbj86IHVua25vd247XG59XG5cbi8qKlxuICogU2V0IG9mIGNvbXBvbmVudCBuYW1lcyB0aGF0IGFyZSBhdmFpbGFibGVcbiAqL1xuZXhwb3J0IHR5cGUgQ3VzdG9tQmxvY2tDb21wb25lbnRzID0gU2V0PHN0cmluZz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtYXJrQ3VzdG9tQmxvY2tzT3B0aW9ucyB7XG4gIC8qKiBTZXQgb2YgY29tcG9uZW50IG5hbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSAqL1xuICBjb21wb25lbnRzOiBDdXN0b21CbG9ja0NvbXBvbmVudHM7XG4gIC8qKiBUaGUgcHJvY2Vzc29yIHRvIHVzZSBmb3IgcGFyc2luZyBuZXN0ZWQgbWFya2Rvd24gKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvY2Vzc29yOiBQcm9jZXNzb3I8YW55LCBhbnksIGFueSwgYW55LCBhbnk+O1xufVxuXG5cbi8qKlxuICogQSByZW1hcmsgcGx1Z2luIHRoYXQgdHJhbnNmb3JtcyBjb2RlIGJsb2NrcyB3aXRoIGBuYW1lL3BhdGgvc2VnbWVudHNgIHN5bnRheFxuICogaW50byBjdXN0b20gYmxvY2sgbm9kZXMgdGhhdCByZW5kZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudC5cbiAqXG4gKiBDb2RlIGJsb2NrcyBsaWtlOlxuICogYGBgY29tcG9uZW50TmFtZS9zdWIvcGF0aFxuICogY29udGVudCBoZXJlXG4gKiBgYGBcbiAqXG4gKiBXaWxsIGJlIHRyYW5zZm9ybWVkIHRvIHVzZSB0aGUgY29tcG9uZW50IGlmIGl0IGV4aXN0cyBpbiB0aGUgY29tcG9uZW50cyBzZXQsXG4gKiBvdGhlcndpc2UgdGhleSByZW1haW4gYXMgcmVndWxhciBjb2RlIGJsb2Nrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFya0N1c3RvbUJsb2NrcyhvcHRpb25zOiBSZW1hcmtDdXN0b21CbG9ja3NPcHRpb25zKSB7XG4gIGNvbnN0IHsgY29tcG9uZW50cywgcHJvY2Vzc29yIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiAodHJlZTogUm9vdCkgPT4ge1xuICAgIHZpc2l0KHRyZWUsIFwiY29kZVwiLCAobm9kZTogQ29kZSwgaW5kZXgsIHBhcmVudDogUGFyZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAoIXBhcmVudCB8fCBpbmRleCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGxhbmcgPSBub2RlLmxhbmc7XG4gICAgICBpZiAoIWxhbmcpIHJldHVybjtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGRhdGEgYmxvY2sgKGxhbmcgZW5kcyB3aXRoIHwpXG4gICAgICBjb25zdCBpc0RhdGFCbG9jayA9IGxhbmcuZW5kc1dpdGgoXCJ8XCIpO1xuICAgICAgY29uc3QgY2xlYW5MYW5nID0gaXNEYXRhQmxvY2sgPyBsYW5nLnNsaWNlKDAsIC0xKSA6IGxhbmc7XG5cbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gY2xlYW5MYW5nLnNwbGl0KFwiL1wiKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBzZWdtZW50c1swXTtcbiAgICAgIGNvbnN0IHJhdyA9IG5vZGUudmFsdWU7XG5cbiAgICAgIC8vIElmIHRoZSBjb21wb25lbnQgZG9lc24ndCBleGlzdCwgbGVhdmUgaXQgYXMgYSByZWd1bGFyIGNvZGUgYmxvY2tcbiAgICAgIGlmICghY29tcG9uZW50cy5oYXMoY29tcG9uZW50TmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHNlZ21lbnRzLnNsaWNlKDEpO1xuXG4gICAgICAvLyBGb3IgZGF0YSBibG9ja3MsIHBhcnNlIFlBTUwgaW5zdGVhZCBvZiBtYXJrZG93blxuICAgICAgaWYgKGlzRGF0YUJsb2NrKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBwYXJzZVlhbWwocmF3KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgICBjb25zdCBjdXN0b21Ob2RlID0ge1xuICAgICAgICAgIHR5cGU6IFwiY3VzdG9tQmxvY2tcIixcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBoTmFtZTogY29tcG9uZW50TmFtZSxcbiAgICAgICAgICAgIGhQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgIHBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgICAgICAgICByYXcsXG4gICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICBwYXJlbnQuY2hpbGRyZW5baW5kZXhdID0gY3VzdG9tTm9kZSBhcyB1bmtub3duIGFzIFJvb3RDb250ZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBjb250ZW50IGFzIG1hcmtkb3duIHRvIGdldCBpdHMgQVNUXG4gICAgICBjb25zdCBjb250ZW50TWRhc3QgPSBwcm9jZXNzb3IucGFyc2UocmF3KSBhcyBSb290O1xuXG4gICAgICAvLyBDcmVhdGUgYSBjdXN0b20gZWxlbWVudCB0aGF0IHdpbGwgYmUgY29udmVydGVkIHRvIGhhc3RcbiAgICAgIC8vIFdlIHVzZSBhIGN1c3RvbSBub2RlIHR5cGUgdGhhdCByZW1hcmstcmVoeXBlIHdpbGwgaGFuZGxlXG4gICAgICBjb25zdCBjdXN0b21Ob2RlID0ge1xuICAgICAgICB0eXBlOiBcImN1c3RvbUJsb2NrXCIsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBoTmFtZTogY29tcG9uZW50TmFtZSxcbiAgICAgICAgICBoUHJvcGVydGllczoge1xuICAgICAgICAgICAgcGF5bG9hZDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICAgICAgICByYXcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgY2hpbGRyZW46IGNvbnRlbnRNZGFzdC5jaGlsZHJlbixcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlcGxhY2UgdGhlIGNvZGUgbm9kZSB3aXRoIG91ciBjdXN0b20gYmxvY2tcbiAgICAgIHBhcmVudC5jaGlsZHJlbltpbmRleF0gPSBjdXN0b21Ob2RlIGFzIHVua25vd24gYXMgUm9vdENvbnRlbnQ7XG4gICAgfSk7XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUyxlQUErQjtBQUN4QyxPQUFPLGlCQUFpQjtBQUN4QixPQUFPLGVBQWU7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LEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQTtBQUFBLElBRVYsS0FBSztBQUNILGFBQU8sQ0FBQyxVQUFVLE9BQU87QUFBQSxJQUMzQixLQUFLO0FBQ0gsYUFBTyxDQUFDLFlBQVksUUFBUSxTQUFTLEVBQTdCO0FBQUE7QUFBQSxJQUVWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsY0FBYyxRQUFRLFNBQVMsRUFBL0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBeEI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxRQUFRLFNBQVMsRUFBM0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsWUFBWSxRQUFRLFNBQVMsRUFBN0I7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxRQUFRLFNB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eEIsVUFBTSxFQUFFLE9BQU8sTUFBTSxTQUFTLElBQUk7QUFBQSxNQUNoQyxNQUFNLEtBQUs7QUFBQSxNQUNYO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFFQSxVQUFNLFFBQVEsVUFBVSxNQUFNLFFBQVE7QUFDdEMsVUFBTSxXQUFXLFVBQVUsUUFBUSxLQUFLO0FBQ3hDLFVBQU0sT0FBTyxxQkFBcUIsVUFBVSxVQUFVO0FBRXRELFVBQU0sU0FBUyxJQUFJO0FBQUEsTUFDakIsSUFBSTtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsTUFDQSxNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsSUFDWDtBQUVBLFdBQU87QUFBQSxNQUNMLE9BQU87QUFBQSxNQUNQO0FBQUEsTUFDQSxPQUFPO0FBQUEsTUFDUDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsV0FBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUN2QyxVQUFNLFVBQVUsUUFBUSxDQUFDO0FBQ3pCLFVBQU0sWUFBWSxRQUFRLElBQUksQ0FBQztBQUMvQixVQUFNLFlBQVksUUFBUSxJQUFJLENBQUM7QUFFL0IsVUFBTSxhQUFhLFFBQVEsUUFBUSxNQUFNLFFBQVEsRUFBRSxHQUFHO0FBQ3RELFVBQU0sV0FBVyxZQUFZLFVBQVUsUUFBUSxNQUFNO0FBRXJELFVBQU0sYUFBYSxNQUFNLE1BQU0sWUFBWSxRQUFRLEVBQUUsS0FBSztBQUMxRCxVQUFNLEVBQUUsT0FBTyxNQUFNLFNBQVMsSUFBSTtBQUFBLE1BQ2hDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBRUEsVUFBTSxRQUFRLFVBQVUsTUFBTSxRQUFRO0FBQ3RDLFVBQU0sV0FBVyxVQUFVLFFBQVEsS0FBSztBQUN4QyxVQUFNLE9BQU8scUJBQXFCLFVBQVUsVUFBVTtBQUV0RCxVQUFNLFFBQVEsRUFBRSxJQUFJO0FBQUEsTUFDbEIsSUFBSSxRQUFRO0FBQUEsTUFDWjtBQUFBLE1BQ0E7QUFBQSxNQUNBLE1BQU0sWUFBWSxVQUFVLEtBQUs7QUFBQSxNQUNqQyxNQUFNLFlBQVksVUFBVSxLQUFLO0FBQUEsTUFDakMsU0FBUyxJQUFJO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQUEsSUFDTCxPQUFPLFFBQVEsU0FBUyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEtBQUs7QUFBQSxJQUM1QztBQUFBLElBQ0EsT0FBTyxRQUFRO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsicGFyc2VZYW1sIiwgIkNvbXAiLCAiY3VzdG9tTm9kZSIsICJwYXJzZVlhbWwiLCAiY29udGVudCJdCn0K
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2hhc3QtdG8tc29saWQudHN4IiwgIi4uL3NyYy9pbmRleC50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEpTWCwgQ29tcG9uZW50LCBjaGlsZHJlbiBhcyByZXNvbHZlQ2hpbGRyZW4gfSBmcm9tIFwic29saWQtanNcIjtcbmltcG9ydCB0eXBlIHsgUm9vdCwgRWxlbWVudCwgVGV4dCwgUm9vdENvbnRlbnQgfSBmcm9tIFwiaGFzdFwiO1xuXG4vKipcbiAqIFByb3BzIGZvciBjdXN0b20gYmxvY2sgY29tcG9uZW50cyAoY29kZSBibG9ja3Mgd2l0aCBuYW1lL3N1Yi9wYXRoIHN5bnRheClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21CbG9ja1Byb3BzIHtcbiAgLyoqIFRoZSBwYXRoIHNlZ21lbnRzIGFmdGVyIHRoZSBjb21wb25lbnQgbmFtZSwgZS5nLiBbJ3N1YnN0cnVjdHVyZScsICdzdWJzdWInXSAqL1xuICBwYXlsb2FkOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSByYXcgY29udGVudCBvZiB0aGUgY29kZSBibG9jayBhcyBwbGFpbiB0ZXh0ICovXG4gIHJhdzogc3RyaW5nO1xuICAvKiogUGFyc2VkIFlBTUwgZGF0YSB3aGVuIHVzaW5nIGNvbXBvbmVudE5hbWV8IHN5bnRheCAqL1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICAvKiogVGhlIG1hcmtkb3duLXJlbmRlcmVkIGNvbnRlbnQgYXMgY2hpbGRyZW4gKi9cbiAgY2hpbGRyZW4/OiBKU1guRWxlbWVudDtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBjb21wb25lbnQgcHJvcHMgZm9yIHJlZ3VsYXIgSFRNTCBlbGVtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkQ29tcG9uZW50UHJvcHMge1xuICBjaGlsZHJlbj86IEpTWC5FbGVtZW50O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgdHlwZSBDb21wb25lbnRNYXAgPSB7XG4gIFt0YWdOYW1lOiBzdHJpbmddOiBDb21wb25lbnQ8Q3VzdG9tQmxvY2tQcm9wcz4gfCBDb21wb25lbnQ8U3RhbmRhcmRDb21wb25lbnRQcm9wcz47XG59O1xuXG5mdW5jdGlvbiBjb252ZXJ0UHJvcGVydGllcyhcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCFwcm9wZXJ0aWVzKSByZXR1cm4ge307XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpKSB7XG4gICAgaWYgKGtleSA9PT0gXCJjbGFzc05hbWVcIikge1xuICAgICAgcmVzdWx0LmNsYXNzID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgcmVzdWx0LmNsYXNzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKFwiIFwiKSA6IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckVsZW1lbnQoXG4gIHRhZ05hbWU6IHN0cmluZyxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjaGlsZHJlbjogSlNYLkVsZW1lbnRcbik6IEpTWC5FbGVtZW50IHtcbiAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgY2FzZSBcInBcIjpcbiAgICAgIHJldHVybiA8cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3A+O1xuICAgIGNhc2UgXCJoMVwiOlxuICAgICAgcmV0dXJuIDxoMSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2gxPjtcbiAgICBjYXNlIFwiaDJcIjpcbiAgICAgIHJldHVybiA8aDIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9oMj47XG4gICAgY2FzZSBcImgzXCI6XG4gICAgICByZXR1cm4gPGgzIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvaDM+O1xuICAgIGNhc2UgXCJoNFwiOlxuICAgICAgcmV0dXJuIDxoNCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2g0PjtcbiAgICBjYXNlIFwiaDVcIjpcbiAgICAgIHJldHVybiA8aDUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9oNT47XG4gICAgY2FzZSBcImg2XCI6XG4gICAgICByZXR1cm4gPGg2IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvaDY+O1xuICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgIHJldHVybiA8ZGl2IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZGl2PjtcbiAgICBjYXNlIFwic3BhblwiOlxuICAgICAgcmV0dXJuIDxzcGFuIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc3Bhbj47XG4gICAgY2FzZSBcImFcIjpcbiAgICAgIHJldHVybiA8YSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2E+O1xuICAgIGNhc2UgXCJzdHJvbmdcIjpcbiAgICAgIHJldHVybiA8c3Ryb25nIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc3Ryb25nPjtcbiAgICBjYXNlIFwiYlwiOlxuICAgICAgcmV0dXJuIDxiIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvYj47XG4gICAgY2FzZSBcImVtXCI6XG4gICAgICByZXR1cm4gPGVtIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZW0+O1xuICAgIGNhc2UgXCJpXCI6XG4gICAgICByZXR1cm4gPGkgey4uLnByb3BzfT57Y2hpbGRyZW59PC9pPjtcbiAgICBjYXNlIFwiY29kZVwiOlxuICAgICAgcmV0dXJuIDxjb2RlIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvY29kZT47XG4gICAgY2FzZSBcInByZVwiOlxuICAgICAgcmV0dXJuIDxwcmUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9wcmU+O1xuICAgIGNhc2UgXCJibG9ja3F1b3RlXCI6XG4gICAgICByZXR1cm4gPGJsb2NrcXVvdGUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9ibG9ja3F1b3RlPjtcbiAgICBjYXNlIFwidWxcIjpcbiAgICAgIHJldHVybiA8dWwgey4uLnByb3BzfT57Y2hpbGRyZW59PC91bD47XG4gICAgY2FzZSBcIm9sXCI6XG4gICAgICByZXR1cm4gPG9sIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvb2w+O1xuICAgIGNhc2UgXCJsaVwiOlxuICAgICAgcmV0dXJuIDxsaSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2xpPjtcbiAgICBjYXNlIFwiaHJcIjpcbiAgICAgIHJldHVybiA8aHIgey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwiYnJcIjpcbiAgICAgIHJldHVybiA8YnIgey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwiaW1nXCI6XG4gICAgICByZXR1cm4gPGltZyB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJ0YWJsZVwiOlxuICAgICAgcmV0dXJuIDx0YWJsZSB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3RhYmxlPjtcbiAgICBjYXNlIFwidGhlYWRcIjpcbiAgICAgIHJldHVybiA8dGhlYWQgey4uLnByb3BzfT57Y2hpbGRyZW59PC90aGVhZD47XG4gICAgY2FzZSBcInRib2R5XCI6XG4gICAgICByZXR1cm4gPHRib2R5IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvdGJvZHk+O1xuICAgIGNhc2UgXCJ0clwiOlxuICAgICAgcmV0dXJuIDx0ciB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3RyPjtcbiAgICBjYXNlIFwidGhcIjpcbiAgICAgIHJldHVybiA8dGggey4uLnByb3BzfT57Y2hpbGRyZW59PC90aD47XG4gICAgY2FzZSBcInRkXCI6XG4gICAgICByZXR1cm4gPHRkIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvdGQ+O1xuICAgIGNhc2UgXCJkZWxcIjpcbiAgICAgIHJldHVybiA8ZGVsIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvZGVsPjtcbiAgICBjYXNlIFwic3VwXCI6XG4gICAgICByZXR1cm4gPHN1cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L3N1cD47XG4gICAgY2FzZSBcInN1YlwiOlxuICAgICAgcmV0dXJuIDxzdWIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9zdWI+O1xuICAgIC8vIEdGTSBlbGVtZW50c1xuICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgcmV0dXJuIDxpbnB1dCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJzZWN0aW9uXCI6XG4gICAgICByZXR1cm4gPHNlY3Rpb24gey4uLnByb3BzfT57Y2hpbGRyZW59PC9zZWN0aW9uPjtcbiAgICAvLyBLYVRlWCBtYXRoIGVsZW1lbnRzXG4gICAgY2FzZSBcIm1hdGhcIjpcbiAgICAgIHJldHVybiA8bWF0aCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21hdGg+O1xuICAgIGNhc2UgXCJzZW1hbnRpY3NcIjpcbiAgICAgIHJldHVybiA8c2VtYW50aWNzIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvc2VtYW50aWNzPjtcbiAgICBjYXNlIFwibXJvd1wiOlxuICAgICAgcmV0dXJuIDxtcm93IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXJvdz47XG4gICAgY2FzZSBcIm1pXCI6XG4gICAgICByZXR1cm4gPG1pIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbWk+O1xuICAgIGNhc2UgXCJtb1wiOlxuICAgICAgcmV0dXJuIDxtbyB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21vPjtcbiAgICBjYXNlIFwibW5cIjpcbiAgICAgIHJldHVybiA8bW4gey4uLnByb3BzfT57Y2hpbGRyZW59PC9tbj47XG4gICAgY2FzZSBcIm1mcmFjXCI6XG4gICAgICByZXR1cm4gPG1mcmFjIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbWZyYWM+O1xuICAgIGNhc2UgXCJtc3VwXCI6XG4gICAgICByZXR1cm4gPG1zdXAgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tc3VwPjtcbiAgICBjYXNlIFwibXN1YlwiOlxuICAgICAgcmV0dXJuIDxtc3ViIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXN1Yj47XG4gICAgY2FzZSBcIm1zdWJzdXBcIjpcbiAgICAgIHJldHVybiA8bXN1YnN1cCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21zdWJzdXA+O1xuICAgIGNhc2UgXCJtc3FydFwiOlxuICAgICAgcmV0dXJuIDxtc3FydCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21zcXJ0PjtcbiAgICBjYXNlIFwibXJvb3RcIjpcbiAgICAgIHJldHVybiA8bXJvb3Qgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tcm9vdD47XG4gICAgY2FzZSBcIm11bmRlclwiOlxuICAgICAgcmV0dXJuIDxtdW5kZXIgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tdW5kZXI+O1xuICAgIGNhc2UgXCJtb3ZlclwiOlxuICAgICAgcmV0dXJuIDxtb3ZlciB7Li4ucHJvcHN9PntjaGlsZHJlbn08L21vdmVyPjtcbiAgICBjYXNlIFwibXVuZGVyb3ZlclwiOlxuICAgICAgcmV0dXJuIDxtdW5kZXJvdmVyIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXVuZGVyb3Zlcj47XG4gICAgY2FzZSBcIm10YWJsZVwiOlxuICAgICAgcmV0dXJuIDxtdGFibGUgey4uLnByb3BzfT57Y2hpbGRyZW59PC9tdGFibGU+O1xuICAgIGNhc2UgXCJtdHJcIjpcbiAgICAgIHJldHVybiA8bXRyIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXRyPjtcbiAgICBjYXNlIFwibXRkXCI6XG4gICAgICByZXR1cm4gPG10ZCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L210ZD47XG4gICAgY2FzZSBcIm10ZXh0XCI6XG4gICAgICByZXR1cm4gPG10ZXh0IHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXRleHQ+O1xuICAgIGNhc2UgXCJtc3BhY2VcIjpcbiAgICAgIHJldHVybiA8bXNwYWNlIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvbXNwYWNlPjtcbiAgICBjYXNlIFwiYW5ub3RhdGlvblwiOlxuICAgICAgcmV0dXJuIDxhbm5vdGF0aW9uIHsuLi5wcm9wc30+e2NoaWxkcmVufTwvYW5ub3RhdGlvbj47XG4gICAgY2FzZSBcInN2Z1wiOlxuICAgICAgcmV0dXJuIDxzdmcgey4uLnByb3BzfT57Y2hpbGRyZW59PC9zdmc+O1xuICAgIGNhc2UgXCJwYXRoXCI6XG4gICAgICByZXR1cm4gPHBhdGggey4uLnByb3BzfSAvPjtcbiAgICBjYXNlIFwibGluZVwiOlxuICAgICAgcmV0dXJuIDxsaW5lIHsuLi5wcm9wc30gLz47XG4gICAgY2FzZSBcInJlY3RcIjpcbiAgICAgIHJldHVybiA8cmVjdCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgXCJjaXJjbGVcIjpcbiAgICAgIHJldHVybiA8Y2lyY2xlIHsuLi5wcm9wc30gLz47XG4gICAgY2FzZSBcImdcIjpcbiAgICAgIHJldHVybiA8ZyB7Li4ucHJvcHN9PntjaGlsZHJlbn08L2c+O1xuICAgIGNhc2UgXCJkZWZzXCI6XG4gICAgICByZXR1cm4gPGRlZnMgey4uLnByb3BzfT57Y2hpbGRyZW59PC9kZWZzPjtcbiAgICBjYXNlIFwiY2xpcFBhdGhcIjpcbiAgICAgIHJldHVybiA8Y2xpcFBhdGggey4uLnByb3BzfT57Y2hpbGRyZW59PC9jbGlwUGF0aD47XG4gICAgY2FzZSBcInVzZVwiOlxuICAgICAgcmV0dXJuIDx1c2Ugey4uLnByb3BzfSAvPjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDxkaXYgey4uLnByb3BzfT57Y2hpbGRyZW59PC9kaXY+O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5vZGUoXG4gIG5vZGU6IFJvb3RDb250ZW50LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXBcbik6IEpTWC5FbGVtZW50IHwgc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChub2RlLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgcmV0dXJuIChub2RlIGFzIFRleHQpLnZhbHVlO1xuICB9XG5cbiAgaWYgKG5vZGUudHlwZSA9PT0gXCJlbGVtZW50XCIpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBFbGVtZW50O1xuICAgIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWU7XG4gICAgY29uc3QgcmF3UHJvcHMgPSBjb252ZXJ0UHJvcGVydGllcyhlbGVtZW50LnByb3BlcnRpZXMpO1xuICAgIGNvbnN0IEN1c3RvbUNvbXBvbmVudCA9IGNvbXBvbmVudHNbdGFnTmFtZV07XG5cbiAgICBjb25zdCBjaGlsZEVsZW1lbnRzID1cbiAgICAgIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMFxuICAgICAgICA/IGVsZW1lbnQuY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gcmVuZGVyTm9kZShjaGlsZCwgY29tcG9uZW50cykpXG4gICAgICAgIDogbnVsbDtcblxuICAgIGlmIChDdXN0b21Db21wb25lbnQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjdXN0b20gYmxvY2sgY29tcG9uZW50IChoYXMgcGF5bG9hZCBhbmQgcmF3IHByb3BzKVxuICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5wYXlsb2FkID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiByYXdQcm9wcy5yYXcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gRGVzZXJpYWxpemUgcGF5bG9hZCBmcm9tIEpTT04gc3RyaW5nXG4gICAgICAgIGNvbnN0IGN1c3RvbUJsb2NrUHJvcHM6IEN1c3RvbUJsb2NrUHJvcHMgPSB7XG4gICAgICAgICAgcGF5bG9hZDogSlNPTi5wYXJzZShyYXdQcm9wcy5wYXlsb2FkIGFzIHN0cmluZyksXG4gICAgICAgICAgcmF3OiByYXdQcm9wcy5yYXcgYXMgc3RyaW5nLFxuICAgICAgICB9O1xuICAgICAgICAvLyBBZGQgZGF0YSBpZiBwcmVzZW50IChmb3IgY29tcG9uZW50TmFtZXwgc3ludGF4KVxuICAgICAgICBpZiAodHlwZW9mIHJhd1Byb3BzLmRhdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjdXN0b21CbG9ja1Byb3BzLmRhdGEgPSBKU09OLnBhcnNlKHJhd1Byb3BzLmRhdGEgYXMgc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBDb21wID0gQ3VzdG9tQ29tcG9uZW50IGFzIENvbXBvbmVudDxDdXN0b21CbG9ja1Byb3BzPjtcbiAgICAgICAgcmV0dXJuIDxDb21wIHsuLi5jdXN0b21CbG9ja1Byb3BzfT57Y2hpbGRFbGVtZW50c308L0NvbXA+O1xuICAgICAgfVxuICAgICAgY29uc3QgQ29tcCA9IEN1c3RvbUNvbXBvbmVudCBhcyBDb21wb25lbnQ8U3RhbmRhcmRDb21wb25lbnRQcm9wcz47XG4gICAgICByZXR1cm4gPENvbXAgey4uLnJhd1Byb3BzfT57Y2hpbGRFbGVtZW50c308L0NvbXA+O1xuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJFbGVtZW50KHRhZ05hbWUsIHJhd1Byb3BzLCBjaGlsZEVsZW1lbnRzIGFzIEpTWC5FbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzdFRvU29saWRKc3goXG4gIGhhc3RUcmVlOiBSb290LFxuICBjb21wb25lbnRzOiBDb21wb25lbnRNYXAgPSB7fVxuKTogSlNYLkVsZW1lbnQge1xuICBjb25zdCBlbGVtZW50cyA9IGhhc3RUcmVlLmNoaWxkcmVuLm1hcCgobm9kZSkgPT4gcmVuZGVyTm9kZShub2RlLCBjb21wb25lbnRzKSk7XG4gIHJldHVybiA8PntlbGVtZW50c308Lz47XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNvbXBvbmVudCBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIEhBU1QgdHJlZSB3aGVuIGNhbGxlZC5cbiAqIFRoaXMgZGVmZXJzIEpTWCBlbGVtZW50IGNyZWF0aW9uIHVudGlsIHJlbmRlciB0aW1lLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAqIGZvciBTU1IgaHlkcmF0aW9uIHRvIHdvcmsgY29ycmVjdGx5LlxuICpcbiAqIFdlIHNlcmlhbGl6ZSB0aGUgSEFTVCB0cmVlIGFuZCBjb21wb25lbnRzIGluZm8gc28gdGhhdCB0aGUgZXhhY3Qgc2FtZVxuICogcmVuZGVyaW5nIGxvZ2ljIHJ1bnMgb24gYm90aCBzZXJ2ZXIgYW5kIGNsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc3RUb1NvbGlkQ29tcG9uZW50KFxuICBoYXN0VHJlZTogUm9vdCxcbiAgY29tcG9uZW50czogQ29tcG9uZW50TWFwID0ge31cbik6ICgpID0+IEpTWC5FbGVtZW50IHtcbiAgLy8gU3RvcmUgdGhlIHRyZWUgZGF0YSwgbm90IHByZS1yZW5kZXJlZCBlbGVtZW50c1xuICBjb25zdCB0cmVlRGF0YSA9IGhhc3RUcmVlO1xuICBjb25zdCBjb21wb25lbnRNYXAgPSBjb21wb25lbnRzO1xuXG4gIHJldHVybiBmdW5jdGlvbiBIYXN0Qm9keSgpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRyZWVEYXRhLmNoaWxkcmVuLm1hcCgobm9kZSkgPT4gcmVuZGVyTm9kZShub2RlLCBjb21wb25lbnRNYXApKTtcbiAgICByZXR1cm4gPD57ZWxlbWVudHN9PC8+O1xuICB9O1xufVxuIiwgImltcG9ydCB0eXBlIHsgSGFzdFBhcnNlUmVzdWx0LCBIYXN0Qm9keSwgSGFzdFN0ZXAgfSBmcm9tIFwiaGFzdC1tZHNcIjtcbmltcG9ydCB7IGhhc3RUb1NvbGlkQ29tcG9uZW50LCBDb21wb25lbnRNYXAgfSBmcm9tIFwiLi9oYXN0LXRvLXNvbGlkXCI7XG5pbXBvcnQgdHlwZSB7IFN0ZXAsIFBhcnNlUmVzdWx0LCBTdGVwTG9jYWxCYXNlLCBHbG9iYWxNZXRhQmFzZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIGhhc3QtdG8tc29saWRcbmV4cG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50TWFwLFxuICBDdXN0b21CbG9ja1Byb3BzLFxuICBTdGFuZGFyZENvbXBvbmVudFByb3BzLFxufSBmcm9tIFwiLi9oYXN0LXRvLXNvbGlkXCI7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBmcm9tIHR5cGVzLnRzXG5leHBvcnQgdHlwZSB7IFN0ZXAsIFBhcnNlUmVzdWx0LCBTdGVwTG9jYWxCYXNlLCBHbG9iYWxNZXRhQmFzZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIFJlLWV4cG9ydCBoYXN0LW1kcyB0eXBlcyBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHtcbiAgSGFzdFBhcnNlUmVzdWx0LFxuICBIYXN0U3RlcCxcbiAgSGFzdEJvZHksXG4gIEN1c3RvbUNvbXBvbmVudHMsXG59IGZyb20gXCJoYXN0LW1kc1wiO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIEhhc3RCb2R5XG4gKi9cbmZ1bmN0aW9uIGlzSGFzdEJvZHkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBIYXN0Qm9keSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICBcInR5cGVcIiBpbiB2YWx1ZSAmJlxuICAgICh2YWx1ZSBhcyBIYXN0Qm9keSkudHlwZSA9PT0gXCJoYXN0XCIgJiZcbiAgICBcIm5vZGVcIiBpbiB2YWx1ZVxuICApO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYW5zZm9ybSBtZXRhZGF0YSBvYmplY3RzLCBjb252ZXJ0aW5nIEhhc3RCb2R5IHRvIFNvbGlkIGNvbXBvbmVudHNcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtTWV0YWRhdGE8VD4oXG4gIG1ldGFkYXRhOiBUIHwgbnVsbCxcbiAgY29tcG9uZW50czogQ29tcG9uZW50TWFwLFxuKTogVCB8IG51bGwge1xuICBpZiAobWV0YWRhdGEgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKSkge1xuICAgIGlmIChpc0hhc3RCb2R5KHZhbHVlKSkge1xuICAgICAgLy8gQ29udmVydCBIYXN0Qm9keSB0byBTb2xpZCBjb21wb25lbnRcbiAgICAgIHJlc3VsdFtrZXldID0gaGFzdFRvU29saWRDb21wb25lbnQodmFsdWUubm9kZSwgY29tcG9uZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCBhcyBUO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIHBhcnNlZCBNRFMgZG9jdW1lbnQgKEhBU1QpIGludG8gU29saWQgY29tcG9uZW50cy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBvdXRwdXQgZnJvbSBgaGFzdC1tZHNgIHBhcnNlKCkgYW5kIGNvbnZlcnRzIGFsbFxuICogSEFTVCB0cmVlcyBpbnRvIHJlbmRlcmFibGUgU29saWQgY29tcG9uZW50cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgcGFyc2UgfSBmcm9tIFwiaGFzdC1tZHNcIjtcbiAqIGltcG9ydCB7IHRyYW5zZm9ybSB9IGZyb20gXCJzb2xpZC1tZHNcIjtcbiAqXG4gKiBjb25zdCBwYXJzZWQgPSBwYXJzZShtZHNTdHJpbmcsIG5ldyBTZXQoW1wicXVpelwiLCBcImNhcmRcIl0pKTtcbiAqIGNvbnN0IHJlc3VsdCA9IHRyYW5zZm9ybShwYXJzZWQsIHsgcXVpejogUXVpekNvbXBvbmVudCwgY2FyZDogQ2FyZENvbXBvbmVudCB9KTtcbiAqXG4gKiAvLyBVc2UgaW4gU29saWQgY29tcG9uZW50OlxuICogPGRpdj57cmVzdWx0LnN0ZXBzLmludHJvLkJvZHkoKX08L2Rpdj5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwYXJzZWQgLSBUaGUgcmVzdWx0IGZyb20gaGFzdC1tZHMgcGFyc2UoKSBmdW5jdGlvblxuICogQHBhcmFtIGNvbXBvbmVudHMgLSBPcHRpb25hbCBtYXAgb2YgY3VzdG9tIFNvbGlkIGNvbXBvbmVudHNcbiAqIEByZXR1cm5zIFBhcnNlUmVzdWx0IHdpdGggU29saWQgY29tcG9uZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtPFRHbG9iYWwgPSBHbG9iYWxNZXRhQmFzZSwgVExvY2FsID0gU3RlcExvY2FsQmFzZT4oXG4gIHBhcnNlZDogSGFzdFBhcnNlUmVzdWx0PFRHbG9iYWwsIFRMb2NhbD4sXG4gIGNvbXBvbmVudHM6IENvbXBvbmVudE1hcCA9IHt9LFxuKTogUGFyc2VSZXN1bHQ8VEdsb2JhbCwgVExvY2FsPiB7XG4gIGNvbnN0IHN0ZXBzOiBSZWNvcmQ8c3RyaW5nLCBTdGVwPFRMb2NhbD4+ID0ge307XG5cbiAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyhwYXJzZWQuc3RlcHMpKSB7XG4gICAgY29uc3QgaGFzdFN0ZXA6IEhhc3RTdGVwPFRMb2NhbD4gPSBwYXJzZWQuc3RlcHNbaWRdO1xuICAgIGNvbnN0IEJvZHkgPSBoYXN0VG9Tb2xpZENvbXBvbmVudChoYXN0U3RlcC5ib2R5Lm5vZGUsIGNvbXBvbmVudHMpO1xuICAgIGNvbnN0IHRyYW5zZm9ybWVkTG9jYWwgPSB0cmFuc2Zvcm1NZXRhZGF0YShoYXN0U3RlcC5sb2NhbCwgY29tcG9uZW50cyk7XG5cbiAgICBzdGVwc1tpZF0gPSB7XG4gICAgICBpZDogaGFzdFN0ZXAuaWQsXG4gICAgICBsb2NhbDogdHJhbnNmb3JtZWRMb2NhbCBhcyBUTG9jYWwsXG4gICAgICBCb2R5LFxuICAgICAgcHJldjogaGFzdFN0ZXAucHJldixcbiAgICAgIG5leHQ6IGhhc3RTdGVwLm5leHQsXG4gICAgICBjdXJyZW50OiBoYXN0U3RlcC5jdXJyZW50LFxuICAgIH07XG4gIH1cblxuICBjb25zdCB0cmFuc2Zvcm1lZEdsb2JhbCA9IHRyYW5zZm9ybU1ldGFkYXRhKHBhcnNlZC5nbG9iYWwsIGNvbXBvbmVudHMpO1xuXG4gIHJldHVybiB7XG4gICAgZmlyc3Q6IHBhcnNlZC5maXJzdCxcbiAgICBzdGVwcyxcbiAgICBjb3VudDogcGFyc2VkLmNvdW50LFxuICAgIGdsb2JhbDogdHJhbnNmb3JtZWRHbG9iYWwgYXMgVEdsb2JhbCB8IG51bGwsXG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBNkJBLFNBQVMsa0JBQ1AsWUFDeUI7QUFDekIsTUFBSSxDQUFDLFdBQVksUUFBTyxDQUFDO0FBRXpCLFFBQU0sU0FBa0MsQ0FBQztBQUV6QyxhQUFXLENBQUMsS0FBSyxLQUFLLEtBQUssT0FBTyxRQUFRLFVBQVUsR0FBRztBQUNyRCxRQUFJLFFBQVEsYUFBYTtBQUN2QixhQUFPLFFBQVE7QUFBQSxJQUNqQixXQUFXLFFBQVEsU0FBUztBQUMxQixhQUFPLFFBQVEsTUFBTSxRQUFRLEtBQUssSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJO0FBQUEsSUFDMUQsT0FBTztBQUNMLGFBQU8sR0FBRyxJQUFJO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBRUEsU0FBUyxjQUNQLFNBQ0EsT0FDQSxVQUNhO0FBQ2IsVUFBUSxTQUFTO0FBQUEsSUFDZixLQUFLO0FBQ0gsYUFBTyxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQXZCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQXZCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFdBQVcsUUFBUSxTQUFTLEVBQTVCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQXZCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQXZCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLGVBQWUsUUFBUSxTQUFTLEVBQWhDO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sT0FBTztBQUFBLElBQ3hCLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxPQUFPO0FBQUEsSUFDeEIsS0FBSztBQUNILGFBQU8sQ0FBQyxRQUFRLE9BQU87QUFBQSxJQUN6QixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUE7QUFBQSxJQUVWLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxPQUFPO0FBQUEsSUFDM0IsS0FBSztBQUNILGFBQU8sQ0FBQyxZQUFZLFFBQVEsU0FBUyxFQUE3QjtBQUFBO0FBQUEsSUFFVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLGNBQWMsUUFBUSxTQUFTLEVBQS9CO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFlBQVksUUFBUSxTQUFTLEVBQTdCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFdBQVcsUUFBUSxTQUFTLEVBQTVCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLGVBQWUsUUFBUSxTQUFTLEVBQWhDO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFdBQVcsUUFBUSxTQUFTLEVBQTVCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFdBQVcsUUFBUSxTQUFTLEVBQTVCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLGVBQWUsUUFBUSxTQUFTLEVBQWhDO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsT0FBTztBQUFBLElBQzFCLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxPQUFPO0FBQUEsSUFDMUIsS0FBSztBQUNILGFBQU8sQ0FBQyxTQUFTLE9BQU87QUFBQSxJQUMxQixLQUFLO0FBQ0gsYUFBTyxDQUFDLFdBQVcsT0FBTztBQUFBLElBQzVCLEtBQUs7QUFDSCxhQUFPLENBQUMsTUFBTSxRQUFRLFNBQVMsRUFBdkI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxR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
|
package/package.json
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "solid-mds",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "A SolidJS library for
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "A SolidJS library for transforming MDS (Markdown Steps) HAST to Solid components",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Matthias Reis",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"solid",
|
|
9
9
|
"solidjs",
|
|
10
10
|
"markdown",
|
|
11
|
-
"
|
|
11
|
+
"hast",
|
|
12
12
|
"slides",
|
|
13
|
-
"presentation"
|
|
14
|
-
"remark",
|
|
15
|
-
"rehype"
|
|
13
|
+
"presentation"
|
|
16
14
|
],
|
|
17
15
|
"type": "module",
|
|
18
16
|
"main": "./dist/index.jsx",
|
|
@@ -37,21 +35,10 @@
|
|
|
37
35
|
"prepublishOnly": "pnpm run build",
|
|
38
36
|
"release": "bash ../../scripts/release.sh"
|
|
39
37
|
},
|
|
40
|
-
"dependencies": {
|
|
41
|
-
"yaml": "^2.7.0",
|
|
42
|
-
"rehype-katex": "^7.0.0",
|
|
43
|
-
"rehype-stringify": "^10.0.1",
|
|
44
|
-
"remark-gfm": "^4.0.0",
|
|
45
|
-
"remark-math": "^6.0.0",
|
|
46
|
-
"remark-parse": "^11.0.0",
|
|
47
|
-
"remark-rehype": "^11.1.1",
|
|
48
|
-
"unified": "^11.0.5",
|
|
49
|
-
"unist-util-visit": "^5.0.0"
|
|
50
|
-
},
|
|
51
38
|
"devDependencies": {
|
|
52
39
|
"@solidjs/testing-library": "^0.8.0",
|
|
53
40
|
"@types/hast": "^3.0.4",
|
|
54
|
-
"
|
|
41
|
+
"hast-mds": "workspace:*",
|
|
55
42
|
"jsdom": "^26.0.0",
|
|
56
43
|
"tsup": "^8.3.5",
|
|
57
44
|
"tsup-preset-solid": "^2.2.0",
|
|
@@ -60,7 +47,8 @@
|
|
|
60
47
|
"vitest": "^3.0.0"
|
|
61
48
|
},
|
|
62
49
|
"peerDependencies": {
|
|
63
|
-
"solid-js": "^1.9.0"
|
|
50
|
+
"solid-js": "^1.9.0",
|
|
51
|
+
"hast-mds": "^0.1.0"
|
|
64
52
|
},
|
|
65
53
|
"typesVersions": {}
|
|
66
54
|
}
|