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 CHANGED
@@ -1,23 +1,26 @@
1
1
  # solid-mds
2
2
 
3
- A SolidJS library for parsing and rendering MDS (Markdown Steps) format an
4
- extended Markdown syntax designed for step-based content like slide decks,
5
- tutorials, and wizards.
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 dependency:** This library requires SolidJS ^1.9.0
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 "solid-mds";
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 result = parse(markdown);
30
- return <div>{result.steps.default.body}</div>;
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
- ![Images](image.png)
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
- #### Task Lists
96
-
97
- ```markdown
98
- - [x] Completed task
99
- - [ ] Incomplete task
35
+ return <div>{result.steps.default.Body()}</div>;
36
+ }
100
37
  ```
101
38
 
102
- #### Autolinks
39
+ ## Architecture
103
40
 
104
- ```markdown
105
- Visit https://example.com automatically linked.
106
- ```
41
+ solid-mds is designed as a thin transformation layer:
107
42
 
108
- ### Math (LaTeX)
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
- #### Inline Math
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
- ```markdown
113
- The equation $E = mc^2$ is famous.
114
- ```
50
+ ## MDS Format
115
51
 
116
- #### Block Math
52
+ MDS (Markdown Steps) extends Markdown with step-based structure.
117
53
 
118
- ```markdown
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 step.
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
- ### Parsing Steps
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
- ### Step Object Structure
71
+ #### Global Metadata
167
72
 
168
- Each step contains:
73
+ ```markdown
74
+ \`\`\`yaml @@
75
+ title: My Presentation
76
+ author: Jane Doe
77
+ \`\`\`
169
78
 
170
- ```ts
171
- interface Step {
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
- ## Metadata Blocks
182
-
183
- ### Local Metadata (per step)
83
+ Access via `result.global.title`.
184
84
 
185
- Use ` ```@| ` blocks to define key-value metadata for a step:
85
+ #### Global Markdown Blocks
186
86
 
187
- ````markdown
188
- +++slide1
87
+ ```markdown
88
+ \`\`\`md @@/footer
89
+ Made with **love**
90
+ \`\`\`
189
91
 
190
- ```@|
191
- title: Introduction
192
- speaker: John Doe
92
+ +++intro
93
+ # Content
193
94
  ```
194
95
 
195
- # Welcome to the Presentation
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
- Use ` ```@/name ` to define named markdown content within a step:
98
+ #### Local Metadata (per step)
203
99
 
204
- ````markdown
100
+ ```markdown
205
101
  +++slide1
102
+ \`\`\`yaml @
103
+ layout: centered
104
+ transition: fade
105
+ \`\`\`
206
106
 
207
- ```@/notes
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
- +++first
227
-
228
- # First Step
229
- ````
230
-
231
- Access via `result.global.author`.
110
+ Access via `result.steps.slide1.local.layout`.
232
111
 
233
- ### Global Markdown Blocks
112
+ #### Local Markdown Blocks
234
113
 
235
- Use ` ```@@/name ` for global named markdown content:
114
+ ```markdown
115
+ +++slide1
116
+ \`\`\`md @/notes
117
+ Speaker **notes** here.
118
+ \`\`\`
236
119
 
237
- ````markdown
238
- ```@@/footer
239
- Made with ❤️ by **Our Team**
120
+ # Main Content
240
121
  ```
241
122
 
242
- +++first
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
- parse,
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 result = parse(markdown, components);
141
+ const parsed = parse(markdown);
142
+ const result = transform(parsed, components);
271
143
  ```
272
144
 
273
- ### Custom Blocks
145
+ ### Custom Block Components
274
146
 
275
- Create custom components that receive special props from code blocks:
147
+ Create custom components using `yaml componentName` or `md componentName/path` syntax:
276
148
 
277
149
  ```tsx
278
- import { parse, ComponentMap, CustomBlockProps } from "solid-mds";
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
- const result = parse(markdown, components);
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
- The code block ` ```slert/warning ` will render using your `Alert` component
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
- \`\`\`Card|
324
- title: My Card Title
325
- description: This is the card description
187
+ \`\`\`yaml card
188
+ title: My Card
189
+ description: Card content here
326
190
  \`\`\`
327
191
  `;
328
192
 
329
- const result = parse(markdown, components);
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, For } from "solid-js";
338
- import {
339
- parse,
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
- \`\`\`Slide/centered
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 result = parse(content, components);
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()}>{currentStep().body}</Show>
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
- ### `parse<TGlobal, TLocal>(input: string, components?: ComponentMap): ParseResult`
296
+ ### `transform<TGlobal, TLocal>(parsed, components?): ParseResult`
442
297
 
443
- Parses MDS content and returns a structured result. Please provide proper types
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
- - `input` — The MDS/Markdown string to parse
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; // First step ID
309
+ first: string | null; // First step ID
456
310
  steps: Record<string, Step<TLocal>>; // All steps by ID
457
- count: number; // Total number of steps
458
- global: TGlobal | null; // Global metadata
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
- export { type ComponentMap, type CustomBlockProps, type GlobalMetaBase, type ParseResult, type StandardComponentProps, type Step, type StepLocalBase, parse };
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 parseLocalMeta(content, processor, components) {
252
- const metaPattern = /```@\|\s*\n([\s\S]*?)```\s*\n?/g;
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 parseGlobalMeta(input, processor, components) {
281
- const globalDataPattern = /```@@\|\s*\n([\s\S]*?)```/g;
282
- let match;
283
- let global = {};
284
- while ((match = globalDataPattern.exec(input)) !== null) {
285
- const parsed = parseYaml2(match[1]);
286
- global = { ...global, ...parsed };
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
- globalMdBlocks[name] = content;
203
+ result[key] = value;
297
204
  }
298
205
  }
299
- for (const [name, mdContent] of Object.entries(globalMdBlocks)) {
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 parse(input, components = {}) {
325
- const stepPattern = /^\+\+\+(.+)$/gm;
208
+ function transform(parsed, components = {}) {
326
209
  const steps = {};
327
- const componentNames = new Set(Object.keys(components));
328
- const baseProcessor = unified().use(remarkParse).use(remarkGfm).use(remarkMath);
329
- const processor = unified().use(remarkParse).use(remarkGfm).use(remarkMath).use(remarkCustomBlocks, {
330
- components: componentNames,
331
- processor: baseProcessor
332
- }).use(remarkRehype, { allowDangerousHtml: true }).use(rehypeKatex);
333
- const global = parseGlobalMeta(input, processor, components);
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: prevMatch ? prevMatch.id : null,
388
- next: nextMatch ? nextMatch.id : null,
389
- current: i + 1
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: matches.length > 0 ? matches[0].id : null,
225
+ first: parsed.first,
394
226
  steps,
395
- count: matches.length,
396
- global
227
+ count: parsed.count,
228
+ global: transformedGlobal
397
229
  };
398
230
  }
399
231
  export {
400
- parse
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+ID0ge307XG5cbiAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyhwYXJzZWQuc3RlcHMpKSB7XG4gICAgY29uc3QgaGFzdFN0ZXA6IEhhc3RTdGVwPFRMb2NhbD4gPSBwYXJzZWQuc3RlcHNbaWRdO1xuICAgIGNvbnN0IEJvZHkgPSBoYXN0VG9Tb2xpZENvbXBvbmVudChoYXN0U3RlcC5ib2R5Lm5vZGUsIGNvbXBvbmVudHMpO1xuICAgIGNvbnN0IHRyYW5zZm9ybWVkTG9jYWwgPSB0cmFuc2Zvcm1NZXRhZGF0YShoYXN0U3RlcC5sb2NhbCwgY29tcG9uZW50cyk7XG5cbiAgICBzdGVwc1tpZF0gPSB7XG4gICAgICBpZDogaGFzdFN0ZXAuaWQsXG4gICAgICBsb2NhbDogdHJhbnNmb3JtZWRMb2NhbCBhcyBUTG9jYWwsXG4gICAgICBCb2R5LFxuICAgICAgcHJldjogaGFzdFN0ZXAucHJldixcbiAgICAgIG5leHQ6IGhhc3RTdGVwLm5leHQsXG4gICAgICBjdXJyZW50OiBoYXN0U3RlcC5jdXJyZW50LFxuICAgIH07XG4gIH1cblxuICBjb25zdCB0cmFuc2Zvcm1lZEdsb2JhbCA9IHRyYW5zZm9ybU1ldGFkYXRhKHBhcnNlZC5nbG9iYWwsIGNvbXBvbmVudHMpO1xuXG4gIHJldHVybiB7XG4gICAgZmlyc3Q6IHBhcnNlZC5maXJzdCxcbiAgICBzdGVwcyxcbiAgICBjb3VudDogcGFyc2VkLmNvdW50LFxuICAgIGdsb2JhbDogdHJhbnNmb3JtZWRHbG9iYWwgYXMgVEdsb2JhbCB8IG51bGwsXG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBNkJBLFNBQVMsa0JBQ1AsWUFDeUI7QUFDekIsTUFBSSxDQUFDLFdBQVksUUFBTyxDQUFDO0FBRXpCLFFBQU0sU0FBa0MsQ0FBQztBQUV6QyxhQUFXLENBQUMsS0FBSyxLQUFLLEtBQUssT0FBTyxRQUFRLFVBQVUsR0FBRztBQUNyRCxRQUFJLFFBQVEsYUFBYTtBQUN2QixhQUFPLFFBQVE7QUFBQSxJQUNqQixXQUFXLFFBQVEsU0FBUztBQUMxQixhQUFPLFFBQVEsTUFBTSxRQUFRLEtBQUssSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJO0FBQUEsSUFDMUQsT0FBTztBQUNMLGFBQU8sR0FBRyxJQUFJO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBRUEsU0FBUyxjQUNQLFNBQ0EsT0FDQSxVQUNhO0FBQ2IsVUFBUSxTQUFTO0FBQUEsSUFDZixLQUFLO0FBQ0gsYUFBTyxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQXZCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQXZCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFdBQVcsUUFBUSxTQUFTLEVBQTVCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQXZCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQXZCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLGVBQWUsUUFBUSxTQUFTLEVBQWhDO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sT0FBTztBQUFBLElBQ3hCLEtBQUs7QUFDSCxhQUFPLENBQUMsT0FBTyxPQUFPO0FBQUEsSUFDeEIsS0FBSztBQUNILGFBQU8sQ0FBQyxRQUFRLE9BQU87QUFBQSxJQUN6QixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUE7QUFBQSxJQUVWLEtBQUs7QUFDSCxhQUFPLENBQUMsVUFBVSxPQUFPO0FBQUEsSUFDM0IsS0FBSztBQUNILGFBQU8sQ0FBQyxZQUFZLFFBQVEsU0FBUyxFQUE3QjtBQUFBO0FBQUEsSUFFVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLGNBQWMsUUFBUSxTQUFTLEVBQS9CO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLE9BQU8sUUFBUSxTQUFTLEVBQXhCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsUUFBUSxTQUFTLEVBQTFCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFlBQVksUUFBUSxTQUFTLEVBQTdCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFdBQVcsUUFBUSxTQUFTLEVBQTVCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLGVBQWUsUUFBUSxTQUFTLEVBQWhDO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFdBQVcsUUFBUSxTQUFTLEVBQTVCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFVBQVUsUUFBUSxTQUFTLEVBQTNCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFdBQVcsUUFBUSxTQUFTLEVBQTVCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLGVBQWUsUUFBUSxTQUFTLEVBQWhDO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFFBQVEsUUFBUSxTQUFTLEVBQXpCO0FBQUEsSUFDVixLQUFLO0FBQ0gsYUFBTyxDQUFDLFNBQVMsT0FBTztBQUFBLElBQzFCLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxPQUFPO0FBQUEsSUFDMUIsS0FBSztBQUNILGFBQU8sQ0FBQyxTQUFTLE9BQU87QUFBQSxJQUMxQixLQUFLO0FBQ0gsYUFBTyxDQUFDLFdBQVcsT0FBTztBQUFBLElBQzVCLEtBQUs7QUFDSCxhQUFPLENBQUMsTUFBTSxRQUFRLFNBQVMsRUFBdkI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsU0FBUyxRQUFRLFNBQVMsRUFBMUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsYUFBYSxRQUFRLFNBQVMsRUFBOUI7QUFBQSxJQUNWLEtBQUs7QUFDSCxhQUFPLENBQUMsUUFBUSxPQUFPO0FBQUEsSUFDekI7QUFDRSxhQUFPLENBQUMsUUFBUSxRQUFRLFNBQVMsRUFBekI7QUFBQSxFQUNaO0FBQ0Y7QUFFQSxTQUFTLFdBQ1AsTUFDQSxZQUM2QjtBQUM3QixNQUFJLEtBQUssU0FBUyxRQUFRO0FBQ3hCLFdBQVEsS0FBYztBQUFBLEVBQ3hCO0FBRUEsTUFBSSxLQUFLLFNBQVMsV0FBVztBQUMzQixVQUFNLFVBQVU7QUFDaEIsVUFBTSxVQUFVLFFBQVE7QUFDeEIsVUFBTSxXQUFXLGtCQUFrQixRQUFRLFVBQVU7QUFDckQsVUFBTSxrQkFBa0IsV0FBVyxPQUFPO0FBRTFDLFVBQU0sZ0JBQ0osUUFBUSxTQUFTLFNBQVMsSUFDdEIsUUFBUSxTQUFTLElBQUksQ0FBQyxVQUFVLFdBQVcsT0FBTyxVQUFVLENBQUMsSUFDN0Q7QUFFTixRQUFJLGlCQUFpQjtBQUVuQixVQUFJLE9BQU8sU0FBUyxZQUFZLFlBQVksT0FBTyxTQUFTLFFBQVEsVUFBVTtBQUU1RSxjQUFNLG1CQUFxQztBQUFBLFVBQ3pDLFNBQVMsS0FBSyxNQUFNLFNBQVMsT0FBaUI7QUFBQSxVQUM5QyxLQUFLLFNBQVM7QUFBQSxRQUNoQjtBQUVBLFlBQUksT0FBTyxTQUFTLFNBQVMsVUFBVTtBQUNyQywyQkFBaUIsT0FBTyxLQUFLLE1BQU0sU0FBUyxJQUFjO0FBQUEsUUFDNUQ7QUFDQSxjQUFNQSxRQUFPO0FBQ2IsZUFBTyxDQUFDQSxVQUFTLG1CQUFtQixjQUFjLEVBQTFDQTtBQUFBLE1BQ1Y7QUFDQSxZQUFNLE9BQU87QUFDYixhQUFPLENBQUMsU0FBUyxXQUFXLGNBQWMsRUFBbEM7QUFBQSxJQUNWO0FBRUEsV0FBTyxjQUFjLFNBQVMsVUFBVSxhQUE0QjtBQUFBLEVBQ3RFO0FBRUEsU0FBTztBQUNUO0FBa0JPLFNBQVMscUJBQ2QsVUFDQSxhQUEyQixDQUFDLEdBQ1Q7QUFFbkIsUUFBTSxXQUFXO0FBQ2pCLFFBQU0sZUFBZTtBQUVyQixTQUFPLFNBQVMsV0FBVztBQUN6QixVQUFNLFdBQVcsU0FBUyxTQUFTLElBQUksQ0FBQyxTQUFTLFdBQVcsTUFBTSxZQUFZLENBQUM7QUFDL0UsV0FBTyxHQUFHLFNBQVM7QUFBQSxFQUNyQjtBQUNGOzs7QUM3T0EsU0FBUyxXQUFXLE9BQW1DO0FBQ3JELFNBQ0UsT0FBTyxVQUFVLFlBQ2pCLFVBQVUsUUFDVixVQUFVLFNBQ1QsTUFBbUIsU0FBUyxVQUM3QixVQUFVO0FBRWQ7QUFLQSxTQUFTLGtCQUNQLFVBQ0EsWUFDVTtBQUNWLE1BQUksYUFBYSxLQUFNLFFBQU87QUFFOUIsUUFBTSxTQUFrQyxDQUFDO0FBRXpDLGFBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxPQUFPO0FBQUEsSUFDaEM7QUFBQSxFQUNGLEdBQUc7QUFDRCxRQUFJLFdBQVcsS0FBSyxHQUFHO0FBRXJCLGFBQU8sR0FBRyxJQUFJLHFCQUFxQixNQUFNLE1BQU0sVUFBVTtBQUFBLElBQzNELE9BQU87QUFDTCxhQUFPLEdBQUcsSUFBSTtBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQXdCTyxTQUFTLFVBQ2QsUUFDQSxhQUEyQixDQUFDLEdBQ0U7QUFDOUIsUUFBTSxRQUFzQyxDQUFDO0FBRTdDLGFBQVcsTUFBTSxPQUFPLEtBQUssT0FBTyxLQUFLLEdBQUc7QUFDMUMsVUFBTSxXQUE2QixPQUFPLE1BQU0sRUFBRTtBQUNsRCxVQUFNLE9BQU8scUJBQXFCLFNBQVMsS0FBSyxNQUFNLFVBQVU7QUFDaEUsVUFBTSxtQkFBbUIsa0JBQWtCLFNBQVMsT0FBTyxVQUFVO0FBRXJFLFVBQU0sRUFBRSxJQUFJO0FBQUEsTUFDVixJQUFJLFNBQVM7QUFBQSxNQUNiLE9BQU87QUFBQSxNQUNQO0FBQUEsTUFDQSxNQUFNLFNBQVM7QUFBQSxNQUNmLE1BQU0sU0FBUztBQUFBLE1BQ2YsU0FBUyxTQUFTO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBRUEsUUFBTSxvQkFBb0Isa0JBQWtCLE9BQU8sUUFBUSxVQUFVO0FBRXJFLFNBQU87QUFBQSxJQUNMLE9BQU8sT0FBTztBQUFBLElBQ2Q7QUFBQSxJQUNBLE9BQU8sT0FBTztBQUFBLElBQ2QsUUFBUTtBQUFBLEVBQ1Y7QUFDRjsiLAogICJuYW1lcyI6IFsiQ29tcCJdCn0K
package/package.json CHANGED
@@ -1,18 +1,16 @@
1
1
  {
2
2
  "name": "solid-mds",
3
- "version": "0.3.2",
4
- "description": "A SolidJS library for parsing and rendering MDS (Markdown Steps) format",
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
- "parser",
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
- "@types/mdast": "^4.0.4",
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
  }