@fairspec/agent 0.9.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.
Files changed (90) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +3 -0
  3. package/build/actions/tableSchema/asHtml.d.ts +4 -0
  4. package/build/actions/tableSchema/asHtml.js +82 -0
  5. package/build/actions/tableSchema/asHtml.spec.d.ts +1 -0
  6. package/build/actions/tableSchema/asHtml.spec.js +356 -0
  7. package/build/actions/tableSchema/asMarkdown.d.ts +4 -0
  8. package/build/actions/tableSchema/asMarkdown.js +65 -0
  9. package/build/actions/tableSchema/asMarkdown.spec.d.ts +1 -0
  10. package/build/actions/tableSchema/asMarkdown.spec.js +133 -0
  11. package/build/document/Document.d.ts +2 -0
  12. package/build/document/Document.js +2 -0
  13. package/build/document/index.d.ts +3 -0
  14. package/build/document/index.js +3 -0
  15. package/build/document/types/Base.d.ts +3 -0
  16. package/build/document/types/Base.js +2 -0
  17. package/build/document/types/Json.d.ts +5 -0
  18. package/build/document/types/Json.js +2 -0
  19. package/build/document/validate.d.ts +5 -0
  20. package/build/document/validate.js +23 -0
  21. package/build/document/validate.spec.d.ts +1 -0
  22. package/build/document/validate.spec.js +71 -0
  23. package/build/index.d.ts +1 -0
  24. package/build/index.js +2 -0
  25. package/build/package.json +39 -0
  26. package/build/plugin.d.ts +6 -0
  27. package/build/plugin.js +15 -0
  28. package/build/schema/convert/toHtml.d.ts +4 -0
  29. package/build/schema/convert/toHtml.js +107 -0
  30. package/build/schema/convert/toHtml.spec.d.ts +1 -0
  31. package/build/schema/convert/toHtml.spec.js +432 -0
  32. package/build/schema/convert/toMarkdown.d.ts +4 -0
  33. package/build/schema/convert/toMarkdown.js +75 -0
  34. package/build/schema/convert/toMarkdown.spec.d.ts +1 -0
  35. package/build/schema/convert/toMarkdown.spec.js +137 -0
  36. package/build/schema/index.d.ts +2 -0
  37. package/build/schema/index.js +3 -0
  38. package/build/server.d.ts +2 -0
  39. package/build/server.js +29 -0
  40. package/build/tableSchema/convert/toHtml.d.ts +4 -0
  41. package/build/tableSchema/convert/toHtml.js +80 -0
  42. package/build/tableSchema/convert/toHtml.spec.d.ts +1 -0
  43. package/build/tableSchema/convert/toHtml.spec.js +375 -0
  44. package/build/tableSchema/convert/toMarkdown.d.ts +4 -0
  45. package/build/tableSchema/convert/toMarkdown.js +57 -0
  46. package/build/tableSchema/convert/toMarkdown.spec.d.ts +1 -0
  47. package/build/tableSchema/convert/toMarkdown.spec.js +141 -0
  48. package/build/tableSchema/index.d.ts +2 -0
  49. package/build/tableSchema/index.js +3 -0
  50. package/build/tools/data/validate.d.ts +971 -0
  51. package/build/tools/data/validate.js +15 -0
  52. package/build/tools/data/validate.spec.d.ts +1 -0
  53. package/build/tools/data/validate.spec.js +228 -0
  54. package/build/tools/dataSchema/infer.d.ts +797 -0
  55. package/build/tools/dataSchema/infer.js +15 -0
  56. package/build/tools/dataSchema/infer.spec.d.ts +1 -0
  57. package/build/tools/dataSchema/infer.spec.js +215 -0
  58. package/build/tools/dataSchema/validate.d.ts +177 -0
  59. package/build/tools/dataSchema/validate.js +17 -0
  60. package/build/tools/dataSchema/validate.spec.d.ts +1 -0
  61. package/build/tools/dataSchema/validate.spec.js +148 -0
  62. package/build/tools/dataset/infer.d.ts +1985 -0
  63. package/build/tools/dataset/infer.js +15 -0
  64. package/build/tools/dataset/infer.spec.d.ts +1 -0
  65. package/build/tools/dataset/infer.spec.js +181 -0
  66. package/build/tools/dataset/validate.d.ts +1168 -0
  67. package/build/tools/dataset/validate.js +17 -0
  68. package/build/tools/dataset/validate.spec.d.ts +1 -0
  69. package/build/tools/dataset/validate.spec.js +212 -0
  70. package/build/tools/dialect/infer.d.ts +889 -0
  71. package/build/tools/dialect/infer.js +16 -0
  72. package/build/tools/dialect/infer.spec.d.ts +1 -0
  73. package/build/tools/dialect/infer.spec.js +138 -0
  74. package/build/tools/table/query.d.ts +798 -0
  75. package/build/tools/table/query.js +24 -0
  76. package/build/tools/table/query.spec.d.ts +1 -0
  77. package/build/tools/table/query.spec.js +138 -0
  78. package/build/tools/table/validate.d.ts +999 -0
  79. package/build/tools/table/validate.js +16 -0
  80. package/build/tools/table/validate.spec.d.ts +1 -0
  81. package/build/tools/table/validate.spec.js +106 -0
  82. package/build/tools/tableSchema/infer.d.ts +1316 -0
  83. package/build/tools/tableSchema/infer.js +16 -0
  84. package/build/tools/tableSchema/infer.spec.d.ts +1 -0
  85. package/build/tools/tableSchema/infer.spec.js +152 -0
  86. package/build/tools/tableSchema/validate.d.ts +177 -0
  87. package/build/tools/tableSchema/validate.js +17 -0
  88. package/build/tools/tableSchema/validate.spec.d.ts +1 -0
  89. package/build/tools/tableSchema/validate.spec.js +121 -0
  90. package/package.json +39 -0
