@nlabs/lex 1.59.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.ts +3 -47
- package/README.md +13 -19
- package/__mocks__/build.js +3 -3
- package/config.json +3 -1
- package/examples/lex.config.js +3 -7
- package/lib/LexConfig.d.ts +2 -6
- package/lib/LexConfig.js +2 -2
- package/lib/commands/ai/ai.js +3 -3
- package/lib/commands/build/build.d.ts +5 -3
- package/lib/commands/build/build.js +66 -156
- package/lib/commands/config/config.js +9 -7
- package/lib/commands/dev/dev.d.ts +0 -2
- package/lib/commands/dev/dev.js +24 -115
- package/lib/commands/init/init.js +4 -9
- package/lib/commands/migrate/migrate.js +2 -2
- package/lib/commands/serverless-dev/serverless-dev.js +2 -2
- package/lib/commands/versions/versions.d.ts +1 -1
- package/lib/commands/versions/versions.js +4 -4
- package/lib/lex.js +10 -11
- package/lib/types.d.ts +1 -1
- package/lib/types.js +1 -1
- package/lib/utils/app.d.ts +0 -2
- package/lib/utils/app.js +2 -29
- package/lib/utils/{webpack/LexSvgSpritemapPlugin.d.ts → assets/LexSvgSpritemap.d.ts} +6 -8
- package/lib/utils/assets/LexSvgSpritemap.js +219 -0
- package/lib/utils/file.d.ts +0 -4
- package/lib/utils/file.js +4 -100
- package/lib/utils/staticSite.d.ts +15 -0
- package/lib/utils/staticSite.js +80 -0
- package/lib/utils/vite/assets.d.ts +19 -0
- package/lib/utils/vite/assets.js +249 -0
- package/lib/utils/vite/config.d.ts +12 -0
- package/lib/utils/vite/config.js +279 -0
- package/package.json +27 -45
- package/postcss.config.js +1 -2
- package/tsconfig.lint.json +0 -1
- package/tsconfig.test.json +0 -1
- package/lib/utils/webpack/LexSvgSpritemapPlugin.js +0 -255
- package/scripts/test-webpack.js +0 -453
- package/webpack.config.d.ts +0 -2
- package/webpack.config.js +0 -960
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { gzipSync } from 'zlib';
|
|
5
|
+
import favicons from 'favicons';
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'fs';
|
|
7
|
+
import { sync as globSync } from 'glob';
|
|
8
|
+
import { extname, join, relative, resolve } from 'path';
|
|
9
|
+
import sharp from 'sharp';
|
|
10
|
+
import { optimize } from 'svgo';
|
|
11
|
+
import { LexSvgSpritemap } from '../assets/LexSvgSpritemap.js';
|
|
12
|
+
const COMPRESSIBLE_FILE = /\.(css|html|js|json|svg|txt|xml)$/i;
|
|
13
|
+
const IMAGE_FILE = /\.(gif|jpe?g|png|svg|webp)$/i;
|
|
14
|
+
const MINIMUM_GZIP_SIZE = 8192;
|
|
15
|
+
const faviconCache = new Map();
|
|
16
|
+
const copyDirectory = (source, destination, exclude)=>{
|
|
17
|
+
if (!existsSync(source)) return;
|
|
18
|
+
for (const entry of readdirSync(source, {
|
|
19
|
+
withFileTypes: true
|
|
20
|
+
})){
|
|
21
|
+
const sourcePath = join(source, entry.name);
|
|
22
|
+
const destinationPath = join(destination, entry.name);
|
|
23
|
+
if (exclude?.test(sourcePath)) continue;
|
|
24
|
+
if (entry.isDirectory()) {
|
|
25
|
+
copyDirectory(sourcePath, destinationPath, exclude);
|
|
26
|
+
} else {
|
|
27
|
+
mkdirSync(resolve(destinationPath, '..'), {
|
|
28
|
+
recursive: true
|
|
29
|
+
});
|
|
30
|
+
writeFileSync(destinationPath, readFileSync(sourcePath));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const getAssetDirectories = (config)=>{
|
|
35
|
+
const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
|
|
36
|
+
const staticPath = config.vite?.staticPath || './src/static';
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
destination: '',
|
|
40
|
+
source: resolve(process.cwd(), staticPath)
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
destination: 'images',
|
|
44
|
+
source: resolve(sourcePath, 'images')
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
destination: 'fonts',
|
|
48
|
+
source: resolve(sourcePath, 'fonts')
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
destination: 'docs',
|
|
52
|
+
source: resolve(sourcePath, 'docs')
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
destination: 'icons',
|
|
56
|
+
exclude: /\.svg$/i,
|
|
57
|
+
source: resolve(sourcePath, 'icons')
|
|
58
|
+
}
|
|
59
|
+
];
|
|
60
|
+
};
|
|
61
|
+
export const generateLexFavicons = async (config)=>{
|
|
62
|
+
const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
|
|
63
|
+
const logoPath = resolve(sourcePath, 'images/logo.png');
|
|
64
|
+
if (!existsSync(logoPath)) return null;
|
|
65
|
+
const modifiedAt = statSync(logoPath).mtimeMs;
|
|
66
|
+
const cached = faviconCache.get(logoPath);
|
|
67
|
+
if (cached?.modifiedAt === modifiedAt) return cached.response;
|
|
68
|
+
const generated = await favicons(logoPath, {
|
|
69
|
+
icons: {
|
|
70
|
+
android: true,
|
|
71
|
+
appleIcon: true,
|
|
72
|
+
appleStartup: false,
|
|
73
|
+
favicons: true,
|
|
74
|
+
windows: false,
|
|
75
|
+
yandex: false
|
|
76
|
+
},
|
|
77
|
+
path: '/'
|
|
78
|
+
});
|
|
79
|
+
const [openGraphImage, twitterImage] = await Promise.all([
|
|
80
|
+
sharp(logoPath).resize(1200, 630, {
|
|
81
|
+
fit: 'contain'
|
|
82
|
+
}).png().toBuffer(),
|
|
83
|
+
sharp(logoPath).resize(1200, 675, {
|
|
84
|
+
fit: 'contain'
|
|
85
|
+
}).png().toBuffer()
|
|
86
|
+
]);
|
|
87
|
+
const response = {
|
|
88
|
+
...generated,
|
|
89
|
+
html: [
|
|
90
|
+
...generated.html,
|
|
91
|
+
'<meta property="og:image" content="/open-graph.png">',
|
|
92
|
+
'<meta name="twitter:image" content="/twitter.png">'
|
|
93
|
+
],
|
|
94
|
+
images: [
|
|
95
|
+
...generated.images,
|
|
96
|
+
{
|
|
97
|
+
contents: openGraphImage,
|
|
98
|
+
name: 'open-graph.png'
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
contents: twitterImage,
|
|
102
|
+
name: 'twitter.png'
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
};
|
|
106
|
+
faviconCache.set(logoPath, {
|
|
107
|
+
modifiedAt,
|
|
108
|
+
response
|
|
109
|
+
});
|
|
110
|
+
return response;
|
|
111
|
+
};
|
|
112
|
+
export const copyLexWebAssets = async (config)=>{
|
|
113
|
+
const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
|
|
114
|
+
for (const assetDirectory of getAssetDirectories(config)){
|
|
115
|
+
copyDirectory(assetDirectory.source, resolve(outputPath, assetDirectory.destination), assetDirectory.exclude);
|
|
116
|
+
}
|
|
117
|
+
const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
|
|
118
|
+
const spritemap = new LexSvgSpritemap(resolve(sourcePath, 'icons/**/*.svg'), {
|
|
119
|
+
filename: 'icons/icons.svg',
|
|
120
|
+
prefix: false
|
|
121
|
+
}).buildSpritemap();
|
|
122
|
+
for (const warning of spritemap.warnings)console.warn(warning.message);
|
|
123
|
+
if (spritemap.content) {
|
|
124
|
+
const spritePath = resolve(outputPath, 'icons/icons.svg');
|
|
125
|
+
mkdirSync(resolve(spritePath, '..'), {
|
|
126
|
+
recursive: true
|
|
127
|
+
});
|
|
128
|
+
writeFileSync(spritePath, spritemap.content);
|
|
129
|
+
}
|
|
130
|
+
const generatedFavicons = await generateLexFavicons(config);
|
|
131
|
+
if (generatedFavicons) {
|
|
132
|
+
for (const image of generatedFavicons.images){
|
|
133
|
+
const imagePath = resolve(outputPath, image.name);
|
|
134
|
+
mkdirSync(resolve(imagePath, '..'), {
|
|
135
|
+
recursive: true
|
|
136
|
+
});
|
|
137
|
+
writeFileSync(imagePath, image.contents);
|
|
138
|
+
}
|
|
139
|
+
for (const file of generatedFavicons.files){
|
|
140
|
+
const filePath = resolve(outputPath, file.name);
|
|
141
|
+
mkdirSync(resolve(filePath, '..'), {
|
|
142
|
+
recursive: true
|
|
143
|
+
});
|
|
144
|
+
writeFileSync(filePath, file.contents);
|
|
145
|
+
}
|
|
146
|
+
const indexPath = resolve(outputPath, 'index.html');
|
|
147
|
+
if (existsSync(indexPath)) {
|
|
148
|
+
const html = readFileSync(indexPath, 'utf8');
|
|
149
|
+
const faviconHtml = generatedFavicons.html.join('\n ');
|
|
150
|
+
writeFileSync(indexPath, html.replace('</head>', ` ${faviconHtml}\n </head>`));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const optimizeImage = async (filePath)=>{
|
|
155
|
+
const extension = extname(filePath).toLowerCase();
|
|
156
|
+
const source = readFileSync(filePath);
|
|
157
|
+
if (extension === '.svg') {
|
|
158
|
+
const isSpritemap = filePath.endsWith('/icons/icons.svg');
|
|
159
|
+
const result = optimize(source.toString(), {
|
|
160
|
+
multipass: true,
|
|
161
|
+
path: filePath,
|
|
162
|
+
plugins: isSpritemap ? [
|
|
163
|
+
{
|
|
164
|
+
name: 'preset-default',
|
|
165
|
+
params: {
|
|
166
|
+
overrides: {
|
|
167
|
+
cleanupIds: false,
|
|
168
|
+
removeHiddenElems: false
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
] : [
|
|
173
|
+
'preset-default'
|
|
174
|
+
]
|
|
175
|
+
});
|
|
176
|
+
writeFileSync(filePath, result.data);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
let image = sharp(source);
|
|
180
|
+
if (extension === '.jpg' || extension === '.jpeg') image = image.jpeg({
|
|
181
|
+
progressive: true,
|
|
182
|
+
quality: 65
|
|
183
|
+
});
|
|
184
|
+
if (extension === '.png') image = image.png({
|
|
185
|
+
quality: 90
|
|
186
|
+
});
|
|
187
|
+
if (extension === '.webp') image = image.webp({
|
|
188
|
+
quality: 75
|
|
189
|
+
});
|
|
190
|
+
if (extension === '.gif') image = image.gif();
|
|
191
|
+
const optimized = await image.toBuffer();
|
|
192
|
+
if (optimized.length < source.length) writeFileSync(filePath, optimized);
|
|
193
|
+
};
|
|
194
|
+
export const optimizeLexWebAssets = async (config)=>{
|
|
195
|
+
const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
|
|
196
|
+
if (!existsSync(outputPath)) return;
|
|
197
|
+
const imageFiles = globSync('**/*.{gif,jpg,jpeg,png,svg,webp}', {
|
|
198
|
+
absolute: true,
|
|
199
|
+
cwd: outputPath,
|
|
200
|
+
nodir: true
|
|
201
|
+
});
|
|
202
|
+
await Promise.all(imageFiles.filter((filePath)=>IMAGE_FILE.test(filePath)).map(optimizeImage));
|
|
203
|
+
};
|
|
204
|
+
export const compressLexWebAssets = (config)=>{
|
|
205
|
+
const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
|
|
206
|
+
if (!existsSync(outputPath)) return;
|
|
207
|
+
const files = globSync('**/*', {
|
|
208
|
+
absolute: true,
|
|
209
|
+
cwd: outputPath,
|
|
210
|
+
nodir: true
|
|
211
|
+
});
|
|
212
|
+
for (const filePath of files){
|
|
213
|
+
if (!COMPRESSIBLE_FILE.test(filePath) || statSync(filePath).size < MINIMUM_GZIP_SIZE) continue;
|
|
214
|
+
writeFileSync(`${filePath}.gz`, gzipSync(readFileSync(filePath)));
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
export const getDevAsset = async (config, requestPath)=>{
|
|
218
|
+
const normalizedPath = requestPath.split('?')[0].replace(/^\/+/, '');
|
|
219
|
+
if (normalizedPath.includes('..')) return null;
|
|
220
|
+
if (normalizedPath === 'icons/icons.svg') {
|
|
221
|
+
const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
|
|
222
|
+
const spritemap = new LexSvgSpritemap(resolve(sourcePath, 'icons/**/*.svg'), {
|
|
223
|
+
prefix: false
|
|
224
|
+
}).buildSpritemap();
|
|
225
|
+
return spritemap.content ? Buffer.from(spritemap.content) : null;
|
|
226
|
+
}
|
|
227
|
+
const generatedFavicons = await generateLexFavicons(config);
|
|
228
|
+
const generatedImage = generatedFavicons?.images.find(({ name })=>name === normalizedPath);
|
|
229
|
+
if (generatedImage) return generatedImage.contents;
|
|
230
|
+
const generatedFile = generatedFavicons?.files.find(({ name })=>name === normalizedPath);
|
|
231
|
+
if (generatedFile) return Buffer.from(generatedFile.contents);
|
|
232
|
+
for (const assetDirectory of getAssetDirectories(config)){
|
|
233
|
+
const prefix = assetDirectory.destination ? `${assetDirectory.destination}/` : '';
|
|
234
|
+
if (!normalizedPath.startsWith(prefix)) continue;
|
|
235
|
+
const relativePath = normalizedPath.slice(prefix.length);
|
|
236
|
+
const filePath = resolve(assetDirectory.source, relativePath);
|
|
237
|
+
if (filePath.startsWith(resolve(assetDirectory.source)) && existsSync(filePath) && statSync(filePath).isFile()) {
|
|
238
|
+
if (assetDirectory.exclude?.test(filePath)) continue;
|
|
239
|
+
return readFileSync(filePath);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
};
|
|
244
|
+
export const getAssetRelativePath = (config, filePath)=>{
|
|
245
|
+
const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
|
|
246
|
+
return relative(outputPath, filePath);
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy92aXRlL2Fzc2V0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtnemlwU3luY30gZnJvbSAnemxpYic7XG5pbXBvcnQgZmF2aWNvbnMgZnJvbSAnZmF2aWNvbnMnO1xuaW1wb3J0IHtleGlzdHNTeW5jLCBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcmVhZGRpclN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtleHRuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnO1xuaW1wb3J0IHtvcHRpbWl6ZX0gZnJvbSAnc3Znbyc7XG5cbmltcG9ydCB0eXBlIHtMZXhDb25maWdUeXBlfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtMZXhTdmdTcHJpdGVtYXB9IGZyb20gJy4uL2Fzc2V0cy9MZXhTdmdTcHJpdGVtYXAuanMnO1xuXG5jb25zdCBDT01QUkVTU0lCTEVfRklMRSA9IC9cXC4oY3NzfGh0bWx8anN8anNvbnxzdmd8dHh0fHhtbCkkL2k7XG5jb25zdCBJTUFHRV9GSUxFID0gL1xcLihnaWZ8anBlP2d8cG5nfHN2Z3x3ZWJwKSQvaTtcbmNvbnN0IE1JTklNVU1fR1pJUF9TSVpFID0gODE5MjtcblxuaW50ZXJmYWNlIEdlbmVyYXRlZEZhdmljb25zIHtcbiAgcmVhZG9ubHkgZmlsZXM6IFJlYWRvbmx5QXJyYXk8e2NvbnRlbnRzOiBzdHJpbmc7IG5hbWU6IHN0cmluZ30+O1xuICByZWFkb25seSBodG1sOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaW1hZ2VzOiBSZWFkb25seUFycmF5PHtjb250ZW50czogQnVmZmVyOyBuYW1lOiBzdHJpbmd9Pjtcbn1cblxuY29uc3QgZmF2aWNvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHttb2RpZmllZEF0OiBudW1iZXI7IHJlc3BvbnNlOiBHZW5lcmF0ZWRGYXZpY29uc30+KCk7XG5cbmNvbnN0IGNvcHlEaXJlY3RvcnkgPSAoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcsIGV4Y2x1ZGU/OiBSZWdFeHApOiB2b2lkID0+IHtcbiAgaWYoIWV4aXN0c1N5bmMoc291cmNlKSkgcmV0dXJuO1xuXG4gIGZvcihjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhzb3VyY2UsIHt3aXRoRmlsZVR5cGVzOiB0cnVlfSkpIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gam9pbihzb3VyY2UsIGVudHJ5Lm5hbWUpO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uUGF0aCA9IGpvaW4oZGVzdGluYXRpb24sIGVudHJ5Lm5hbWUpO1xuXG4gICAgaWYoZXhjbHVkZT8udGVzdChzb3VyY2VQYXRoKSkgY29udGludWU7XG5cbiAgICBpZihlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb3B5RGlyZWN0b3J5KHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uUGF0aCwgZXhjbHVkZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKGRlc3RpbmF0aW9uUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoZGVzdGluYXRpb25QYXRoLCByZWFkRmlsZVN5bmMoc291cmNlUGF0aCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZ2V0QXNzZXREaXJlY3RvcmllcyA9IChjb25maWc6IExleENvbmZpZ1R5cGUpOiBBcnJheTx7ZGVzdGluYXRpb246IHN0cmluZzsgZXhjbHVkZT86IFJlZ0V4cDsgc291cmNlOiBzdHJpbmd9PiA9PiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBjb25maWcuc291cmNlRnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcuc291cmNlUGF0aCB8fCAnLi9zcmMnKTtcbiAgY29uc3Qgc3RhdGljUGF0aCA9IGNvbmZpZy52aXRlPy5zdGF0aWNQYXRoIHx8ICcuL3NyYy9zdGF0aWMnO1xuXG4gIHJldHVybiBbXG4gICAge2Rlc3RpbmF0aW9uOiAnJywgc291cmNlOiByZXNvbHZlKHByb2Nlc3MuY3dkKCksIHN0YXRpY1BhdGgpfSxcbiAgICB7ZGVzdGluYXRpb246ICdpbWFnZXMnLCBzb3VyY2U6IHJlc29sdmUoc291cmNlUGF0aCwgJ2ltYWdlcycpfSxcbiAgICB7ZGVzdGluYXRpb246ICdmb250cycsIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnZm9udHMnKX0sXG4gICAge2Rlc3RpbmF0aW9uOiAnZG9jcycsIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnZG9jcycpfSxcbiAgICB7ZGVzdGluYXRpb246ICdpY29ucycsIGV4Y2x1ZGU6IC9cXC5zdmckL2ksIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnaWNvbnMnKX1cbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUxleEZhdmljb25zID0gYXN5bmMgKGNvbmZpZzogTGV4Q29uZmlnVHlwZSk6IFByb21pc2U8R2VuZXJhdGVkRmF2aWNvbnMgfCBudWxsPiA9PiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBjb25maWcuc291cmNlRnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcuc291cmNlUGF0aCB8fCAnLi9zcmMnKTtcbiAgY29uc3QgbG9nb1BhdGggPSByZXNvbHZlKHNvdXJjZVBhdGgsICdpbWFnZXMvbG9nby5wbmcnKTtcblxuICBpZighZXhpc3RzU3luYyhsb2dvUGF0aCkpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG1vZGlmaWVkQXQgPSBzdGF0U3luYyhsb2dvUGF0aCkubXRpbWVNcztcbiAgY29uc3QgY2FjaGVkID0gZmF2aWNvbkNhY2hlLmdldChsb2dvUGF0aCk7XG4gIGlmKGNhY2hlZD8ubW9kaWZpZWRBdCA9PT0gbW9kaWZpZWRBdCkgcmV0dXJuIGNhY2hlZC5yZXNwb25zZTtcblxuICBjb25zdCBnZW5lcmF0ZWQgPSBhd2FpdCBmYXZpY29ucyhsb2dvUGF0aCwge1xuICAgIGljb25zOiB7XG4gICAgICBhbmRyb2lkOiB0cnVlLFxuICAgICAgYXBwbGVJY29uOiB0cnVlLFxuICAgICAgYXBwbGVTdGFydHVwOiBmYWxzZSxcbiAgICAgIGZhdmljb25zOiB0cnVlLFxuICAgICAgd2luZG93czogZmFsc2UsXG4gICAgICB5YW5kZXg6IGZhbHNlXG4gICAgfSxcbiAgICBwYXRoOiAnLydcbiAgfSk7XG4gIGNvbnN0IFtvcGVuR3JhcGhJbWFnZSwgdHdpdHRlckltYWdlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzaGFycChsb2dvUGF0aCkucmVzaXplKDEyMDAsIDYzMCwge2ZpdDogJ2NvbnRhaW4nfSkucG5nKCkudG9CdWZmZXIoKSxcbiAgICBzaGFycChsb2dvUGF0aCkucmVzaXplKDEyMDAsIDY3NSwge2ZpdDogJ2NvbnRhaW4nfSkucG5nKCkudG9CdWZmZXIoKVxuICBdKTtcbiAgY29uc3QgcmVzcG9uc2U6IEdlbmVyYXRlZEZhdmljb25zID0ge1xuICAgIC4uLmdlbmVyYXRlZCxcbiAgICBodG1sOiBbXG4gICAgICAuLi5nZW5lcmF0ZWQuaHRtbCxcbiAgICAgICc8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cIi9vcGVuLWdyYXBoLnBuZ1wiPicsXG4gICAgICAnPG1ldGEgbmFtZT1cInR3aXR0ZXI6aW1hZ2VcIiBjb250ZW50PVwiL3R3aXR0ZXIucG5nXCI+J1xuICAgIF0sXG4gICAgaW1hZ2VzOiBbXG4gICAgICAuLi5nZW5lcmF0ZWQuaW1hZ2VzLFxuICAgICAge2NvbnRlbnRzOiBvcGVuR3JhcGhJbWFnZSwgbmFtZTogJ29wZW4tZ3JhcGgucG5nJ30sXG4gICAgICB7Y29udGVudHM6IHR3aXR0ZXJJbWFnZSwgbmFtZTogJ3R3aXR0ZXIucG5nJ31cbiAgICBdXG4gIH07XG4gIGZhdmljb25DYWNoZS5zZXQobG9nb1BhdGgsIHttb2RpZmllZEF0LCByZXNwb25zZX0pO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG5leHBvcnQgY29uc3QgY29weUxleFdlYkFzc2V0cyA9IGFzeW5jIChjb25maWc6IExleENvbmZpZ1R5cGUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IGNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCByZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5vdXRwdXRQYXRoIHx8ICcuL2xpYicpO1xuXG4gIGZvcihjb25zdCBhc3NldERpcmVjdG9yeSBvZiBnZXRBc3NldERpcmVjdG9yaWVzKGNvbmZpZykpIHtcbiAgICBjb3B5RGlyZWN0b3J5KGFzc2V0RGlyZWN0b3J5LnNvdXJjZSwgcmVzb2x2ZShvdXRwdXRQYXRoLCBhc3NldERpcmVjdG9yeS5kZXN0aW5hdGlvbiksIGFzc2V0RGlyZWN0b3J5LmV4Y2x1ZGUpO1xuICB9XG5cbiAgY29uc3Qgc291cmNlUGF0aCA9IGNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCByZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5zb3VyY2VQYXRoIHx8ICcuL3NyYycpO1xuICBjb25zdCBzcHJpdGVtYXAgPSBuZXcgTGV4U3ZnU3ByaXRlbWFwKHJlc29sdmUoc291cmNlUGF0aCwgJ2ljb25zLyoqLyouc3ZnJyksIHtcbiAgICBmaWxlbmFtZTogJ2ljb25zL2ljb25zLnN2ZycsXG4gICAgcHJlZml4OiBmYWxzZVxuICB9KS5idWlsZFNwcml0ZW1hcCgpO1xuXG4gIGZvcihjb25zdCB3YXJuaW5nIG9mIHNwcml0ZW1hcC53YXJuaW5ncykgY29uc29sZS53YXJuKHdhcm5pbmcubWVzc2FnZSk7XG5cbiAgaWYoc3ByaXRlbWFwLmNvbnRlbnQpIHtcbiAgICBjb25zdCBzcHJpdGVQYXRoID0gcmVzb2x2ZShvdXRwdXRQYXRoLCAnaWNvbnMvaWNvbnMuc3ZnJyk7XG4gICAgbWtkaXJTeW5jKHJlc29sdmUoc3ByaXRlUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICB3cml0ZUZpbGVTeW5jKHNwcml0ZVBhdGgsIHNwcml0ZW1hcC5jb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlZEZhdmljb25zID0gYXdhaXQgZ2VuZXJhdGVMZXhGYXZpY29ucyhjb25maWcpO1xuICBpZihnZW5lcmF0ZWRGYXZpY29ucykge1xuICAgIGZvcihjb25zdCBpbWFnZSBvZiBnZW5lcmF0ZWRGYXZpY29ucy5pbWFnZXMpIHtcbiAgICAgIGNvbnN0IGltYWdlUGF0aCA9IHJlc29sdmUob3V0cHV0UGF0aCwgaW1hZ2UubmFtZSk7XG4gICAgICBta2RpclN5bmMocmVzb2x2ZShpbWFnZVBhdGgsICcuLicpLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGltYWdlUGF0aCwgaW1hZ2UuY29udGVudHMpO1xuICAgIH1cbiAgICBmb3IoY29uc3QgZmlsZSBvZiBnZW5lcmF0ZWRGYXZpY29ucy5maWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKG91dHB1dFBhdGgsIGZpbGUubmFtZSk7XG4gICAgICBta2RpclN5bmMocmVzb2x2ZShmaWxlUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGZpbGUuY29udGVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4UGF0aCA9IHJlc29sdmUob3V0cHV0UGF0aCwgJ2luZGV4Lmh0bWwnKTtcbiAgICBpZihleGlzdHNTeW5jKGluZGV4UGF0aCkpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSByZWFkRmlsZVN5bmMoaW5kZXhQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZmF2aWNvbkh0bWwgPSBnZW5lcmF0ZWRGYXZpY29ucy5odG1sLmpvaW4oJ1xcbiAgICAnKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoaW5kZXhQYXRoLCBodG1sLnJlcGxhY2UoJzwvaGVhZD4nLCBgICAgICR7ZmF2aWNvbkh0bWx9XFxuICA8L2hlYWQ+YCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3Qgb3B0aW1pemVJbWFnZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZmlsZVBhdGgpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XG5cbiAgaWYoZXh0ZW5zaW9uID09PSAnLnN2ZycpIHtcbiAgICBjb25zdCBpc1Nwcml0ZW1hcCA9IGZpbGVQYXRoLmVuZHNXaXRoKCcvaWNvbnMvaWNvbnMuc3ZnJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gb3B0aW1pemUoc291cmNlLnRvU3RyaW5nKCksIHtcbiAgICAgIG11bHRpcGFzczogdHJ1ZSxcbiAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgcGx1Z2luczogaXNTcHJpdGVtYXBcbiAgICAgICAgPyBbe25hbWU6ICdwcmVzZXQtZGVmYXVsdCcsIHBhcmFtczoge292ZXJyaWRlczoge2NsZWFudXBJZHM6IGZhbHNlLCByZW1vdmVIaWRkZW5FbGVtczogZmFsc2V9fX1dXG4gICAgICAgIDogWydwcmVzZXQtZGVmYXVsdCddXG4gICAgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgcmVzdWx0LmRhdGEpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpbWFnZSA9IHNoYXJwKHNvdXJjZSk7XG4gIGlmKGV4dGVuc2lvbiA9PT0gJy5qcGcnIHx8IGV4dGVuc2lvbiA9PT0gJy5qcGVnJykgaW1hZ2UgPSBpbWFnZS5qcGVnKHtwcm9ncmVzc2l2ZTogdHJ1ZSwgcXVhbGl0eTogNjV9KTtcbiAgaWYoZXh0ZW5zaW9uID09PSAnLnBuZycpIGltYWdlID0gaW1hZ2UucG5nKHtxdWFsaXR5OiA5MH0pO1xuICBpZihleHRlbnNpb24gPT09ICcud2VicCcpIGltYWdlID0gaW1hZ2Uud2VicCh7cXVhbGl0eTogNzV9KTtcbiAgaWYoZXh0ZW5zaW9uID09PSAnLmdpZicpIGltYWdlID0gaW1hZ2UuZ2lmKCk7XG5cbiAgY29uc3Qgb3B0aW1pemVkID0gYXdhaXQgaW1hZ2UudG9CdWZmZXIoKTtcbiAgaWYob3B0aW1pemVkLmxlbmd0aCA8IHNvdXJjZS5sZW5ndGgpIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG9wdGltaXplZCk7XG59O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVMZXhXZWJBc3NldHMgPSBhc3luYyAoY29uZmlnOiBMZXhDb25maWdUeXBlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgaWYoIWV4aXN0c1N5bmMob3V0cHV0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCBpbWFnZUZpbGVzID0gZ2xvYlN5bmMoJyoqLyoue2dpZixqcGcsanBlZyxwbmcsc3ZnLHdlYnB9Jywge1xuICAgIGFic29sdXRlOiB0cnVlLFxuICAgIGN3ZDogb3V0cHV0UGF0aCxcbiAgICBub2RpcjogdHJ1ZVxuICB9KTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChpbWFnZUZpbGVzLmZpbHRlcigoZmlsZVBhdGgpID0+IElNQUdFX0ZJTEUudGVzdChmaWxlUGF0aCkpLm1hcChvcHRpbWl6ZUltYWdlKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY29tcHJlc3NMZXhXZWJBc3NldHMgPSAoY29uZmlnOiBMZXhDb25maWdUeXBlKTogdm9pZCA9PiB7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgaWYoIWV4aXN0c1N5bmMob3V0cHV0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCBmaWxlcyA9IGdsb2JTeW5jKCcqKi8qJywge2Fic29sdXRlOiB0cnVlLCBjd2Q6IG91dHB1dFBhdGgsIG5vZGlyOiB0cnVlfSk7XG4gIGZvcihjb25zdCBmaWxlUGF0aCBvZiBmaWxlcykge1xuICAgIGlmKCFDT01QUkVTU0lCTEVfRklMRS50ZXN0KGZpbGVQYXRoKSB8fCBzdGF0U3luYyhmaWxlUGF0aCkuc2l6ZSA8IE1JTklNVU1fR1pJUF9TSVpFKSBjb250aW51ZTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke2ZpbGVQYXRofS5nemAsIGd6aXBTeW5jKHJlYWRGaWxlU3luYyhmaWxlUGF0aCkpKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldERldkFzc2V0ID0gYXN5bmMgKGNvbmZpZzogTGV4Q29uZmlnVHlwZSwgcmVxdWVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHJlcXVlc3RQYXRoLnNwbGl0KCc/JylbMF0ucmVwbGFjZSgvXlxcLysvLCAnJyk7XG4gIGlmKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcuLicpKSByZXR1cm4gbnVsbDtcblxuICBpZihub3JtYWxpemVkUGF0aCA9PT0gJ2ljb25zL2ljb25zLnN2ZycpIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLnNvdXJjZVBhdGggfHwgJy4vc3JjJyk7XG4gICAgY29uc3Qgc3ByaXRlbWFwID0gbmV3IExleFN2Z1Nwcml0ZW1hcChyZXNvbHZlKHNvdXJjZVBhdGgsICdpY29ucy8qKi8qLnN2ZycpLCB7cHJlZml4OiBmYWxzZX0pLmJ1aWxkU3ByaXRlbWFwKCk7XG4gICAgcmV0dXJuIHNwcml0ZW1hcC5jb250ZW50ID8gQnVmZmVyLmZyb20oc3ByaXRlbWFwLmNvbnRlbnQpIDogbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlZEZhdmljb25zID0gYXdhaXQgZ2VuZXJhdGVMZXhGYXZpY29ucyhjb25maWcpO1xuICBjb25zdCBnZW5lcmF0ZWRJbWFnZSA9IGdlbmVyYXRlZEZhdmljb25zPy5pbWFnZXMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSBub3JtYWxpemVkUGF0aCk7XG4gIGlmKGdlbmVyYXRlZEltYWdlKSByZXR1cm4gZ2VuZXJhdGVkSW1hZ2UuY29udGVudHM7XG4gIGNvbnN0IGdlbmVyYXRlZEZpbGUgPSBnZW5lcmF0ZWRGYXZpY29ucz8uZmlsZXMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSBub3JtYWxpemVkUGF0aCk7XG4gIGlmKGdlbmVyYXRlZEZpbGUpIHJldHVybiBCdWZmZXIuZnJvbShnZW5lcmF0ZWRGaWxlLmNvbnRlbnRzKTtcblxuICBmb3IoY29uc3QgYXNzZXREaXJlY3Rvcnkgb2YgZ2V0QXNzZXREaXJlY3Rvcmllcyhjb25maWcpKSB7XG4gICAgY29uc3QgcHJlZml4ID0gYXNzZXREaXJlY3RvcnkuZGVzdGluYXRpb24gPyBgJHthc3NldERpcmVjdG9yeS5kZXN0aW5hdGlvbn0vYCA6ICcnO1xuICAgIGlmKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplZFBhdGguc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGFzc2V0RGlyZWN0b3J5LnNvdXJjZSwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZihmaWxlUGF0aC5zdGFydHNXaXRoKHJlc29sdmUoYXNzZXREaXJlY3Rvcnkuc291cmNlKSkgJiYgZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpKSB7XG4gICAgICBpZihhc3NldERpcmVjdG9yeS5leGNsdWRlPy50ZXN0KGZpbGVQYXRoKSkgY29udGludWU7XG4gICAgICByZXR1cm4gcmVhZEZpbGVTeW5jKGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBc3NldFJlbGF0aXZlUGF0aCA9IChjb25maWc6IExleENvbmZpZ1R5cGUsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBvdXRwdXRQYXRoID0gY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLm91dHB1dFBhdGggfHwgJy4vbGliJyk7XG4gIHJldHVybiByZWxhdGl2ZShvdXRwdXRQYXRoLCBmaWxlUGF0aCk7XG59O1xuIl0sIm5hbWVzIjpbImd6aXBTeW5jIiwiZmF2aWNvbnMiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwicmVhZEZpbGVTeW5jIiwicmVhZGRpclN5bmMiLCJzdGF0U3luYyIsIndyaXRlRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJleHRuYW1lIiwiam9pbiIsInJlbGF0aXZlIiwicmVzb2x2ZSIsInNoYXJwIiwib3B0aW1pemUiLCJMZXhTdmdTcHJpdGVtYXAiLCJDT01QUkVTU0lCTEVfRklMRSIsIklNQUdFX0ZJTEUiLCJNSU5JTVVNX0daSVBfU0laRSIsImZhdmljb25DYWNoZSIsIk1hcCIsImNvcHlEaXJlY3RvcnkiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsImV4Y2x1ZGUiLCJlbnRyeSIsIndpdGhGaWxlVHlwZXMiLCJzb3VyY2VQYXRoIiwibmFtZSIsImRlc3RpbmF0aW9uUGF0aCIsInRlc3QiLCJpc0RpcmVjdG9yeSIsInJlY3Vyc2l2ZSIsImdldEFzc2V0RGlyZWN0b3JpZXMiLCJjb25maWciLCJzb3VyY2VGdWxsUGF0aCIsInByb2Nlc3MiLCJjd2QiLCJzdGF0aWNQYXRoIiwidml0ZSIsImdlbmVyYXRlTGV4RmF2aWNvbnMiLCJsb2dvUGF0aCIsIm1vZGlmaWVkQXQiLCJtdGltZU1zIiwiY2FjaGVkIiwiZ2V0IiwicmVzcG9uc2UiLCJnZW5lcmF0ZWQiLCJpY29ucyIsImFuZHJvaWQiLCJhcHBsZUljb24iLCJhcHBsZVN0YXJ0dXAiLCJ3aW5kb3dzIiwieWFuZGV4IiwicGF0aCIsIm9wZW5HcmFwaEltYWdlIiwidHdpdHRlckltYWdlIiwiUHJvbWlzZSIsImFsbCIsInJlc2l6ZSIsImZpdCIsInBuZyIsInRvQnVmZmVyIiwiaHRtbCIsImltYWdlcyIsImNvbnRlbnRzIiwic2V0IiwiY29weUxleFdlYkFzc2V0cyIsIm91dHB1dFBhdGgiLCJvdXRwdXRGdWxsUGF0aCIsImFzc2V0RGlyZWN0b3J5Iiwic3ByaXRlbWFwIiwiZmlsZW5hbWUiLCJwcmVmaXgiLCJidWlsZFNwcml0ZW1hcCIsIndhcm5pbmciLCJ3YXJuaW5ncyIsImNvbnNvbGUiLCJ3YXJuIiwibWVzc2FnZSIsImNvbnRlbnQiLCJzcHJpdGVQYXRoIiwiZ2VuZXJhdGVkRmF2aWNvbnMiLCJpbWFnZSIsImltYWdlUGF0aCIsImZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiaW5kZXhQYXRoIiwiZmF2aWNvbkh0bWwiLCJyZXBsYWNlIiwib3B0aW1pemVJbWFnZSIsImV4dGVuc2lvbiIsInRvTG93ZXJDYXNlIiwiaXNTcHJpdGVtYXAiLCJlbmRzV2l0aCIsInJlc3VsdCIsInRvU3RyaW5nIiwibXVsdGlwYXNzIiwicGx1Z2lucyIsInBhcmFtcyIsIm92ZXJyaWRlcyIsImNsZWFudXBJZHMiLCJyZW1vdmVIaWRkZW5FbGVtcyIsImRhdGEiLCJqcGVnIiwicHJvZ3Jlc3NpdmUiLCJxdWFsaXR5Iiwid2VicCIsImdpZiIsIm9wdGltaXplZCIsImxlbmd0aCIsIm9wdGltaXplTGV4V2ViQXNzZXRzIiwiaW1hZ2VGaWxlcyIsImFic29sdXRlIiwibm9kaXIiLCJmaWx0ZXIiLCJtYXAiLCJjb21wcmVzc0xleFdlYkFzc2V0cyIsInNpemUiLCJnZXREZXZBc3NldCIsInJlcXVlc3RQYXRoIiwibm9ybWFsaXplZFBhdGgiLCJzcGxpdCIsImluY2x1ZGVzIiwiQnVmZmVyIiwiZnJvbSIsImdlbmVyYXRlZEltYWdlIiwiZmluZCIsImdlbmVyYXRlZEZpbGUiLCJzdGFydHNXaXRoIiwicmVsYXRpdmVQYXRoIiwic2xpY2UiLCJpc0ZpbGUiLCJnZXRBc3NldFJlbGF0aXZlUGF0aCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsUUFBUSxRQUFPLE9BQU87QUFDOUIsT0FBT0MsY0FBYyxXQUFXO0FBQ2hDLFNBQVFDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxZQUFZLEVBQUVDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxhQUFhLFFBQU8sS0FBSztBQUM3RixTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxTQUFRQyxPQUFPLEVBQUVDLElBQUksRUFBRUMsUUFBUSxFQUFFQyxPQUFPLFFBQU8sT0FBTztBQUN0RCxPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBUUMsUUFBUSxRQUFPLE9BQU87QUFHOUIsU0FBUUMsZUFBZSxRQUFPLCtCQUErQjtBQUU3RCxNQUFNQyxvQkFBb0I7QUFDMUIsTUFBTUMsYUFBYTtBQUNuQixNQUFNQyxvQkFBb0I7QUFRMUIsTUFBTUMsZUFBZSxJQUFJQztBQUV6QixNQUFNQyxnQkFBZ0IsQ0FBQ0MsUUFBZ0JDLGFBQXFCQztJQUMxRCxJQUFHLENBQUN2QixXQUFXcUIsU0FBUztJQUV4QixLQUFJLE1BQU1HLFNBQVNyQixZQUFZa0IsUUFBUTtRQUFDSSxlQUFlO0lBQUksR0FBSTtRQUM3RCxNQUFNQyxhQUFhakIsS0FBS1ksUUFBUUcsTUFBTUcsSUFBSTtRQUMxQyxNQUFNQyxrQkFBa0JuQixLQUFLYSxhQUFhRSxNQUFNRyxJQUFJO1FBRXBELElBQUdKLFNBQVNNLEtBQUtILGFBQWE7UUFFOUIsSUFBR0YsTUFBTU0sV0FBVyxJQUFJO1lBQ3RCVixjQUFjTSxZQUFZRSxpQkFB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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { InlineConfig } from 'vite';
|
|
2
|
+
export interface LexViteOptions {
|
|
3
|
+
readonly analyze?: boolean;
|
|
4
|
+
readonly command: 'build' | 'serve';
|
|
5
|
+
readonly entry?: string;
|
|
6
|
+
readonly mode?: string;
|
|
7
|
+
readonly open?: boolean;
|
|
8
|
+
readonly port?: number;
|
|
9
|
+
readonly quiet?: boolean;
|
|
10
|
+
readonly ssr?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const createLexViteConfig: (options: LexViteOptions) => InlineConfig;
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { transform } from '@swc/core';
|
|
5
|
+
import inject from '@rollup/plugin-inject';
|
|
6
|
+
import { existsSync, readFileSync } from 'fs';
|
|
7
|
+
import { extname, resolve } from 'path';
|
|
8
|
+
import { mergeConfig } from 'vite';
|
|
9
|
+
import { nodePolyfills } from 'vite-plugin-node-polyfills';
|
|
10
|
+
import { LexConfig } from '../../LexConfig.js';
|
|
11
|
+
import { generateLexFavicons, getDevAsset } from './assets.js';
|
|
12
|
+
const createInjectPlugin = inject;
|
|
13
|
+
const contentTypes = {
|
|
14
|
+
'.css': 'text/css',
|
|
15
|
+
'.gif': 'image/gif',
|
|
16
|
+
'.html': 'text/html',
|
|
17
|
+
'.ico': 'image/x-icon',
|
|
18
|
+
'.jpeg': 'image/jpeg',
|
|
19
|
+
'.jpg': 'image/jpeg',
|
|
20
|
+
'.json': 'application/json',
|
|
21
|
+
'.png': 'image/png',
|
|
22
|
+
'.svg': 'image/svg+xml',
|
|
23
|
+
'.ttf': 'font/ttf',
|
|
24
|
+
'.txt': 'text/plain',
|
|
25
|
+
'.woff': 'font/woff',
|
|
26
|
+
'.woff2': 'font/woff2'
|
|
27
|
+
};
|
|
28
|
+
const emptyCryptoPlugin = ()=>({
|
|
29
|
+
load (id) {
|
|
30
|
+
return id === '\0lex-empty-crypto' ? 'export default {}; export const webcrypto = undefined;' : null;
|
|
31
|
+
},
|
|
32
|
+
name: 'lex-empty-crypto',
|
|
33
|
+
resolveId (id) {
|
|
34
|
+
return id === 'crypto' || id === 'node:crypto' ? '\0lex-empty-crypto' : null;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
const graphqlPlugin = ()=>({
|
|
38
|
+
load (id) {
|
|
39
|
+
if (!/\.(gql|graphql)$/.test(id)) return null;
|
|
40
|
+
const source = JSON.stringify(readFileSync(id, 'utf8'));
|
|
41
|
+
return `import gql from 'graphql-tag'; export default gql(${source});`;
|
|
42
|
+
},
|
|
43
|
+
name: 'lex-graphql'
|
|
44
|
+
});
|
|
45
|
+
const swcPlugin = (sourcePath)=>({
|
|
46
|
+
enforce: 'pre',
|
|
47
|
+
async transform (source, id) {
|
|
48
|
+
const cleanId = id.split('?')[0];
|
|
49
|
+
if (!cleanId.startsWith(sourcePath) || !/\.[jt]sx?$/.test(cleanId) || /\.(test|spec|integration|e2e)\.[jt]sx?$/.test(cleanId)) return null;
|
|
50
|
+
const swcConfig = LexConfig.getSWCConfigWithReactCompiler();
|
|
51
|
+
const result = await transform(source, {
|
|
52
|
+
...swcConfig,
|
|
53
|
+
filename: cleanId,
|
|
54
|
+
module: {
|
|
55
|
+
...swcConfig?.module,
|
|
56
|
+
type: 'es6'
|
|
57
|
+
},
|
|
58
|
+
sourceMaps: true
|
|
59
|
+
});
|
|
60
|
+
const needsReact = /\bReact\s*\./.test(result.code) && !/from\s+['"]react['"]/.test(result.code);
|
|
61
|
+
return {
|
|
62
|
+
code: needsReact ? `import React from 'react';\n${result.code}` : result.code,
|
|
63
|
+
map: result.map || null
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
name: 'lex-swc'
|
|
67
|
+
});
|
|
68
|
+
const importMetaCompatibilityPlugin = (sourcePath)=>({
|
|
69
|
+
enforce: 'post',
|
|
70
|
+
name: 'lex-import-meta-compatibility',
|
|
71
|
+
transform (source, id) {
|
|
72
|
+
const cleanId = id.split('?')[0];
|
|
73
|
+
if (!cleanId.startsWith(sourcePath) || !source.includes('import.meta.url')) return null;
|
|
74
|
+
const replacement = '(typeof document !== "undefined" && document.currentScript && document.currentScript.src ? new URL(document.currentScript.src, window.location.href).href : (typeof window !== "undefined" ? new URL("", window.location.href).href : ""))';
|
|
75
|
+
return source.replaceAll('import.meta.url', replacement);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
const assetsDevPlugin = ()=>{
|
|
79
|
+
let faviconHtml = [];
|
|
80
|
+
return {
|
|
81
|
+
async buildStart () {
|
|
82
|
+
const generatedFavicons = await generateLexFavicons(LexConfig.config);
|
|
83
|
+
faviconHtml = generatedFavicons?.html || [];
|
|
84
|
+
},
|
|
85
|
+
configureServer (server) {
|
|
86
|
+
server.middlewares.use(async (request, response, next)=>{
|
|
87
|
+
if (!request.url) return next();
|
|
88
|
+
const asset = await getDevAsset(LexConfig.config, request.url);
|
|
89
|
+
if (!asset) return next();
|
|
90
|
+
response.statusCode = 200;
|
|
91
|
+
response.setHeader('Content-Type', contentTypes[extname(request.url.split('?')[0])] || 'application/octet-stream');
|
|
92
|
+
response.end(asset);
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
name: 'lex-assets-dev',
|
|
96
|
+
transformIndexHtml (html) {
|
|
97
|
+
if (faviconHtml.length === 0) return html;
|
|
98
|
+
return html.replace('</head>', ` ${faviconHtml.join('\n ')}\n </head>`);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
const analyzerPlugin = (enabled)=>({
|
|
103
|
+
generateBundle (_options, bundle) {
|
|
104
|
+
if (!enabled) return;
|
|
105
|
+
const report = Object.entries(bundle).map(([fileName, output])=>({
|
|
106
|
+
fileName,
|
|
107
|
+
size: output.type === 'asset' ? Buffer.byteLength(typeof output.source === 'string' ? output.source : output.source) : Buffer.byteLength(output.code),
|
|
108
|
+
type: output.type
|
|
109
|
+
}));
|
|
110
|
+
this.emitFile({
|
|
111
|
+
fileName: 'bundle-report.json',
|
|
112
|
+
source: JSON.stringify(report, null, 2),
|
|
113
|
+
type: 'asset'
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
name: 'lex-bundle-analyzer'
|
|
117
|
+
});
|
|
118
|
+
const getLibraryFormats = (libraryTarget)=>{
|
|
119
|
+
if (libraryTarget === 'commonjs' || libraryTarget === 'commonjs2') return [
|
|
120
|
+
'cjs'
|
|
121
|
+
];
|
|
122
|
+
if (libraryTarget === 'var' || libraryTarget === 'window') return [
|
|
123
|
+
'iife'
|
|
124
|
+
];
|
|
125
|
+
if (libraryTarget === 'umd') return [
|
|
126
|
+
'umd'
|
|
127
|
+
];
|
|
128
|
+
return [
|
|
129
|
+
'es'
|
|
130
|
+
];
|
|
131
|
+
};
|
|
132
|
+
const resolveProjectPackage = (packageName)=>{
|
|
133
|
+
const projectPackage = resolve(process.cwd(), 'node_modules', packageName);
|
|
134
|
+
return existsSync(projectPackage) ? projectPackage : resolve(LexConfig.getLexDir(), 'node_modules', packageName);
|
|
135
|
+
};
|
|
136
|
+
export const createLexViteConfig = (options)=>{
|
|
137
|
+
const config = LexConfig.config;
|
|
138
|
+
const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
|
|
139
|
+
const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
|
|
140
|
+
const entryPath = resolve(sourcePath, options.entry || config.entryJs || 'index.js');
|
|
141
|
+
const htmlPath = resolve(sourcePath, config.entryHTML || 'index.html');
|
|
142
|
+
const hasHtmlEntry = existsSync(htmlPath) && !options.ssr;
|
|
143
|
+
const outputHash = config.outputHash || options.mode === 'production';
|
|
144
|
+
const fileName = config.outputFile || (outputHash ? '[name].[hash].js' : '[name].js');
|
|
145
|
+
const viteConfig = {
|
|
146
|
+
appType: hasHtmlEntry ? 'spa' : 'custom',
|
|
147
|
+
base: '/',
|
|
148
|
+
build: {
|
|
149
|
+
cssCodeSplit: true,
|
|
150
|
+
emptyOutDir: false,
|
|
151
|
+
minify: options.mode === 'production',
|
|
152
|
+
outDir: outputPath,
|
|
153
|
+
rolldownOptions: {
|
|
154
|
+
input: hasHtmlEntry ? htmlPath : entryPath,
|
|
155
|
+
output: {
|
|
156
|
+
assetFileNames: outputHash ? 'assets/[name].[hash][extname]' : 'assets/[name][extname]',
|
|
157
|
+
chunkFileNames: outputHash ? '[name].[hash].chunk.js' : '[name].chunk.js',
|
|
158
|
+
entryFileNames: fileName,
|
|
159
|
+
manualChunks (id) {
|
|
160
|
+
return id.includes('/node_modules/') ? 'vendors' : undefined;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
sourcemap: config.swc?.sourceMaps ? true : false,
|
|
165
|
+
ssr: options.ssr ? entryPath : false,
|
|
166
|
+
target: config.swc?.jsc?.target?.toString() || 'es2020'
|
|
167
|
+
},
|
|
168
|
+
clearScreen: false,
|
|
169
|
+
configFile: false,
|
|
170
|
+
css: {
|
|
171
|
+
postcss: resolve(LexConfig.getLexDir(), 'postcss.config.js')
|
|
172
|
+
},
|
|
173
|
+
define: {
|
|
174
|
+
'process.env.NODE_ENV': JSON.stringify(options.mode || (options.command === 'build' ? 'production' : 'development'))
|
|
175
|
+
},
|
|
176
|
+
envDir: process.cwd(),
|
|
177
|
+
logLevel: options.quiet ? 'silent' : 'info',
|
|
178
|
+
mode: options.mode || (options.command === 'build' ? 'production' : 'development'),
|
|
179
|
+
plugins: [
|
|
180
|
+
...options.ssr ? [] : [
|
|
181
|
+
emptyCryptoPlugin(),
|
|
182
|
+
nodePolyfills({
|
|
183
|
+
globals: {
|
|
184
|
+
Buffer: false,
|
|
185
|
+
global: false,
|
|
186
|
+
process: false
|
|
187
|
+
},
|
|
188
|
+
include: [
|
|
189
|
+
'assert',
|
|
190
|
+
'buffer',
|
|
191
|
+
'http',
|
|
192
|
+
'https',
|
|
193
|
+
'os',
|
|
194
|
+
'path',
|
|
195
|
+
'process',
|
|
196
|
+
'stream',
|
|
197
|
+
'util',
|
|
198
|
+
'vm'
|
|
199
|
+
],
|
|
200
|
+
overrides: {
|
|
201
|
+
buffer: resolveProjectPackage('buffer'),
|
|
202
|
+
process: resolveProjectPackage('process/browser.js')
|
|
203
|
+
},
|
|
204
|
+
protocolImports: true
|
|
205
|
+
}),
|
|
206
|
+
createInjectPlugin({
|
|
207
|
+
Buffer: [
|
|
208
|
+
resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/buffer/dist/index.js'),
|
|
209
|
+
'Buffer'
|
|
210
|
+
],
|
|
211
|
+
global: [
|
|
212
|
+
resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/global/dist/index.js'),
|
|
213
|
+
'default'
|
|
214
|
+
],
|
|
215
|
+
process: [
|
|
216
|
+
resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/process/dist/index.js'),
|
|
217
|
+
'default'
|
|
218
|
+
]
|
|
219
|
+
})
|
|
220
|
+
],
|
|
221
|
+
swcPlugin(sourcePath),
|
|
222
|
+
graphqlPlugin(),
|
|
223
|
+
...options.ssr ? [] : [
|
|
224
|
+
importMetaCompatibilityPlugin(sourcePath),
|
|
225
|
+
assetsDevPlugin(),
|
|
226
|
+
analyzerPlugin(Boolean(options.analyze))
|
|
227
|
+
]
|
|
228
|
+
],
|
|
229
|
+
publicDir: false,
|
|
230
|
+
resolve: {
|
|
231
|
+
alias: {
|
|
232
|
+
Buffer: resolveProjectPackage('buffer'),
|
|
233
|
+
'core-js': resolveProjectPackage('core-js'),
|
|
234
|
+
global: resolveProjectPackage('global'),
|
|
235
|
+
'graphql-tag': resolveProjectPackage('graphql-tag'),
|
|
236
|
+
randombytes: resolve(LexConfig.getLexDir(), 'node_modules/randombytes'),
|
|
237
|
+
react: resolveProjectPackage('react'),
|
|
238
|
+
'react-dom': resolveProjectPackage('react-dom'),
|
|
239
|
+
'regenerator-runtime': resolveProjectPackage('regenerator-runtime'),
|
|
240
|
+
'vite-plugin-node-polyfills/shims/buffer': resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/buffer/dist/index.js'),
|
|
241
|
+
'vite-plugin-node-polyfills/shims/global': resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/global/dist/index.js'),
|
|
242
|
+
'vite-plugin-node-polyfills/shims/process': resolve(LexConfig.getLexDir(), 'node_modules/vite-plugin-node-polyfills/shims/process/dist/index.js')
|
|
243
|
+
},
|
|
244
|
+
extensions: [
|
|
245
|
+
'.mjs',
|
|
246
|
+
'.js',
|
|
247
|
+
'.ts',
|
|
248
|
+
'.tsx',
|
|
249
|
+
'.jsx',
|
|
250
|
+
'.json',
|
|
251
|
+
'.gql',
|
|
252
|
+
'.graphql'
|
|
253
|
+
],
|
|
254
|
+
preserveSymlinks: false,
|
|
255
|
+
tsconfigPaths: true
|
|
256
|
+
},
|
|
257
|
+
root: sourcePath,
|
|
258
|
+
server: {
|
|
259
|
+
hmr: false,
|
|
260
|
+
open: options.open,
|
|
261
|
+
port: options.port,
|
|
262
|
+
strictPort: true
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
if (!hasHtmlEntry && config.libraryName && !options.ssr) {
|
|
266
|
+
viteConfig.build = {
|
|
267
|
+
...viteConfig.build,
|
|
268
|
+
lib: {
|
|
269
|
+
entry: entryPath,
|
|
270
|
+
fileName: ()=>config.outputFile || 'index.js',
|
|
271
|
+
formats: getLibraryFormats(config.libraryTarget),
|
|
272
|
+
name: config.libraryName
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
return mergeConfig(viteConfig, config.vite || {});
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy92aXRlL2NvbmZpZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQgaW5qZWN0IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWluamVjdCc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtleHRuYW1lLCByZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7bWVyZ2VDb25maWd9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHtub2RlUG9seWZpbGxzfSBmcm9tICd2aXRlLXBsdWdpbi1ub2RlLXBvbHlmaWxscyc7XG5cbmltcG9ydCB7TGV4Q29uZmlnfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtnZW5lcmF0ZUxleEZhdmljb25zLCBnZXREZXZBc3NldH0gZnJvbSAnLi9hc3NldHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7SW5saW5lQ29uZmlnLCBQbHVnaW59IGZyb20gJ3ZpdGUnO1xuXG5jb25zdCBjcmVhdGVJbmplY3RQbHVnaW4gPSBpbmplY3QgYXMgdW5rbm93biBhcyAob3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IFBsdWdpbjtcblxuZXhwb3J0IGludGVyZmFjZSBMZXhWaXRlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBjb21tYW5kOiAnYnVpbGQnIHwgJ3NlcnZlJztcbiAgcmVhZG9ubHkgZW50cnk/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wZW4/OiBib29sZWFuO1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNzcj86IGJvb2xlYW47XG59XG5cbmNvbnN0IGNvbnRlbnRUeXBlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJy5jc3MnOiAndGV4dC9jc3MnLFxuICAnLmdpZic6ICdpbWFnZS9naWYnLFxuICAnLmh0bWwnOiAndGV4dC9odG1sJyxcbiAgJy5pY28nOiAnaW1hZ2UveC1pY29uJyxcbiAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmpwZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qc29uJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAnLnBuZyc6ICdpbWFnZS9wbmcnLFxuICAnLnN2Zyc6ICdpbWFnZS9zdmcreG1sJyxcbiAgJy50dGYnOiAnZm9udC90dGYnLFxuICAnLnR4dCc6ICd0ZXh0L3BsYWluJyxcbiAgJy53b2ZmJzogJ2ZvbnQvd29mZicsXG4gICcud29mZjInOiAnZm9udC93b2ZmMidcbn07XG5cbmNvbnN0IGVtcHR5Q3J5cHRvUGx1Z2luID0gKCk6IFBsdWdpbiA9PiAoe1xuICBsb2FkKGlkKSB7XG4gICAgcmV0dXJuIGlkID09PSAnXFwwbGV4LWVtcHR5LWNyeXB0bycgPyAnZXhwb3J0IGRlZmF1bHQge307IGV4cG9ydCBjb25zdCB3ZWJjcnlwdG8gPSB1bmRlZmluZWQ7JyA6IG51bGw7XG4gIH0sXG4gIG5hbWU6ICdsZXgtZW1wdHktY3J5cHRvJyxcbiAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgcmV0dXJuIGlkID09PSAnY3J5cHRvJyB8fCBpZCA9PT0gJ25vZGU6Y3J5cHRvJyA/ICdcXDBsZXgtZW1wdHktY3J5cHRvJyA6IG51bGw7XG4gIH1cbn0pO1xuXG5jb25zdCBncmFwaHFsUGx1Z2luID0gKCk6IFBsdWdpbiA9PiAoe1xuICBsb2FkKGlkKSB7XG4gICAgaWYoIS9cXC4oZ3FsfGdyYXBocWwpJC8udGVzdChpZCkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHNvdXJjZSA9IEpTT04uc3RyaW5naWZ5KHJlYWRGaWxlU3luYyhpZCwgJ3V0ZjgnKSk7XG4gICAgcmV0dXJuIGBpbXBvcnQgZ3FsIGZyb20gJ2dyYXBocWwtdGFnJzsgZXhwb3J0IGRlZmF1bHQgZ3FsKCR7c291cmNlfSk7YDtcbiAgfSxcbiAgbmFtZTogJ2xleC1ncmFwaHFsJ1xufSk7XG5cbmNvbnN0IHN3Y1BsdWdpbiA9IChzb3VyY2VQYXRoOiBzdHJpbmcpOiBQbHVnaW4gPT4gKHtcbiAgZW5mb3JjZTogJ3ByZScsXG4gIGFzeW5jIHRyYW5zZm9ybShzb3VyY2UsIGlkKSB7XG4gICAgY29uc3QgY2xlYW5JZCA9IGlkLnNwbGl0KCc/JylbMF07XG4gICAgaWYoIWNsZWFuSWQuc3RhcnRzV2l0aChzb3VyY2VQYXRoKSB8fCAhL1xcLltqdF1zeD8kLy50ZXN0KGNsZWFuSWQpIHx8IC9cXC4odGVzdHxzcGVjfGludGVncmF0aW9ufGUyZSlcXC5banRdc3g/JC8udGVzdChjbGVhbklkKSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBzd2NDb25maWcgPSBMZXhDb25maWcuZ2V0U1dDQ29uZmlnV2l0aFJlYWN0Q29tcGlsZXIoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm0oc291cmNlLCB7XG4gICAgICAuLi5zd2NDb25maWcsXG4gICAgICBmaWxlbmFtZTogY2xlYW5JZCxcbiAgICAgIG1vZHVsZTogey4uLnN3Y0NvbmZpZz8ubW9kdWxlLCB0eXBlOiAnZXM2J30sXG4gICAgICBzb3VyY2VNYXBzOiB0cnVlXG4gICAgfSk7XG5cbiAgICBjb25zdCBuZWVkc1JlYWN0ID0gL1xcYlJlYWN0XFxzKlxcLi8udGVzdChyZXN1bHQuY29kZSkgJiYgIS9mcm9tXFxzK1snXCJdcmVhY3RbJ1wiXS8udGVzdChyZXN1bHQuY29kZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvZGU6IG5lZWRzUmVhY3QgPyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcXG4ke3Jlc3VsdC5jb2RlfWAgOiByZXN1bHQuY29kZSxcbiAgICAgIG1hcDogcmVzdWx0Lm1hcCB8fCBudWxsXG4gICAgfTtcbiAgfSxcbiAgbmFtZTogJ2xleC1zd2MnXG59KTtcblxuY29uc3QgaW1wb3J0TWV0YUNvbXBhdGliaWxpdHlQbHVnaW4gPSAoc291cmNlUGF0aDogc3RyaW5nKTogUGx1Z2luID0+ICh7XG4gIGVuZm9yY2U6ICdwb3N0JyxcbiAgbmFtZTogJ2xleC1pbXBvcnQtbWV0YS1jb21wYXRpYmlsaXR5JyxcbiAgdHJhbnNmb3JtKHNvdXJjZSwgaWQpIHtcbiAgICBjb25zdCBjbGVhbklkID0gaWQuc3BsaXQoJz8nKVswXTtcbiAgICBpZighY2xlYW5JZC5zdGFydHNXaXRoKHNvdXJjZVBhdGgpIHx8ICFzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydC5tZXRhLnVybCcpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gJyh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA/IG5ldyBVUkwoZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5ocmVmIDogKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyBuZXcgVVJMKFwiXCIsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5ocmVmIDogXCJcIikpJztcbiAgICByZXR1cm4gc291cmNlLnJlcGxhY2VBbGwoJ2ltcG9ydC5tZXRhLnVybCcsIHJlcGxhY2VtZW50KTtcbiAgfVxufSk7XG5cbmNvbnN0IGFzc2V0c0RldlBsdWdpbiA9ICgpOiBQbHVnaW4gPT4ge1xuICBsZXQgZmF2aWNvbkh0bWw6IHN0cmluZ1tdID0gW107XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBidWlsZFN0YXJ0KCkge1xuICAgICAgY29uc3QgZ2VuZXJhdGVkRmF2aWNvbnMgPSBhd2FpdCBnZW5lcmF0ZUxleEZhdmljb25zKExleENvbmZpZy5jb25maWcpO1xuICAgICAgZmF2aWNvbkh0bWwgPSBnZW5lcmF0ZWRGYXZpY29ucz8uaHRtbCB8fCBbXTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyZVNlcnZlcihzZXJ2ZXIpIHtcbiAgICAgIHNlcnZlci5taWRkbGV3YXJlcy51c2UoYXN5bmMgKHJlcXVlc3QsIHJlc3BvbnNlLCBuZXh0KSA9PiB7XG4gICAgICAgIGlmKCFyZXF1ZXN0LnVybCkgcmV0dXJuIG5leHQoKTtcbiAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCBnZXREZXZBc3NldChMZXhDb25maWcuY29uZmlnLCByZXF1ZXN0LnVybCk7XG4gICAgICAgIGlmKCFhc3NldCkgcmV0dXJuIG5leHQoKTtcblxuICAgICAgICByZXNwb25zZS5zdGF0dXNDb2RlID0gMjAwO1xuICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIGNvbnRlbnRUeXBlc1tleHRuYW1lKHJlcXVlc3QudXJsLnNwbGl0KCc/JylbMF0pXSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk7XG4gICAgICAgIHJlc3BvbnNlLmVuZChhc3NldCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIG5hbWU6ICdsZXgtYXNzZXRzLWRldicsXG4gICAgdHJhbnNmb3JtSW5kZXhIdG1sKGh0bWwpIHtcbiAgICAgIGlmKGZhdmljb25IdG1sLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGh0bWw7XG4gICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKCc8L2hlYWQ+JywgYCAgICAke2Zhdmljb25IdG1sLmpvaW4oJ1xcbiAgICAnKX1cXG4gIDwvaGVhZD5gKTtcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBhbmFseXplclBsdWdpbiA9IChlbmFibGVkOiBib29sZWFuKTogUGx1Z2luID0+ICh7XG4gIGdlbmVyYXRlQnVuZGxlKF9vcHRpb25zLCBidW5kbGUpIHtcbiAgICBpZighZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVwb3J0ID0gT2JqZWN0LmVudHJpZXMoYnVuZGxlKS5tYXAoKFtmaWxlTmFtZSwgb3V0cHV0XSkgPT4gKHtcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgc2l6ZTogb3V0cHV0LnR5cGUgPT09ICdhc3NldCdcbiAgICAgICAgPyBCdWZmZXIuYnl0ZUxlbmd0aCh0eXBlb2Ygb3V0cHV0LnNvdXJjZSA9PT0gJ3N0cmluZycgPyBvdXRwdXQuc291cmNlIDogb3V0cHV0LnNvdXJjZSlcbiAgICAgICAgOiBCdWZmZXIuYnl0ZUxlbmd0aChvdXRwdXQuY29kZSksXG4gICAgICB0eXBlOiBvdXRwdXQudHlwZVxuICAgIH0pKTtcblxuICAgIHRoaXMuZW1pdEZpbGUoe2ZpbGVOYW1lOiAnYnVuZGxlLXJlcG9ydC5qc29uJywgc291cmNlOiBKU09OLnN0cmluZ2lmeShyZXBvcnQsIG51bGwsIDIpLCB0eXBlOiAnYXNzZXQnfSk7XG4gIH0sXG4gIG5hbWU6ICdsZXgtYnVuZGxlLWFuYWx5emVyJ1xufSk7XG5cbmNvbnN0IGdldExpYnJhcnlGb3JtYXRzID0gKGxpYnJhcnlUYXJnZXQ/OiBzdHJpbmcpOiBBcnJheTwnY2pzJyB8ICdlcycgfCAnaWlmZScgfCAndW1kJz4gPT4ge1xuICBpZihsaWJyYXJ5VGFyZ2V0ID09PSAnY29tbW9uanMnIHx8IGxpYnJhcnlUYXJnZXQgPT09ICdjb21tb25qczInKSByZXR1cm4gWydjanMnXTtcbiAgaWYobGlicmFyeVRhcmdldCA9PT0gJ3ZhcicgfHwgbGlicmFyeVRhcmdldCA9PT0gJ3dpbmRvdycpIHJldHVybiBbJ2lpZmUnXTtcbiAgaWYobGlicmFyeVRhcmdldCA9PT0gJ3VtZCcpIHJldHVybiBbJ3VtZCddO1xuICByZXR1cm4gWydlcyddO1xufTtcblxuY29uc3QgcmVzb2x2ZVByb2plY3RQYWNrYWdlID0gKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwcm9qZWN0UGFja2FnZSA9IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcycsIHBhY2thZ2VOYW1lKTtcbiAgcmV0dXJuIGV4aXN0c1N5bmMocHJvamVjdFBhY2thZ2UpID8gcHJvamVjdFBhY2thZ2UgOiByZXNvbHZlKExleENvbmZpZy5nZXRMZXhEaXIoKSwgJ25vZGVfbW9kdWxlcycsIHBhY2thZ2VOYW1lKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMZXhWaXRlQ29uZmlnID0gKG9wdGlvbnM6IExleFZpdGVPcHRpb25zKTogSW5saW5lQ29uZmlnID0+IHtcbiAgY29uc3QgY29uZmlnID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3Qgc291cmNlUGF0aCA9IGNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCByZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5zb3VyY2VQYXRoIHx8ICcuL3NyYycpO1xuICBjb25zdCBvdXRwdXRQYXRoID0gY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLm91dHB1dFBhdGggfHwgJy4vbGliJyk7XG4gIGNvbnN0IGVudHJ5UGF0aCA9IHJlc29sdmUoc291cmNlUGF0aCwgb3B0aW9ucy5lbnRyeSB8fCBjb25maWcuZW50cnlKcyB8fCAnaW5kZXguanMnKTtcbiAgY29uc3QgaHRtbFBhdGggPSByZXNvbHZlKHNvdXJjZVBhdGgsIGNvbmZpZy5lbnRyeUhUTUwgfHwgJ2luZGV4Lmh0bWwnKTtcbiAgY29uc3QgaGFzSHRtbEVudHJ5ID0gZXhpc3RzU3luYyhodG1sUGF0aCkgJiYgIW9wdGlvbnMuc3NyO1xuICBjb25zdCBvdXRwdXRIYXNoID0gY29uZmlnLm91dHB1dEhhc2ggfHwgb3B0aW9ucy5tb2RlID09PSAncHJvZHVjdGlvbic7XG4gIGNvbnN0IGZpbGVOYW1lID0gY29uZmlnLm91dHB1dEZpbGUgfHwgKG91dHB1dEhhc2ggPyAnW25hbWVdLltoYXNoXS5qcycgOiAnW25hbWVdLmpzJyk7XG5cbiAgY29uc3Qgdml0ZUNvbmZpZzogSW5saW5lQ29uZmlnID0ge1xuICAgIGFwcFR5cGU6IGhhc0h0bWxFbnRyeSA/ICdzcGEnIDogJ2N1c3RvbScsXG4gICAgYmFzZTogJy8nLFxuICAgIGJ1aWxkOiB7XG4gICAgICBjc3NDb2RlU3BsaXQ6IHRydWUsXG4gICAgICBlbXB0eU91dERpcjogZmFsc2UsXG4gICAgICBtaW5pZnk6IG9wdGlvbnMubW9kZSA9PT0gJ3Byb2R1Y3Rpb24nLFxuICAgICAgb3V0RGlyOiBvdXRwdXRQYXRoLFxuICAgICAgcm9sbGRvd25PcHRpb25zOiB7XG4gICAgICAgIGlucHV0OiBoYXNIdG1sRW50cnkgPyBodG1sUGF0aCA6IGVudHJ5UGF0aCxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgYXNzZXRGaWxlTmFtZXM6IG91dHB1dEhhc2ggPyAnYXNzZXRzL1tuYW1lXS5baGFzaF1bZXh0bmFtZV0nIDogJ2Fzc2V0cy9bbmFtZV1bZXh0bmFtZV0nLFxuICAgICAgICAgIGNodW5rRmlsZU5hbWVzOiBvdXRwdXRIYXNoID8gJ1tuYW1lXS5baGFzaF0uY2h1bmsuanMnIDogJ1tuYW1lXS5jaHVuay5qcycsXG4gICAgICAgICAgZW50cnlGaWxlTmFtZXM6IGZpbGVOYW1lLFxuICAgICAgICAgIG1hbnVhbENodW5rcyhpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpID8gJ3ZlbmRvcnMnIDogdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvdXJjZW1hcDogY29uZmlnLnN3Yz8uc291cmNlTWFwcyA/IHRydWUgOiBmYWxzZSxcbiAgICAgIHNzcjogb3B0aW9ucy5zc3IgPyBlbnRyeVBhdGggOiBmYWxzZSxcbiAgICAgIHRhcmdldDogY29uZmlnLnN3Yz8uanNjPy50YXJnZXQ/LnRvU3RyaW5nKCkgfHwgJ2VzMjAyMCdcbiAgICB9LFxuICAgIGNsZWFyU2NyZWVuOiBmYWxzZSxcbiAgICBjb25maWdGaWxlOiBmYWxzZSxcbiAgICBjc3M6IHtcbiAgICAgIHBvc3Rjc3M6IHJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAncG9zdGNzcy5jb25maWcuanMnKVxuICAgIH0sXG4gICAgZGVmaW5lOiB7XG4gICAgICAncHJvY2Vzcy5lbnYuTk9ERV9FTlYnOiBKU09OLnN0cmluZ2lmeShvcHRpb25zLm1vZGUgfHwgKG9wdGlvbnMuY29tbWFuZCA9PT0gJ2J1aWxkJyA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpKVxuICAgIH0sXG4gICAgZW52RGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGxvZ0xldmVsOiBvcHRpb25zLnF1aWV0ID8gJ3NpbGVudCcgOiAnaW5mbycsXG4gICAgbW9kZTogb3B0aW9ucy5tb2RlIHx8IChvcHRpb25zLmNvbW1hbmQgPT09ICdidWlsZCcgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnKSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICAuLi4ob3B0aW9ucy5zc3IgPyBbXSA6IFtcbiAgICAgICAgZW1wdHlDcnlwdG9QbHVnaW4oKSxcbiAgICAgICAgbm9kZVBvbHlmaWxscyh7XG4gICAgICAgICAgZ2xvYmFsczoge0J1ZmZlcjogZmFsc2UsIGdsb2JhbDogZmFsc2UsIHByb2Nlc3M6IGZhbHNlfSxcbiAgICAgICAgICBpbmNsdWRlOiBbJ2Fzc2VydCcsICdidWZmZXInLCAnaHR0cCcsICdodHRwcycsICdvcycsICdwYXRoJywgJ3Byb2Nlc3MnLCAnc3RyZWFtJywgJ3V0aWwnLCAndm0nXSxcbiAgICAgICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgICAgIGJ1ZmZlcjogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdidWZmZXInKSxcbiAgICAgICAgICAgIHByb2Nlc3M6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgncHJvY2Vzcy9icm93c2VyLmpzJylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb3RvY29sSW1wb3J0czogdHJ1ZVxuICAgICAgICB9KSxcbiAgICAgICAgY3JlYXRlSW5qZWN0UGx1Z2luKHtcbiAgICAgICAgICBCdWZmZXI6IFtyZXNvbHZlKExleENvbmZpZy5nZXRMZXhEaXIoKSwgJ25vZGVfbW9kdWxlcy92aXRlLXBsdWdpbi1ub2RlLXBvbHlmaWxscy9zaGltcy9idWZmZXIvZGlzdC9pbmRleC5qcycpLCAnQnVmZmVyJ10sXG4gICAgICAgICAgZ2xvYmFsOiBbcmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdub2RlX21vZHVsZXMvdml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvZ2xvYmFsL2Rpc3QvaW5kZXguanMnKSwgJ2RlZmF1bHQnXSxcbiAgICAgICAgICBwcm9jZXNzOiBbcmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdub2RlX21vZHVsZXMvdml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvcHJvY2Vzcy9kaXN0L2luZGV4LmpzJyksICdkZWZhdWx0J11cbiAgICAgICAgfSlcbiAgICAgIF0pLFxuICAgICAgc3djUGx1Z2luKHNvdXJjZVBhdGgpLFxuICAgICAgZ3JhcGhxbFBsdWdpbigpLFxuICAgICAgLi4uKG9wdGlvbnMuc3NyID8gW10gOiBbaW1wb3J0TWV0YUNvbXBhdGliaWxpdHlQbHVnaW4oc291cmNlUGF0aCksIGFzc2V0c0RldlBsdWdpbigpLCBhbmFseXplclBsdWdpbihCb29sZWFuKG9wdGlvbnMuYW5hbHl6ZSkpXSlcbiAgICBdLFxuICAgIHB1YmxpY0RpcjogZmFsc2UsXG4gICAgcmVzb2x2ZToge1xuICAgICAgYWxpYXM6IHtcbiAgICAgICAgQnVmZmVyOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2J1ZmZlcicpLFxuICAgICAgICAnY29yZS1qcyc6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgnY29yZS1qcycpLFxuICAgICAgICBnbG9iYWw6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgnZ2xvYmFsJyksXG4gICAgICAgICdncmFwaHFsLXRhZyc6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgnZ3JhcGhxbC10YWcnKSxcbiAgICAgICAgcmFuZG9tYnl0ZXM6IHJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnbm9kZV9tb2R1bGVzL3JhbmRvbWJ5dGVzJyksXG4gICAgICAgIHJlYWN0OiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3JlYWN0JyksXG4gICAgICAgICdyZWFjdC1kb20nOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3JlYWN0LWRvbScpLFxuICAgICAgICAncmVnZW5lcmF0b3ItcnVudGltZSc6IHJlc29sdmVQcm9qZWN0UGFja2FnZSgncmVnZW5lcmF0b3ItcnVudGltZScpLFxuICAgICAgICAndml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvYnVmZmVyJzogcmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdub2RlX21vZHVsZXMvdml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvYnVmZmVyL2Rpc3QvaW5kZXguanMnKSxcbiAgICAgICAgJ3ZpdGUtcGx1Z2luLW5vZGUtcG9seWZpbGxzL3NoaW1zL2dsb2JhbCc6IHJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnbm9kZV9tb2R1bGVzL3ZpdGUtcGx1Z2luLW5vZGUtcG9seWZpbGxzL3NoaW1zL2dsb2JhbC9kaXN0L2luZGV4LmpzJyksXG4gICAgICAgICd2aXRlLXBsdWdpbi1ub2RlLXBvbHlmaWxscy9zaGltcy9wcm9jZXNzJzogcmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdub2RlX21vZHVsZXMvdml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvcHJvY2Vzcy9kaXN0L2luZGV4LmpzJylcbiAgICAgIH0sXG4gICAgICBleHRlbnNpb25zOiBbJy5tanMnLCAnLmpzJywgJy50cycsICcudHN4JywgJy5qc3gnLCAnLmpzb24nLCAnLmdxbCcsICcuZ3JhcGhxbCddLFxuICAgICAgcHJlc2VydmVTeW1saW5rczogZmFsc2UsXG4gICAgICB0c2NvbmZpZ1BhdGhzOiB0cnVlXG4gICAgfSxcbiAgICByb290OiBzb3VyY2VQYXRoLFxuICAgIHNlcnZlcjoge1xuICAgICAgaG1yOiBmYWxzZSxcbiAgICAgIG9wZW46IG9wdGlvbnMub3BlbixcbiAgICAgIHBvcnQ6IG9wdGlvbnMucG9ydCxcbiAgICAgIHN0cmljdFBvcnQ6IHRydWVcbiAgICB9XG4gIH07XG5cbiAgaWYoIWhhc0h0bWxFbnRyeSAmJiBjb25maWcubGlicmFyeU5hbWUgJiYgIW9wdGlvbnMuc3NyKSB7XG4gICAgdml0ZUNvbmZpZy5idWlsZCA9IHtcbiAgICAgIC4uLnZpdGVDb25maWcuYnVpbGQsXG4gICAgICBsaWI6IHtcbiAgICAgICAgZW50cnk6IGVudHJ5UGF0aCxcbiAgICAgICAgZmlsZU5hbWU6ICgpID0+IGNvbmZpZy5vdXRwdXRGaWxlIHx8ICdpbmRleC5qcycsXG4gICAgICAgIGZvcm1hdHM6IGdldExpYnJhcnlGb3JtYXRzKGNvbmZpZy5saWJyYXJ5VGFyZ2V0KSxcbiAgICAgICAgbmFtZTogY29uZmlnLmxpYnJhcnlOYW1lXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBtZXJnZUNvbmZpZyh2aXRlQ29uZmlnLCBjb25maWcudml0ZSB8fCB7fSkgYXMgSW5saW5lQ29uZmlnO1xufTtcbiJdLCJuYW1lcyI6WyJ0cmFuc2Zvcm0iLCJpbmplY3QiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwiZXh0bmFtZSIsInJlc29sdmUiLCJtZXJnZUNvbmZpZyIsIm5vZGVQb2x5ZmlsbHMiLCJMZXhDb25maWciLCJnZW5lcmF0ZUxleEZhdmljb25zIiwiZ2V0RGV2QXNzZXQiLCJjcmVhdGVJbmplY3RQbHVnaW4iLCJjb250ZW50VHlwZXMiLCJlbXB0eUNyeXB0b1BsdWdpbiIsImxvYWQiLCJpZCIsIm5hbWUiLCJyZXNvbHZlSWQiLCJncmFwaHFsUGx1Z2luIiwidGVzdCIsInNvdXJjZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzd2NQbHVnaW4iLCJzb3VyY2VQYXRoIiwiZW5mb3JjZSIsImNsZWFuSWQiLCJzcGxpdCIsInN0YXJ0c1dpdGgiLCJzd2NDb25maWciLCJnZXRTV0NDb25maWdXaXRoUmVhY3RDb21waWxlciIsInJlc3VsdCIsImZpbGVuYW1lIiwibW9kdWxlIiwidHlwZSIsInNvdXJjZU1hcHMiLCJuZWVkc1JlYWN0IiwiY29kZSIsIm1hcCIsImltcG9ydE1ldGFDb21wYXRpYmlsaXR5UGx1Z2luIiwiaW5jbHVkZXMiLCJyZXBsYWNlbWVudCIsInJlcGxhY2VBbGwiLCJhc3NldHNEZXZQbHVnaW4iLCJmYXZpY29uSHRtbCIsImJ1aWxkU3RhcnQiLCJnZW5lcmF0ZWRGYXZpY29ucyIsImNvbmZpZyIsImh0bWwiLCJjb25maWd1cmVTZXJ2ZXIiLCJzZXJ2ZXIiLCJtaWRkbGV3YXJlcyIsInVzZSIsInJlcXVlc3QiLCJyZXNwb25zZSIsIm5leHQiLCJ1cmwiLCJhc3NldCIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJlbmQiLCJ0cmFuc2Zvcm1JbmRleEh0bWwiLCJsZW5ndGgiLCJyZXBsYWNlIiwiam9pbiIsImFuYWx5emVyUGx1Z2luIiwiZW5hYmxlZCIsImdlbmVyYXRlQnVuZGxlIiwiX29wdGlvbnMiLCJidW5kbGUiLCJyZXBvcnQiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmlsZU5hbWUiLCJvdXRwdXQiLCJzaXplIiwiQnVmZmVyIiwiYnl0ZUxlbmd0aCIsImVtaXRGaWxlIiwiZ2V0TGlicmFyeUZvcm1hdHMiLCJsaWJyYXJ5VGFyZ2V0IiwicmVzb2x2ZVByb2plY3RQYWNrYWdlIiwicGFja2FnZU5hbWUiLCJwcm9qZWN0UGFja2FnZSIsInByb2Nlc3MiLCJjd2QiLCJnZXRMZXhEaXIiLCJjcmVhdGVMZXhWaXRlQ29uZmlnIiwib3B0aW9ucyIsInNvdXJjZUZ1bGxQYXRoIiwib3V0cHV0UGF0aCIsIm91dHB1dEZ1bGxQYXRoIiwiZW50cnlQYXRoIiwiZW50cnkiLCJlbnRyeUpzIiwiaHRtbFBhdGgiLCJlbnRyeUhUTUwiLCJoYXNIdG1sRW50cnkiLCJzc3IiLCJvdXRwdXRIYXNoIiwibW9kZSIsIm91dHB1dEZpbGUiLCJ2aXRlQ29uZmlnIiwiYXBwVHlwZSIsImJhc2UiLCJidWlsZCIsImNzc0NvZGVTcGxpdCIsImVtcHR5T3V0RGlyIiwibWluaWZ5Iiwib3V0RGlyIiwicm9sbGRvd25PcHRpb25zIiwiaW5wdXQiLCJhc3NldEZpbGVOYW1lcyIsImNodW5rRmlsZU5hbWVzIiwiZW50cnlGaWxlTmFtZXMiLCJtYW51YWxDaHVua3MiLCJ1bmRlZmluZWQiLCJzb3VyY2VtYXAiLCJzd2MiLCJ0YXJnZXQiLCJqc2MiLCJ0b1N0cmluZyIsImNsZWFyU2NyZWVuIiwiY29uZmlnRmlsZSIsImNzcyIsInBvc3Rjc3MiLCJkZWZpbmUiLCJjb21tYW5kIiwiZW52RGlyIiwibG9nTGV2ZWwiLCJxdWlldCIsInBsdWdpbnMiLCJnbG9iYWxzIiwiZ2xvYmFsIiwiaW5jbHVkZSIsIm92ZXJyaWRlcyIsImJ1ZmZlciIsInByb3RvY29sSW1wb3J0cyIsIkJvb2xlYW4iLCJhbmFseXplIiwicHVibGljRGlyIiwiYWxpYXMiLCJyYW5kb21ieXRlcyIsInJlYWN0IiwiZXh0ZW5zaW9ucyIsInByZXNlcnZlU3ltbGlua3MiLCJ0c2NvbmZpZ1BhdGhzIiwicm9vdCIsImhtciIsIm9wZW4iLCJwb3J0Iiwic3RyaWN0UG9ydCIsImxpYnJhcnlOYW1lIiwibGliIiwiZm9ybWF0cyIsInZpdGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFNBQVMsUUFBTyxZQUFZO0FBQ3BDLE9BQU9DLFlBQVksd0JBQXdCO0FBQzNDLFNBQVFDLFVBQVUsRUFBRUMsWUFBWSxRQUFPLEtBQUs7QUFDNUMsU0FBUUMsT0FBTyxFQUFFQyxPQUFPLFFBQU8sT0FBTztBQUN0QyxTQUFRQyxXQUFXLFFBQU8sT0FBTztBQUNqQyxTQUFRQyxhQUFhLFFBQU8sNkJBQTZCO0FBRXpELFNBQVFDLFNBQVMsUUFBTyxxQkFBcUI7QUFDN0MsU0FBUUMsbUJBQW1CLEVBQUVDLFdBQVcsUUFB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
|