css-to-tailwind-react 0.3.0 → 0.3.2
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/dist/tailwindMapper.d.ts +40 -0
- package/dist/tailwindMapper.js +1081 -71
- package/dist/utils/propertyMapper.d.ts +2 -0
- package/dist/utils/propertyMapper.js +135 -7
- package/package.json +1 -1
package/dist/tailwindMapper.js
CHANGED
|
@@ -6,18 +6,22 @@ class TailwindMapper {
|
|
|
6
6
|
constructor(config) {
|
|
7
7
|
this.config = config;
|
|
8
8
|
this.spacingScale = this.buildSpacingScale();
|
|
9
|
+
this.maxWidthScale = this.buildMaxWidthScale();
|
|
10
|
+
this.fontSizeScale = this.buildFontSizeScale();
|
|
11
|
+
this.lineHeightScale = this.buildLineHeightScale();
|
|
12
|
+
this.letterSpacingScale = this.buildLetterSpacingScale();
|
|
13
|
+
this.zIndexScale = this.buildZIndexScale();
|
|
14
|
+
this.opacityScale = this.buildOpacityScale();
|
|
9
15
|
}
|
|
10
16
|
buildSpacingScale() {
|
|
11
17
|
const scale = new Map();
|
|
12
18
|
const spacing = this.config.theme?.spacing || {};
|
|
13
19
|
Object.entries(spacing).forEach(([key, value]) => {
|
|
14
|
-
// Convert rem to pixels for comparison (assuming 1rem = 16px)
|
|
15
20
|
const remMatch = value.match(/([\d.]+)rem/);
|
|
16
21
|
if (remMatch) {
|
|
17
22
|
const pixels = parseFloat(remMatch[1]) * 16;
|
|
18
23
|
scale.set(Math.round(pixels), key);
|
|
19
24
|
}
|
|
20
|
-
// Also handle pixel values
|
|
21
25
|
const pxMatch = value.match(/([\d.]+)px/);
|
|
22
26
|
if (pxMatch) {
|
|
23
27
|
scale.set(Math.round(parseFloat(pxMatch[1])), key);
|
|
@@ -25,12 +29,114 @@ class TailwindMapper {
|
|
|
25
29
|
});
|
|
26
30
|
return scale;
|
|
27
31
|
}
|
|
32
|
+
buildMaxWidthScale() {
|
|
33
|
+
const scale = new Map();
|
|
34
|
+
const maxWidth = this.config.theme?.maxWidth || {};
|
|
35
|
+
Object.entries(maxWidth).forEach(([key, value]) => {
|
|
36
|
+
if (typeof value === 'string') {
|
|
37
|
+
scale.set(value, key);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
scale.set('100%', 'full');
|
|
41
|
+
scale.set('min-content', 'min');
|
|
42
|
+
scale.set('max-content', 'max');
|
|
43
|
+
scale.set('fit-content', 'fit');
|
|
44
|
+
return scale;
|
|
45
|
+
}
|
|
46
|
+
buildFontSizeScale() {
|
|
47
|
+
const scale = new Map();
|
|
48
|
+
const fontSize = this.config.theme?.fontSize || {};
|
|
49
|
+
Object.entries(fontSize).forEach(([key, value]) => {
|
|
50
|
+
if (typeof value === 'string') {
|
|
51
|
+
const remMatch = value.match(/([\d.]+)rem/);
|
|
52
|
+
if (remMatch) {
|
|
53
|
+
scale.set(Math.round(parseFloat(remMatch[1]) * 16), key);
|
|
54
|
+
}
|
|
55
|
+
const pxMatch = value.match(/([\d.]+)px/);
|
|
56
|
+
if (pxMatch) {
|
|
57
|
+
scale.set(Math.round(parseFloat(pxMatch[1])), key);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (Array.isArray(value) && typeof value[0] === 'string') {
|
|
61
|
+
const remMatch = value[0].match(/([\d.]+)rem/);
|
|
62
|
+
if (remMatch) {
|
|
63
|
+
scale.set(Math.round(parseFloat(remMatch[1]) * 16), key);
|
|
64
|
+
}
|
|
65
|
+
const pxMatch = value[0].match(/([\d.]+)px/);
|
|
66
|
+
if (pxMatch) {
|
|
67
|
+
scale.set(Math.round(parseFloat(pxMatch[1])), key);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return scale;
|
|
72
|
+
}
|
|
73
|
+
buildLineHeightScale() {
|
|
74
|
+
const scale = new Map();
|
|
75
|
+
const lineHeight = this.config.theme?.lineHeight || {};
|
|
76
|
+
Object.entries(lineHeight).forEach(([key, value]) => {
|
|
77
|
+
if (typeof value === 'string') {
|
|
78
|
+
scale.set(value, key);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
scale.set('1', 'none');
|
|
82
|
+
scale.set('1.25', 'tight');
|
|
83
|
+
scale.set('1.375', 'snug');
|
|
84
|
+
scale.set('1.5', 'normal');
|
|
85
|
+
scale.set('1.625', 'relaxed');
|
|
86
|
+
scale.set('2', 'loose');
|
|
87
|
+
return scale;
|
|
88
|
+
}
|
|
89
|
+
buildLetterSpacingScale() {
|
|
90
|
+
const scale = new Map();
|
|
91
|
+
const letterSpacing = this.config.theme?.letterSpacing || {};
|
|
92
|
+
Object.entries(letterSpacing).forEach(([key, value]) => {
|
|
93
|
+
if (typeof value === 'string') {
|
|
94
|
+
scale.set(value, key);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return scale;
|
|
98
|
+
}
|
|
99
|
+
buildZIndexScale() {
|
|
100
|
+
const scale = new Map();
|
|
101
|
+
const zIndex = this.config.theme?.zIndex || {};
|
|
102
|
+
Object.entries(zIndex).forEach(([key, value]) => {
|
|
103
|
+
if (typeof value === 'string') {
|
|
104
|
+
const num = parseInt(value, 10);
|
|
105
|
+
if (!isNaN(num)) {
|
|
106
|
+
scale.set(num, key);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
scale.set(0, '0');
|
|
111
|
+
scale.set(10, '10');
|
|
112
|
+
scale.set(20, '20');
|
|
113
|
+
scale.set(30, '30');
|
|
114
|
+
scale.set(40, '40');
|
|
115
|
+
scale.set(50, '50');
|
|
116
|
+
return scale;
|
|
117
|
+
}
|
|
118
|
+
buildOpacityScale() {
|
|
119
|
+
const scale = new Map();
|
|
120
|
+
const opacity = this.config.theme?.opacity || {};
|
|
121
|
+
Object.entries(opacity).forEach(([key, value]) => {
|
|
122
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
123
|
+
const num = typeof value === 'string' ? parseFloat(value) : value;
|
|
124
|
+
if (!isNaN(num)) {
|
|
125
|
+
scale.set(Math.round(num * 100), key);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
for (let i = 0; i <= 100; i += 5) {
|
|
130
|
+
if (!scale.has(i)) {
|
|
131
|
+
scale.set(i, String(i));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return scale;
|
|
135
|
+
}
|
|
28
136
|
pxToSpacing(px) {
|
|
29
|
-
// Try exact match first
|
|
30
137
|
if (this.spacingScale.has(px)) {
|
|
31
138
|
return this.spacingScale.get(px);
|
|
32
139
|
}
|
|
33
|
-
// Find closest match
|
|
34
140
|
let closestKey = null;
|
|
35
141
|
let closestDiff = Infinity;
|
|
36
142
|
this.spacingScale.forEach((_, key) => {
|
|
@@ -40,7 +146,6 @@ class TailwindMapper {
|
|
|
40
146
|
closestDiff = diff;
|
|
41
147
|
}
|
|
42
148
|
});
|
|
43
|
-
// Only accept if within reasonable tolerance (20%)
|
|
44
149
|
if (closestKey !== null && closestDiff / px < 0.2) {
|
|
45
150
|
return this.spacingScale.get(closestKey) || null;
|
|
46
151
|
}
|
|
@@ -51,79 +156,382 @@ class TailwindMapper {
|
|
|
51
156
|
if (pxMatch) {
|
|
52
157
|
return parseFloat(pxMatch[1]);
|
|
53
158
|
}
|
|
54
|
-
// Handle rem values
|
|
55
159
|
const remMatch = value.match(/^([\d.]+)rem$/);
|
|
56
160
|
if (remMatch) {
|
|
57
161
|
return parseFloat(remMatch[1]) * 16;
|
|
58
162
|
}
|
|
59
163
|
return null;
|
|
60
164
|
}
|
|
165
|
+
parseSpacingValue(value) {
|
|
166
|
+
const px = this.extractPx(value);
|
|
167
|
+
const spacingKey = px !== null ? this.pxToSpacing(px) : null;
|
|
168
|
+
return {
|
|
169
|
+
value,
|
|
170
|
+
px,
|
|
171
|
+
spacingKey
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
buildSpacingUtility(prefix, parsed) {
|
|
175
|
+
if (parsed.spacingKey) {
|
|
176
|
+
return `${prefix}-${parsed.spacingKey}`;
|
|
177
|
+
}
|
|
178
|
+
return `${prefix}-[${parsed.value}]`;
|
|
179
|
+
}
|
|
180
|
+
tokenizeValue(value) {
|
|
181
|
+
const tokens = [];
|
|
182
|
+
let current = '';
|
|
183
|
+
let parenDepth = 0;
|
|
184
|
+
let inFunction = false;
|
|
185
|
+
for (let i = 0; i < value.length; i++) {
|
|
186
|
+
const char = value[i];
|
|
187
|
+
if (char === '(') {
|
|
188
|
+
parenDepth++;
|
|
189
|
+
inFunction = true;
|
|
190
|
+
current += char;
|
|
191
|
+
}
|
|
192
|
+
else if (char === ')') {
|
|
193
|
+
parenDepth--;
|
|
194
|
+
current += char;
|
|
195
|
+
if (parenDepth === 0) {
|
|
196
|
+
inFunction = false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else if (char === ' ' && parenDepth === 0) {
|
|
200
|
+
if (current.trim()) {
|
|
201
|
+
tokens.push(current.trim());
|
|
202
|
+
}
|
|
203
|
+
current = '';
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
current += char;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (current.trim()) {
|
|
210
|
+
tokens.push(current.trim());
|
|
211
|
+
}
|
|
212
|
+
return tokens;
|
|
213
|
+
}
|
|
61
214
|
convertProperty(property, value) {
|
|
62
215
|
const normalizedProp = property.toLowerCase().trim();
|
|
63
216
|
const normalizedValue = value.toLowerCase().trim();
|
|
64
217
|
logger_1.logger.verbose(`Converting: ${normalizedProp}: ${normalizedValue}`);
|
|
65
|
-
|
|
218
|
+
if (normalizedProp.startsWith('--')) {
|
|
219
|
+
return { className: null, skipped: true, reason: `CSS variable declaration: ${property}` };
|
|
220
|
+
}
|
|
66
221
|
if (normalizedProp === 'display') {
|
|
67
222
|
return this.convertDisplay(normalizedValue);
|
|
68
223
|
}
|
|
69
|
-
// Position properties
|
|
70
224
|
if (normalizedProp === 'position') {
|
|
71
225
|
return { className: normalizedValue, skipped: false };
|
|
72
226
|
}
|
|
73
|
-
// Margin properties
|
|
74
227
|
if (normalizedProp.startsWith('margin')) {
|
|
75
228
|
return this.convertMargin(normalizedProp, normalizedValue);
|
|
76
229
|
}
|
|
77
|
-
// Padding properties
|
|
78
230
|
if (normalizedProp.startsWith('padding')) {
|
|
79
231
|
return this.convertPadding(normalizedProp, normalizedValue);
|
|
80
232
|
}
|
|
81
|
-
|
|
233
|
+
if (normalizedProp === 'max-width' || normalizedProp === 'min-width') {
|
|
234
|
+
return this.convertDimensionConstraint(normalizedProp, normalizedValue);
|
|
235
|
+
}
|
|
236
|
+
if (normalizedProp === 'max-height' || normalizedProp === 'min-height') {
|
|
237
|
+
return this.convertDimensionConstraint(normalizedProp, normalizedValue);
|
|
238
|
+
}
|
|
239
|
+
if (normalizedProp === 'width') {
|
|
240
|
+
return this.convertWidth(normalizedValue);
|
|
241
|
+
}
|
|
242
|
+
if (normalizedProp === 'height') {
|
|
243
|
+
return this.convertHeight(normalizedValue);
|
|
244
|
+
}
|
|
82
245
|
if (normalizedProp === 'font-weight') {
|
|
83
246
|
return this.convertFontWeight(normalizedValue);
|
|
84
247
|
}
|
|
85
248
|
if (normalizedProp === 'font-size') {
|
|
86
249
|
return this.convertFontSize(normalizedValue);
|
|
87
250
|
}
|
|
88
|
-
// Text properties
|
|
89
251
|
if (normalizedProp === 'text-align') {
|
|
90
252
|
return { className: `text-${normalizedValue}`, skipped: false };
|
|
91
253
|
}
|
|
92
|
-
|
|
254
|
+
if (normalizedProp === 'text-decoration') {
|
|
255
|
+
return this.convertTextDecoration(normalizedValue);
|
|
256
|
+
}
|
|
257
|
+
if (normalizedProp === 'text-transform') {
|
|
258
|
+
return this.convertTextTransform(normalizedValue);
|
|
259
|
+
}
|
|
260
|
+
if (normalizedProp === 'letter-spacing') {
|
|
261
|
+
return this.convertLetterSpacing(normalizedValue);
|
|
262
|
+
}
|
|
263
|
+
if (normalizedProp === 'line-height') {
|
|
264
|
+
return this.convertLineHeight(normalizedValue);
|
|
265
|
+
}
|
|
93
266
|
if (normalizedProp.startsWith('flex') ||
|
|
94
267
|
normalizedProp.startsWith('justify') ||
|
|
95
268
|
normalizedProp.startsWith('align')) {
|
|
96
269
|
return this.convertFlexbox(normalizedProp, normalizedValue);
|
|
97
270
|
}
|
|
98
|
-
// Gap properties
|
|
99
271
|
if (normalizedProp === 'gap') {
|
|
100
272
|
return this.convertGap(normalizedValue);
|
|
101
273
|
}
|
|
102
|
-
// Width and Height
|
|
103
|
-
if (normalizedProp === 'width') {
|
|
104
|
-
return this.convertWidth(normalizedValue);
|
|
105
|
-
}
|
|
106
|
-
if (normalizedProp === 'height') {
|
|
107
|
-
return this.convertHeight(normalizedValue);
|
|
108
|
-
}
|
|
109
|
-
// Colors
|
|
110
274
|
if (normalizedProp === 'background-color') {
|
|
111
275
|
return this.convertBackgroundColor(normalizedValue);
|
|
112
276
|
}
|
|
277
|
+
if (normalizedProp === 'background') {
|
|
278
|
+
const result = this.convertBackgroundShorthand(normalizedValue);
|
|
279
|
+
if (result.classes.length > 0) {
|
|
280
|
+
return { className: result.classes[0], skipped: false };
|
|
281
|
+
}
|
|
282
|
+
return { className: null, skipped: true, reason: result.warnings[0] || `Could not convert background: ${normalizedValue}` };
|
|
283
|
+
}
|
|
113
284
|
if (normalizedProp === 'color') {
|
|
114
285
|
return this.convertTextColor(normalizedValue);
|
|
115
286
|
}
|
|
116
|
-
// Border radius
|
|
117
287
|
if (normalizedProp === 'border-radius') {
|
|
118
288
|
return this.convertBorderRadius(normalizedValue);
|
|
119
289
|
}
|
|
120
|
-
|
|
290
|
+
if (normalizedProp.startsWith('border')) {
|
|
291
|
+
return this.convertBorder(normalizedProp, normalizedValue);
|
|
292
|
+
}
|
|
293
|
+
if (normalizedProp === 'aspect-ratio') {
|
|
294
|
+
return this.convertAspectRatio(normalizedValue);
|
|
295
|
+
}
|
|
296
|
+
if (normalizedProp === 'overflow' || normalizedProp === 'overflow-x' || normalizedProp === 'overflow-y') {
|
|
297
|
+
return this.convertOverflow(normalizedProp, normalizedValue);
|
|
298
|
+
}
|
|
299
|
+
if (normalizedProp === 'object-fit') {
|
|
300
|
+
return this.convertObjectFit(normalizedValue);
|
|
301
|
+
}
|
|
302
|
+
if (normalizedProp === 'object-position') {
|
|
303
|
+
return this.convertObjectPosition(normalizedValue);
|
|
304
|
+
}
|
|
305
|
+
if (normalizedProp === 'opacity') {
|
|
306
|
+
return this.convertOpacity(normalizedValue);
|
|
307
|
+
}
|
|
308
|
+
if (normalizedProp === 'word-break') {
|
|
309
|
+
return this.convertWordBreak(normalizedValue);
|
|
310
|
+
}
|
|
311
|
+
if (normalizedProp === 'z-index') {
|
|
312
|
+
return this.convertZIndex(normalizedValue);
|
|
313
|
+
}
|
|
121
314
|
return {
|
|
122
315
|
className: null,
|
|
123
316
|
skipped: true,
|
|
124
317
|
reason: `Unsupported property: ${property}`
|
|
125
318
|
};
|
|
126
319
|
}
|
|
320
|
+
convertPropertyWithMultiple(property, value) {
|
|
321
|
+
const normalizedProp = property.toLowerCase().trim();
|
|
322
|
+
const normalizedValue = value.toLowerCase().trim();
|
|
323
|
+
if (normalizedProp === 'margin' || normalizedProp === 'padding') {
|
|
324
|
+
return this.convertSpacingShorthand(normalizedProp, normalizedValue);
|
|
325
|
+
}
|
|
326
|
+
if (normalizedProp === 'border') {
|
|
327
|
+
return this.convertBorderShorthand(normalizedValue);
|
|
328
|
+
}
|
|
329
|
+
if (normalizedProp.startsWith('border-') &&
|
|
330
|
+
['border-top', 'border-right', 'border-bottom', 'border-left'].includes(normalizedProp)) {
|
|
331
|
+
return this.convertDirectionalBorderShorthand(normalizedProp, normalizedValue);
|
|
332
|
+
}
|
|
333
|
+
if (normalizedProp === 'flex') {
|
|
334
|
+
return this.convertFlexShorthand(normalizedValue);
|
|
335
|
+
}
|
|
336
|
+
if (normalizedProp === 'background') {
|
|
337
|
+
return this.convertBackgroundShorthand(normalizedValue);
|
|
338
|
+
}
|
|
339
|
+
const result = this.convertProperty(property, value);
|
|
340
|
+
return {
|
|
341
|
+
classes: result.className ? [result.className] : [],
|
|
342
|
+
warnings: result.reason ? [result.reason] : [],
|
|
343
|
+
cssProperties: result.className ? [property] : []
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
convertBackgroundShorthand(value) {
|
|
347
|
+
const classes = [];
|
|
348
|
+
const warnings = [];
|
|
349
|
+
const cssProperties = [];
|
|
350
|
+
if (value === 'transparent') {
|
|
351
|
+
classes.push('bg-transparent');
|
|
352
|
+
cssProperties.push('background-color');
|
|
353
|
+
return { classes, warnings, cssProperties };
|
|
354
|
+
}
|
|
355
|
+
if (value === 'none') {
|
|
356
|
+
classes.push('bg-none');
|
|
357
|
+
cssProperties.push('background-image');
|
|
358
|
+
return { classes, warnings, cssProperties };
|
|
359
|
+
}
|
|
360
|
+
const colorValue = this.extractColorFromBackground(value);
|
|
361
|
+
if (colorValue) {
|
|
362
|
+
if (colorValue.startsWith('#')) {
|
|
363
|
+
classes.push(`bg-[${colorValue}]`);
|
|
364
|
+
}
|
|
365
|
+
else if (colorValue.startsWith('rgb')) {
|
|
366
|
+
classes.push(`bg-[${colorValue}]`);
|
|
367
|
+
}
|
|
368
|
+
else if (colorValue.startsWith('hsl')) {
|
|
369
|
+
classes.push(`bg-[${colorValue}]`);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
const colorMap = {
|
|
373
|
+
'white': 'bg-white',
|
|
374
|
+
'black': 'bg-black',
|
|
375
|
+
'red': 'bg-red-500',
|
|
376
|
+
'blue': 'bg-blue-500',
|
|
377
|
+
'green': 'bg-green-500',
|
|
378
|
+
'gray': 'bg-gray-500',
|
|
379
|
+
'transparent': 'bg-transparent'
|
|
380
|
+
};
|
|
381
|
+
if (colorMap[colorValue]) {
|
|
382
|
+
classes.push(colorMap[colorValue]);
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
classes.push(`bg-${colorValue}`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
cssProperties.push('background-color');
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
warnings.push(`Cannot extract color from background shorthand: ${value}`);
|
|
392
|
+
}
|
|
393
|
+
return { classes, warnings, cssProperties };
|
|
394
|
+
}
|
|
395
|
+
extractColorFromBackground(value) {
|
|
396
|
+
const tokens = this.tokenizeValue(value);
|
|
397
|
+
for (const token of tokens) {
|
|
398
|
+
if (token.startsWith('#')) {
|
|
399
|
+
return token;
|
|
400
|
+
}
|
|
401
|
+
if (token.startsWith('rgb') || token.startsWith('hsl')) {
|
|
402
|
+
return token;
|
|
403
|
+
}
|
|
404
|
+
if (token.startsWith('url(') || token === 'none') {
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
if (/^(linear-gradient|radial-gradient|conic-gradient|repeating-linear-gradient|repeating-radial-gradient|repeating-conic-gradient)\(/i.test(token)) {
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
if (/^(repeat|no-repeat|repeat-x|repeat-y|space|round)$/i.test(token)) {
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
if (/^(scroll|fixed|local)$/i.test(token)) {
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
if (/^(center|top|bottom|left|right|\d+%|\d+px)/i.test(token)) {
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
if (/^(cover|contain)$/i.test(token)) {
|
|
420
|
+
continue;
|
|
421
|
+
}
|
|
422
|
+
if (/^(border-box|padding-box|content-box)$/i.test(token)) {
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
if (/^(clip|border|padding|content)$/i.test(token)) {
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
if (/^\d/.test(token) && !token.includes('gradient')) {
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
if (/^(transparent|white|black|red|blue|green|yellow|orange|purple|pink|gray|grey|brown|cyan|magenta|olive|lime|aqua|navy|teal|maroon|silver|fuchsia)$/i.test(token)) {
|
|
432
|
+
return token;
|
|
433
|
+
}
|
|
434
|
+
if (/^(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|blanchedalmond|blueviolet|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|gainsboro|ghostwhite|gold|goldenrod|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|limegreen|linen|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|oldlace|olivedrab|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|plum|powderblue|rebeccapurple|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|thistle|tomato|turquoise|violet|wheat|whitesmoke|yellowgreen)$/i.test(token)) {
|
|
435
|
+
return token;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return null;
|
|
439
|
+
}
|
|
440
|
+
convertSpacingShorthand(prop, value) {
|
|
441
|
+
const tokens = this.tokenizeValue(value);
|
|
442
|
+
const classes = [];
|
|
443
|
+
const warnings = [];
|
|
444
|
+
const cssProperties = [];
|
|
445
|
+
const prefix = prop === 'margin' ? 'm' : 'p';
|
|
446
|
+
const propPrefix = prop === 'margin' ? 'margin' : 'padding';
|
|
447
|
+
if (tokens.length === 0) {
|
|
448
|
+
return { classes, warnings: ['Empty spacing value'], cssProperties };
|
|
449
|
+
}
|
|
450
|
+
const parsedTokens = tokens.map(t => this.parseSpacingValue(t));
|
|
451
|
+
if (tokens.length === 1) {
|
|
452
|
+
const parsed = parsedTokens[0];
|
|
453
|
+
if (parsed.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
|
|
454
|
+
classes.push(this.buildSpacingUtility(prefix, parsed));
|
|
455
|
+
cssProperties.push(prop);
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
warnings.push(`Invalid ${prop} value: ${tokens[0]}`);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
else if (tokens.length === 2) {
|
|
462
|
+
const [vertical, horizontal] = parsedTokens;
|
|
463
|
+
if (vertical.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
|
|
464
|
+
classes.push(this.buildSpacingUtility(`${prefix}y`, vertical));
|
|
465
|
+
cssProperties.push(`${propPrefix}-y`);
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
warnings.push(`Invalid ${prop} vertical value: ${tokens[0]}`);
|
|
469
|
+
}
|
|
470
|
+
if (horizontal.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[1])) {
|
|
471
|
+
classes.push(this.buildSpacingUtility(`${prefix}x`, horizontal));
|
|
472
|
+
cssProperties.push(`${propPrefix}-x`);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
warnings.push(`Invalid ${prop} horizontal value: ${tokens[1]}`);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
else if (tokens.length === 3) {
|
|
479
|
+
const [top, horizontal, bottom] = parsedTokens;
|
|
480
|
+
if (top.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
|
|
481
|
+
classes.push(this.buildSpacingUtility(`${prefix}t`, top));
|
|
482
|
+
cssProperties.push(`${propPrefix}-top`);
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
warnings.push(`Invalid ${prop}-top value: ${tokens[0]}`);
|
|
486
|
+
}
|
|
487
|
+
if (horizontal.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[1])) {
|
|
488
|
+
classes.push(this.buildSpacingUtility(`${prefix}x`, horizontal));
|
|
489
|
+
cssProperties.push(`${propPrefix}-x`);
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
warnings.push(`Invalid ${prop} horizontal value: ${tokens[1]}`);
|
|
493
|
+
}
|
|
494
|
+
if (bottom.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[2])) {
|
|
495
|
+
classes.push(this.buildSpacingUtility(`${prefix}b`, bottom));
|
|
496
|
+
cssProperties.push(`${propPrefix}-bottom`);
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
warnings.push(`Invalid ${prop}-bottom value: ${tokens[2]}`);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
else if (tokens.length >= 4) {
|
|
503
|
+
const [top, right, bottom, left] = parsedTokens;
|
|
504
|
+
if (top.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[0])) {
|
|
505
|
+
classes.push(this.buildSpacingUtility(`${prefix}t`, top));
|
|
506
|
+
cssProperties.push(`${propPrefix}-top`);
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
warnings.push(`Invalid ${prop}-top value: ${tokens[0]}`);
|
|
510
|
+
}
|
|
511
|
+
if (right.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[1])) {
|
|
512
|
+
classes.push(this.buildSpacingUtility(`${prefix}r`, right));
|
|
513
|
+
cssProperties.push(`${propPrefix}-right`);
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
warnings.push(`Invalid ${prop}-right value: ${tokens[1]}`);
|
|
517
|
+
}
|
|
518
|
+
if (bottom.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[2])) {
|
|
519
|
+
classes.push(this.buildSpacingUtility(`${prefix}b`, bottom));
|
|
520
|
+
cssProperties.push(`${propPrefix}-bottom`);
|
|
521
|
+
}
|
|
522
|
+
else {
|
|
523
|
+
warnings.push(`Invalid ${prop}-bottom value: ${tokens[2]}`);
|
|
524
|
+
}
|
|
525
|
+
if (left.px !== null || /^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(tokens[3])) {
|
|
526
|
+
classes.push(this.buildSpacingUtility(`${prefix}l`, left));
|
|
527
|
+
cssProperties.push(`${propPrefix}-left`);
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
warnings.push(`Invalid ${prop}-left value: ${tokens[3]}`);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
return { classes, warnings, cssProperties };
|
|
534
|
+
}
|
|
127
535
|
convertDisplay(value) {
|
|
128
536
|
const displayMap = {
|
|
129
537
|
'flex': 'flex',
|
|
@@ -131,10 +539,14 @@ class TailwindMapper {
|
|
|
131
539
|
'inline': 'inline',
|
|
132
540
|
'inline-block': 'inline-block',
|
|
133
541
|
'grid': 'grid',
|
|
542
|
+
'inline-flex': 'inline-flex',
|
|
543
|
+
'inline-grid': 'inline-grid',
|
|
134
544
|
'none': 'hidden',
|
|
135
545
|
'contents': 'contents',
|
|
136
546
|
'table': 'table',
|
|
137
|
-
'table-cell': 'table-cell'
|
|
547
|
+
'table-cell': 'table-cell',
|
|
548
|
+
'table-row': 'table-row',
|
|
549
|
+
'flow-root': 'flow-root'
|
|
138
550
|
};
|
|
139
551
|
if (displayMap[value]) {
|
|
140
552
|
return { className: displayMap[value], skipped: false };
|
|
@@ -142,7 +554,6 @@ class TailwindMapper {
|
|
|
142
554
|
return { className: null, skipped: true, reason: `Unknown display value: ${value}` };
|
|
143
555
|
}
|
|
144
556
|
convertMargin(prop, value) {
|
|
145
|
-
const px = this.extractPx(value);
|
|
146
557
|
const sideMap = {
|
|
147
558
|
'margin': 'm',
|
|
148
559
|
'margin-top': 'mt',
|
|
@@ -153,8 +564,14 @@ class TailwindMapper {
|
|
|
153
564
|
'margin-y': 'my'
|
|
154
565
|
};
|
|
155
566
|
const prefix = sideMap[prop] || 'm';
|
|
567
|
+
const isNegative = value.startsWith('-');
|
|
568
|
+
const absoluteValue = isNegative ? value.slice(1) : value;
|
|
569
|
+
const px = this.extractPx(absoluteValue);
|
|
570
|
+
if (value === 'auto') {
|
|
571
|
+
return { className: `${prefix}-auto`, skipped: false };
|
|
572
|
+
}
|
|
156
573
|
if (px === null) {
|
|
157
|
-
if (/^-?\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
|
|
574
|
+
if (/^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
|
|
158
575
|
return { className: `${prefix}-[${value}]`, skipped: false };
|
|
159
576
|
}
|
|
160
577
|
return { className: null, skipped: true, reason: `Non-pixel margin value: ${value}` };
|
|
@@ -163,7 +580,7 @@ class TailwindMapper {
|
|
|
163
580
|
if (!spacing) {
|
|
164
581
|
return { className: `${prefix}-[${value}]`, skipped: false };
|
|
165
582
|
}
|
|
166
|
-
return { className: `${prefix}-${spacing}`, skipped: false };
|
|
583
|
+
return { className: isNegative ? `-${prefix}-${spacing}` : `${prefix}-${spacing}`, skipped: false };
|
|
167
584
|
}
|
|
168
585
|
convertPadding(prop, value) {
|
|
169
586
|
const px = this.extractPx(value);
|
|
@@ -178,7 +595,7 @@ class TailwindMapper {
|
|
|
178
595
|
};
|
|
179
596
|
const prefix = sideMap[prop] || 'p';
|
|
180
597
|
if (px === null) {
|
|
181
|
-
if (/^-?\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
|
|
598
|
+
if (/^-?\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
|
|
182
599
|
return { className: `${prefix}-[${value}]`, skipped: false };
|
|
183
600
|
}
|
|
184
601
|
return { className: null, skipped: true, reason: `Non-pixel padding value: ${value}` };
|
|
@@ -189,6 +606,56 @@ class TailwindMapper {
|
|
|
189
606
|
}
|
|
190
607
|
return { className: `${prefix}-${spacing}`, skipped: false };
|
|
191
608
|
}
|
|
609
|
+
convertDimensionConstraint(prop, value) {
|
|
610
|
+
const prefixMap = {
|
|
611
|
+
'max-width': 'max-w',
|
|
612
|
+
'min-width': 'min-w',
|
|
613
|
+
'max-height': 'max-h',
|
|
614
|
+
'min-height': 'min-h'
|
|
615
|
+
};
|
|
616
|
+
const prefix = prefixMap[prop];
|
|
617
|
+
if (value === '100%') {
|
|
618
|
+
return { className: `${prefix}-full`, skipped: false };
|
|
619
|
+
}
|
|
620
|
+
if (value === '0' || value === '0px') {
|
|
621
|
+
return { className: `${prefix}-0`, skipped: false };
|
|
622
|
+
}
|
|
623
|
+
if (value === 'none') {
|
|
624
|
+
return { className: `${prefix}-none`, skipped: false };
|
|
625
|
+
}
|
|
626
|
+
if (prop === 'max-width') {
|
|
627
|
+
if (value === 'min-content') {
|
|
628
|
+
return { className: 'max-w-min', skipped: false };
|
|
629
|
+
}
|
|
630
|
+
if (value === 'max-content') {
|
|
631
|
+
return { className: 'max-w-max', skipped: false };
|
|
632
|
+
}
|
|
633
|
+
if (value === 'fit-content') {
|
|
634
|
+
return { className: 'max-w-fit', skipped: false };
|
|
635
|
+
}
|
|
636
|
+
const maxWProseSizes = {
|
|
637
|
+
'65ch': 'prose',
|
|
638
|
+
'80ch': 'prose-lg'
|
|
639
|
+
};
|
|
640
|
+
if (maxWProseSizes[value]) {
|
|
641
|
+
return { className: `max-w-${maxWProseSizes[value]}`, skipped: false };
|
|
642
|
+
}
|
|
643
|
+
if (this.maxWidthScale.has(value)) {
|
|
644
|
+
return { className: `max-w-${this.maxWidthScale.get(value)}`, skipped: false };
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
const px = this.extractPx(value);
|
|
648
|
+
if (px !== null) {
|
|
649
|
+
const spacing = this.pxToSpacing(px);
|
|
650
|
+
if (spacing) {
|
|
651
|
+
return { className: `${prefix}-${spacing}`, skipped: false };
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
if (/^\d+(\.\d+)?(px|rem|em|%|ch|vw|vh)?$/.test(value)) {
|
|
655
|
+
return { className: `${prefix}-[${value}]`, skipped: false };
|
|
656
|
+
}
|
|
657
|
+
return { className: null, skipped: true, reason: `Complex ${prop} value: ${value}` };
|
|
658
|
+
}
|
|
192
659
|
convertFontWeight(value) {
|
|
193
660
|
const weightMap = {
|
|
194
661
|
'100': 'font-thin',
|
|
@@ -211,33 +678,86 @@ class TailwindMapper {
|
|
|
211
678
|
convertFontSize(value) {
|
|
212
679
|
const px = this.extractPx(value);
|
|
213
680
|
if (px !== null) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
12: 'text-xs',
|
|
217
|
-
14: 'text-sm',
|
|
218
|
-
16: 'text-base',
|
|
219
|
-
18: 'text-lg',
|
|
220
|
-
20: 'text-xl',
|
|
221
|
-
24: 'text-2xl',
|
|
222
|
-
30: 'text-3xl',
|
|
223
|
-
36: 'text-4xl',
|
|
224
|
-
48: 'text-5xl'
|
|
225
|
-
};
|
|
226
|
-
const closest = Object.keys(sizeMap)
|
|
227
|
-
.map(Number)
|
|
228
|
-
.reduce((prev, curr) => Math.abs(curr - px) < Math.abs(prev - px) ? curr : prev);
|
|
229
|
-
if (Math.abs(closest - px) / px < 0.15) {
|
|
230
|
-
return { className: sizeMap[closest], skipped: false };
|
|
681
|
+
if (this.fontSizeScale.has(px)) {
|
|
682
|
+
return { className: `text-${this.fontSizeScale.get(px)}`, skipped: false };
|
|
231
683
|
}
|
|
232
684
|
return { className: `text-[${value}]`, skipped: false };
|
|
233
685
|
}
|
|
234
|
-
if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
|
|
686
|
+
if (/^\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
|
|
235
687
|
return { className: `text-[${value}]`, skipped: false };
|
|
236
688
|
}
|
|
237
689
|
return { className: null, skipped: true, reason: `Non-standard font-size: ${value}` };
|
|
238
690
|
}
|
|
691
|
+
convertTextDecoration(value) {
|
|
692
|
+
const decorationMap = {
|
|
693
|
+
'underline': 'underline',
|
|
694
|
+
'line-through': 'line-through',
|
|
695
|
+
'none': 'no-underline',
|
|
696
|
+
'no-underline': 'no-underline'
|
|
697
|
+
};
|
|
698
|
+
if (decorationMap[value]) {
|
|
699
|
+
return { className: decorationMap[value], skipped: false };
|
|
700
|
+
}
|
|
701
|
+
logger_1.logger.warn(`Unsupported text-decoration value: ${value}`);
|
|
702
|
+
return { className: null, skipped: true, reason: `Unsupported text-decoration: ${value}` };
|
|
703
|
+
}
|
|
704
|
+
convertTextTransform(value) {
|
|
705
|
+
const transformMap = {
|
|
706
|
+
'uppercase': 'uppercase',
|
|
707
|
+
'lowercase': 'lowercase',
|
|
708
|
+
'capitalize': 'capitalize',
|
|
709
|
+
'none': 'normal-case',
|
|
710
|
+
'initial': 'normal-case'
|
|
711
|
+
};
|
|
712
|
+
if (transformMap[value]) {
|
|
713
|
+
return { className: transformMap[value], skipped: false };
|
|
714
|
+
}
|
|
715
|
+
return { className: null, skipped: true, reason: `Unknown text-transform: ${value}` };
|
|
716
|
+
}
|
|
717
|
+
convertLetterSpacing(value) {
|
|
718
|
+
if (this.letterSpacingScale.has(value)) {
|
|
719
|
+
return { className: `tracking-${this.letterSpacingScale.get(value)}`, skipped: false };
|
|
720
|
+
}
|
|
721
|
+
const knownMappings = {
|
|
722
|
+
'-0.025em': 'tight',
|
|
723
|
+
'-0.05em': 'tighter',
|
|
724
|
+
'0.025em': 'wide',
|
|
725
|
+
'0.05em': 'wider',
|
|
726
|
+
'0.1em': 'widest',
|
|
727
|
+
'0em': 'normal'
|
|
728
|
+
};
|
|
729
|
+
if (knownMappings[value]) {
|
|
730
|
+
return { className: `tracking-${knownMappings[value]}`, skipped: false };
|
|
731
|
+
}
|
|
732
|
+
if (/^-?\d+(\.\d+)?(em|px|rem)?$/.test(value)) {
|
|
733
|
+
return { className: `tracking-[${value}]`, skipped: false };
|
|
734
|
+
}
|
|
735
|
+
return { className: null, skipped: true, reason: `Unknown letter-spacing: ${value}` };
|
|
736
|
+
}
|
|
737
|
+
convertLineHeight(value) {
|
|
738
|
+
if (this.lineHeightScale.has(value)) {
|
|
739
|
+
return { className: `leading-${this.lineHeightScale.get(value)}`, skipped: false };
|
|
740
|
+
}
|
|
741
|
+
const knownMappings = {
|
|
742
|
+
'1': 'none',
|
|
743
|
+
'1.25': 'tight',
|
|
744
|
+
'1.375': 'snug',
|
|
745
|
+
'1.5': 'normal',
|
|
746
|
+
'1.625': 'relaxed',
|
|
747
|
+
'2': 'loose'
|
|
748
|
+
};
|
|
749
|
+
if (knownMappings[value]) {
|
|
750
|
+
return { className: `leading-${knownMappings[value]}`, skipped: false };
|
|
751
|
+
}
|
|
752
|
+
if (/^\d+(\.\d+)?$/.test(value)) {
|
|
753
|
+
return { className: `leading-[${value}]`, skipped: false };
|
|
754
|
+
}
|
|
755
|
+
if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
|
|
756
|
+
return { className: `leading-[${value}]`, skipped: false };
|
|
757
|
+
}
|
|
758
|
+
return { className: null, skipped: true, reason: `Unknown line-height: ${value}` };
|
|
759
|
+
}
|
|
239
760
|
convertFlexbox(prop, value) {
|
|
240
|
-
// Flex direction
|
|
241
761
|
if (prop === 'flex-direction') {
|
|
242
762
|
const dirMap = {
|
|
243
763
|
'row': 'flex-row',
|
|
@@ -247,7 +767,6 @@ class TailwindMapper {
|
|
|
247
767
|
};
|
|
248
768
|
return { className: dirMap[value] || null, skipped: !dirMap[value] };
|
|
249
769
|
}
|
|
250
|
-
// Flex wrap
|
|
251
770
|
if (prop === 'flex-wrap') {
|
|
252
771
|
const wrapMap = {
|
|
253
772
|
'wrap': 'flex-wrap',
|
|
@@ -256,7 +775,6 @@ class TailwindMapper {
|
|
|
256
775
|
};
|
|
257
776
|
return { className: wrapMap[value] || null, skipped: !wrapMap[value] };
|
|
258
777
|
}
|
|
259
|
-
// Justify content
|
|
260
778
|
if (prop === 'justify-content') {
|
|
261
779
|
const justifyMap = {
|
|
262
780
|
'flex-start': 'justify-start',
|
|
@@ -268,7 +786,6 @@ class TailwindMapper {
|
|
|
268
786
|
};
|
|
269
787
|
return { className: justifyMap[value] || null, skipped: !justifyMap[value] };
|
|
270
788
|
}
|
|
271
|
-
// Align items
|
|
272
789
|
if (prop === 'align-items') {
|
|
273
790
|
const alignMap = {
|
|
274
791
|
'flex-start': 'items-start',
|
|
@@ -279,21 +796,138 @@ class TailwindMapper {
|
|
|
279
796
|
};
|
|
280
797
|
return { className: alignMap[value] || null, skipped: !alignMap[value] };
|
|
281
798
|
}
|
|
799
|
+
if (prop === 'align-content') {
|
|
800
|
+
const alignMap = {
|
|
801
|
+
'flex-start': 'content-start',
|
|
802
|
+
'flex-end': 'content-end',
|
|
803
|
+
'center': 'content-center',
|
|
804
|
+
'space-between': 'content-between',
|
|
805
|
+
'space-around': 'content-around',
|
|
806
|
+
'stretch': 'content-stretch'
|
|
807
|
+
};
|
|
808
|
+
return { className: alignMap[value] || null, skipped: !alignMap[value] };
|
|
809
|
+
}
|
|
810
|
+
if (prop === 'align-self') {
|
|
811
|
+
const alignSelfMap = {
|
|
812
|
+
'auto': 'self-auto',
|
|
813
|
+
'flex-start': 'self-start',
|
|
814
|
+
'flex-end': 'self-end',
|
|
815
|
+
'center': 'self-center',
|
|
816
|
+
'stretch': 'self-stretch',
|
|
817
|
+
'baseline': 'self-baseline'
|
|
818
|
+
};
|
|
819
|
+
return { className: alignSelfMap[value] || null, skipped: !alignSelfMap[value] };
|
|
820
|
+
}
|
|
821
|
+
if (prop === 'flex-grow') {
|
|
822
|
+
if (value === '0') {
|
|
823
|
+
return { className: 'grow-0', skipped: false };
|
|
824
|
+
}
|
|
825
|
+
if (value === '1') {
|
|
826
|
+
return { className: 'grow', skipped: false };
|
|
827
|
+
}
|
|
828
|
+
return { className: `grow-[${value}]`, skipped: false };
|
|
829
|
+
}
|
|
830
|
+
if (prop === 'flex-shrink') {
|
|
831
|
+
if (value === '0') {
|
|
832
|
+
return { className: 'shrink-0', skipped: false };
|
|
833
|
+
}
|
|
834
|
+
if (value === '1') {
|
|
835
|
+
return { className: 'shrink', skipped: false };
|
|
836
|
+
}
|
|
837
|
+
return { className: `shrink-[${value}]`, skipped: false };
|
|
838
|
+
}
|
|
839
|
+
if (prop === 'flex-basis') {
|
|
840
|
+
if (value === 'auto') {
|
|
841
|
+
return { className: 'basis-auto', skipped: false };
|
|
842
|
+
}
|
|
843
|
+
if (value === '0' || value === '0px') {
|
|
844
|
+
return { className: 'basis-0', skipped: false };
|
|
845
|
+
}
|
|
846
|
+
const px = this.extractPx(value);
|
|
847
|
+
if (px !== null) {
|
|
848
|
+
const spacing = this.pxToSpacing(px);
|
|
849
|
+
if (spacing) {
|
|
850
|
+
return { className: `basis-${spacing}`, skipped: false };
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
if (/^\d+(\.\d+)?(px|rem|em|%|vw|vh)?$/.test(value)) {
|
|
854
|
+
return { className: `basis-[${value}]`, skipped: false };
|
|
855
|
+
}
|
|
856
|
+
}
|
|
282
857
|
return { className: null, skipped: true, reason: `Unsupported flexbox property: ${prop}` };
|
|
283
858
|
}
|
|
859
|
+
convertFlexShorthand(value) {
|
|
860
|
+
const classes = [];
|
|
861
|
+
const warnings = [];
|
|
862
|
+
const cssProperties = [];
|
|
863
|
+
if (value === '1') {
|
|
864
|
+
classes.push('flex-1');
|
|
865
|
+
cssProperties.push('flex');
|
|
866
|
+
return { classes, warnings, cssProperties };
|
|
867
|
+
}
|
|
868
|
+
if (value === 'auto') {
|
|
869
|
+
classes.push('flex-auto');
|
|
870
|
+
cssProperties.push('flex');
|
|
871
|
+
return { classes, warnings, cssProperties };
|
|
872
|
+
}
|
|
873
|
+
if (value === 'none') {
|
|
874
|
+
classes.push('flex-none');
|
|
875
|
+
cssProperties.push('flex');
|
|
876
|
+
return { classes, warnings, cssProperties };
|
|
877
|
+
}
|
|
878
|
+
if (value === 'initial') {
|
|
879
|
+
classes.push('flex-initial');
|
|
880
|
+
cssProperties.push('flex');
|
|
881
|
+
return { classes, warnings, cssProperties };
|
|
882
|
+
}
|
|
883
|
+
const tokens = this.tokenizeValue(value);
|
|
884
|
+
if (tokens.length === 3) {
|
|
885
|
+
const [grow, shrink, basis] = tokens;
|
|
886
|
+
if (grow === '1' && shrink === '1' && basis === '0%') {
|
|
887
|
+
classes.push('flex-1');
|
|
888
|
+
cssProperties.push('flex');
|
|
889
|
+
}
|
|
890
|
+
else if (grow === '1' && shrink === '1' && basis === 'auto') {
|
|
891
|
+
classes.push('flex-auto');
|
|
892
|
+
cssProperties.push('flex');
|
|
893
|
+
}
|
|
894
|
+
else if (grow === '0' && shrink === '1' && basis === 'auto') {
|
|
895
|
+
classes.push('flex-initial');
|
|
896
|
+
cssProperties.push('flex');
|
|
897
|
+
}
|
|
898
|
+
else if (grow === '0' && shrink === '0' && basis === 'auto') {
|
|
899
|
+
classes.push('flex-none');
|
|
900
|
+
cssProperties.push('flex');
|
|
901
|
+
}
|
|
902
|
+
else {
|
|
903
|
+
classes.push(`flex-[${value}]`);
|
|
904
|
+
cssProperties.push('flex');
|
|
905
|
+
}
|
|
906
|
+
return { classes, warnings, cssProperties };
|
|
907
|
+
}
|
|
908
|
+
if (tokens.length === 1 || tokens.length === 2) {
|
|
909
|
+
classes.push(`flex-[${value}]`);
|
|
910
|
+
cssProperties.push('flex');
|
|
911
|
+
return { classes, warnings, cssProperties };
|
|
912
|
+
}
|
|
913
|
+
warnings.push(`Complex flex shorthand: ${value}`);
|
|
914
|
+
return { classes, warnings, cssProperties };
|
|
915
|
+
}
|
|
284
916
|
convertGap(value) {
|
|
285
917
|
const px = this.extractPx(value);
|
|
286
918
|
if (px === null) {
|
|
919
|
+
if (/^\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
|
|
920
|
+
return { className: `gap-[${value}]`, skipped: false };
|
|
921
|
+
}
|
|
287
922
|
return { className: null, skipped: true, reason: `Non-pixel gap value: ${value}` };
|
|
288
923
|
}
|
|
289
924
|
const spacing = this.pxToSpacing(px);
|
|
290
925
|
if (!spacing) {
|
|
291
|
-
return { className:
|
|
926
|
+
return { className: `gap-[${value}]`, skipped: false };
|
|
292
927
|
}
|
|
293
928
|
return { className: `gap-${spacing}`, skipped: false };
|
|
294
929
|
}
|
|
295
930
|
convertWidth(value) {
|
|
296
|
-
// Handle percentage values
|
|
297
931
|
if (value === '100%') {
|
|
298
932
|
return { className: 'w-full', skipped: false };
|
|
299
933
|
}
|
|
@@ -312,27 +946,53 @@ class TailwindMapper {
|
|
|
312
946
|
if (value === '75%') {
|
|
313
947
|
return { className: 'w-3/4', skipped: false };
|
|
314
948
|
}
|
|
315
|
-
|
|
949
|
+
if (value === 'auto') {
|
|
950
|
+
return { className: 'w-auto', skipped: false };
|
|
951
|
+
}
|
|
952
|
+
if (value === 'fit-content') {
|
|
953
|
+
return { className: 'w-fit', skipped: false };
|
|
954
|
+
}
|
|
955
|
+
if (value === 'min-content') {
|
|
956
|
+
return { className: 'w-min', skipped: false };
|
|
957
|
+
}
|
|
958
|
+
if (value === 'max-content') {
|
|
959
|
+
return { className: 'w-max', skipped: false };
|
|
960
|
+
}
|
|
316
961
|
const px = this.extractPx(value);
|
|
317
962
|
if (px !== null) {
|
|
318
963
|
const spacing = this.pxToSpacing(px);
|
|
319
964
|
if (spacing) {
|
|
320
965
|
return { className: `w-${spacing}`, skipped: false };
|
|
321
966
|
}
|
|
322
|
-
|
|
967
|
+
return { className: `w-[${value}]`, skipped: false };
|
|
968
|
+
}
|
|
969
|
+
if (/^\d+(\.\d+)?(px|rem|em|%|vw)?$/.test(value)) {
|
|
323
970
|
return { className: `w-[${value}]`, skipped: false };
|
|
324
971
|
}
|
|
325
972
|
return { className: null, skipped: true, reason: `Complex width value: ${value}` };
|
|
326
973
|
}
|
|
327
974
|
convertHeight(value) {
|
|
328
|
-
// Handle percentage values
|
|
329
975
|
if (value === '100%') {
|
|
330
976
|
return { className: 'h-full', skipped: false };
|
|
331
977
|
}
|
|
332
978
|
if (value === '50%') {
|
|
333
979
|
return { className: 'h-1/2', skipped: false };
|
|
334
980
|
}
|
|
335
|
-
|
|
981
|
+
if (value === 'auto') {
|
|
982
|
+
return { className: 'h-auto', skipped: false };
|
|
983
|
+
}
|
|
984
|
+
if (value === 'fit-content') {
|
|
985
|
+
return { className: 'h-fit', skipped: false };
|
|
986
|
+
}
|
|
987
|
+
if (value === 'min-content') {
|
|
988
|
+
return { className: 'h-min', skipped: false };
|
|
989
|
+
}
|
|
990
|
+
if (value === 'max-content') {
|
|
991
|
+
return { className: 'h-max', skipped: false };
|
|
992
|
+
}
|
|
993
|
+
if (value === '100vh') {
|
|
994
|
+
return { className: 'h-screen', skipped: false };
|
|
995
|
+
}
|
|
336
996
|
const px = this.extractPx(value);
|
|
337
997
|
if (px !== null) {
|
|
338
998
|
const spacing = this.pxToSpacing(px);
|
|
@@ -341,10 +1001,12 @@ class TailwindMapper {
|
|
|
341
1001
|
}
|
|
342
1002
|
return { className: `h-[${value}]`, skipped: false };
|
|
343
1003
|
}
|
|
1004
|
+
if (/^\d+(\.\d+)?(px|rem|em|%|vh)?$/.test(value)) {
|
|
1005
|
+
return { className: `h-[${value}]`, skipped: false };
|
|
1006
|
+
}
|
|
344
1007
|
return { className: null, skipped: true, reason: `Complex height value: ${value}` };
|
|
345
1008
|
}
|
|
346
1009
|
convertBackgroundColor(value) {
|
|
347
|
-
// Handle named colors and hex
|
|
348
1010
|
const colorMap = {
|
|
349
1011
|
'transparent': 'bg-transparent',
|
|
350
1012
|
'white': 'bg-white',
|
|
@@ -357,11 +1019,9 @@ class TailwindMapper {
|
|
|
357
1019
|
if (colorMap[value]) {
|
|
358
1020
|
return { className: colorMap[value], skipped: false };
|
|
359
1021
|
}
|
|
360
|
-
// Handle hex colors - use arbitrary values
|
|
361
1022
|
if (value.startsWith('#')) {
|
|
362
1023
|
return { className: `bg-[${value}]`, skipped: false };
|
|
363
1024
|
}
|
|
364
|
-
// Handle rgb/rgba
|
|
365
1025
|
if (value.startsWith('rgb')) {
|
|
366
1026
|
return { className: `bg-[${value}]`, skipped: false };
|
|
367
1027
|
}
|
|
@@ -391,13 +1051,14 @@ class TailwindMapper {
|
|
|
391
1051
|
convertBorderRadius(value) {
|
|
392
1052
|
const px = this.extractPx(value);
|
|
393
1053
|
if (px === null) {
|
|
394
|
-
// Handle named values
|
|
395
1054
|
if (value === '50%') {
|
|
396
1055
|
return { className: 'rounded-full', skipped: false };
|
|
397
1056
|
}
|
|
1057
|
+
if (/^\d+(\.\d+)?(px|rem|em|%)?$/.test(value)) {
|
|
1058
|
+
return { className: `rounded-[${value}]`, skipped: false };
|
|
1059
|
+
}
|
|
398
1060
|
return { className: null, skipped: true, reason: `Complex border-radius: ${value}` };
|
|
399
1061
|
}
|
|
400
|
-
// Map to Tailwind radius scale
|
|
401
1062
|
const radiusMap = {
|
|
402
1063
|
0: 'rounded-none',
|
|
403
1064
|
2: 'rounded-sm',
|
|
@@ -414,25 +1075,374 @@ class TailwindMapper {
|
|
|
414
1075
|
if (Math.abs(closest - px) / (px || 1) < 0.2) {
|
|
415
1076
|
return { className: radiusMap[closest], skipped: false };
|
|
416
1077
|
}
|
|
417
|
-
// Use arbitrary value
|
|
418
1078
|
return { className: `rounded-[${value}]`, skipped: false };
|
|
419
1079
|
}
|
|
1080
|
+
convertBorder(prop, value) {
|
|
1081
|
+
if (prop === 'border-width') {
|
|
1082
|
+
const widthMap = {
|
|
1083
|
+
'0': 'border-0',
|
|
1084
|
+
'1px': 'border',
|
|
1085
|
+
'2px': 'border-2',
|
|
1086
|
+
'4px': 'border-4',
|
|
1087
|
+
'8px': 'border-8'
|
|
1088
|
+
};
|
|
1089
|
+
if (widthMap[value]) {
|
|
1090
|
+
return { className: widthMap[value], skipped: false };
|
|
1091
|
+
}
|
|
1092
|
+
if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
|
|
1093
|
+
return { className: `border-[${value}]`, skipped: false };
|
|
1094
|
+
}
|
|
1095
|
+
return { className: null, skipped: true, reason: `Unknown border-width: ${value}` };
|
|
1096
|
+
}
|
|
1097
|
+
if (prop === 'border-style') {
|
|
1098
|
+
const styleMap = {
|
|
1099
|
+
'solid': '',
|
|
1100
|
+
'dashed': 'border-dashed',
|
|
1101
|
+
'dotted': 'border-dotted',
|
|
1102
|
+
'double': 'border-double',
|
|
1103
|
+
'hidden': 'border-hidden',
|
|
1104
|
+
'none': 'border-none'
|
|
1105
|
+
};
|
|
1106
|
+
if (value === 'solid') {
|
|
1107
|
+
return { className: null, skipped: false };
|
|
1108
|
+
}
|
|
1109
|
+
if (styleMap[value]) {
|
|
1110
|
+
return { className: styleMap[value], skipped: false };
|
|
1111
|
+
}
|
|
1112
|
+
return { className: null, skipped: true, reason: `Unknown border-style: ${value}` };
|
|
1113
|
+
}
|
|
1114
|
+
if (prop === 'border-color') {
|
|
1115
|
+
if (value.startsWith('#')) {
|
|
1116
|
+
return { className: `border-[${value}]`, skipped: false };
|
|
1117
|
+
}
|
|
1118
|
+
if (value.startsWith('rgb')) {
|
|
1119
|
+
return { className: `border-[${value}]`, skipped: false };
|
|
1120
|
+
}
|
|
1121
|
+
const colorMap = {
|
|
1122
|
+
'transparent': 'border-transparent',
|
|
1123
|
+
'white': 'border-white',
|
|
1124
|
+
'black': 'border-black',
|
|
1125
|
+
'red': 'border-red-500',
|
|
1126
|
+
'blue': 'border-blue-500',
|
|
1127
|
+
'green': 'border-green-500',
|
|
1128
|
+
'gray': 'border-gray-500'
|
|
1129
|
+
};
|
|
1130
|
+
if (colorMap[value]) {
|
|
1131
|
+
return { className: colorMap[value], skipped: false };
|
|
1132
|
+
}
|
|
1133
|
+
return { className: `border-${value}`, skipped: false };
|
|
1134
|
+
}
|
|
1135
|
+
if (prop === 'border-top-width' || prop === 'border-right-width' ||
|
|
1136
|
+
prop === 'border-bottom-width' || prop === 'border-left-width') {
|
|
1137
|
+
const sideMap = {
|
|
1138
|
+
'border-top-width': 'border-t',
|
|
1139
|
+
'border-right-width': 'border-r',
|
|
1140
|
+
'border-bottom-width': 'border-b',
|
|
1141
|
+
'border-left-width': 'border-l'
|
|
1142
|
+
};
|
|
1143
|
+
const prefix = sideMap[prop];
|
|
1144
|
+
const widthMap = {
|
|
1145
|
+
'0': `${prefix}-0`,
|
|
1146
|
+
'1px': prefix,
|
|
1147
|
+
'2px': `${prefix}-2`,
|
|
1148
|
+
'4px': `${prefix}-4`,
|
|
1149
|
+
'8px': `${prefix}-8`
|
|
1150
|
+
};
|
|
1151
|
+
if (widthMap[value]) {
|
|
1152
|
+
return { className: widthMap[value], skipped: false };
|
|
1153
|
+
}
|
|
1154
|
+
if (/^\d+(\.\d+)?(px|rem|em)?$/.test(value)) {
|
|
1155
|
+
return { className: `${prefix}-[${value}]`, skipped: false };
|
|
1156
|
+
}
|
|
1157
|
+
return { className: null, skipped: true, reason: `Unknown ${prop}: ${value}` };
|
|
1158
|
+
}
|
|
1159
|
+
return { className: null, skipped: true, reason: `Unknown border property: ${prop}` };
|
|
1160
|
+
}
|
|
1161
|
+
convertBorderShorthand(value) {
|
|
1162
|
+
const classes = [];
|
|
1163
|
+
const warnings = [];
|
|
1164
|
+
const cssProperties = [];
|
|
1165
|
+
const tokens = this.tokenizeValue(value);
|
|
1166
|
+
let width = null;
|
|
1167
|
+
let style = null;
|
|
1168
|
+
let color = null;
|
|
1169
|
+
for (const token of tokens) {
|
|
1170
|
+
if (/^\d+(\.\d+)?(px|rem|em|thin|medium|thick)?$/.test(token) ||
|
|
1171
|
+
token === 'thin' || token === 'medium' || token === 'thick') {
|
|
1172
|
+
width = token;
|
|
1173
|
+
}
|
|
1174
|
+
else if (['solid', 'dashed', 'dotted', 'double', 'hidden', 'none', 'groove', 'ridge', 'inset', 'outset'].includes(token)) {
|
|
1175
|
+
style = token;
|
|
1176
|
+
}
|
|
1177
|
+
else {
|
|
1178
|
+
color = token;
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
if (width) {
|
|
1182
|
+
const widthMap = {
|
|
1183
|
+
'0': 'border-0',
|
|
1184
|
+
'1px': 'border',
|
|
1185
|
+
'2px': 'border-2',
|
|
1186
|
+
'4px': 'border-4',
|
|
1187
|
+
'8px': 'border-8',
|
|
1188
|
+
'thin': 'border',
|
|
1189
|
+
'medium': 'border-2',
|
|
1190
|
+
'thick': 'border-4'
|
|
1191
|
+
};
|
|
1192
|
+
if (widthMap[width]) {
|
|
1193
|
+
classes.push(widthMap[width]);
|
|
1194
|
+
}
|
|
1195
|
+
else {
|
|
1196
|
+
classes.push(`border-[${width}]`);
|
|
1197
|
+
}
|
|
1198
|
+
cssProperties.push('border-width');
|
|
1199
|
+
}
|
|
1200
|
+
if (style && style !== 'solid') {
|
|
1201
|
+
const styleMap = {
|
|
1202
|
+
'dashed': 'border-dashed',
|
|
1203
|
+
'dotted': 'border-dotted',
|
|
1204
|
+
'double': 'border-double',
|
|
1205
|
+
'hidden': 'border-hidden',
|
|
1206
|
+
'none': 'border-none'
|
|
1207
|
+
};
|
|
1208
|
+
if (styleMap[style]) {
|
|
1209
|
+
classes.push(styleMap[style]);
|
|
1210
|
+
cssProperties.push('border-style');
|
|
1211
|
+
}
|
|
1212
|
+
else {
|
|
1213
|
+
warnings.push(`Unsupported border-style: ${style}`);
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
if (color) {
|
|
1217
|
+
if (color.startsWith('#')) {
|
|
1218
|
+
classes.push(`border-[${color}]`);
|
|
1219
|
+
}
|
|
1220
|
+
else if (color.startsWith('rgb')) {
|
|
1221
|
+
classes.push(`border-[${color}]`);
|
|
1222
|
+
}
|
|
1223
|
+
else {
|
|
1224
|
+
const colorMap = {
|
|
1225
|
+
'transparent': 'border-transparent',
|
|
1226
|
+
'white': 'border-white',
|
|
1227
|
+
'black': 'border-black'
|
|
1228
|
+
};
|
|
1229
|
+
if (colorMap[color]) {
|
|
1230
|
+
classes.push(colorMap[color]);
|
|
1231
|
+
}
|
|
1232
|
+
else {
|
|
1233
|
+
classes.push(`border-${color}`);
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
cssProperties.push('border-color');
|
|
1237
|
+
}
|
|
1238
|
+
return { classes, warnings, cssProperties };
|
|
1239
|
+
}
|
|
1240
|
+
convertDirectionalBorderShorthand(prop, value) {
|
|
1241
|
+
const classes = [];
|
|
1242
|
+
const warnings = [];
|
|
1243
|
+
const cssProperties = [];
|
|
1244
|
+
const sideMap = {
|
|
1245
|
+
'border-top': { prefix: 'border-t', widthProp: 'border-top-width', colorProp: 'border-top-color' },
|
|
1246
|
+
'border-right': { prefix: 'border-r', widthProp: 'border-right-width', colorProp: 'border-right-color' },
|
|
1247
|
+
'border-bottom': { prefix: 'border-b', widthProp: 'border-bottom-width', colorProp: 'border-bottom-color' },
|
|
1248
|
+
'border-left': { prefix: 'border-l', widthProp: 'border-left-width', colorProp: 'border-left-color' }
|
|
1249
|
+
};
|
|
1250
|
+
const side = sideMap[prop];
|
|
1251
|
+
if (!side) {
|
|
1252
|
+
return { classes, warnings: [`Unknown directional border: ${prop}`], cssProperties };
|
|
1253
|
+
}
|
|
1254
|
+
const tokens = this.tokenizeValue(value);
|
|
1255
|
+
let width = null;
|
|
1256
|
+
let style = null;
|
|
1257
|
+
let color = null;
|
|
1258
|
+
for (const token of tokens) {
|
|
1259
|
+
if (/^\d+(\.\d+)?(px|rem|em|thin|medium|thick)?$/.test(token) ||
|
|
1260
|
+
token === 'thin' || token === 'medium' || token === 'thick') {
|
|
1261
|
+
width = token;
|
|
1262
|
+
}
|
|
1263
|
+
else if (['solid', 'dashed', 'dotted', 'double', 'hidden', 'none'].includes(token)) {
|
|
1264
|
+
style = token;
|
|
1265
|
+
}
|
|
1266
|
+
else {
|
|
1267
|
+
color = token;
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
if (width) {
|
|
1271
|
+
const widthMap = {
|
|
1272
|
+
'0': `${side.prefix}-0`,
|
|
1273
|
+
'1px': side.prefix,
|
|
1274
|
+
'2px': `${side.prefix}-2`,
|
|
1275
|
+
'4px': `${side.prefix}-4`,
|
|
1276
|
+
'8px': `${side.prefix}-8`
|
|
1277
|
+
};
|
|
1278
|
+
if (widthMap[width]) {
|
|
1279
|
+
classes.push(widthMap[width]);
|
|
1280
|
+
}
|
|
1281
|
+
else {
|
|
1282
|
+
classes.push(`${side.prefix}-[${width}]`);
|
|
1283
|
+
}
|
|
1284
|
+
cssProperties.push(side.widthProp);
|
|
1285
|
+
}
|
|
1286
|
+
if (style && style !== 'solid') {
|
|
1287
|
+
warnings.push(`Border style '${style}' for ${prop} applies to all borders`);
|
|
1288
|
+
}
|
|
1289
|
+
if (color) {
|
|
1290
|
+
if (color.startsWith('#')) {
|
|
1291
|
+
classes.push(`${side.prefix}-[${color}]`);
|
|
1292
|
+
}
|
|
1293
|
+
else if (color.startsWith('rgb')) {
|
|
1294
|
+
classes.push(`${side.prefix}-[${color}]`);
|
|
1295
|
+
}
|
|
1296
|
+
else {
|
|
1297
|
+
classes.push(`${side.prefix}-${color}`);
|
|
1298
|
+
}
|
|
1299
|
+
cssProperties.push(side.colorProp);
|
|
1300
|
+
}
|
|
1301
|
+
return { classes, warnings, cssProperties };
|
|
1302
|
+
}
|
|
1303
|
+
convertAspectRatio(value) {
|
|
1304
|
+
const ratioMap = {
|
|
1305
|
+
'1/1': 'aspect-square',
|
|
1306
|
+
'16/9': 'aspect-video',
|
|
1307
|
+
'4/3': 'aspect-[4/3]',
|
|
1308
|
+
'3/4': 'aspect-[3/4]',
|
|
1309
|
+
'2/3': 'aspect-[2/3]',
|
|
1310
|
+
'3/2': 'aspect-[3/2]',
|
|
1311
|
+
'1/2': 'aspect-[1/2]',
|
|
1312
|
+
'2/1': 'aspect-[2/1]',
|
|
1313
|
+
'auto': 'aspect-auto'
|
|
1314
|
+
};
|
|
1315
|
+
if (ratioMap[value]) {
|
|
1316
|
+
return { className: ratioMap[value], skipped: false };
|
|
1317
|
+
}
|
|
1318
|
+
if (/^\d+(\.\d+)?$/.test(value)) {
|
|
1319
|
+
return { className: `aspect-[${value}]`, skipped: false };
|
|
1320
|
+
}
|
|
1321
|
+
if (/^\d+\/\d+$/.test(value)) {
|
|
1322
|
+
return { className: `aspect-[${value}]`, skipped: false };
|
|
1323
|
+
}
|
|
1324
|
+
return { className: null, skipped: true, reason: `Unknown aspect-ratio: ${value}` };
|
|
1325
|
+
}
|
|
1326
|
+
convertOverflow(prop, value) {
|
|
1327
|
+
const prefixMap = {
|
|
1328
|
+
'overflow': 'overflow',
|
|
1329
|
+
'overflow-x': 'overflow-x',
|
|
1330
|
+
'overflow-y': 'overflow-y'
|
|
1331
|
+
};
|
|
1332
|
+
const prefix = prefixMap[prop];
|
|
1333
|
+
const valueMap = {
|
|
1334
|
+
'auto': `${prefix}-auto`,
|
|
1335
|
+
'hidden': `${prefix}-hidden`,
|
|
1336
|
+
'visible': `${prefix}-visible`,
|
|
1337
|
+
'scroll': `${prefix}-scroll`,
|
|
1338
|
+
'clip': `${prefix}-clip`
|
|
1339
|
+
};
|
|
1340
|
+
if (valueMap[value]) {
|
|
1341
|
+
return { className: valueMap[value], skipped: false };
|
|
1342
|
+
}
|
|
1343
|
+
return { className: null, skipped: true, reason: `Unknown overflow value: ${value}` };
|
|
1344
|
+
}
|
|
1345
|
+
convertObjectFit(value) {
|
|
1346
|
+
const fitMap = {
|
|
1347
|
+
'contain': 'object-contain',
|
|
1348
|
+
'cover': 'object-cover',
|
|
1349
|
+
'fill': 'object-fill',
|
|
1350
|
+
'none': 'object-none',
|
|
1351
|
+
'scale-down': 'object-scale-down'
|
|
1352
|
+
};
|
|
1353
|
+
if (fitMap[value]) {
|
|
1354
|
+
return { className: fitMap[value], skipped: false };
|
|
1355
|
+
}
|
|
1356
|
+
return { className: null, skipped: true, reason: `Unknown object-fit: ${value}` };
|
|
1357
|
+
}
|
|
1358
|
+
convertObjectPosition(value) {
|
|
1359
|
+
const positionMap = {
|
|
1360
|
+
'center': 'object-center',
|
|
1361
|
+
'top': 'object-top',
|
|
1362
|
+
'bottom': 'object-bottom',
|
|
1363
|
+
'left': 'object-left',
|
|
1364
|
+
'right': 'object-right',
|
|
1365
|
+
'center center': 'object-center',
|
|
1366
|
+
'center top': 'object-top',
|
|
1367
|
+
'center bottom': 'object-bottom',
|
|
1368
|
+
'left center': 'object-left',
|
|
1369
|
+
'right center': 'object-right',
|
|
1370
|
+
'left top': 'object-left-top',
|
|
1371
|
+
'right top': 'object-right-top',
|
|
1372
|
+
'left bottom': 'object-left-bottom',
|
|
1373
|
+
'right bottom': 'object-right-bottom'
|
|
1374
|
+
};
|
|
1375
|
+
if (positionMap[value]) {
|
|
1376
|
+
return { className: positionMap[value], skipped: false };
|
|
1377
|
+
}
|
|
1378
|
+
if (/^\d+(\.\d+)?(%|px|rem|em)?(\s+\d+(\.\d+)?(%|px|rem|em)?)?$/.test(value)) {
|
|
1379
|
+
return { className: `object-[${value}]`, skipped: false };
|
|
1380
|
+
}
|
|
1381
|
+
return { className: null, skipped: true, reason: `Unknown object-position: ${value}` };
|
|
1382
|
+
}
|
|
1383
|
+
convertOpacity(value) {
|
|
1384
|
+
const numValue = parseFloat(value);
|
|
1385
|
+
if (isNaN(numValue)) {
|
|
1386
|
+
return { className: null, skipped: true, reason: `Invalid opacity value: ${value}` };
|
|
1387
|
+
}
|
|
1388
|
+
const percentValue = Math.round(numValue * 100);
|
|
1389
|
+
if (this.opacityScale.has(percentValue)) {
|
|
1390
|
+
return { className: `opacity-${this.opacityScale.get(percentValue)}`, skipped: false };
|
|
1391
|
+
}
|
|
1392
|
+
return { className: `opacity-[${value}]`, skipped: false };
|
|
1393
|
+
}
|
|
1394
|
+
convertWordBreak(value) {
|
|
1395
|
+
const breakMap = {
|
|
1396
|
+
'normal': 'break-normal',
|
|
1397
|
+
'break-all': 'break-all',
|
|
1398
|
+
'break-word': 'break-words',
|
|
1399
|
+
'keep-all': 'break-keep'
|
|
1400
|
+
};
|
|
1401
|
+
if (breakMap[value]) {
|
|
1402
|
+
return { className: breakMap[value], skipped: false };
|
|
1403
|
+
}
|
|
1404
|
+
return { className: null, skipped: true, reason: `Unknown word-break: ${value}` };
|
|
1405
|
+
}
|
|
1406
|
+
convertZIndex(value) {
|
|
1407
|
+
const numValue = parseInt(value, 10);
|
|
1408
|
+
if (isNaN(numValue)) {
|
|
1409
|
+
if (value === 'auto') {
|
|
1410
|
+
return { className: 'z-auto', skipped: false };
|
|
1411
|
+
}
|
|
1412
|
+
return { className: null, skipped: true, reason: `Invalid z-index value: ${value}` };
|
|
1413
|
+
}
|
|
1414
|
+
if (this.zIndexScale.has(numValue)) {
|
|
1415
|
+
return { className: `z-${this.zIndexScale.get(numValue)}`, skipped: false };
|
|
1416
|
+
}
|
|
1417
|
+
return { className: `z-[${value}]`, skipped: false };
|
|
1418
|
+
}
|
|
420
1419
|
convertMultiple(properties) {
|
|
421
1420
|
const classes = [];
|
|
422
1421
|
const warnings = [];
|
|
423
1422
|
properties.forEach(({ property, value }) => {
|
|
424
|
-
const
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
1423
|
+
const multiResult = this.convertPropertyWithMultiple(property, value);
|
|
1424
|
+
classes.push(...multiResult.classes);
|
|
1425
|
+
warnings.push(...multiResult.warnings);
|
|
1426
|
+
if (multiResult.classes.length === 0 && multiResult.warnings.length === 0) {
|
|
1427
|
+
const result = this.convertProperty(property, value);
|
|
1428
|
+
if (result.skipped) {
|
|
1429
|
+
warnings.push(result.reason || `Skipped: ${property}: ${value}`);
|
|
1430
|
+
logger_1.logger.verbose(`Skipped: ${property}: ${value} - ${result.reason}`);
|
|
1431
|
+
}
|
|
1432
|
+
else if (result.className) {
|
|
1433
|
+
classes.push(result.className);
|
|
1434
|
+
logger_1.logger.verbose(`Converted: ${property}: ${value} → ${result.className}`);
|
|
1435
|
+
}
|
|
428
1436
|
}
|
|
429
|
-
else
|
|
430
|
-
classes.
|
|
431
|
-
|
|
1437
|
+
else {
|
|
1438
|
+
if (multiResult.classes.length > 0) {
|
|
1439
|
+
logger_1.logger.verbose(`Converted: ${property}: ${value} → ${multiResult.classes.join(', ')}`);
|
|
1440
|
+
}
|
|
1441
|
+
multiResult.warnings.forEach(w => logger_1.logger.verbose(`Warning: ${w}`));
|
|
432
1442
|
}
|
|
433
1443
|
});
|
|
434
1444
|
return { classes, warnings };
|
|
435
1445
|
}
|
|
436
1446
|
}
|
|
437
1447
|
exports.TailwindMapper = TailwindMapper;
|
|
438
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmRNYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFpbHdpbmRNYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXdDO0FBYXhDLE1BQWEsY0FBYztJQUl6QixZQUFZLE1BQXNCO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBRWpELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMvQyw4REFBOEQ7WUFDOUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1QyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzVDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBRUQsMkJBQTJCO1lBQzNCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDMUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFD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LE9BQU8sQ0FBQyxZQUFZLFFBQVEsS0FBSyxLQUFLLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDdEUsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQy9CLGVBQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxRQUFRLEtBQUssS0FBSyxNQUFNLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzNFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBMWdCRCx3Q0EwZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFpbHdpbmRDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUHJvcGVydHkge1xuICBwcm9wZXJ0eTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnNpb25SZXN1bHQge1xuICBjbGFzc05hbWU6IHN0cmluZyB8IG51bGw7XG4gIHNraXBwZWQ6IGJvb2xlYW47XG4gIHJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRhaWx3aW5kTWFwcGVyIHtcbiAgcHJpdmF0ZSBjb25maWc6IFRhaWx3aW5kQ29uZmlnO1xuICBwcml2YXRlIHNwYWNpbmdTY2FsZTogTWFwPG51bWJlciwgc3RyaW5nPjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFRhaWx3aW5kQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5zcGFjaW5nU2NhbGUgPSB0aGlzLmJ1aWxkU3BhY2luZ1NjYWxlKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3BhY2luZ1NjYWxlKCk6IE1hcDxudW1iZXIsIHN0cmluZz4ge1xuICAgIGNvbnN0IHNjYWxlID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5jb25maWcudGhlbWU/LnNwYWNpbmcgfHwge307XG5cbiAgICBPYmplY3QuZW50cmllcyhzcGFjaW5nKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIENvbnZlcnQgcmVtIHRvIHBpeGVscyBmb3IgY29tcGFyaXNvbiAoYXNzdW1pbmcgMXJlbSA9IDE2cHgpXG4gICAgICBjb25zdCByZW1NYXRjaCA9IHZhbHVlLm1hdGNoKC8oW1xcZC5dKylyZW0vKTtcbiAgICAgIGlmIChyZW1NYXRjaCkge1xuICAgICAgICBjb25zdCBwaXhlbHMgPSBwYXJzZUZsb2F0KHJlbU1hdGNoWzFdKSAqIDE2O1xuICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwaXhlbHMpLCBrZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIGhhbmRsZSBwaXhlbCB2YWx1ZXNcbiAgICAgIGNvbnN0IHB4TWF0Y2ggPSB2YWx1ZS5tYXRjaCgvKFtcXGQuXSspcHgvKTtcbiAgICAgIGlmIChweE1hdGNoKSB7XG4gICAgICAgIHNjYWxlLnNldChNYXRoLnJvdW5kKHBhcnNlRmxvYXQocHhNYXRjaFsxXSkpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBweFRvU3BhY2luZyhweDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVHJ5IGV4YWN0IG1hdGNoIGZpcnN0XG4gICAgaWYgKHRoaXMuc3BhY2luZ1NjYWxlLmhhcyhweCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYWNpbmdTY2FsZS5nZXQocHgpITtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGNsb3Nlc3QgbWF0Y2hcbiAgICBsZXQgY2xvc2VzdEtleTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNsb3Nlc3REaWZmOiBudW1iZXIgPSBJbmZpbml0eTtcbiAgICBcbiAgICB0aGlzLnNwYWNpbmdTY2FsZS5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhrZXkgLSBweCk7XG4gICAgICBpZiAoZGlmZiA8IGNsb3Nlc3REaWZmKSB7XG4gICAgICAgIGNsb3Nlc3RLZXkgPSBrZXk7XG4gICAgICAgIGNsb3Nlc3REaWZmID0gZGlmZjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE9ubHkgYWNjZXB0IGlmIHdpdGhpbiByZWFzb25hYmxlIHRvbGVyYW5jZSAoMjAlKVxuICAgIGlmIChjbG9zZXN0S2V5ICE9PSBudWxsICYmIGNsb3Nlc3REaWZmIC8gcHggPCAwLjIpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYWNpbmdTY2FsZS5nZXQoY2xvc2VzdEtleSkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFB4KHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBweE1hdGNoID0gdmFsdWUubWF0Y2goL14oW1xcZC5dKylweCQvKTtcbiAgICBpZiAocHhNYXRjaCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocHhNYXRjaFsxXSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHJlbSB2YWx1ZXNcbiAgICBjb25zdCByZW1NYXRjaCA9IHZhbHVlLm1hdGNoKC9eKFtcXGQuXSspcmVtJC8pO1xuICAgIGlmIChyZW1NYXRjaCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocmVtTWF0Y2hbMV0pICogMTY7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb252ZXJ0UHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm9wID0gcHJvcGVydHkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICBsb2dnZXIudmVyYm9zZShgQ29udmVydGluZzogJHtub3JtYWxpemVkUHJvcH06ICR7bm9ybWFsaXplZFZhbHVlfWApO1xuXG4gICAgLy8gRGlzcGxheSBwcm9wZXJ0aWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnZGlzcGxheScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnREaXNwbGF5KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gUG9zaXRpb24gcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3Bvc2l0aW9uJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBub3JtYWxpemVkVmFsdWUsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gTWFyZ2luIHByb3BlcnRpZXNcbiAgICBpZiAobm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgnbWFyZ2luJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRNYXJnaW4obm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gUGFkZGluZyBwcm9wZXJ0aWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ3BhZGRpbmcnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFBhZGRpbmcobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gRm9udCBwcm9wZXJ0aWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnZm9udC13ZWlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Rm9udFdlaWdodChub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2ZvbnQtc2l6ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGb250U2l6ZShub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFRleHQgcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3RleHQtYWxpZ24nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LSR7bm9ybWFsaXplZFZhbHVlfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gRmxleGJveCBwcm9wZXJ0aWVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ2ZsZXgnKSB8fCBcbiAgICAgICAgbm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgnanVzdGlmeScpIHx8IFxuICAgICAgICBub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdhbGlnbicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmxleGJveChub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBHYXAgcHJvcGVydGllc1xuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2dhcCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRHYXAobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBXaWR0aCBhbmQgSGVpZ2h0XG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnd2lkdGgnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0V2lkdGgobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdoZWlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0SGVpZ2h0KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQ29sb3JzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnYmFja2dyb3VuZC1jb2xvcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRCYWNrZ3JvdW5kQ29sb3Iobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdjb2xvcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUZXh0Q29sb3Iobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBCb3JkZXIgcmFkaXVzXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnYm9yZGVyLXJhZGl1cycpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRCb3JkZXJSYWRpdXMobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBVbnN1cHBvcnRlZCBwcm9wZXJ0aWVzXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogbnVsbCxcbiAgICAgIHNraXBwZWQ6IHRydWUsXG4gICAgICByZWFzb246IGBVbnN1cHBvcnRlZCBwcm9wZXJ0eTogJHtwcm9wZXJ0eX1gXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERpc3BsYXkodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGRpc3BsYXlNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnZmxleCc6ICdmbGV4JyxcbiAgICAgICdibG9jayc6ICdibG9jaycsXG4gICAgICAnaW5saW5lJzogJ2lubGluZScsXG4gICAgICAnaW5saW5lLWJsb2NrJzogJ2lubGluZS1ibG9jaycsXG4gICAgICAnZ3JpZCc6ICdncmlkJyxcbiAgICAgICdub25lJzogJ2hpZGRlbicsXG4gICAgICAnY29udGVudHMnOiAnY29udGVudHMnLFxuICAgICAgJ3RhYmxlJzogJ3RhYmxlJyxcbiAgICAgICd0YWJsZS1jZWxsJzogJ3RhYmxlLWNlbGwnXG4gICAgfTtcblxuICAgIGlmIChkaXNwbGF5TWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBkaXNwbGF5TWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gZGlzcGxheSB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRNYXJnaW4ocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgXG4gICAgY29uc3Qgc2lkZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdtYXJnaW4nOiAnbScsXG4gICAgICAnbWFyZ2luLXRvcCc6ICdtdCcsXG4gICAgICAnbWFyZ2luLXJpZ2h0JzogJ21yJyxcbiAgICAgICdtYXJnaW4tYm90dG9tJzogJ21iJyxcbiAgICAgICdtYXJnaW4tbGVmdCc6ICdtbCcsXG4gICAgICAnbWFyZ2luLXgnOiAnbXgnLFxuICAgICAgJ21hcmdpbi15JzogJ215J1xuICAgIH07XG4gICAgY29uc3QgcHJlZml4ID0gc2lkZU1hcFtwcm9wXSB8fCAnbSc7XG4gICAgXG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICBpZiAoL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tcGl4ZWwgbWFyZ2luIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgaWYgKCFzcGFjaW5nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UGFkZGluZyhwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBcbiAgICBjb25zdCBzaWRlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3BhZGRpbmcnOiAncCcsXG4gICAgICAncGFkZGluZy10b3AnOiAncHQnLFxuICAgICAgJ3BhZGRpbmctcmlnaHQnOiAncHInLFxuICAgICAgJ3BhZGRpbmctYm90dG9tJzogJ3BiJyxcbiAgICAgICdwYWRkaW5nLWxlZnQnOiAncGwnLFxuICAgICAgJ3BhZGRpbmcteCc6ICdweCcsXG4gICAgICAncGFkZGluZy15JzogJ3B5J1xuICAgIH07XG4gICAgY29uc3QgcHJlZml4ID0gc2lkZU1hcFtwcm9wXSB8fCAncCc7XG4gICAgXG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICBpZiAoL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tcGl4ZWwgcGFkZGluZyB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgIGlmICghc3BhY2luZykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZvbnRXZWlnaHQodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHdlaWdodE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICcxMDAnOiAnZm9udC10aGluJyxcbiAgICAgICcyMDAnOiAnZm9udC1leHRyYWxpZ2h0JyxcbiAgICAgICczMDAnOiAnZm9udC1saWdodCcsXG4gICAgICAnNDAwJzogJ2ZvbnQtbm9ybWFsJyxcbiAgICAgICc1MDAnOiAnZm9udC1tZWRpdW0nLFxuICAgICAgJzYwMCc6ICdmb250LXNlbWlib2xkJyxcbiAgICAgICc3MDAnOiAnZm9udC1ib2xkJyxcbiAgICAgICc4MDAnOiAnZm9udC1leHRyYWJvbGQnLFxuICAgICAgJzkwMCc6ICdmb250LWJsYWNrJyxcbiAgICAgICdub3JtYWwnOiAnZm9udC1ub3JtYWwnLFxuICAgICAgJ2JvbGQnOiAnZm9udC1ib2xkJ1xuICAgIH07XG5cbiAgICBpZiAod2VpZ2h0TWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiB3ZWlnaHRNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBmb250LXdlaWdodDogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRGb250U2l6ZSh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICAvLyBNYXAgY29tbW9uIGZvbnQgc2l6ZXNcbiAgICAgIGNvbnN0IHNpemVNYXA6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgICAgIDEyOiAndGV4dC14cycsXG4gICAgICAgIDE0OiAndGV4dC1zbScsXG4gICAgICAgIDE2OiAndGV4dC1iYXNlJyxcbiAgICAgICAgMTg6ICd0ZXh0LWxnJyxcbiAgICAgICAgMjA6ICd0ZXh0LXhsJyxcbiAgICAgICAgMjQ6ICd0ZXh0LTJ4bCcsXG4gICAgICAgIDMwOiAndGV4dC0zeGwnLFxuICAgICAgICAzNjogJ3RleHQtNHhsJyxcbiAgICAgICAgNDg6ICd0ZXh0LTV4bCdcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNsb3Nlc3QgPSBPYmplY3Qua2V5cyhzaXplTWFwKVxuICAgICAgICAubWFwKE51bWJlcilcbiAgICAgICAgLnJlZHVjZSgocHJldiwgY3VycikgPT4gXG4gICAgICAgICAgTWF0aC5hYnMoY3VyciAtIHB4KSA8IE1hdGguYWJzKHByZXYgLSBweCkgPyBjdXJyIDogcHJldlxuICAgICAgICApO1xuXG4gICAgICBpZiAoTWF0aC5hYnMoY2xvc2VzdCAtIHB4KSAvIHB4IDwgMC4xNSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IHNpemVNYXBbY2xvc2VzdF0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtKT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdGV4dC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vbi1zdGFuZGFyZCBmb250LXNpemU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RmxleGJveChwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICAvLyBGbGV4IGRpcmVjdGlvblxuICAgIGlmIChwcm9wID09PSAnZmxleC1kaXJlY3Rpb24nKSB7XG4gICAgICBjb25zdCBkaXJNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdyb3cnOiAnZmxleC1yb3cnLFxuICAgICAgICAncm93LXJldmVyc2UnOiAnZmxleC1yb3ctcmV2ZXJzZScsXG4gICAgICAgICdjb2x1bW4nOiAnZmxleC1jb2wnLFxuICAgICAgICAnY29sdW1uLXJldmVyc2UnOiAnZmxleC1jb2wtcmV2ZXJzZSdcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGRpck1hcFt2YWx1ZV0gfHwgbnVsbCwgc2tpcHBlZDogIWRpck1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICAvLyBGbGV4IHdyYXBcbiAgICBpZiAocHJvcCA9PT0gJ2ZsZXgtd3JhcCcpIHtcbiAgICAgIGNvbnN0IHdyYXBNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICd3cmFwJzogJ2ZsZXgtd3JhcCcsXG4gICAgICAgICdub3dyYXAnOiAnZmxleC1ub3dyYXAnLFxuICAgICAgICAnd3JhcC1yZXZlcnNlJzogJ2ZsZXgtd3JhcC1yZXZlcnNlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogd3JhcE1hcFt2YWx1ZV0gfHwgbnVsbCwgc2tpcHBlZDogIXdyYXBNYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgLy8gSnVzdGlmeSBjb250ZW50XG4gICAgaWYgKHByb3AgPT09ICdqdXN0aWZ5LWNvbnRlbnQnKSB7XG4gICAgICBjb25zdCBqdXN0aWZ5TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnZmxleC1zdGFydCc6ICdqdXN0aWZ5LXN0YXJ0JyxcbiAgICAgICAgJ2ZsZXgtZW5kJzogJ2p1c3RpZnktZW5kJyxcbiAgICAgICAgJ2NlbnRlcic6ICdqdXN0aWZ5LWNlbnRlcicsXG4gICAgICAgICdzcGFjZS1iZXR3ZWVuJzogJ2p1c3RpZnktYmV0d2VlbicsXG4gICAgICAgICdzcGFjZS1hcm91bmQnOiAnanVzdGlmeS1hcm91bmQnLFxuICAgICAgICAnc3BhY2UtZXZlbmx5JzogJ2p1c3RpZnktZXZlbmx5J1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZToganVzdGlmeU1hcFt2YWx1ZV0gfHwgbnVsbCwgc2tpcHBlZDogIWp1c3RpZnlNYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgLy8gQWxpZ24gaXRlbXNcbiAgICBpZiAocHJvcCA9PT0gJ2FsaWduLWl0ZW1zJykge1xuICAgICAgY29uc3QgYWxpZ25NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ2l0ZW1zLXN0YXJ0JyxcbiAgICAgICAgJ2ZsZXgtZW5kJzogJ2l0ZW1zLWVuZCcsXG4gICAgICAgICdjZW50ZXInOiAnaXRlbXMtY2VudGVyJyxcbiAgICAgICAgJ2Jhc2VsaW5lJzogJ2l0ZW1zLWJhc2VsaW5lJyxcbiAgICAgICAgJ3N0cmV0Y2gnOiAnaXRlbXMtc3RyZXRjaCdcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGFsaWduTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhYWxpZ25NYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbnN1cHBvcnRlZCBmbGV4Ym94IHByb3BlcnR5OiAke3Byb3B9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0R2FwKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBpZiAocHggPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgTm9uLXBpeGVsIGdhcCB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgIGlmICghc3BhY2luZykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBObyBtYXRjaGluZyBzcGFjaW5nIGZvcjogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgZ2FwLSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0V2lkdGgodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIC8vIEhhbmRsZSBwZXJjZW50YWdlIHZhbHVlc1xuICAgIGlmICh2YWx1ZSA9PT0gJzEwMCUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LWZ1bGwnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICc1MCUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTEvMicsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzMzLjMzMyUnIHx8IHZhbHVlID09PSAnMzMuMzMlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0xLzMnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICc2Ni42NjYlJyB8fCB2YWx1ZSA9PT0gJzY2LjY3JScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMi8zJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnMjUlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0xLzQnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICc3NSUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTMvNCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHBpeGVsIHZhbHVlc1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgICAgaWYgKHNwYWNpbmcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdy0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIC8vIFRyeSBhcmJpdHJhcnkgdmFsdWVzIGZvciBsYXJnZXIgc2l6ZXNcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IHdpZHRoIHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEhlaWdodCh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgLy8gSGFuZGxlIHBlcmNlbnRhZ2UgdmFsdWVzXG4gICAgaWYgKHZhbHVlID09PSAnMTAwJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2gtZnVsbCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzUwJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2gtMS8yJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcGl4ZWwgdmFsdWVzXG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgICBpZiAoc3BhY2luZykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBoLSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgaC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggaGVpZ2h0IHZhbHVlOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgLy8gSGFuZGxlIG5hbWVkIGNvbG9ycyBhbmQgaGV4XG4gICAgY29uc3QgY29sb3JNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAndHJhbnNwYXJlbnQnOiAnYmctdHJhbnNwYXJlbnQnLFxuICAgICAgJ3doaXRlJzogJ2JnLXdoaXRlJyxcbiAgICAgICdibGFjayc6ICdiZy1ibGFjaycsXG4gICAgICAncmVkJzogJ2JnLXJlZC01MDAnLFxuICAgICAgJ2JsdWUnOiAnYmctYmx1ZS01MDAnLFxuICAgICAgJ2dyZWVuJzogJ2JnLWdyZWVuLTUwMCcsXG4gICAgICAnZ3JheSc6ICdiZy1ncmF5LTUwMCdcbiAgICB9O1xuXG4gICAgaWYgKGNvbG9yTWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBjb2xvck1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGhleCBjb2xvcnMgLSB1c2UgYXJiaXRyYXJ5IHZhbHVlc1xuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJnLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSByZ2IvcmdiYVxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGJhY2tncm91bmQtY29sb3I6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VGV4dENvbG9yKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBjb2xvck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICd0cmFuc3BhcmVudCc6ICd0ZXh0LXRyYW5zcGFyZW50JyxcbiAgICAgICd3aGl0ZSc6ICd0ZXh0LXdoaXRlJyxcbiAgICAgICdibGFjayc6ICd0ZXh0LWJsYWNrJyxcbiAgICAgICdyZWQnOiAndGV4dC1yZWQtNTAwJyxcbiAgICAgICdibHVlJzogJ3RleHQtYmx1ZS01MDAnLFxuICAgICAgJ2dyZWVuJzogJ3RleHQtZ3JlZW4tNTAwJyxcbiAgICAgICdncmF5JzogJ3RleHQtZ3JheS01MDAnXG4gICAgfTtcblxuICAgIGlmIChjb2xvck1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogY29sb3JNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgQ29tcGxleCBjb2xvcjogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRCb3JkZXJSYWRpdXModmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIFxuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgLy8gSGFuZGxlIG5hbWVkIHZhbHVlc1xuICAgICAgaWYgKHZhbHVlID09PSAnNTAlJykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdyb3VuZGVkLWZ1bGwnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGJvcmRlci1yYWRpdXM6ICR7dmFsdWV9YCB9O1xuICAgIH1cblxuICAgIC8vIE1hcCB0byBUYWlsd2luZCByYWRpdXMgc2NhbGVcbiAgICBjb25zdCByYWRpdXNNYXA6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgICAwOiAncm91bmRlZC1ub25lJyxcbiAgICAgIDI6ICdyb3VuZGVkLXNtJyxcbiAgICAgIDQ6ICdyb3VuZGVkJyxcbiAgICAgIDY6ICdyb3VuZGVkLW1kJyxcbiAgICAgIDg6ICdyb3VuZGVkLWxnJyxcbiAgICAgIDEyOiAncm91bmRlZC14bCcsXG4gICAgICAxNjogJ3JvdW5kZWQtMnhsJyxcbiAgICAgIDI0OiAncm91bmRlZC0zeGwnXG4gICAgfTtcblxuICAgIGNvbnN0IGNsb3Nlc3QgPSBPYmplY3Qua2V5cyhyYWRpdXNNYXApXG4gICAgICAubWFwKE51bWJlcilcbiAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IFxuICAgICAgICBNYXRoLmFicyhjdXJyIC0gcHgpIDwgTWF0aC5hYnMocHJldiAtIHB4KSA/IGN1cnIgOiBwcmV2XG4gICAgICApO1xuXG4gICAgaWYgKE1hdGguYWJzKGNsb3Nlc3QgLSBweCkgLyAocHggfHwgMSkgPCAwLjIpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogcmFkaXVzTWFwW2Nsb3Nlc3RdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIC8vIFVzZSBhcmJpdHJhcnkgdmFsdWVcbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGByb3VuZGVkLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29udmVydE11bHRpcGxlKHByb3BlcnRpZXM6IENTU1Byb3BlcnR5W10pOiB7IGNsYXNzZXM6IHN0cmluZ1tdOyB3YXJuaW5nczogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIHByb3BlcnRpZXMuZm9yRWFjaCgoeyBwcm9wZXJ0eSwgdmFsdWUgfSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb252ZXJ0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTtcbiAgICAgIFxuICAgICAgaWYgKHJlc3VsdC5za2lwcGVkKSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2gocmVzdWx0LnJlYXNvbiB8fCBgU2tpcHBlZDogJHtwcm9wZXJ0eX06ICR7dmFsdWV9YCk7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBTa2lwcGVkOiAke3Byb3BlcnR5fTogJHt2YWx1ZX0gLSAke3Jlc3VsdC5yZWFzb259YCk7XG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5jbGFzc05hbWUpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHJlc3VsdC5jbGFzc05hbWUpO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgQ29udmVydGVkOiAke3Byb3BlcnR5fTogJHt2YWx1ZX0g4oaSICR7cmVzdWx0LmNsYXNzTmFtZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzIH07XG4gIH1cbn1cbiJdfQ==
|
|
1448
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmRNYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFpbHdpbmRNYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXdDO0FBeUJ4QyxNQUFhLGNBQWM7SUFVekIsWUFBWSxNQUFzQjtRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBRWpELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVDLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxNQUFN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Q0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQy9CLGVBQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxRQUFRLEtBQUssS0FBSyxNQUFNLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ25DLGVBQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxRQUFRLEtBQUssS0FBSyxNQUFNLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekYsQ0FBQztnQkFDRCxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUE3cERELHdDQTZwREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYWlsd2luZENvbmZpZyB9IGZyb20gJy4vdXRpbHMvY29uZmlnJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBDU1NQcm9wZXJ0eSB7XG4gIHByb3BlcnR5OiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2lvblJlc3VsdCB7XG4gIGNsYXNzTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgc2tpcHBlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpQ29udmVyc2lvblJlc3VsdCB7XG4gIGNsYXNzZXM6IHN0cmluZ1tdO1xuICB3YXJuaW5nczogc3RyaW5nW107XG4gIGNzc1Byb3BlcnRpZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUGFyc2VkU3BhY2luZ1ZhbHVlIHtcbiAgdmFsdWU6IHN0cmluZztcbiAgcHg6IG51bWJlciB8IG51bGw7XG4gIHNwYWNpbmdLZXk6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBUYWlsd2luZE1hcHBlciB7XG4gIHByaXZhdGUgY29uZmlnOiBUYWlsd2luZENvbmZpZztcbiAgcHJpdmF0ZSBzcGFjaW5nU2NhbGU6IE1hcDxudW1iZXIsIHN0cmluZz47XG4gIHByaXZhdGUgbWF4V2lkdGhTY2FsZTogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSBmb250U2l6ZVNjYWxlOiBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuICBwcml2YXRlIGxpbmVIZWlnaHRTY2FsZTogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSBsZXR0ZXJTcGFjaW5nU2NhbGU6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgekluZGV4U2NhbGU6IE1hcDxudW1iZXIsIHN0cmluZz47XG4gIHByaXZhdGUgb3BhY2l0eVNjYWxlOiBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogVGFpbHdpbmRDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNwYWNpbmdTY2FsZSA9IHRoaXMuYnVpbGRTcGFjaW5nU2NhbGUoKTtcbiAgICB0aGlzLm1heFdpZHRoU2NhbGUgPSB0aGlzLmJ1aWxkTWF4V2lkdGhTY2FsZSgpO1xuICAgIHRoaXMuZm9udFNpemVTY2FsZSA9IHRoaXMuYnVpbGRGb250U2l6ZVNjYWxlKCk7XG4gICAgdGhpcy5saW5lSGVpZ2h0U2NhbGUgPSB0aGlzLmJ1aWxkTGluZUhlaWdodFNjYWxlKCk7XG4gICAgdGhpcy5sZXR0ZXJTcGFjaW5nU2NhbGUgPSB0aGlzLmJ1aWxkTGV0dGVyU3BhY2luZ1NjYWxlKCk7XG4gICAgdGhpcy56SW5kZXhTY2FsZSA9IHRoaXMuYnVpbGRaSW5kZXhTY2FsZSgpO1xuICAgIHRoaXMub3BhY2l0eVNjYWxlID0gdGhpcy5idWlsZE9wYWNpdHlTY2FsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNwYWNpbmdTY2FsZSgpOiBNYXA8bnVtYmVyLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuY29uZmlnLnRoZW1lPy5zcGFjaW5nIHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMoc3BhY2luZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCByZW1NYXRjaCA9IHZhbHVlLm1hdGNoKC8oW1xcZC5dKylyZW0vKTtcbiAgICAgIGlmIChyZW1NYXRjaCkge1xuICAgICAgICBjb25zdCBwaXhlbHMgPSBwYXJzZUZsb2F0KHJlbU1hdGNoWzFdKSAqIDE2O1xuICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwaXhlbHMpLCBrZXkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBweE1hdGNoID0gdmFsdWUubWF0Y2goLyhbXFxkLl0rKXB4Lyk7XG4gICAgICBpZiAocHhNYXRjaCkge1xuICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwYXJzZUZsb2F0KHB4TWF0Y2hbMV0pKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRNYXhXaWR0aFNjYWxlKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHNjYWxlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBjb25zdCBtYXhXaWR0aCA9IHRoaXMuY29uZmlnLnRoZW1lPy5tYXhXaWR0aCB8fCB7fTtcblxuICAgIE9iamVjdC5lbnRyaWVzKG1heFdpZHRoKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNjYWxlLnNldCh2YWx1ZSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNjYWxlLnNldCgnMTAwJScsICdmdWxsJyk7XG4gICAgc2NhbGUuc2V0KCdtaW4tY29udGVudCcsICdtaW4nKTtcbiAgICBzY2FsZS5zZXQoJ21heC1jb250ZW50JywgJ21heCcpO1xuICAgIHNjYWxlLnNldCgnZml0LWNvbnRlbnQnLCAnZml0Jyk7XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9udFNpemVTY2FsZSgpOiBNYXA8bnVtYmVyLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgZm9udFNpemUgPSB0aGlzLmNvbmZpZy50aGVtZT8uZm9udFNpemUgfHwge307XG5cbiAgICBPYmplY3QuZW50cmllcyhmb250U2l6ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCByZW1NYXRjaCA9IHZhbHVlLm1hdGNoKC8oW1xcZC5dKylyZW0vKTtcbiAgICAgICAgaWYgKHJlbU1hdGNoKSB7XG4gICAgICAgICAgc2NhbGUuc2V0KE1hdGgucm91bmQocGFyc2VGbG9hdChyZW1NYXRjaFsxXSkgKiAxNiksIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHhNYXRjaCA9IHZhbHVlLm1hdGNoKC8oW1xcZC5dKylweC8pO1xuICAgICAgICBpZiAocHhNYXRjaCkge1xuICAgICAgICAgIHNjYWxlLnNldChNYXRoLnJvdW5kKHBhcnNlRmxvYXQocHhNYXRjaFsxXSkpLCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHR5cGVvZiB2YWx1ZVswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgcmVtTWF0Y2ggPSB2YWx1ZVswXS5tYXRjaCgvKFtcXGQuXSspcmVtLyk7XG4gICAgICAgIGlmIChyZW1NYXRjaCkge1xuICAgICAgICAgIHNjYWxlLnNldChNYXRoLnJvdW5kKHBhcnNlRmxvYXQocmVtTWF0Y2hbMV0pICogMTYpLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB4TWF0Y2ggPSB2YWx1ZVswXS5tYXRjaCgvKFtcXGQuXSspcHgvKTtcbiAgICAgICAgaWYgKHB4TWF0Y2gpIHtcbiAgICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChwYXJzZUZsb2F0KHB4TWF0Y2hbMV0pKSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExpbmVIZWlnaHRTY2FsZSgpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgbGluZUhlaWdodCA9IHRoaXMuY29uZmlnLnRoZW1lPy5saW5lSGVpZ2h0IHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMobGluZUhlaWdodCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzY2FsZS5zZXQodmFsdWUsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzY2FsZS5zZXQoJzEnLCAnbm9uZScpO1xuICAgIHNjYWxlLnNldCgnMS4yNScsICd0aWdodCcpO1xuICAgIHNjYWxlLnNldCgnMS4zNzUnLCAnc251ZycpO1xuICAgIHNjYWxlLnNldCgnMS41JywgJ25vcm1hbCcpO1xuICAgIHNjYWxlLnNldCgnMS42MjUnLCAncmVsYXhlZCcpO1xuICAgIHNjYWxlLnNldCgnMicsICdsb29zZScpO1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExldHRlclNwYWNpbmdTY2FsZSgpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgbGV0dGVyU3BhY2luZyA9IHRoaXMuY29uZmlnLnRoZW1lPy5sZXR0ZXJTcGFjaW5nIHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMobGV0dGVyU3BhY2luZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzY2FsZS5zZXQodmFsdWUsIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2NhbGU7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkWkluZGV4U2NhbGUoKTogTWFwPG51bWJlciwgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NhbGUgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICAgIGNvbnN0IHpJbmRleCA9IHRoaXMuY29uZmlnLnRoZW1lPy56SW5kZXggfHwge307XG5cbiAgICBPYmplY3QuZW50cmllcyh6SW5kZXgpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICAgICAgaWYgKCFpc05hTihudW0pKSB7XG4gICAgICAgICAgc2NhbGUuc2V0KG51bSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2NhbGUuc2V0KDAsICcwJyk7XG4gICAgc2NhbGUuc2V0KDEwLCAnMTAnKTtcbiAgICBzY2FsZS5zZXQoMjAsICcyMCcpO1xuICAgIHNjYWxlLnNldCgzMCwgJzMwJyk7XG4gICAgc2NhbGUuc2V0KDQwLCAnNDAnKTtcbiAgICBzY2FsZS5zZXQoNTAsICc1MCcpO1xuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE9wYWNpdHlTY2FsZSgpOiBNYXA8bnVtYmVyLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2FsZSA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3Qgb3BhY2l0eSA9IHRoaXMuY29uZmlnLnRoZW1lPy5vcGFjaXR5IHx8IHt9O1xuXG4gICAgT2JqZWN0LmVudHJpZXMob3BhY2l0eSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICBpZiAoIWlzTmFOKG51bSkpIHtcbiAgICAgICAgICBzY2FsZS5zZXQoTWF0aC5yb3VuZChudW0gKiAxMDApLCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAxMDA7IGkgKz0gNSkge1xuICAgICAgaWYgKCFzY2FsZS5oYXMoaSkpIHtcbiAgICAgICAgc2NhbGUuc2V0KGksIFN0cmluZyhpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBweFRvU3BhY2luZyhweDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc3BhY2luZ1NjYWxlLmhhcyhweCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYWNpbmdTY2FsZS5nZXQocHgpITtcbiAgICB9XG5cbiAgICBsZXQgY2xvc2VzdEtleTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNsb3Nlc3REaWZmOiBudW1iZXIgPSBJbmZpbml0eTtcbiAgICBcbiAgICB0aGlzLnNwYWNpbmdTY2FsZS5mb3JFYWNoKChfLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhrZXkgLSBweCk7XG4gICAgICBpZiAoZGlmZiA8IGNsb3Nlc3REaWZmKSB7XG4gICAgICAgIGNsb3Nlc3RLZXkgPSBrZXk7XG4gICAgICAgIGNsb3Nlc3REaWZmID0gZGlmZjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChjbG9zZXN0S2V5ICE9PSBudWxsICYmIGNsb3Nlc3REaWZmIC8gcHggPCAwLjIpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwYWNpbmdTY2FsZS5nZXQoY2xvc2VzdEtleSkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFB4KHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBweE1hdGNoID0gdmFsdWUubWF0Y2goL14oW1xcZC5dKylweCQvKTtcbiAgICBpZiAocHhNYXRjaCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQocHhNYXRjaFsxXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtTWF0Y2ggPSB2YWx1ZS5tYXRjaCgvXihbXFxkLl0rKXJlbSQvKTtcbiAgICBpZiAocmVtTWF0Y2gpIHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHJlbU1hdGNoWzFdKSAqIDE2O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVNwYWNpbmdWYWx1ZSh2YWx1ZTogc3RyaW5nKTogUGFyc2VkU3BhY2luZ1ZhbHVlIHtcbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBjb25zdCBzcGFjaW5nS2V5ID0gcHggIT09IG51bGwgPyB0aGlzLnB4VG9TcGFjaW5nKHB4KSA6IG51bGw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWUsXG4gICAgICBweCxcbiAgICAgIHNwYWNpbmdLZXlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNwYWNpbmdVdGlsaXR5KHByZWZpeDogc3RyaW5nLCBwYXJzZWQ6IFBhcnNlZFNwYWNpbmdWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKHBhcnNlZC5zcGFjaW5nS2V5KSB7XG4gICAgICByZXR1cm4gYCR7cHJlZml4fS0ke3BhcnNlZC5zcGFjaW5nS2V5fWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9LVske3BhcnNlZC52YWx1ZX1dYDtcbiAgfVxuXG4gIHByaXZhdGUgdG9rZW5pemVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9ICcnO1xuICAgIGxldCBwYXJlbkRlcHRoID0gMDtcbiAgICBsZXQgaW5GdW5jdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hhciA9IHZhbHVlW2ldO1xuXG4gICAgICBpZiAoY2hhciA9PT0gJygnKSB7XG4gICAgICAgIHBhcmVuRGVwdGgrKztcbiAgICAgICAgaW5GdW5jdGlvbiA9IHRydWU7XG4gICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJyknKSB7XG4gICAgICAgIHBhcmVuRGVwdGgtLTtcbiAgICAgICAgY3VycmVudCArPSBjaGFyO1xuICAgICAgICBpZiAocGFyZW5EZXB0aCA9PT0gMCkge1xuICAgICAgICAgIGluRnVuY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnICcgJiYgcGFyZW5EZXB0aCA9PT0gMCkge1xuICAgICAgICBpZiAoY3VycmVudC50cmltKCkpIHtcbiAgICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50LnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudCArPSBjaGFyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyZW50LnRyaW0oKSkge1xuICAgICAgdG9rZW5zLnB1c2goY3VycmVudC50cmltKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICBjb252ZXJ0UHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm9wID0gcHJvcGVydHkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICBsb2dnZXIudmVyYm9zZShgQ29udmVydGluZzogJHtub3JtYWxpemVkUHJvcH06ICR7bm9ybWFsaXplZFZhbHVlfWApO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgQ1NTIHZhcmlhYmxlIGRlY2xhcmF0aW9uOiAke3Byb3BlcnR5fWAgfTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdkaXNwbGF5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydERpc3BsYXkobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdwb3NpdGlvbicpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbm9ybWFsaXplZFZhbHVlLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdtYXJnaW4nKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydE1hcmdpbihub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgncGFkZGluZycpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UGFkZGluZyhub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdtYXgtd2lkdGgnIHx8IG5vcm1hbGl6ZWRQcm9wID09PSAnbWluLXdpZHRoJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydERpbWVuc2lvbkNvbnN0cmFpbnQobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnbWF4LWhlaWdodCcgfHwgbm9ybWFsaXplZFByb3AgPT09ICdtaW4taGVpZ2h0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydERpbWVuc2lvbkNvbnN0cmFpbnQobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnd2lkdGgnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0V2lkdGgobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdoZWlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0SGVpZ2h0KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnZm9udC13ZWlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Rm9udFdlaWdodChub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2ZvbnQtc2l6ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGb250U2l6ZShub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3RleHQtYWxpZ24nKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LSR7bm9ybWFsaXplZFZhbHVlfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAndGV4dC1kZWNvcmF0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRleHREZWNvcmF0aW9uKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAndGV4dC10cmFuc2Zvcm0nKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0VGV4dFRyYW5zZm9ybShub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ2xldHRlci1zcGFjaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydExldHRlclNwYWNpbmcobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdsaW5lLWhlaWdodCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRMaW5lSGVpZ2h0KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ2ZsZXgnKSB8fCBcbiAgICAgICAgbm9ybWFsaXplZFByb3Auc3RhcnRzV2l0aCgnanVzdGlmeScpIHx8IFxuICAgICAgICBub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdhbGlnbicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RmxleGJveChub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdnYXAnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0R2FwKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnYmFja2dyb3VuZC1jb2xvcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRCYWNrZ3JvdW5kQ29sb3Iobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdiYWNrZ3JvdW5kJykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb252ZXJ0QmFja2dyb3VuZFNob3J0aGFuZChub3JtYWxpemVkVmFsdWUpO1xuICAgICAgaWYgKHJlc3VsdC5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiByZXN1bHQuY2xhc3Nlc1swXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiByZXN1bHQud2FybmluZ3NbMF0gfHwgYENvdWxkIG5vdCBjb252ZXJ0IGJhY2tncm91bmQ6ICR7bm9ybWFsaXplZFZhbHVlfWAgfTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdjb2xvcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUZXh0Q29sb3Iobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdib3JkZXItcmFkaXVzJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEJvcmRlclJhZGl1cyhub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcC5zdGFydHNXaXRoKCdib3JkZXInKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydEJvcmRlcihub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdhc3BlY3QtcmF0aW8nKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0QXNwZWN0UmF0aW8obm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdvdmVyZmxvdycgfHwgbm9ybWFsaXplZFByb3AgPT09ICdvdmVyZmxvdy14JyB8fCBub3JtYWxpemVkUHJvcCA9PT0gJ292ZXJmbG93LXknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0T3ZlcmZsb3cobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnb2JqZWN0LWZpdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRPYmplY3RGaXQobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdvYmplY3QtcG9zaXRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0T2JqZWN0UG9zaXRpb24obm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdvcGFjaXR5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydE9wYWNpdHkobm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICd3b3JkLWJyZWFrJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFdvcmRCcmVhayhub3JtYWxpemVkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkUHJvcCA9PT0gJ3otaW5kZXgnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0WkluZGV4KG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogbnVsbCxcbiAgICAgIHNraXBwZWQ6IHRydWUsXG4gICAgICByZWFzb246IGBVbnN1cHBvcnRlZCBwcm9wZXJ0eTogJHtwcm9wZXJ0eX1gXG4gICAgfTtcbiAgfVxuXG4gIGNvbnZlcnRQcm9wZXJ0eVdpdGhNdWx0aXBsZShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogTXVsdGlDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBub3JtYWxpemVkUHJvcCA9IHByb3BlcnR5LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnbWFyZ2luJyB8fCBub3JtYWxpemVkUHJvcCA9PT0gJ3BhZGRpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U3BhY2luZ1Nob3J0aGFuZChub3JtYWxpemVkUHJvcCwgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFByb3AgPT09ICdib3JkZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Qm9yZGVyU2hvcnRoYW5kKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wLnN0YXJ0c1dpdGgoJ2JvcmRlci0nKSAmJiBcbiAgICAgICAgWydib3JkZXItdG9wJywgJ2JvcmRlci1yaWdodCcsICdib3JkZXItYm90dG9tJywgJ2JvcmRlci1sZWZ0J10uaW5jbHVkZXMobm9ybWFsaXplZFByb3ApKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RGlyZWN0aW9uYWxCb3JkZXJTaG9ydGhhbmQobm9ybWFsaXplZFByb3AsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnZmxleCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGbGV4U2hvcnRoYW5kKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRQcm9wID09PSAnYmFja2dyb3VuZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRCYWNrZ3JvdW5kU2hvcnRoYW5kKG5vcm1hbGl6ZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb252ZXJ0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTtcbiAgICByZXR1cm4ge1xuICAgICAgY2xhc3NlczogcmVzdWx0LmNsYXNzTmFtZSA/IFtyZXN1bHQuY2xhc3NOYW1lXSA6IFtdLFxuICAgICAgd2FybmluZ3M6IHJlc3VsdC5yZWFzb24gPyBbcmVzdWx0LnJlYXNvbl0gOiBbXSxcbiAgICAgIGNzc1Byb3BlcnRpZXM6IHJlc3VsdC5jbGFzc05hbWUgPyBbcHJvcGVydHldIDogW11cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0QmFja2dyb3VuZFNob3J0aGFuZCh2YWx1ZTogc3RyaW5nKTogTXVsdGlDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAodmFsdWUgPT09ICd0cmFuc3BhcmVudCcpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnYmctdHJhbnNwYXJlbnQnKTtcbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnYmFja2dyb3VuZC1jb2xvcicpO1xuICAgICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICdub25lJykge1xuICAgICAgY2xhc3Nlcy5wdXNoKCdiZy1ub25lJyk7XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2JhY2tncm91bmQtaW1hZ2UnKTtcbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JWYWx1ZSA9IHRoaXMuZXh0cmFjdENvbG9yRnJvbUJhY2tncm91bmQodmFsdWUpO1xuICAgIFxuICAgIGlmIChjb2xvclZhbHVlKSB7XG4gICAgICBpZiAoY29sb3JWYWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGBiZy1bJHtjb2xvclZhbHVlfV1gKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sb3JWYWx1ZS5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goYGJnLVske2NvbG9yVmFsdWV9XWApO1xuICAgICAgfSBlbHNlIGlmIChjb2xvclZhbHVlLnN0YXJ0c1dpdGgoJ2hzbCcpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgYmctWyR7Y29sb3JWYWx1ZX1dYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2xvck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAnd2hpdGUnOiAnYmctd2hpdGUnLFxuICAgICAgICAgICdibGFjayc6ICdiZy1ibGFjaycsXG4gICAgICAgICAgJ3JlZCc6ICdiZy1yZWQtNTAwJyxcbiAgICAgICAgICAnYmx1ZSc6ICdiZy1ibHVlLTUwMCcsXG4gICAgICAgICAgJ2dyZWVuJzogJ2JnLWdyZWVuLTUwMCcsXG4gICAgICAgICAgJ2dyYXknOiAnYmctZ3JheS01MDAnLFxuICAgICAgICAgICd0cmFuc3BhcmVudCc6ICdiZy10cmFuc3BhcmVudCdcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGlmIChjb2xvck1hcFtjb2xvclZhbHVlXSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChjb2xvck1hcFtjb2xvclZhbHVlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKGBiZy0ke2NvbG9yVmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnYmFja2dyb3VuZC1jb2xvcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKGBDYW5ub3QgZXh0cmFjdCBjb2xvciBmcm9tIGJhY2tncm91bmQgc2hvcnRoYW5kOiAke3ZhbHVlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RDb2xvckZyb21CYWNrZ3JvdW5kKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2VuaXplVmFsdWUodmFsdWUpO1xuICAgIFxuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBpZiAodG9rZW4uc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJ3JnYicpIHx8IHRva2VuLnN0YXJ0c1dpdGgoJ2hzbCcpKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRva2VuLnN0YXJ0c1dpdGgoJ3VybCgnKSB8fCB0b2tlbiA9PT0gJ25vbmUnKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoL14obGluZWFyLWdyYWRpZW50fHJhZGlhbC1ncmFkaWVudHxjb25pYy1ncmFkaWVudHxyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50fHJlcGVhdGluZy1yYWRpYWwtZ3JhZGllbnR8cmVwZWF0aW5nLWNvbmljLWdyYWRpZW50KVxcKC9pLnRlc3QodG9rZW4pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoL14ocmVwZWF0fG5vLXJlcGVhdHxyZXBlYXQteHxyZXBlYXQteXxzcGFjZXxyb3VuZCkkL2kudGVzdCh0b2tlbikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICgvXihzY3JvbGx8Zml4ZWR8bG9jYWwpJC9pLnRlc3QodG9rZW4pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoL14oY2VudGVyfHRvcHxib3R0b218bGVmdHxyaWdodHxcXGQrJXxcXGQrcHgpL2kudGVzdCh0b2tlbikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICgvXihjb3Zlcnxjb250YWluKSQvaS50ZXN0KHRva2VuKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKC9eKGJvcmRlci1ib3h8cGFkZGluZy1ib3h8Y29udGVudC1ib3gpJC9pLnRlc3QodG9rZW4pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoL14oY2xpcHxib3JkZXJ8cGFkZGluZ3xjb250ZW50KSQvaS50ZXN0KHRva2VuKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKC9eXFxkLy50ZXN0KHRva2VuKSAmJiAhdG9rZW4uaW5jbHVkZXMoJ2dyYWRpZW50JykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICgvXih0cmFuc3BhcmVudHx3aGl0ZXxibGFja3xyZWR8Ymx1ZXxncmVlbnx5ZWxsb3d8b3JhbmdlfHB1cnBsZXxwaW5rfGdyYXl8Z3JleXxicm93bnxjeWFufG1hZ2VudGF8b2xpdmV8bGltZXxhcXVhfG5hdnl8dGVhbHxtYXJvb258c2lsdmVyfGZ1Y2hzaWEpJC9pLnRlc3QodG9rZW4pKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKC9eKGFsaWNlYmx1ZXxhbnRpcXVld2hpdGV8YXF1YXxhcXVhbWFyaW5lfGF6dXJlfGJlaWdlfGJpc3F1ZXxibGFuY2hlZGFsbW9uZHxibHVldmlvbGV0fGJ1cmx5d29vZHxjYWRldGJsdWV8Y2hhcnRyZXVzZXxjaG9jb2xhdGV8Y29yYWx8Y29ybmZsb3dlcmJsdWV8Y29ybnNpbGt8Y3JpbXNvbnxkYXJrYmx1ZXxkYXJrY3lhbnxkYXJrZ29sZGVucm9kfGRhcmtncmF5fGRhcmtncmVlbnxkYXJrZ3JleXxkYXJra2hha2l8ZGFya21hZ2VudGF8ZGFya29saXZlZ3JlZW58ZGFya29yYW5nZXxkYXJrb3JjaGlkfGRhcmtyZWR8ZGFya3NhbG1vbnxkYXJrc2VhZ3JlZW58ZGFya3NsYXRlYmx1ZXxkYXJrc2xhdGVncmF5fGRhcmtzbGF0ZWdyZXl8ZGFya3R1cnF1b2lzZXxkYXJrdmlvbGV0fGRlZXBwaW5rfGRlZXBza3libHVlfGRpbWdyYXl8ZGltZ3JleXxkb2RnZXJibHVlfGZpcmVicmlja3xmbG9yYWx3aGl0ZXxmb3Jlc3RncmVlbnxnYWluc2Jvcm98Z2hvc3R3aGl0ZXxnb2xkfGdvbGRlbnJvZHxncmVlbnllbGxvd3xncmV5fGhvbmV5ZGV3fGhvdHBpbmt8aW5kaWFucmVkfGluZGlnb3xpdm9yeXxraGFraXxsYXZlbmRlcnxsYXZlbmRlcmJsdXNofGxhd25ncmVlbnxsZW1vbmNoaWZmb258bGlnaHRibHVlfGxpZ2h0Y29yYWx8bGlnaHRjeWFufGxpZ2h0Z29sZGVucm9keWVsbG93fGxpZ2h0Z3JheXxsaWdodGdyZWVufGxpZ2h0Z3JleXxsaWdodHBpbmt8bGlnaHRzYWxtb258bGlnaHRzZWFncmVlbnxsaWdodHNreWJsdWV8bGlnaHRzbGF0ZWdyYXl8bGlnaHRzbGF0ZWdyZXl8bGlnaHRzdGVlbGJsdWV8bGlnaHR5ZWxsb3d8bGltZWdyZWVufGxpbmVufG1lZGl1bWFxdWFtYXJpbmV8bWVkaXVtYmx1ZXxtZWRpdW1vcmNoaWR8bWVkaXVtcHVycGxlfG1lZGl1bXNlYWdyZWVufG1lZGl1bXNsYXRlYmx1ZXxtZWRpdW1zcHJpbmdncmVlbnxtZWRpdW10dXJxdW9pc2V8bWVkaXVtdmlvbGV0cmVkfG1pZG5pZ2h0Ymx1ZXxtaW50Y3JlYW18bWlzdHlyb3NlfG1vY2Nhc2lufG5hdmFqb3doaXRlfG9sZGxhY2V8b2xpdmVkcmFifG9yYW5nZXJlZHxvcmNoaWR8cGFsZWdvbGRlbnJvZHxwYWxlZ3JlZW58cGFsZXR1cnF1b2lzZXxwYWxldmlvbGV0cmVkfHBhcGF5YXdoaXB8cGVhY2hwdWZmfHBlcnV8cGx1bXxwb3dkZXJibHVlfHJlYmVjY2FwdXJwbGV8cm9zeWJyb3dufHJveWFsYmx1ZXxzYWRkbGVicm93bnxzYWxtb258c2FuZHlicm93bnxzZWFncmVlbnxzZWFzaGVsbHxzaWVubmF8c2t5Ymx1ZXxzbGF0ZWJsdWV8c2xhdGVncmF5fHNsYXRlZ3JleXxzbm93fHNwcmluZ2dyZWVufHN0ZWVsYmx1ZXx0YW58dGhpc3RsZXx0b21hdG98dHVycXVvaXNlfHZpb2xldHx3aGVhdHx3aGl0ZXNtb2tlfHllbGxvd2dyZWVuKSQvaS50ZXN0KHRva2VuKSkge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U3BhY2luZ1Nob3J0aGFuZChwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBNdWx0aUNvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMudG9rZW5pemVWYWx1ZSh2YWx1ZSk7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHByZWZpeCA9IHByb3AgPT09ICdtYXJnaW4nID8gJ20nIDogJ3AnO1xuICAgIGNvbnN0IHByb3BQcmVmaXggPSBwcm9wID09PSAnbWFyZ2luJyA/ICdtYXJnaW4nIDogJ3BhZGRpbmcnO1xuXG4gICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzOiBbJ0VtcHR5IHNwYWNpbmcgdmFsdWUnXSwgY3NzUHJvcGVydGllcyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZFRva2VucyA9IHRva2Vucy5tYXAodCA9PiB0aGlzLnBhcnNlU3BhY2luZ1ZhbHVlKHQpKTtcblxuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZWRUb2tlbnNbMF07XG4gICAgICBpZiAocGFyc2VkLnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkocHJlZml4LCBwYXJzZWQpKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKHByb3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgSW52YWxpZCAke3Byb3B9IHZhbHVlOiAke3Rva2Vuc1swXX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2Vucy5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IFt2ZXJ0aWNhbCwgaG9yaXpvbnRhbF0gPSBwYXJzZWRUb2tlbnM7XG4gICAgICBcbiAgICAgIGlmICh2ZXJ0aWNhbC5weCAhPT0gbnVsbCB8fCAvXi0/XFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2godGhpcy5idWlsZFNwYWNpbmdVdGlsaXR5KGAke3ByZWZpeH15YCwgdmVydGljYWwpKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKGAke3Byb3BQcmVmaXh9LXlgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfSB2ZXJ0aWNhbCB2YWx1ZTogJHt0b2tlbnNbMF19YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChob3Jpem9udGFsLnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMV0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkoYCR7cHJlZml4fXhgLCBob3Jpem9udGFsKSk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaChgJHtwcm9wUHJlZml4fS14YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0gaG9yaXpvbnRhbCB2YWx1ZTogJHt0b2tlbnNbMV19YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0b2tlbnMubGVuZ3RoID09PSAzKSB7XG4gICAgICBjb25zdCBbdG9wLCBob3Jpem9udGFsLCBib3R0b21dID0gcGFyc2VkVG9rZW5zO1xuXG4gICAgICBpZiAodG9wLnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkoYCR7cHJlZml4fXRgLCB0b3ApKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKGAke3Byb3BQcmVmaXh9LXRvcGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgSW52YWxpZCAke3Byb3B9LXRvcCB2YWx1ZTogJHt0b2tlbnNbMF19YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChob3Jpem9udGFsLnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMV0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkoYCR7cHJlZml4fXhgLCBob3Jpem9udGFsKSk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaChgJHtwcm9wUHJlZml4fS14YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0gaG9yaXpvbnRhbCB2YWx1ZTogJHt0b2tlbnNbMV19YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChib3R0b20ucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1syXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9YmAsIGJvdHRvbSkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0tYm90dG9tYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0tYm90dG9tIHZhbHVlOiAke3Rva2Vuc1syXX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2Vucy5sZW5ndGggPj0gNCkge1xuICAgICAgY29uc3QgW3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdF0gPSBwYXJzZWRUb2tlbnM7XG5cbiAgICAgIGlmICh0b3AucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9dGAsIHRvcCkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0tdG9wYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0tdG9wIHZhbHVlOiAke3Rva2Vuc1swXX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJpZ2h0LnB4ICE9PSBudWxsIHx8IC9eLT9cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh0b2tlbnNbMV0pKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh0aGlzLmJ1aWxkU3BhY2luZ1V0aWxpdHkoYCR7cHJlZml4fXJgLCByaWdodCkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0tcmlnaHRgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfS1yaWdodCB2YWx1ZTogJHt0b2tlbnNbMV19YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChib3R0b20ucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1syXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9YmAsIGJvdHRvbSkpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goYCR7cHJvcFByZWZpeH0tYm90dG9tYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKGBJbnZhbGlkICR7cHJvcH0tYm90dG9tIHZhbHVlOiAke3Rva2Vuc1syXX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxlZnQucHggIT09IG51bGwgfHwgL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHRva2Vuc1szXSkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKHRoaXMuYnVpbGRTcGFjaW5nVXRpbGl0eShgJHtwcmVmaXh9bGAsIGxlZnQpKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKGAke3Byb3BQcmVmaXh9LWxlZnRgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgJHtwcm9wfS1sZWZ0IHZhbHVlOiAke3Rva2Vuc1szXX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc2VzLCB3YXJuaW5ncywgY3NzUHJvcGVydGllcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGlzcGxheSh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgZGlzcGxheU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdmbGV4JzogJ2ZsZXgnLFxuICAgICAgJ2Jsb2NrJzogJ2Jsb2NrJyxcbiAgICAgICdpbmxpbmUnOiAnaW5saW5lJyxcbiAgICAgICdpbmxpbmUtYmxvY2snOiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICdncmlkJzogJ2dyaWQnLFxuICAgICAgJ2lubGluZS1mbGV4JzogJ2lubGluZS1mbGV4JyxcbiAgICAgICdpbmxpbmUtZ3JpZCc6ICdpbmxpbmUtZ3JpZCcsXG4gICAgICAnbm9uZSc6ICdoaWRkZW4nLFxuICAgICAgJ2NvbnRlbnRzJzogJ2NvbnRlbnRzJyxcbiAgICAgICd0YWJsZSc6ICd0YWJsZScsXG4gICAgICAndGFibGUtY2VsbCc6ICd0YWJsZS1jZWxsJyxcbiAgICAgICd0YWJsZS1yb3cnOiAndGFibGUtcm93JyxcbiAgICAgICdmbG93LXJvb3QnOiAnZmxvdy1yb290J1xuICAgIH07XG5cbiAgICBpZiAoZGlzcGxheU1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogZGlzcGxheU1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGRpc3BsYXkgdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0TWFyZ2luKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHNpZGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnbWFyZ2luJzogJ20nLFxuICAgICAgJ21hcmdpbi10b3AnOiAnbXQnLFxuICAgICAgJ21hcmdpbi1yaWdodCc6ICdtcicsXG4gICAgICAnbWFyZ2luLWJvdHRvbSc6ICdtYicsXG4gICAgICAnbWFyZ2luLWxlZnQnOiAnbWwnLFxuICAgICAgJ21hcmdpbi14JzogJ214JyxcbiAgICAgICdtYXJnaW4teSc6ICdteSdcbiAgICB9O1xuICAgIGNvbnN0IHByZWZpeCA9IHNpZGVNYXBbcHJvcF0gfHwgJ20nO1xuICAgIFxuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB2YWx1ZS5zdGFydHNXaXRoKCctJyk7XG4gICAgY29uc3QgYWJzb2x1dGVWYWx1ZSA9IGlzTmVnYXRpdmUgPyB2YWx1ZS5zbGljZSgxKSA6IHZhbHVlO1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgoYWJzb2x1dGVWYWx1ZSk7XG4gICAgXG4gICAgaWYgKHZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1hdXRvYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHB4ID09PSBudWxsKSB7XG4gICAgICBpZiAoL14tP1xcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlKT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYE5vbi1waXhlbCBtYXJnaW4gdmFsdWU6ICR7dmFsdWV9YCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICBpZiAoIXNwYWNpbmcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGlzTmVnYXRpdmUgPyBgLSR7cHJlZml4fS0ke3NwYWNpbmd9YCA6IGAke3ByZWZpeH0tJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRQYWRkaW5nKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIFxuICAgIGNvbnN0IHNpZGVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAncGFkZGluZyc6ICdwJyxcbiAgICAgICdwYWRkaW5nLXRvcCc6ICdwdCcsXG4gICAgICAncGFkZGluZy1yaWdodCc6ICdwcicsXG4gICAgICAncGFkZGluZy1ib3R0b20nOiAncGInLFxuICAgICAgJ3BhZGRpbmctbGVmdCc6ICdwbCcsXG4gICAgICAncGFkZGluZy14JzogJ3B4JyxcbiAgICAgICdwYWRkaW5nLXknOiAncHknXG4gICAgfTtcbiAgICBjb25zdCBwcmVmaXggPSBzaWRlTWFwW3Byb3BdIHx8ICdwJztcbiAgICBcbiAgICBpZiAocHggPT09IG51bGwpIHtcbiAgICAgIGlmICgvXi0/XFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgTm9uLXBpeGVsIHBhZGRpbmcgdmFsdWU6ICR7dmFsdWV9YCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICBpZiAoIXNwYWNpbmcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREaW1lbnNpb25Db25zdHJhaW50KHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHByZWZpeE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdtYXgtd2lkdGgnOiAnbWF4LXcnLFxuICAgICAgJ21pbi13aWR0aCc6ICdtaW4tdycsXG4gICAgICAnbWF4LWhlaWdodCc6ICdtYXgtaCcsXG4gICAgICAnbWluLWhlaWdodCc6ICdtaW4taCdcbiAgICB9O1xuICAgIGNvbnN0IHByZWZpeCA9IHByZWZpeE1hcFtwcm9wXTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJzEwMCUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tZnVsbGAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzAnIHx8IHZhbHVlID09PSAnMHB4Jykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LTBgLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LW5vbmVgLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnbWF4LXdpZHRoJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnbWluLWNvbnRlbnQnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ21heC13LW1pbicsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT09ICdtYXgtY29udGVudCcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnbWF4LXctbWF4Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gJ2ZpdC1jb250ZW50Jykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdtYXgtdy1maXQnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXhXUHJvc2VTaXplczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJzY1Y2gnOiAncHJvc2UnLFxuICAgICAgICAnODBjaCc6ICdwcm9zZS1sZydcbiAgICAgIH07XG4gICAgICBpZiAobWF4V1Byb3NlU2l6ZXNbdmFsdWVdKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYG1heC13LSR7bWF4V1Byb3NlU2l6ZXNbdmFsdWVdfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1heFdpZHRoU2NhbGUuaGFzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBtYXgtdy0ke3RoaXMubWF4V2lkdGhTY2FsZS5nZXQodmFsdWUpfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgICBpZiAoc3BhY2luZykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCV8Y2h8dnd8dmgpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGAke3ByZWZpeH0tWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4ICR7cHJvcH0gdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Rm9udFdlaWdodCh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3Qgd2VpZ2h0TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJzEwMCc6ICdmb250LXRoaW4nLFxuICAgICAgJzIwMCc6ICdmb250LWV4dHJhbGlnaHQnLFxuICAgICAgJzMwMCc6ICdmb250LWxpZ2h0JyxcbiAgICAgICc0MDAnOiAnZm9udC1ub3JtYWwnLFxuICAgICAgJzUwMCc6ICdmb250LW1lZGl1bScsXG4gICAgICAnNjAwJzogJ2ZvbnQtc2VtaWJvbGQnLFxuICAgICAgJzcwMCc6ICdmb250LWJvbGQnLFxuICAgICAgJzgwMCc6ICdmb250LWV4dHJhYm9sZCcsXG4gICAgICAnOTAwJzogJ2ZvbnQtYmxhY2snLFxuICAgICAgJ25vcm1hbCc6ICdmb250LW5vcm1hbCcsXG4gICAgICAnYm9sZCc6ICdmb250LWJvbGQnXG4gICAgfTtcblxuICAgIGlmICh3ZWlnaHRNYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHdlaWdodE1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGZvbnQtd2VpZ2h0OiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZvbnRTaXplKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBpZiAocHggIT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLmZvbnRTaXplU2NhbGUuaGFzKHB4KSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LSR7dGhpcy5mb250U2l6ZVNjYWxlLmdldChweCl9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdGV4dC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBOb24tc3RhbmRhcmQgZm9udC1zaXplOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRleHREZWNvcmF0aW9uKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBkZWNvcmF0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3VuZGVybGluZSc6ICd1bmRlcmxpbmUnLFxuICAgICAgJ2xpbmUtdGhyb3VnaCc6ICdsaW5lLXRocm91Z2gnLFxuICAgICAgJ25vbmUnOiAnbm8tdW5kZXJsaW5lJyxcbiAgICAgICduby11bmRlcmxpbmUnOiAnbm8tdW5kZXJsaW5lJ1xuICAgIH07XG5cbiAgICBpZiAoZGVjb3JhdGlvbk1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogZGVjb3JhdGlvbk1hcFt2YWx1ZV0sIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYFVuc3VwcG9ydGVkIHRleHQtZGVjb3JhdGlvbiB2YWx1ZTogJHt2YWx1ZX1gKTtcbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVuc3VwcG9ydGVkIHRleHQtZGVjb3JhdGlvbjogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRUZXh0VHJhbnNmb3JtKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCB0cmFuc2Zvcm1NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAndXBwZXJjYXNlJzogJ3VwcGVyY2FzZScsXG4gICAgICAnbG93ZXJjYXNlJzogJ2xvd2VyY2FzZScsXG4gICAgICAnY2FwaXRhbGl6ZSc6ICdjYXBpdGFsaXplJyxcbiAgICAgICdub25lJzogJ25vcm1hbC1jYXNlJyxcbiAgICAgICdpbml0aWFsJzogJ25vcm1hbC1jYXNlJ1xuICAgIH07XG5cbiAgICBpZiAodHJhbnNmb3JtTWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiB0cmFuc2Zvcm1NYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biB0ZXh0LXRyYW5zZm9ybTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRMZXR0ZXJTcGFjaW5nKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBpZiAodGhpcy5sZXR0ZXJTcGFjaW5nU2NhbGUuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdHJhY2tpbmctJHt0aGlzLmxldHRlclNwYWNpbmdTY2FsZS5nZXQodmFsdWUpfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY29uc3Qga25vd25NYXBwaW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICctMC4wMjVlbSc6ICd0aWdodCcsXG4gICAgICAnLTAuMDVlbSc6ICd0aWdodGVyJyxcbiAgICAgICcwLjAyNWVtJzogJ3dpZGUnLFxuICAgICAgJzAuMDVlbSc6ICd3aWRlcicsXG4gICAgICAnMC4xZW0nOiAnd2lkZXN0JyxcbiAgICAgICcwZW0nOiAnbm9ybWFsJ1xuICAgIH07XG5cbiAgICBpZiAoa25vd25NYXBwaW5nc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRyYWNraW5nLSR7a25vd25NYXBwaW5nc1t2YWx1ZV19YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL14tP1xcZCsoXFwuXFxkKyk/KGVtfHB4fHJlbSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRyYWNraW5nLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBsZXR0ZXItc3BhY2luZzogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRMaW5lSGVpZ2h0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBpZiAodGhpcy5saW5lSGVpZ2h0U2NhbGUuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgbGVhZGluZy0ke3RoaXMubGluZUhlaWdodFNjYWxlLmdldCh2YWx1ZSl9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBrbm93bk1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJzEnOiAnbm9uZScsXG4gICAgICAnMS4yNSc6ICd0aWdodCcsXG4gICAgICAnMS4zNzUnOiAnc251ZycsXG4gICAgICAnMS41JzogJ25vcm1hbCcsXG4gICAgICAnMS42MjUnOiAncmVsYXhlZCcsXG4gICAgICAnMic6ICdsb29zZSdcbiAgICB9O1xuXG4gICAgaWYgKGtub3duTWFwcGluZ3NbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBsZWFkaW5nLSR7a25vd25NYXBwaW5nc1t2YWx1ZV19YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBsZWFkaW5nLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGxlYWRpbmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGxpbmUtaGVpZ2h0OiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZsZXhib3gocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgaWYgKHByb3AgPT09ICdmbGV4LWRpcmVjdGlvbicpIHtcbiAgICAgIGNvbnN0IGRpck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3Jvdyc6ICdmbGV4LXJvdycsXG4gICAgICAgICdyb3ctcmV2ZXJzZSc6ICdmbGV4LXJvdy1yZXZlcnNlJyxcbiAgICAgICAgJ2NvbHVtbic6ICdmbGV4LWNvbCcsXG4gICAgICAgICdjb2x1bW4tcmV2ZXJzZSc6ICdmbGV4LWNvbC1yZXZlcnNlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogZGlyTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhZGlyTWFwW3ZhbHVlXSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnZmxleC13cmFwJykge1xuICAgICAgY29uc3Qgd3JhcE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3dyYXAnOiAnZmxleC13cmFwJyxcbiAgICAgICAgJ25vd3JhcCc6ICdmbGV4LW5vd3JhcCcsXG4gICAgICAgICd3cmFwLXJldmVyc2UnOiAnZmxleC13cmFwLXJldmVyc2UnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiB3cmFwTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhd3JhcE1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2p1c3RpZnktY29udGVudCcpIHtcbiAgICAgIGNvbnN0IGp1c3RpZnlNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ2p1c3RpZnktc3RhcnQnLFxuICAgICAgICAnZmxleC1lbmQnOiAnanVzdGlmeS1lbmQnLFxuICAgICAgICAnY2VudGVyJzogJ2p1c3RpZnktY2VudGVyJyxcbiAgICAgICAgJ3NwYWNlLWJldHdlZW4nOiAnanVzdGlmeS1iZXR3ZWVuJyxcbiAgICAgICAgJ3NwYWNlLWFyb3VuZCc6ICdqdXN0aWZ5LWFyb3VuZCcsXG4gICAgICAgICdzcGFjZS1ldmVubHknOiAnanVzdGlmeS1ldmVubHknXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBqdXN0aWZ5TWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhanVzdGlmeU1hcFt2YWx1ZV0gfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2FsaWduLWl0ZW1zJykge1xuICAgICAgY29uc3QgYWxpZ25NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ2l0ZW1zLXN0YXJ0JyxcbiAgICAgICAgJ2ZsZXgtZW5kJzogJ2l0ZW1zLWVuZCcsXG4gICAgICAgICdjZW50ZXInOiAnaXRlbXMtY2VudGVyJyxcbiAgICAgICAgJ2Jhc2VsaW5lJzogJ2l0ZW1zLWJhc2VsaW5lJyxcbiAgICAgICAgJ3N0cmV0Y2gnOiAnaXRlbXMtc3RyZXRjaCdcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGFsaWduTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhYWxpZ25NYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdhbGlnbi1jb250ZW50Jykge1xuICAgICAgY29uc3QgYWxpZ25NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdmbGV4LXN0YXJ0JzogJ2NvbnRlbnQtc3RhcnQnLFxuICAgICAgICAnZmxleC1lbmQnOiAnY29udGVudC1lbmQnLFxuICAgICAgICAnY2VudGVyJzogJ2NvbnRlbnQtY2VudGVyJyxcbiAgICAgICAgJ3NwYWNlLWJldHdlZW4nOiAnY29udGVudC1iZXR3ZWVuJyxcbiAgICAgICAgJ3NwYWNlLWFyb3VuZCc6ICdjb250ZW50LWFyb3VuZCcsXG4gICAgICAgICdzdHJldGNoJzogJ2NvbnRlbnQtc3RyZXRjaCdcbiAgICAgIH07XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGFsaWduTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhYWxpZ25NYXBbdmFsdWVdIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdhbGlnbi1zZWxmJykge1xuICAgICAgY29uc3QgYWxpZ25TZWxmTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnYXV0byc6ICdzZWxmLWF1dG8nLFxuICAgICAgICAnZmxleC1zdGFydCc6ICdzZWxmLXN0YXJ0JyxcbiAgICAgICAgJ2ZsZXgtZW5kJzogJ3NlbGYtZW5kJyxcbiAgICAgICAgJ2NlbnRlcic6ICdzZWxmLWNlbnRlcicsXG4gICAgICAgICdzdHJldGNoJzogJ3NlbGYtc3RyZXRjaCcsXG4gICAgICAgICdiYXNlbGluZSc6ICdzZWxmLWJhc2VsaW5lJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYWxpZ25TZWxmTWFwW3ZhbHVlXSB8fCBudWxsLCBza2lwcGVkOiAhYWxpZ25TZWxmTWFwW3ZhbHVlXSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnZmxleC1ncm93Jykge1xuICAgICAgaWYgKHZhbHVlID09PSAnMCcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnZ3Jvdy0wJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gJzEnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2dyb3cnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgZ3Jvdy1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2ZsZXgtc2hyaW5rJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnMCcpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnc2hyaW5rLTAnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09PSAnMScpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnc2hyaW5rJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHNocmluay1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAocHJvcCA9PT0gJ2ZsZXgtYmFzaXMnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdiYXNpcy1hdXRvJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gJzAnIHx8IHZhbHVlID09PSAnMHB4Jykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdiYXNpcy0wJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICAgICAgaWYgKHNwYWNpbmcpIHtcbiAgICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBiYXNpcy0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCV8dnd8dmgpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJhc2lzLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5zdXBwb3J0ZWQgZmxleGJveCBwcm9wZXJ0eTogJHtwcm9wfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZsZXhTaG9ydGhhbmQodmFsdWU6IHN0cmluZyk6IE11bHRpQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKHZhbHVlID09PSAnMScpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnZmxleC0xJyk7XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2ZsZXgnKTtcbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICBjbGFzc2VzLnB1c2goJ2ZsZXgtYXV0bycpO1xuICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdmbGV4Jyk7XG4gICAgICByZXR1cm4geyBjbGFzc2VzLCB3YXJuaW5ncywgY3NzUHJvcGVydGllcyB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdub25lJykge1xuICAgICAgY2xhc3Nlcy5wdXNoKCdmbGV4LW5vbmUnKTtcbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnZmxleC1pbml0aWFsJyk7XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2ZsZXgnKTtcbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZVZhbHVlKHZhbHVlKTtcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMykge1xuICAgICAgY29uc3QgW2dyb3csIHNocmluaywgYmFzaXNdID0gdG9rZW5zO1xuICAgICAgXG4gICAgICBpZiAoZ3JvdyA9PT0gJzEnICYmIHNocmluayA9PT0gJzEnICYmIGJhc2lzID09PSAnMCUnKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnZmxleC0xJyk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgfSBlbHNlIGlmIChncm93ID09PSAnMScgJiYgc2hyaW5rID09PSAnMScgJiYgYmFzaXMgPT09ICdhdXRvJykge1xuICAgICAgICBjbGFzc2VzLnB1c2goJ2ZsZXgtYXV0bycpO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2ZsZXgnKTtcbiAgICAgIH0gZWxzZSBpZiAoZ3JvdyA9PT0gJzAnICYmIHNocmluayA9PT0gJzEnICYmIGJhc2lzID09PSAnYXV0bycpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdmbGV4LWluaXRpYWwnKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdmbGV4Jyk7XG4gICAgICB9IGVsc2UgaWYgKGdyb3cgPT09ICcwJyAmJiBzaHJpbmsgPT09ICcwJyAmJiBiYXNpcyA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnZmxleC1ub25lJyk7XG4gICAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGBmbGV4LVske3ZhbHVlfV1gKTtcbiAgICAgICAgY3NzUHJvcGVydGllcy5wdXNoKCdmbGV4Jyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDEgfHwgdG9rZW5zLmxlbmd0aCA9PT0gMikge1xuICAgICAgY2xhc3Nlcy5wdXNoKGBmbGV4LVske3ZhbHVlfV1gKTtcbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnZmxleCcpO1xuICAgICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgICB9XG5cbiAgICB3YXJuaW5ncy5wdXNoKGBDb21wbGV4IGZsZXggc2hvcnRoYW5kOiAke3ZhbHVlfWApO1xuICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRHYXAodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGdhcC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgTm9uLXBpeGVsIGdhcCB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMucHhUb1NwYWNpbmcocHgpO1xuICAgIGlmICghc3BhY2luZykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgZ2FwLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGdhcC0ke3NwYWNpbmd9YCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFdpZHRoKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBpZiAodmFsdWUgPT09ICcxMDAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy1mdWxsJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnNTAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0xLzInLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICczMy4zMzMlJyB8fCB2YWx1ZSA9PT0gJzMzLjMzJScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMS8zJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnNjYuNjY2JScgfHwgdmFsdWUgPT09ICc2Ni42NyUnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LTIvMycsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJzI1JScpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctMS80Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnNzUlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy0zLzQnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy1hdXRvJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnZml0LWNvbnRlbnQnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICd3LWZpdCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ21pbi1jb250ZW50Jykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAndy1taW4nLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdtYXgtY29udGVudCcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3ctbWF4Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBweCA9IHRoaXMuZXh0cmFjdFB4KHZhbHVlKTtcbiAgICBpZiAocHggIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNwYWNpbmcgPSB0aGlzLnB4VG9TcGFjaW5nKHB4KTtcbiAgICAgIGlmIChzcGFjaW5nKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHctJHtzcGFjaW5nfWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB3LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXwlfHZ3KT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgdy1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggd2lkdGggdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGVpZ2h0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBpZiAodmFsdWUgPT09ICcxMDAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC1mdWxsJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnNTAlJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC0xLzInLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC1hdXRvJywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnZml0LWNvbnRlbnQnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdoLWZpdCcsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gJ21pbi1jb250ZW50Jykge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiAnaC1taW4nLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdtYXgtY29udGVudCcpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ2gtbWF4Jywgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnMTAwdmgnKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdoLXNjcmVlbicsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY29uc3QgcHggPSB0aGlzLmV4dHJhY3RQeCh2YWx1ZSk7XG4gICAgaWYgKHB4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzcGFjaW5nID0gdGhpcy5weFRvU3BhY2luZyhweCk7XG4gICAgICBpZiAoc3BhY2luZykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBoLSR7c3BhY2luZ31gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgaC1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW18JXx2aCk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGgtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGhlaWdodCB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRCYWNrZ3JvdW5kQ29sb3IodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGNvbG9yTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3RyYW5zcGFyZW50JzogJ2JnLXRyYW5zcGFyZW50JyxcbiAgICAgICd3aGl0ZSc6ICdiZy13aGl0ZScsXG4gICAgICAnYmxhY2snOiAnYmctYmxhY2snLFxuICAgICAgJ3JlZCc6ICdiZy1yZWQtNTAwJyxcbiAgICAgICdibHVlJzogJ2JnLWJsdWUtNTAwJyxcbiAgICAgICdncmVlbic6ICdiZy1ncmVlbi01MDAnLFxuICAgICAgJ2dyYXknOiAnYmctZ3JheS01MDAnXG4gICAgfTtcblxuICAgIGlmIChjb2xvck1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogY29sb3JNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJnLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYmctWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBDb21wbGV4IGJhY2tncm91bmQtY29sb3I6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VGV4dENvbG9yKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBjb2xvck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICd0cmFuc3BhcmVudCc6ICd0ZXh0LXRyYW5zcGFyZW50JyxcbiAgICAgICd3aGl0ZSc6ICd0ZXh0LXdoaXRlJyxcbiAgICAgICdibGFjayc6ICd0ZXh0LWJsYWNrJyxcbiAgICAgICdyZWQnOiAndGV4dC1yZWQtNTAwJyxcbiAgICAgICdibHVlJzogJ3RleHQtYmx1ZS01MDAnLFxuICAgICAgJ2dyZWVuJzogJ3RleHQtZ3JlZW4tNTAwJyxcbiAgICAgICdncmF5JzogJ3RleHQtZ3JheS01MDAnXG4gICAgfTtcblxuICAgIGlmIChjb2xvck1hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogY29sb3JNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHRleHQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGB0ZXh0LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgQ29tcGxleCBjb2xvcjogJHt2YWx1ZX1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRCb3JkZXJSYWRpdXModmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IHB4ID0gdGhpcy5leHRyYWN0UHgodmFsdWUpO1xuICAgIFxuICAgIGlmIChweCA9PT0gbnVsbCkge1xuICAgICAgaWYgKHZhbHVlID09PSAnNTAlJykge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6ICdyb3VuZGVkLWZ1bGwnLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKC9eXFxkKyhcXC5cXGQrKT8ocHh8cmVtfGVtfCUpPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHJvdW5kZWQtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYENvbXBsZXggYm9yZGVyLXJhZGl1czogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmFkaXVzTWFwOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAgICAgMDogJ3JvdW5kZWQtbm9uZScsXG4gICAgICAyOiAncm91bmRlZC1zbScsXG4gICAgICA0OiAncm91bmRlZCcsXG4gICAgICA2OiAncm91bmRlZC1tZCcsXG4gICAgICA4OiAncm91bmRlZC1sZycsXG4gICAgICAxMjogJ3JvdW5kZWQteGwnLFxuICAgICAgMTY6ICdyb3VuZGVkLTJ4bCcsXG4gICAgICAyNDogJ3JvdW5kZWQtM3hsJ1xuICAgIH07XG5cbiAgICBjb25zdCBjbG9zZXN0ID0gT2JqZWN0LmtleXMocmFkaXVzTWFwKVxuICAgICAgLm1hcChOdW1iZXIpXG4gICAgICAucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBcbiAgICAgICAgTWF0aC5hYnMoY3VyciAtIHB4KSA8IE1hdGguYWJzKHByZXYgLSBweCkgPyBjdXJyIDogcHJldlxuICAgICAgKTtcblxuICAgIGlmIChNYXRoLmFicyhjbG9zZXN0IC0gcHgpIC8gKHB4IHx8IDEpIDwgMC4yKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHJhZGl1c01hcFtjbG9zZXN0XSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IGByb3VuZGVkLVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Qm9yZGVyKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGlmIChwcm9wID09PSAnYm9yZGVyLXdpZHRoJykge1xuICAgICAgY29uc3Qgd2lkdGhNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICcwJzogJ2JvcmRlci0wJyxcbiAgICAgICAgJzFweCc6ICdib3JkZXInLFxuICAgICAgICAnMnB4JzogJ2JvcmRlci0yJyxcbiAgICAgICAgJzRweCc6ICdib3JkZXItNCcsXG4gICAgICAgICc4cHgnOiAnYm9yZGVyLTgnXG4gICAgICB9O1xuXG4gICAgICBpZiAod2lkdGhNYXBbdmFsdWVdKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogd2lkdGhNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW0pPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJvcmRlci1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGJvcmRlci13aWR0aDogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdib3JkZXItc3R5bGUnKSB7XG4gICAgICBjb25zdCBzdHlsZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3NvbGlkJzogJycsXG4gICAgICAgICdkYXNoZWQnOiAnYm9yZGVyLWRhc2hlZCcsXG4gICAgICAgICdkb3R0ZWQnOiAnYm9yZGVyLWRvdHRlZCcsXG4gICAgICAgICdkb3VibGUnOiAnYm9yZGVyLWRvdWJsZScsXG4gICAgICAgICdoaWRkZW4nOiAnYm9yZGVyLWhpZGRlbicsXG4gICAgICAgICdub25lJzogJ2JvcmRlci1ub25lJ1xuICAgICAgfTtcblxuICAgICAgaWYgKHZhbHVlID09PSAnc29saWQnKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0eWxlTWFwW3ZhbHVlXSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IHN0eWxlTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duIGJvcmRlci1zdHlsZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICdib3JkZXItY29sb3InKSB7XG4gICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYGJvcmRlci1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdyZ2InKSkge1xuICAgICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBib3JkZXItWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbG9yTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAndHJhbnNwYXJlbnQnOiAnYm9yZGVyLXRyYW5zcGFyZW50JyxcbiAgICAgICAgJ3doaXRlJzogJ2JvcmRlci13aGl0ZScsXG4gICAgICAgICdibGFjayc6ICdib3JkZXItYmxhY2snLFxuICAgICAgICAncmVkJzogJ2JvcmRlci1yZWQtNTAwJyxcbiAgICAgICAgJ2JsdWUnOiAnYm9yZGVyLWJsdWUtNTAwJyxcbiAgICAgICAgJ2dyZWVuJzogJ2JvcmRlci1ncmVlbi01MDAnLFxuICAgICAgICAnZ3JheSc6ICdib3JkZXItZ3JheS01MDAnXG4gICAgICB9O1xuXG4gICAgICBpZiAoY29sb3JNYXBbdmFsdWVdKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogY29sb3JNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBib3JkZXItJHt2YWx1ZX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wID09PSAnYm9yZGVyLXRvcC13aWR0aCcgfHwgcHJvcCA9PT0gJ2JvcmRlci1yaWdodC13aWR0aCcgfHwgXG4gICAgICAgIHByb3AgPT09ICdib3JkZXItYm90dG9tLXdpZHRoJyB8fCBwcm9wID09PSAnYm9yZGVyLWxlZnQtd2lkdGgnKSB7XG4gICAgICBjb25zdCBzaWRlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnYm9yZGVyLXRvcC13aWR0aCc6ICdib3JkZXItdCcsXG4gICAgICAgICdib3JkZXItcmlnaHQtd2lkdGgnOiAnYm9yZGVyLXInLFxuICAgICAgICAnYm9yZGVyLWJvdHRvbS13aWR0aCc6ICdib3JkZXItYicsXG4gICAgICAgICdib3JkZXItbGVmdC13aWR0aCc6ICdib3JkZXItbCdcbiAgICAgIH07XG4gICAgICBjb25zdCBwcmVmaXggPSBzaWRlTWFwW3Byb3BdO1xuXG4gICAgICBjb25zdCB3aWR0aE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJzAnOiBgJHtwcmVmaXh9LTBgLFxuICAgICAgICAnMXB4JzogcHJlZml4LFxuICAgICAgICAnMnB4JzogYCR7cHJlZml4fS0yYCxcbiAgICAgICAgJzRweCc6IGAke3ByZWZpeH0tNGAsXG4gICAgICAgICc4cHgnOiBgJHtwcmVmaXh9LThgXG4gICAgICB9O1xuXG4gICAgICBpZiAod2lkdGhNYXBbdmFsdWVdKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogd2lkdGhNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoL15cXGQrKFxcLlxcZCspPyhweHxyZW18ZW0pPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYCR7cHJlZml4fS1bJHt2YWx1ZX1dYCwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBudWxsLCBza2lwcGVkOiB0cnVlLCByZWFzb246IGBVbmtub3duICR7cHJvcH06ICR7dmFsdWV9YCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBib3JkZXIgcHJvcGVydHk6ICR7cHJvcH1gIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRCb3JkZXJTaG9ydGhhbmQodmFsdWU6IHN0cmluZyk6IE11bHRpQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZVZhbHVlKHZhbHVlKTtcblxuICAgIGxldCB3aWR0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHN0eWxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY29sb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXx0aGlufG1lZGl1bXx0aGljayk/JC8udGVzdCh0b2tlbikgfHwgXG4gICAgICAgICAgdG9rZW4gPT09ICd0aGluJyB8fCB0b2tlbiA9PT0gJ21lZGl1bScgfHwgdG9rZW4gPT09ICd0aGljaycpIHtcbiAgICAgICAgd2lkdGggPSB0b2tlbjtcbiAgICAgIH0gZWxzZSBpZiAoWydzb2xpZCcsICdkYXNoZWQnLCAnZG90dGVkJywgJ2RvdWJsZScsICdoaWRkZW4nLCAnbm9uZScsICdncm9vdmUnLCAncmlkZ2UnLCAnaW5zZXQnLCAnb3V0c2V0J10uaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgIHN0eWxlID0gdG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xvciA9IHRva2VuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3aWR0aCkge1xuICAgICAgY29uc3Qgd2lkdGhNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICcwJzogJ2JvcmRlci0wJyxcbiAgICAgICAgJzFweCc6ICdib3JkZXInLFxuICAgICAgICAnMnB4JzogJ2JvcmRlci0yJyxcbiAgICAgICAgJzRweCc6ICdib3JkZXItNCcsXG4gICAgICAgICc4cHgnOiAnYm9yZGVyLTgnLFxuICAgICAgICAndGhpbic6ICdib3JkZXInLFxuICAgICAgICAnbWVkaXVtJzogJ2JvcmRlci0yJyxcbiAgICAgICAgJ3RoaWNrJzogJ2JvcmRlci00J1xuICAgICAgfTtcblxuICAgICAgaWYgKHdpZHRoTWFwW3dpZHRoXSkge1xuICAgICAgICBjbGFzc2VzLnB1c2god2lkdGhNYXBbd2lkdGhdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgYm9yZGVyLVske3dpZHRofV1gKTtcbiAgICAgIH1cbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnYm9yZGVyLXdpZHRoJyk7XG4gICAgfVxuXG4gICAgaWYgKHN0eWxlICYmIHN0eWxlICE9PSAnc29saWQnKSB7XG4gICAgICBjb25zdCBzdHlsZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ2Rhc2hlZCc6ICdib3JkZXItZGFzaGVkJyxcbiAgICAgICAgJ2RvdHRlZCc6ICdib3JkZXItZG90dGVkJyxcbiAgICAgICAgJ2RvdWJsZSc6ICdib3JkZXItZG91YmxlJyxcbiAgICAgICAgJ2hpZGRlbic6ICdib3JkZXItaGlkZGVuJyxcbiAgICAgICAgJ25vbmUnOiAnYm9yZGVyLW5vbmUnXG4gICAgICB9O1xuXG4gICAgICBpZiAoc3R5bGVNYXBbc3R5bGVdKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChzdHlsZU1hcFtzdHlsZV0pO1xuICAgICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goJ2JvcmRlci1zdHlsZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgVW5zdXBwb3J0ZWQgYm9yZGVyLXN0eWxlOiAke3N0eWxlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2xvcikge1xuICAgICAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goYGJvcmRlci1bJHtjb2xvcn1dYCk7XG4gICAgICB9IGVsc2UgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoJ3JnYicpKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChgYm9yZGVyLVske2NvbG9yfV1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbG9yTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICd0cmFuc3BhcmVudCc6ICdib3JkZXItdHJhbnNwYXJlbnQnLFxuICAgICAgICAgICd3aGl0ZSc6ICdib3JkZXItd2hpdGUnLFxuICAgICAgICAgICdibGFjayc6ICdib3JkZXItYmxhY2snXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGNvbG9yTWFwW2NvbG9yXSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChjb2xvck1hcFtjb2xvcl0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChgYm9yZGVyLSR7Y29sb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNzc1Byb3BlcnRpZXMucHVzaCgnYm9yZGVyLWNvbG9yJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MsIGNzc1Byb3BlcnRpZXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydERpcmVjdGlvbmFsQm9yZGVyU2hvcnRoYW5kKHByb3A6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IE11bHRpQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjc3NQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3Qgc2lkZU1hcDogUmVjb3JkPHN0cmluZywgeyBwcmVmaXg6IHN0cmluZzsgd2lkdGhQcm9wOiBzdHJpbmc7IGNvbG9yUHJvcDogc3RyaW5nIH0+ID0ge1xuICAgICAgJ2JvcmRlci10b3AnOiB7IHByZWZpeDogJ2JvcmRlci10Jywgd2lkdGhQcm9wOiAnYm9yZGVyLXRvcC13aWR0aCcsIGNvbG9yUHJvcDogJ2JvcmRlci10b3AtY29sb3InIH0sXG4gICAgICAnYm9yZGVyLXJpZ2h0JzogeyBwcmVmaXg6ICdib3JkZXItcicsIHdpZHRoUHJvcDogJ2JvcmRlci1yaWdodC13aWR0aCcsIGNvbG9yUHJvcDogJ2JvcmRlci1yaWdodC1jb2xvcicgfSxcbiAgICAgICdib3JkZXItYm90dG9tJzogeyBwcmVmaXg6ICdib3JkZXItYicsIHdpZHRoUHJvcDogJ2JvcmRlci1ib3R0b20td2lkdGgnLCBjb2xvclByb3A6ICdib3JkZXItYm90dG9tLWNvbG9yJyB9LFxuICAgICAgJ2JvcmRlci1sZWZ0JzogeyBwcmVmaXg6ICdib3JkZXItbCcsIHdpZHRoUHJvcDogJ2JvcmRlci1sZWZ0LXdpZHRoJywgY29sb3JQcm9wOiAnYm9yZGVyLWxlZnQtY29sb3InIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc2lkZSA9IHNpZGVNYXBbcHJvcF07XG4gICAgaWYgKCFzaWRlKSB7XG4gICAgICByZXR1cm4geyBjbGFzc2VzLCB3YXJuaW5nczogW2BVbmtub3duIGRpcmVjdGlvbmFsIGJvcmRlcjogJHtwcm9wfWBdLCBjc3NQcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZVZhbHVlKHZhbHVlKTtcblxuICAgIGxldCB3aWR0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHN0eWxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY29sb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgIGlmICgvXlxcZCsoXFwuXFxkKyk/KHB4fHJlbXxlbXx0aGlufG1lZGl1bXx0aGljayk/JC8udGVzdCh0b2tlbikgfHwgXG4gICAgICAgICAgdG9rZW4gPT09ICd0aGluJyB8fCB0b2tlbiA9PT0gJ21lZGl1bScgfHwgdG9rZW4gPT09ICd0aGljaycpIHtcbiAgICAgICAgd2lkdGggPSB0b2tlbjtcbiAgICAgIH0gZWxzZSBpZiAoWydzb2xpZCcsICdkYXNoZWQnLCAnZG90dGVkJywgJ2RvdWJsZScsICdoaWRkZW4nLCAnbm9uZSddLmluY2x1ZGVzKHRva2VuKSkge1xuICAgICAgICBzdHlsZSA9IHRva2VuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sb3IgPSB0b2tlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod2lkdGgpIHtcbiAgICAgIGNvbnN0IHdpZHRoTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAnMCc6IGAke3NpZGUucHJlZml4fS0wYCxcbiAgICAgICAgJzFweCc6IHNpZGUucHJlZml4LFxuICAgICAgICAnMnB4JzogYCR7c2lkZS5wcmVmaXh9LTJgLFxuICAgICAgICAnNHB4JzogYCR7c2lkZS5wcmVmaXh9LTRgLFxuICAgICAgICAnOHB4JzogYCR7c2lkZS5wcmVmaXh9LThgXG4gICAgICB9O1xuXG4gICAgICBpZiAod2lkdGhNYXBbd2lkdGhdKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCh3aWR0aE1hcFt3aWR0aF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGAke3NpZGUucHJlZml4fS1bJHt3aWR0aH1dYCk7XG4gICAgICB9XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goc2lkZS53aWR0aFByb3ApO1xuICAgIH1cblxuICAgIGlmIChzdHlsZSAmJiBzdHlsZSAhPT0gJ3NvbGlkJykge1xuICAgICAgd2FybmluZ3MucHVzaChgQm9yZGVyIHN0eWxlICcke3N0eWxlfScgZm9yICR7cHJvcH0gYXBwbGllcyB0byBhbGwgYm9yZGVyc2ApO1xuICAgIH1cblxuICAgIGlmIChjb2xvcikge1xuICAgICAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goYCR7c2lkZS5wcmVmaXh9LVske2NvbG9yfV1gKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sb3Iuc3RhcnRzV2l0aCgncmdiJykpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGAke3NpZGUucHJlZml4fS1bJHtjb2xvcn1dYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc2VzLnB1c2goYCR7c2lkZS5wcmVmaXh9LSR7Y29sb3J9YCk7XG4gICAgICB9XG4gICAgICBjc3NQcm9wZXJ0aWVzLnB1c2goc2lkZS5jb2xvclByb3ApO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzZXMsIHdhcm5pbmdzLCBjc3NQcm9wZXJ0aWVzIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRBc3BlY3RSYXRpbyh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcmF0aW9NYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnMS8xJzogJ2FzcGVjdC1zcXVhcmUnLFxuICAgICAgJzE2LzknOiAnYXNwZWN0LXZpZGVvJyxcbiAgICAgICc0LzMnOiAnYXNwZWN0LVs0LzNdJyxcbiAgICAgICczLzQnOiAnYXNwZWN0LVszLzRdJyxcbiAgICAgICcyLzMnOiAnYXNwZWN0LVsyLzNdJyxcbiAgICAgICczLzInOiAnYXNwZWN0LVszLzJdJyxcbiAgICAgICcxLzInOiAnYXNwZWN0LVsxLzJdJyxcbiAgICAgICcyLzEnOiAnYXNwZWN0LVsyLzFdJyxcbiAgICAgICdhdXRvJzogJ2FzcGVjdC1hdXRvJ1xuICAgIH07XG5cbiAgICBpZiAocmF0aW9NYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHJhdGlvTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IGBhc3BlY3QtWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKC9eXFxkK1xcL1xcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgYXNwZWN0LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBhc3BlY3QtcmF0aW86ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0T3ZlcmZsb3cocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgcHJlZml4TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ292ZXJmbG93JzogJ292ZXJmbG93JyxcbiAgICAgICdvdmVyZmxvdy14JzogJ292ZXJmbG93LXgnLFxuICAgICAgJ292ZXJmbG93LXknOiAnb3ZlcmZsb3cteSdcbiAgICB9O1xuXG4gICAgY29uc3QgcHJlZml4ID0gcHJlZml4TWFwW3Byb3BdO1xuXG4gICAgY29uc3QgdmFsdWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnYXV0byc6IGAke3ByZWZpeH0tYXV0b2AsXG4gICAgICAnaGlkZGVuJzogYCR7cHJlZml4fS1oaWRkZW5gLFxuICAgICAgJ3Zpc2libGUnOiBgJHtwcmVmaXh9LXZpc2libGVgLFxuICAgICAgJ3Njcm9sbCc6IGAke3ByZWZpeH0tc2Nyb2xsYCxcbiAgICAgICdjbGlwJzogYCR7cHJlZml4fS1jbGlwYFxuICAgIH07XG5cbiAgICBpZiAodmFsdWVNYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHZhbHVlTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYFVua25vd24gb3ZlcmZsb3cgdmFsdWU6ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0T2JqZWN0Rml0KHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBmaXRNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY29udGFpbic6ICdvYmplY3QtY29udGFpbicsXG4gICAgICAnY292ZXInOiAnb2JqZWN0LWNvdmVyJyxcbiAgICAgICdmaWxsJzogJ29iamVjdC1maWxsJyxcbiAgICAgICdub25lJzogJ29iamVjdC1ub25lJyxcbiAgICAgICdzY2FsZS1kb3duJzogJ29iamVjdC1zY2FsZS1kb3duJ1xuICAgIH07XG5cbiAgICBpZiAoZml0TWFwW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBmaXRNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBvYmplY3QtZml0OiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydE9iamVjdFBvc2l0aW9uKHZhbHVlOiBzdHJpbmcpOiBDb252ZXJzaW9uUmVzdWx0IHtcbiAgICBjb25zdCBwb3NpdGlvbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjZW50ZXInOiAnb2JqZWN0LWNlbnRlcicsXG4gICAgICAndG9wJzogJ29iamVjdC10b3AnLFxuICAgICAgJ2JvdHRvbSc6ICdvYmplY3QtYm90dG9tJyxcbiAgICAgICdsZWZ0JzogJ29iamVjdC1sZWZ0JyxcbiAgICAgICdyaWdodCc6ICdvYmplY3QtcmlnaHQnLFxuICAgICAgJ2NlbnRlciBjZW50ZXInOiAnb2JqZWN0LWNlbnRlcicsXG4gICAgICAnY2VudGVyIHRvcCc6ICdvYmplY3QtdG9wJyxcbiAgICAgICdjZW50ZXIgYm90dG9tJzogJ29iamVjdC1ib3R0b20nLFxuICAgICAgJ2xlZnQgY2VudGVyJzogJ29iamVjdC1sZWZ0JyxcbiAgICAgICdyaWdodCBjZW50ZXInOiAnb2JqZWN0LXJpZ2h0JyxcbiAgICAgICdsZWZ0IHRvcCc6ICdvYmplY3QtbGVmdC10b3AnLFxuICAgICAgJ3JpZ2h0IHRvcCc6ICdvYmplY3QtcmlnaHQtdG9wJyxcbiAgICAgICdsZWZ0IGJvdHRvbSc6ICdvYmplY3QtbGVmdC1ib3R0b20nLFxuICAgICAgJ3JpZ2h0IGJvdHRvbSc6ICdvYmplY3QtcmlnaHQtYm90dG9tJ1xuICAgIH07XG5cbiAgICBpZiAocG9zaXRpb25NYXBbdmFsdWVdKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IHBvc2l0aW9uTWFwW3ZhbHVlXSwgc2tpcHBlZDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZiAoL15cXGQrKFxcLlxcZCspPyglfHB4fHJlbXxlbSk/KFxccytcXGQrKFxcLlxcZCspPyglfHB4fHJlbXxlbSk/KT8kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgb2JqZWN0LVske3ZhbHVlfV1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biBvYmplY3QtcG9zaXRpb246ICR7dmFsdWV9YCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0T3BhY2l0eSh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgbnVtVmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICBpZiAoaXNOYU4obnVtVmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYEludmFsaWQgb3BhY2l0eSB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGVyY2VudFZhbHVlID0gTWF0aC5yb3VuZChudW1WYWx1ZSAqIDEwMCk7XG5cbiAgICBpZiAodGhpcy5vcGFjaXR5U2NhbGUuaGFzKHBlcmNlbnRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYG9wYWNpdHktJHt0aGlzLm9wYWNpdHlTY2FsZS5nZXQocGVyY2VudFZhbHVlKX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYG9wYWNpdHktWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRXb3JkQnJlYWsodmFsdWU6IHN0cmluZyk6IENvbnZlcnNpb25SZXN1bHQge1xuICAgIGNvbnN0IGJyZWFrTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ25vcm1hbCc6ICdicmVhay1ub3JtYWwnLFxuICAgICAgJ2JyZWFrLWFsbCc6ICdicmVhay1hbGwnLFxuICAgICAgJ2JyZWFrLXdvcmQnOiAnYnJlYWstd29yZHMnLFxuICAgICAgJ2tlZXAtYWxsJzogJ2JyZWFrLWtlZXAnXG4gICAgfTtcblxuICAgIGlmIChicmVha01hcFt2YWx1ZV0pIHtcbiAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogYnJlYWtNYXBbdmFsdWVdLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogbnVsbCwgc2tpcHBlZDogdHJ1ZSwgcmVhc29uOiBgVW5rbm93biB3b3JkLWJyZWFrOiAke3ZhbHVlfWAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFpJbmRleCh2YWx1ZTogc3RyaW5nKTogQ29udmVyc2lvblJlc3VsdCB7XG4gICAgY29uc3QgbnVtVmFsdWUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIGlmIChpc05hTihudW1WYWx1ZSkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHJldHVybiB7IGNsYXNzTmFtZTogJ3otYXV0bycsIHNraXBwZWQ6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjbGFzc05hbWU6IG51bGwsIHNraXBwZWQ6IHRydWUsIHJlYXNvbjogYEludmFsaWQgei1pbmRleCB2YWx1ZTogJHt2YWx1ZX1gIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuekluZGV4U2NhbGUuaGFzKG51bVZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgei0ke3RoaXMuekluZGV4U2NhbGUuZ2V0KG51bVZhbHVlKX1gLCBza2lwcGVkOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IGNsYXNzTmFtZTogYHotWyR7dmFsdWV9XWAsIHNraXBwZWQ6IGZhbHNlIH07XG4gIH1cblxuICBjb252ZXJ0TXVsdGlwbGUocHJvcGVydGllczogQ1NTUHJvcGVydHlbXSk6IHsgY2xhc3Nlczogc3RyaW5nW107IHdhcm5pbmdzOiBzdHJpbmdbXSB9IHtcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHJvcGVydGllcy5mb3JFYWNoKCh7IHByb3BlcnR5LCB2YWx1ZSB9KSA9PiB7XG4gICAgICBjb25zdCBtdWx0aVJlc3VsdCA9IHRoaXMuY29udmVydFByb3BlcnR5V2l0aE11bHRpcGxlKHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgICBcbiAgICAgIGNsYXNzZXMucHVzaCguLi5tdWx0aVJlc3VsdC5jbGFzc2VzKTtcbiAgICAgIHdhcm5pbmdzLnB1c2goLi4ubXVsdGlSZXN1bHQud2FybmluZ3MpO1xuXG4gICAgICBpZiAobXVsdGlSZXN1bHQuY2xhc3Nlcy5sZW5ndGggPT09IDAgJiYgbXVsdGlSZXN1bHQud2FybmluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udmVydFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAocmVzdWx0LnNraXBwZWQpIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKHJlc3VsdC5yZWFzb24gfHwgYFNraXBwZWQ6ICR7cHJvcGVydHl9OiAke3ZhbHVlfWApO1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBTa2lwcGVkOiAke3Byb3BlcnR5fTogJHt2YWx1ZX0gLSAke3Jlc3VsdC5yZWFzb259YCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmNsYXNzTmFtZSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChyZXN1bHQuY2xhc3NOYW1lKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgQ29udmVydGVkOiAke3Byb3BlcnR5fTogJHt2YWx1ZX0g4oaSICR7cmVzdWx0LmNsYXNzTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG11bHRpUmVzdWx0LmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGBDb252ZXJ0ZWQ6ICR7cHJvcGVydHl9OiAke3ZhbHVlfSDihpIgJHttdWx0aVJlc3VsdC5jbGFzc2VzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbXVsdGlSZXN1bHQud2FybmluZ3MuZm9yRWFjaCh3ID0+IGxvZ2dlci52ZXJib3NlKGBXYXJuaW5nOiAke3d9YCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY2xhc3Nlcywgd2FybmluZ3MgfTtcbiAgfVxufVxuIl19
|