@@ -0,0 +1,375 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { convertTableSchemaToHtml } from "./toHtml.js";
3
+ describe("convertTableSchemaToHtml", () => {
4
+ it("converts a simple schema to html table", () => {
5
+ const schema = {
6
+ $schema: "https://fairspec.org/profiles/latest/table.json",
7
+ properties: {
8
+ id: {
9
+ type: "integer",
10
+ title: "Identifier",
11
+ description: "Unique identifier",
12
+ },
13
+ name: {
14
+ type: "string",
15
+ title: "Name",
16
+ description: "Person name",
17
+ },
18
+ },
19
+ };
20
+ const result = convertTableSchemaToHtml(schema);
21
+ expect(result).toContain("<h2>Columns</h2>");
22
+ expect(result).toContain("<table>");
23
+ expect(result).toContain("<th>Name</th>");
24
+ expect(result).toContain("<th>Definition</th>");
25
+ expect(result).toContain("<th>Type</th>");
26
+ expect(result).toContain("<strong>id?</strong>");
27
+ expect(result).toContain("<strong>name?</strong>");
28
+ expect(result).toContain("<p>Unique identifier</p>");
29
+ expect(result).toContain("<p>Person name</p>");
30
+ expect(result).toContain("<code>integer</code>");
31
+ expect(result).toContain("<code>string</code>");
32
+ });
33
+ it("handles column constraints", () => {
34
+ const schema = {
35
+ $schema: "https://fairspec.org/profiles/latest/table.json",
36
+ properties: {
37
+ age: {
38
+ type: "integer",
39
+ minimum: 0,
40
+ maximum: 120,
41
+ },
42
+ email: {
43
+ type: "string",
44
+ pattern: "^[a-z]+@[a-z]+\\.[a-z]+$",
45
+ },
46
+ },
47
+ required: ["age", "email"],
48
+ };
49
+ const result = convertTableSchemaToHtml(schema);
50
+ expect(result).toContain("<strong>Constraints</strong>");
51
+ expect(result).toContain("minimum:");
52
+ expect(result).toContain("<code>0</code>");
53
+ expect(result).toContain("maximum:");
54
+ expect(result).toContain("<code>120</code>");
55
+ expect(result).toContain("pattern:");
56
+ });
57
+ it("handles required field indicator", () => {
58
+ const schema = {
59
+ $schema: "https://fairspec.org/profiles/latest/table.json",
60
+ properties: {
61
+ requiredField: {
62
+ type: "string",
63
+ },
64
+ optionalField: {
65
+ type: "string",
66
+ },
67
+ },
68
+ required: ["requiredField"],
69
+ };
70
+ const result = convertTableSchemaToHtml(schema);
71
+ expect(result).toContain("<strong>requiredField</strong>");
72
+ expect(result).not.toContain("requiredField?");
73
+ expect(result).toContain("<strong>optionalField?</strong>");
74
+ });
75
+ it("handles empty properties object", () => {
76
+ const schema = {
77
+ $schema: "https://fairspec.org/profiles/latest/table.json",
78
+ properties: {},
79
+ };
80
+ const result = convertTableSchemaToHtml(schema);
81
+ expect(result).toContain("<h2>Columns</h2>");
82
+ expect(result).toContain("<table>");
83
+ expect(result).toContain("</table>");
84
+ });
85
+ it("escapes HTML special characters", () => {
86
+ const schema = {
87
+ $schema: "https://fairspec.org/profiles/latest/table.json",
88
+ properties: {
89
+ field: {
90
+ type: "string",
91
+ description: "Description with <script>alert('xss')</script>",
92
+ },
93
+ },
94
+ };
95
+ const result = convertTableSchemaToHtml(schema);
96
+ expect(result).toContain("Description with &lt;script&gt;alert(&#x27;xss&#x27;)&lt;/script&gt;");
97
+ });
98
+ it("handles columns with enum constraints", () => {
99
+ const schema = {
100
+ $schema: "https://fairspec.org/profiles/latest/table.json",
101
+ properties: {
102
+ status: {
103
+ type: "string",
104
+ enum: ["active", "inactive", "pending"],
105
+ },
106
+ },
107
+ };
108
+ const result = convertTableSchemaToHtml(schema);
109
+ expect(result).toContain("enum:");
110
+ expect(result).toContain("<code>active, inactive, pending</code>");
111
+ });
112
+ it("handles multiple constraint types", () => {
113
+ const schema = {
114
+ $schema: "https://fairspec.org/profiles/latest/table.json",
115
+ properties: {
116
+ username: {
117
+ type: "string",
118
+ minLength: 3,
119
+ maxLength: 20,
120
+ pattern: "^[a-zA-Z0-9_]+$",
121
+ },
122
+ },
123
+ required: ["username"],
124
+ };
125
+ const result = convertTableSchemaToHtml(schema);
126
+ expect(result).toContain("minLength:");
127
+ expect(result).toContain("<code>3</code>");
128
+ expect(result).toContain("maxLength:");
129
+ expect(result).toContain("<code>20</code>");
130
+ expect(result).toContain("pattern:");
131
+ });
132
+ it("handles different column types", () => {
133
+ const schema = {
134
+ $schema: "https://fairspec.org/profiles/latest/table.json",
135
+ properties: {
136
+ field1: { type: "string" },
137
+ field2: { type: "integer" },
138
+ field3: { type: "number" },
139
+ field4: { type: "boolean" },
140
+ field5: { type: "string", format: "date-time" },
141
+ field6: { type: "array" },
142
+ },
143
+ };
144
+ const result = convertTableSchemaToHtml(schema);
145
+ expect(result).toContain("<code>string</code>");
146
+ expect(result).toContain("<code>integer</code>");
147
+ expect(result).toContain("<code>number</code>");
148
+ expect(result).toContain("<code>boolean</code>");
149
+ expect(result).toContain("<code>array</code>");
150
+ });
151
+ it("sanitizes IDs for anchors", () => {
152
+ const schema = {
153
+ $schema: "https://fairspec.org/profiles/latest/table.json",
154
+ properties: {
155
+ "field-with-dashes": {
156
+ type: "string",
157
+ },
158
+ "Field With Spaces": {
159
+ type: "string",
160
+ },
161
+ },
162
+ };
163
+ const result = convertTableSchemaToHtml(schema);
164
+ expect(result).toContain('id="field-with-dashes"');
165
+ expect(result).toContain('id="field-with-spaces"');
166
+ });
167
+ it("does not include top-level html tags", () => {
168
+ const schema = {
169
+ $schema: "https://fairspec.org/profiles/latest/table.json",
170
+ properties: {
171
+ field1: { type: "string" },
172
+ },
173
+ };
174
+ const result = convertTableSchemaToHtml(schema);
175
+ expect(result).not.toContain("<!DOCTYPE");
176
+ expect(result).not.toContain("<html>");
177
+ expect(result).not.toContain("<head>");
178
+ expect(result).not.toContain("<body>");
179
+ expect(result).not.toContain("<style>");
180
+ });
181
+ it("handles column without description", () => {
182
+ const schema = {
183
+ $schema: "https://fairspec.org/profiles/latest/table.json",
184
+ properties: {
185
+ field1: {
186
+ type: "string",
187
+ },
188
+ },
189
+ };
190
+ const result = convertTableSchemaToHtml(schema);
191
+ expect(result).toContain("<strong>field1?</strong>");
192
+ expect(result).toContain("<code>string</code>");
193
+ });
194
+ it("uses frontmatter when frontmatter option is true", () => {
195
+ const schema = {
196
+ $schema: "https://fairspec.org/profiles/latest/table.json",
197
+ properties: {
198
+ field1: {
199
+ type: "string",
200
+ },
201
+ },
202
+ };
203
+ const result = convertTableSchemaToHtml(schema, { frontmatter: true });
204
+ expect(result).toContain("---");
205
+ expect(result).toContain("title: Table Schema");
206
+ });
207
+ it("handles schema with primary key", () => {
208
+ const schema = {
209
+ $schema: "https://fairspec.org/profiles/latest/table.json",
210
+ properties: {
211
+ id: {
212
+ type: "integer",
213
+ },
214
+ name: {
215
+ type: "string",
216
+ },
217
+ },
218
+ primaryKey: ["id"],
219
+ };
220
+ const result = convertTableSchemaToHtml(schema);
221
+ expect(result).toContain("<h2>Primary Key</h2>");
222
+ expect(result).toContain("<code>id</code>");
223
+ });
224
+ it("handles schema with composite primary key", () => {
225
+ const schema = {
226
+ $schema: "https://fairspec.org/profiles/latest/table.json",
227
+ properties: {
228
+ user_id: {
229
+ type: "integer",
230
+ },
231
+ project_id: {
232
+ type: "integer",
233
+ },
234
+ },
235
+ primaryKey: ["user_id", "project_id"],
236
+ };
237
+ const result = convertTableSchemaToHtml(schema);
238
+ expect(result).toContain("<h2>Primary Key</h2>");
239
+ expect(result).toContain("<code>user_id, project_id</code>");
240
+ });
241
+ it("handles schema with foreign keys", () => {
242
+ const schema = {
243
+ $schema: "https://fairspec.org/profiles/latest/table.json",
244
+ properties: {
245
+ user_id: {
246
+ type: "integer",
247
+ },
248
+ },
249
+ foreignKeys: [
250
+ {
251
+ columns: ["user_id"],
252
+ reference: {
253
+ resource: "users",
254
+ columns: ["id"],
255
+ },
256
+ },
257
+ ],
258
+ };
259
+ const result = convertTableSchemaToHtml(schema);
260
+ expect(result).toContain("<h2>Foreign Keys</h2>");
261
+ expect(result).toContain("<th>Columns</th>");
262
+ expect(result).toContain("<th>Reference Resource</th>");
263
+ expect(result).toContain("<th>Reference Columns</th>");
264
+ expect(result).toContain("<code>user_id</code>");
265
+ expect(result).toContain("<code>users</code>");
266
+ expect(result).toContain("<code>id</code>");
267
+ });
268
+ it("handles schema with multiple foreign keys", () => {
269
+ const schema = {
270
+ $schema: "https://fairspec.org/profiles/latest/table.json",
271
+ properties: {
272
+ user_id: {
273
+ type: "integer",
274
+ },
275
+ project_id: {
276
+ type: "integer",
277
+ },
278
+ },
279
+ foreignKeys: [
280
+ {
281
+ columns: ["user_id"],
282
+ reference: {
283
+ resource: "users",
284
+ columns: ["id"],
285
+ },
286
+ },
287
+ {
288
+ columns: ["project_id"],
289
+ reference: {
290
+ resource: "projects",
291
+ columns: ["id"],
292
+ },
293
+ },
294
+ ],
295
+ };
296
+ const result = convertTableSchemaToHtml(schema);
297
+ expect(result).toContain("<h2>Foreign Keys</h2>");
298
+ expect(result).toContain("<code>user_id</code>");
299
+ expect(result).toContain("<code>users</code>");
300
+ expect(result).toContain("<code>project_id</code>");
301
+ expect(result).toContain("<code>projects</code>");
302
+ });
303
+ it("handles foreign key without resource specified", () => {
304
+ const schema = {
305
+ $schema: "https://fairspec.org/profiles/latest/table.json",
306
+ properties: {
307
+ parent_id: {
308
+ type: "integer",
309
+ },
310
+ },
311
+ foreignKeys: [
312
+ {
313
+ columns: ["parent_id"],
314
+ reference: {
315
+ columns: ["id"],
316
+ },
317
+ },
318
+ ],
319
+ };
320
+ const result = convertTableSchemaToHtml(schema);
321
+ expect(result).toContain("<h2>Foreign Keys</h2>");
322
+ expect(result).toContain("<code>parent_id</code>");
323
+ expect(result).toContain("<code>-</code>");
324
+ expect(result).toContain("<code>id</code>");
325
+ });
326
+ it("does not render primary key or foreign keys sections when not present", () => {
327
+ const schema = {
328
+ $schema: "https://fairspec.org/profiles/latest/table.json",
329
+ properties: {
330
+ field1: {
331
+ type: "string",
332
+ },
333
+ },
334
+ };
335
+ const result = convertTableSchemaToHtml(schema);
336
+ expect(result).not.toContain("<h2>Primary Key</h2>");
337
+ expect(result).not.toContain("<h2>Foreign Keys</h2>");
338
+ });
339
+ it("handles string categories", () => {
340
+ const schema = {
341
+ $schema: "https://fairspec.org/profiles/latest/table.json",
342
+ properties: {
343
+ status: {
344
+ type: "string",
345
+ categories: ["active", "inactive"],
346
+ },
347
+ },
348
+ };
349
+ const result = convertTableSchemaToHtml(schema);
350
+ expect(result).toContain("<strong>Categories</strong>");
351
+ expect(result).toContain("<code>active</code>");
352
+ expect(result).toContain("<code>inactive</code>");
353
+ });
354
+ it("handles integer categories with labels", () => {
355
+ const schema = {
356
+ $schema: "https://fairspec.org/profiles/latest/table.json",
357
+ properties: {
358
+ level: {
359
+ type: "integer",
360
+ categories: [
361
+ { value: 1, label: "Beginner" },
362
+ { value: 2, label: "Advanced" },
363
+ ],
364
+ },
365
+ },
366
+ };
367
+ const result = convertTableSchemaToHtml(schema);
368
+ expect(result).toContain("<strong>Categories</strong>");
369
+ expect(result).toContain("<code>1</code>");
370
+ expect(result).toContain(" - Beginner");
371
+ expect(result).toContain("<code>2</code>");
372
+ expect(result).toContain(" - Advanced");
373
+ });
374
+ });
375
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9IdG1sLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90YWJsZVNjaGVtYS9jb252ZXJ0L3RvSHRtbC5zcGVjLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDN0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sYUFBYyxDQUFBO0FBRXZELFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtRQUNoRCxNQUFNLE1BQU0sR0FBZ0I7WUFDMUIsT0FBTyxFQUFFLGlEQUFpRDtZQUMxRCxVQUFVLEVBQUU7Z0JBQ1YsRUFBRSxFQUFFO29CQUNGLElBQUksRUFBRSxTQUFTO29CQUNmLEtBQUssRUFBRSxZQUFZO29CQUNuQixXQUFXLEVBQUUsbUJBQW1CO2lCQUNqQztnQkFDRCxJQUFJLEVBQUU7b0JBQ0osSUFBSSxFQUFFLFFBQVE7b0JBQ2QsS0FBSyxFQUFFLE1BQU07b0JBQ2IsV0FBVyxFQUFFLGFBQWE7aUJBQzNCO2FBQ0Y7U0FDRixDQUFBO1FBRUQsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUN6QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUE7UUFDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUN6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LGFBQWEsQ0FBQyxDQUFBO1FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUMxQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3pDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRhYmxlU2NoZW1hIH0gZnJvbSBcIkBmYWlyc3BlYy9tZXRhZGF0YVwiXG5pbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCB9IGZyb20gXCJ2aXRlc3RcIlxuaW1wb3J0IHsgY29udmVydFRhYmxlU2NoZW1hVG9IdG1sIH0gZnJvbSBcIi4vdG9IdG1sLnRzeFwiXG5cbmRlc2NyaWJlKFwiY29udmVydFRhYmxlU2NoZW1hVG9IdG1sXCIsICgpID0+IHtcbiAgaXQoXCJjb252ZXJ0cyBhIHNpbXBsZSBzY2hlbWEgdG8gaHRtbCB0YWJsZVwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgICRzY2hlbWE6IFwiaHR0cHM6Ly9mYWlyc3BlYy5vcmcvcHJvZmlsZXMvbGF0ZXN0L3RhYmxlLmpzb25cIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaWQ6IHtcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICB0aXRsZTogXCJJZGVudGlmaWVyXCIsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiVW5pcXVlIGlkZW50aWZpZXJcIixcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZToge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgdGl0bGU6IFwiTmFtZVwiLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBlcnNvbiBuYW1lXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUYWJsZVNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8aDI+Q29sdW1uczwvaDI+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHRhYmxlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjx0aD5OYW1lPC90aD5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8dGg+RGVmaW5pdGlvbjwvdGg+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHRoPlR5cGU8L3RoPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxzdHJvbmc+aWQ/PC9zdHJvbmc+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHN0cm9uZz5uYW1lPzwvc3Ryb25nPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxwPlVuaXF1ZSBpZGVudGlmaWVyPC9wPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxwPlBlcnNvbiBuYW1lPC9wPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmludGVnZXI8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+c3RyaW5nPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBjb2x1bW4gY29uc3RyYWludHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICAkc2NoZW1hOiBcImh0dHBzOi8vZmFpcnNwZWMub3JnL3Byb2ZpbGVzL2xhdGVzdC90YWJsZS5qc29uXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGFnZToge1xuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuXG4gICAgICAgICAgbWluaW11bTogMCxcbiAgICAgICAgICBtYXhpbXVtOiAxMjAsXG4gICAgICAgIH0sXG4gICAgICAgIGVtYWlsOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBwYXR0ZXJuOiBcIl5bYS16XStAW2Etel0rXFxcXC5bYS16XSskXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IFtcImFnZVwiLCBcImVtYWlsXCJdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUYWJsZVNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8c3Ryb25nPkNvbnN0cmFpbnRzPC9zdHJvbmc+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwibWluaW11bTpcIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT4wPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIm1heGltdW06XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+MTIwPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcInBhdHRlcm46XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIHJlcXVpcmVkIGZpZWxkIGluZGljYXRvclwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgICRzY2hlbWE6IFwiaHR0cHM6Ly9mYWlyc3BlYy5vcmcvcHJvZmlsZXMvbGF0ZXN0L3RhYmxlLmpzb25cIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgcmVxdWlyZWRGaWVsZDoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbmFsRmllbGQ6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmVkOiBbXCJyZXF1aXJlZEZpZWxkXCJdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUYWJsZVNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8c3Ryb25nPnJlcXVpcmVkRmllbGQ8L3N0cm9uZz5cIilcbiAgICBleHBlY3QocmVzdWx0KS5ub3QudG9Db250YWluKFwicmVxdWlyZWRGaWVsZD9cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8c3Ryb25nPm9wdGlvbmFsRmllbGQ/PC9zdHJvbmc+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGVtcHR5IHByb3BlcnRpZXMgb2JqZWN0XCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgJHNjaGVtYTogXCJodHRwczovL2ZhaXJzcGVjLm9yZy9wcm9maWxlcy9sYXRlc3QvdGFibGUuanNvblwiLFxuICAgICAgcHJvcGVydGllczoge30sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFRhYmxlU2NoZW1hVG9IdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxoMj5Db2x1bW5zPC9oMj5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8dGFibGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPC90YWJsZT5cIilcbiAgfSlcblxuICBpdChcImVzY2FwZXMgSFRNTCBzcGVjaWFsIGNoYXJhY3RlcnNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICAkc2NoZW1hOiBcImh0dHBzOi8vZmFpcnNwZWMub3JnL3Byb2ZpbGVzL2xhdGVzdC90YWJsZS5qc29uXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGZpZWxkOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJEZXNjcmlwdGlvbiB3aXRoIDxzY3JpcHQ+YWxlcnQoJ3hzcycpPC9zY3JpcHQ+XCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUYWJsZVNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXG4gICAgICBcIkRlc2NyaXB0aW9uIHdpdGggJmx0O3NjcmlwdCZndDthbGVydCgmI3gyNzt4c3MmI3gyNzspJmx0Oy9zY3JpcHQmZ3Q7XCIsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBjb2x1bW5zIHdpdGggZW51bSBjb25zdHJhaW50c1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgICRzY2hlbWE6IFwiaHR0cHM6Ly9mYWlyc3BlYy5vcmcvcHJvZmlsZXMvbGF0ZXN0L3RhYmxlLmpzb25cIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBlbnVtOiBbXCJhY3RpdmVcIiwgXCJpbmFjdGl2ZVwiLCBcInBlbmRpbmdcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUYWJsZVNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJlbnVtOlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmFjdGl2ZSwgaW5hY3RpdmUsIHBlbmRpbmc8L2NvZGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIG11bHRpcGxlIGNvbnN0cmFpbnQgdHlwZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICAkc2NoZW1hOiBcImh0dHBzOi8vZmFpcnNwZWMub3JnL3Byb2ZpbGVzL2xhdGVzdC90YWJsZS5qc29uXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHVzZXJuYW1lOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBtaW5MZW5ndGg6IDMsXG4gICAgICAgICAgbWF4TGVuZ3RoOiAyMCxcbiAgICAgICAgICBwYXR0ZXJuOiBcIl5bYS16QS1aMC05X10rJFwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmVkOiBbXCJ1c2VybmFtZVwiXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VGFibGVTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwibWluTGVuZ3RoOlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPjM8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwibWF4TGVuZ3RoOlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPjIwPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcInBhdHRlcm46XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGRpZmZlcmVudCBjb2x1bW4gdHlwZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICAkc2NoZW1hOiBcImh0dHBzOi8vZmFpcnNwZWMub3JnL3Byb2ZpbGVzL2xhdGVzdC90YWJsZS5qc29uXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGZpZWxkMTogeyB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIGZpZWxkMjogeyB0eXBlOiBcImludGVnZXJcIiB9LFxuICAgICAgICBmaWVsZDM6IHsgdHlwZTogXCJudW1iZXJcIiB9LFxuICAgICAgICBmaWVsZDQ6IHsgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgZmllbGQ1OiB7IHR5cGU6IFwic3RyaW5nXCIsIGZvcm1hdDogXCJkYXRlLXRpbWVcIiB9LFxuICAgICAgICBmaWVsZDY6IHsgdHlwZTogXCJhcnJheVwiIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUYWJsZVNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT5zdHJpbmc8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+aW50ZWdlcjwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT5udW1iZXI8L2NvZGU+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+Ym9vbGVhbjwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT5hcnJheTwvY29kZT5cIilcbiAgfSlcblxuICBpdChcInNhbml0aXplcyBJRHMgZm9yIGFuY2hvcnNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICAkc2NoZW1hOiBcImh0dHBzOi8vZmFpcnNwZWMub3JnL3Byb2ZpbGVzL2xhdGVzdC90YWJsZS5qc29uXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFwiZmllbGQtd2l0aC1kYXNoZXNcIjoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICAgIFwiRmllbGQgV2l0aCBTcGFjZXNcIjoge1xuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUYWJsZVNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oJ2lkPVwiZmllbGQtd2l0aC1kYXNoZXNcIicpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKCdpZD1cImZpZWxkLXdpdGgtc3BhY2VzXCInKVxuICB9KVxuXG4gIGl0KFwiZG9lcyBub3QgaW5jbHVkZSB0b3AtbGV2ZWwgaHRtbCB0YWdzXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgJHNjaGVtYTogXCJodHRwczovL2ZhaXJzcGVjLm9yZy9wcm9maWxlcy9sYXRlc3QvdGFibGUuanNvblwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBmaWVsZDE6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VGFibGVTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjwhRE9DVFlQRVwiKVxuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0NvbnRhaW4oXCI8aHRtbD5cIilcbiAgICBleHBlY3QocmVzdWx0KS5ub3QudG9Db250YWluKFwiPGhlYWQ+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxib2R5PlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLm5vdC50b0NvbnRhaW4oXCI8c3R5bGU+XCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIGNvbHVtbiB3aXRob3V0IGRlc2NyaXB0aW9uXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgJHNjaGVtYTogXCJodHRwczovL2ZhaXJzcGVjLm9yZy9wcm9maWxlcy9sYXRlc3QvdGFibGUuanNvblwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBmaWVsZDE6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VGFibGVTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHN0cm9uZz5maWVsZDE/PC9zdHJvbmc+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+c3RyaW5nPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwidXNlcyBmcm9udG1hdHRlciB3aGVuIGZyb250bWF0dGVyIG9wdGlvbiBpcyB0cnVlXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgJHNjaGVtYTogXCJodHRwczovL2ZhaXJzcGVjLm9yZy9wcm9maWxlcy9sYXRlc3QvdGFibGUuanNvblwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBmaWVsZDE6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VGFibGVTY2hlbWFUb0h0bWwoc2NoZW1hLCB7IGZyb250bWF0dGVyOiB0cnVlIH0pXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCItLS1cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCJ0aXRsZTogVGFibGUgU2NoZW1hXCIpXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIHNjaGVtYSB3aXRoIHByaW1hcnkga2V5XCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgJHNjaGVtYTogXCJodHRwczovL2ZhaXJzcGVjLm9yZy9wcm9maWxlcy9sYXRlc3QvdGFibGUuanNvblwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBpZDoge1xuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuXG4gICAgICAgIH0sXG4gICAgICAgIG5hbWU6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHByaW1hcnlLZXk6IFtcImlkXCJdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUYWJsZVNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8aDI+UHJpbWFyeSBLZXk8L2gyPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmlkPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBzY2hlbWEgd2l0aCBjb21wb3NpdGUgcHJpbWFyeSBrZXlcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICAkc2NoZW1hOiBcImh0dHBzOi8vZmFpcnNwZWMub3JnL3Byb2ZpbGVzL2xhdGVzdC90YWJsZS5qc29uXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHVzZXJfaWQ6IHtcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcblxuICAgICAgICB9LFxuICAgICAgICBwcm9qZWN0X2lkOiB7XG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG5cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwcmltYXJ5S2V5OiBbXCJ1c2VyX2lkXCIsIFwicHJvamVjdF9pZFwiXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VGFibGVTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGgyPlByaW1hcnkgS2V5PC9oMj5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT51c2VyX2lkLCBwcm9qZWN0X2lkPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBzY2hlbWEgd2l0aCBmb3JlaWduIGtleXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICAkc2NoZW1hOiBcImh0dHBzOi8vZmFpcnNwZWMub3JnL3Byb2ZpbGVzL2xhdGVzdC90YWJsZS5qc29uXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHVzZXJfaWQ6IHtcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcblxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGZvcmVpZ25LZXlzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb2x1bW5zOiBbXCJ1c2VyX2lkXCJdLFxuICAgICAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICAgICAgcmVzb3VyY2U6IFwidXNlcnNcIixcbiAgICAgICAgICAgIGNvbHVtbnM6IFtcImlkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUYWJsZVNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8aDI+Rm9yZWlnbiBLZXlzPC9oMj5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8dGg+Q29sdW1uczwvdGg+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHRoPlJlZmVyZW5jZSBSZXNvdXJjZTwvdGg+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPHRoPlJlZmVyZW5jZSBDb2x1bW5zPC90aD5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT51c2VyX2lkPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnVzZXJzPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmlkPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBzY2hlbWEgd2l0aCBtdWx0aXBsZSBmb3JlaWduIGtleXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHNjaGVtYTogVGFibGVTY2hlbWEgPSB7XG4gICAgICAkc2NoZW1hOiBcImh0dHBzOi8vZmFpcnNwZWMub3JnL3Byb2ZpbGVzL2xhdGVzdC90YWJsZS5qc29uXCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHVzZXJfaWQ6IHtcbiAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcblxuICAgICAgICB9LFxuICAgICAgICBwcm9qZWN0X2lkOiB7XG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG5cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmb3JlaWduS2V5czogW1xuICAgICAgICB7XG4gICAgICAgICAgY29sdW1uczogW1widXNlcl9pZFwiXSxcbiAgICAgICAgICByZWZlcmVuY2U6IHtcbiAgICAgICAgICAgIHJlc291cmNlOiBcInVzZXJzXCIsXG4gICAgICAgICAgICBjb2x1bW5zOiBbXCJpZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29sdW1uczogW1wicHJvamVjdF9pZFwiXSxcbiAgICAgICAgICByZWZlcmVuY2U6IHtcbiAgICAgICAgICAgIHJlc291cmNlOiBcInByb2plY3RzXCIsXG4gICAgICAgICAgICBjb2x1bW5zOiBbXCJpZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VGFibGVTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGgyPkZvcmVpZ24gS2V5czwvaDI+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+dXNlcl9pZDwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT51c2VyczwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT5wcm9qZWN0X2lkPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnByb2plY3RzPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBmb3JlaWduIGtleSB3aXRob3V0IHJlc291cmNlIHNwZWNpZmllZFwiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgICRzY2hlbWE6IFwiaHR0cHM6Ly9mYWlyc3BlYy5vcmcvcHJvZmlsZXMvbGF0ZXN0L3RhYmxlLmpzb25cIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgcGFyZW50X2lkOiB7XG4gICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG5cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmb3JlaWduS2V5czogW1xuICAgICAgICB7XG4gICAgICAgICAgY29sdW1uczogW1wicGFyZW50X2lkXCJdLFxuICAgICAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICAgICAgY29sdW1uczogW1wiaWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFRhYmxlU2NoZW1hVG9IdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxoMj5Gb3JlaWduIEtleXM8L2gyPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPnBhcmVudF9pZDwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT4tPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmlkPC9jb2RlPlwiKVxuICB9KVxuXG4gIGl0KFwiZG9lcyBub3QgcmVuZGVyIHByaW1hcnkga2V5IG9yIGZvcmVpZ24ga2V5cyBzZWN0aW9ucyB3aGVuIG5vdCBwcmVzZW50XCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgJHNjaGVtYTogXCJodHRwczovL2ZhaXJzcGVjLm9yZy9wcm9maWxlcy9sYXRlc3QvdGFibGUuanNvblwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBmaWVsZDE6IHtcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0VGFibGVTY2hlbWFUb0h0bWwoc2NoZW1hKVxuXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxoMj5QcmltYXJ5IEtleTwvaDI+XCIpXG4gICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQ29udGFpbihcIjxoMj5Gb3JlaWduIEtleXM8L2gyPlwiKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBzdHJpbmcgY2F0ZWdvcmllc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hOiBUYWJsZVNjaGVtYSA9IHtcbiAgICAgICRzY2hlbWE6IFwiaHR0cHM6Ly9mYWlyc3BlYy5vcmcvcHJvZmlsZXMvbGF0ZXN0L3RhYmxlLmpzb25cIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBjYXRlZ29yaWVzOiBbXCJhY3RpdmVcIiwgXCJpbmFjdGl2ZVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY29udmVydFRhYmxlU2NoZW1hVG9IdG1sKHNjaGVtYSlcblxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIjxjb2RlPmFjdGl2ZTwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT5pbmFjdGl2ZTwvY29kZT5cIilcbiAgfSlcblxuICBpdChcImhhbmRsZXMgaW50ZWdlciBjYXRlZ29yaWVzIHdpdGggbGFiZWxzXCIsICgpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFRhYmxlU2NoZW1hID0ge1xuICAgICAgJHNjaGVtYTogXCJodHRwczovL2ZhaXJzcGVjLm9yZy9wcm9maWxlcy9sYXRlc3QvdGFibGUuanNvblwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBsZXZlbDoge1xuICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuXG4gICAgICAgICAgY2F0ZWdvcmllczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogMSwgbGFiZWw6IFwiQmVnaW5uZXJcIiB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogMiwgbGFiZWw6IFwiQWR2YW5jZWRcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRUYWJsZVNjaGVtYVRvSHRtbChzY2hlbWEpXG5cbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCI8Y29kZT4xPC9jb2RlPlwiKVxuICAgIGV4cGVjdChyZXN1bHQpLnRvQ29udGFpbihcIiAtIEJlZ2lubmVyXCIpXG4gICAgZXhwZWN0KHJlc3VsdCkudG9Db250YWluKFwiPGNvZGU+MjwvY29kZT5cIilcbiAgICBleHBlY3QocmVzdWx0KS50b0NvbnRhaW4oXCIgLSBBZHZhbmNlZFwiKVxuICB9KVxufSlcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import type { TableSchema } from "@fairspec/metadata";
2
+ export declare function convertTableSchemaToMarkdown(schema: TableSchema, options?: {
3
+ frontmatter?: boolean;
4
+ }): string;
@@ -0,0 +1,57 @@
1
+ export function convertTableSchemaToMarkdown(schema, options) {
2
+ const rows = [];
3
+ rows.push("");
4
+ rows.push("## Columns");
5
+ rows.push("");
6
+ rows.push("| Name | Type | Title | Description | Constraints |");
7
+ rows.push("|------|------|-------|-------------|-------------|");
8
+ const columns = Object.entries(schema.properties);
9
+ const required = schema.required || [];
10
+ for (const [name, column] of columns) {
11
+ const type = column.type || "any";
12
+ const title = column.title || "";
13
+ const description = column.description || "";
14
+ const constraints = [];
15
+ if (required.includes(name)) {
16
+ constraints.push("required");
17
+ }
18
+ if ("minimum" in column && column.minimum !== undefined) {
19
+ constraints.push(`min: ${column.minimum}`);
20
+ }
21
+ if ("maximum" in column && column.maximum !== undefined) {
22
+ constraints.push(`max: ${column.maximum}`);
23
+ }
24
+ if ("minLength" in column && column.minLength !== undefined) {
25
+ constraints.push(`minLength: ${column.minLength}`);
26
+ }
27
+ if ("maxLength" in column && column.maxLength !== undefined) {
28
+ constraints.push(`maxLength: ${column.maxLength}`);
29
+ }
30
+ if ("pattern" in column && column.pattern) {
31
+ constraints.push(`pattern: ${column.pattern}`);
32
+ }
33
+ if ("enum" in column && column.enum) {
34
+ constraints.push(`enum: ${column.enum.join(", ")}`);
35
+ }
36
+ const constraintsStr = constraints.join(", ");
37
+ const escapedName = escapeMarkdown(name);
38
+ const escapedTitle = escapeMarkdown(title);
39
+ const escapedDescription = escapeMarkdown(description);
40
+ const escapedConstraints = escapeMarkdown(constraintsStr);
41
+ rows.push(`| ${escapedName} | ${type} | ${escapedTitle} | ${escapedDescription} | ${escapedConstraints} |`);
42
+ }
43
+ let markdown = `${rows.join("\n")}\n`;
44
+ if (options?.frontmatter) {
45
+ const header = [];
46
+ header.push("---");
47
+ header.push("title: Table Schema");
48
+ header.push("---");
49
+ header.push("");
50
+ markdown = header.join("\n") + markdown;
51
+ }
52
+ return markdown;
53
+ }
54
+ function escapeMarkdown(text) {
55
+ return text.replace(/\n/g, " ");
56
+ }
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9NYXJrZG93bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RhYmxlU2NoZW1hL2NvbnZlcnQvdG9NYXJrZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLE1BQW1CLEVBQ25CLE9BQW1DO0lBRW5DLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQTtJQUV6QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFBO0lBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQTtJQUVoRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNqRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQTtJQUV0QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUE7UUFDakMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUE7UUFDaEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUE7UUFFNUMsTUFBTSxXQUFXLEdBQWEsRUFBRSxDQUFBO1FBRWhDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVCLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDOUIsQ0FBQztRQUVELElBQUksU0FBUyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hELFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUM1QyxDQUFDO1FBQ0QsSUFBSSxTQUFTLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEQsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQzVDLENBQUM7UUFDRCxJQUFJLFdBQVcsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1RCxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFDcEQsQ0FBQztRQUNELElBQUksV0FBVyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUNwRCxDQUFDO1FBQ0QsSUFBSSxTQUFTLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDaEQsQ0FBQztRQUNELElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNyRCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUU3QyxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDeEMsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzFDLE1BQU0sa0JBQWtCLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3RELE1BQU0sa0JBQWtCLEdBQUcsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRXpELElBQUksQ0FBQyxJQUFJLENBQ1AsS0FBSyxXQUFXLE1BQU0sSUFBSSxNQUFNLFlBQVksTUFBTSxrQkFBa0IsTUFBTSxrQkFBa0IsSUFBSSxDQUNqRyxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBRXJDLElBQUksT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQTtRQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDZixRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUE7SUFDekMsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVGFibGVTY2hlbWEgfSBmcm9tIFwiQGZhaXJzcGVjL21ldGFkYXRhXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUYWJsZVNjaGVtYVRvTWFya2Rvd24oXG4gIHNjaGVtYTogVGFibGVTY2hlbWEsXG4gIG9wdGlvbnM/OiB7IGZyb250bWF0dGVyPzogYm9vbGVhbiB9LFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgcm93czogc3RyaW5nW10gPSBbXVxuXG4gIHJvd3MucHVzaChcIlwiKVxuICByb3dzLnB1c2goXCIjIyBDb2x1bW5zXCIpXG4gIHJvd3MucHVzaChcIlwiKVxuICByb3dzLnB1c2goXCJ8IE5hbWUgfCBUeXBlIHwgVGl0bGUgfCBEZXNjcmlwdGlvbiB8IENvbnN0cmFpbnRzIHxcIilcbiAgcm93cy5wdXNoKFwifC0tLS0tLXwtLS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18XCIpXG5cbiAgY29uc3QgY29sdW1ucyA9IE9iamVjdC5lbnRyaWVzKHNjaGVtYS5wcm9wZXJ0aWVzKVxuICBjb25zdCByZXF1aXJlZCA9IHNjaGVtYS5yZXF1aXJlZCB8fCBbXVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvbHVtbl0gb2YgY29sdW1ucykge1xuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4udHlwZSB8fCBcImFueVwiXG4gICAgY29uc3QgdGl0bGUgPSBjb2x1bW4udGl0bGUgfHwgXCJcIlxuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gY29sdW1uLmRlc2NyaXB0aW9uIHx8IFwiXCJcblxuICAgIGNvbnN0IGNvbnN0cmFpbnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBpZiAocmVxdWlyZWQuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goXCJyZXF1aXJlZFwiKVxuICAgIH1cblxuICAgIGlmIChcIm1pbmltdW1cIiBpbiBjb2x1bW4gJiYgY29sdW1uLm1pbmltdW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3RyYWludHMucHVzaChgbWluOiAke2NvbHVtbi5taW5pbXVtfWApXG4gICAgfVxuICAgIGlmIChcIm1heGltdW1cIiBpbiBjb2x1bW4gJiYgY29sdW1uLm1heGltdW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3RyYWludHMucHVzaChgbWF4OiAke2NvbHVtbi5tYXhpbXVtfWApXG4gICAgfVxuICAgIGlmIChcIm1pbkxlbmd0aFwiIGluIGNvbHVtbiAmJiBjb2x1bW4ubWluTGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goYG1pbkxlbmd0aDogJHtjb2x1bW4ubWluTGVuZ3RofWApXG4gICAgfVxuICAgIGlmIChcIm1heExlbmd0aFwiIGluIGNvbHVtbiAmJiBjb2x1bW4ubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goYG1heExlbmd0aDogJHtjb2x1bW4ubWF4TGVuZ3RofWApXG4gICAgfVxuICAgIGlmIChcInBhdHRlcm5cIiBpbiBjb2x1bW4gJiYgY29sdW1uLnBhdHRlcm4pIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goYHBhdHRlcm46ICR7Y29sdW1uLnBhdHRlcm59YClcbiAgICB9XG4gICAgaWYgKFwiZW51bVwiIGluIGNvbHVtbiAmJiBjb2x1bW4uZW51bSkge1xuICAgICAgY29uc3RyYWludHMucHVzaChgZW51bTogJHtjb2x1bW4uZW51bS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBjb25zdCBjb25zdHJhaW50c1N0ciA9IGNvbnN0cmFpbnRzLmpvaW4oXCIsIFwiKVxuXG4gICAgY29uc3QgZXNjYXBlZE5hbWUgPSBlc2NhcGVNYXJrZG93bihuYW1lKVxuICAgIGNvbnN0IGVzY2FwZWRUaXRsZSA9IGVzY2FwZU1hcmtkb3duKHRpdGxlKVxuICAgIGNvbnN0IGVzY2FwZWREZXNjcmlwdGlvbiA9IGVzY2FwZU1hcmtkb3duKGRlc2NyaXB0aW9uKVxuICAgIGNvbnN0IGVzY2FwZWRDb25zdHJhaW50cyA9IGVzY2FwZU1hcmtkb3duKGNvbnN0cmFpbnRzU3RyKVxuXG4gICAgcm93cy5wdXNoKFxuICAgICAgYHwgJHtlc2NhcGVkTmFtZX0gfCAke3R5cGV9IHwgJHtlc2NhcGVkVGl0bGV9IHwgJHtlc2NhcGVkRGVzY3JpcHRpb259IHwgJHtlc2NhcGVkQ29uc3RyYWludHN9IHxgLFxuICAgIClcbiAgfVxuXG4gIGxldCBtYXJrZG93biA9IGAke3Jvd3Muam9pbihcIlxcblwiKX1cXG5gXG5cbiAgaWYgKG9wdGlvbnM/LmZyb250bWF0dGVyKSB7XG4gICAgY29uc3QgaGVhZGVyOiBzdHJpbmdbXSA9IFtdXG4gICAgaGVhZGVyLnB1c2goXCItLS1cIilcbiAgICBoZWFkZXIucHVzaChcInRpdGxlOiBUYWJsZSBTY2hlbWFcIilcbiAgICBoZWFkZXIucHVzaChcIi0tLVwiKVxuICAgIGhlYWRlci5wdXNoKFwiXCIpXG4gICAgbWFya2Rvd24gPSBoZWFkZXIuam9pbihcIlxcblwiKSArIG1hcmtkb3duXG4gIH1cblxuICByZXR1cm4gbWFya2Rvd25cbn1cblxuZnVuY3Rpb24gZXNjYXBlTWFya2Rvd24odGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFxuL2csIFwiIFwiKVxufVxuIl19
@@ -0,0 +1 @@
1
+ export {};