@studiokloek/vite-config 0.10.0 → 0.11.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studiokloek/vite-config",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "license": "MIT",
5
5
  "author": "Martijn Swart <opensource@studiokloek.nl> (https://studiokloek.nl)",
6
6
  "description": "Base Vite config for usage in our projects.",
@@ -66,11 +66,11 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "@sveltejs/vite-plugin-svelte": "^2.4.6",
69
- "@typescript-eslint/eslint-plugin": "^6.8.0",
70
- "@typescript-eslint/parser": "^6.8.0",
71
- "@vheemstra/vite-plugin-imagemin": "^1.0.11",
69
+ "@typescript-eslint/eslint-plugin": "^6.9.1",
70
+ "@typescript-eslint/parser": "^6.9.1",
71
+ "@vheemstra/vite-plugin-imagemin": "^1.0.12",
72
72
  "@vitejs/plugin-legacy": "^4.1.1",
73
- "eslint": "^8.52.0",
73
+ "eslint": "^8.53.0",
74
74
  "eslint-config-prettier": "^9.0.0",
75
75
  "eslint-formatter-pretty": "^5.0.0",
76
76
  "eslint-import-resolver-typescript": "^3.6.1",
@@ -78,8 +78,9 @@
78
78
  "eslint-plugin-import": "^2.29.0",
79
79
  "eslint-plugin-prettier": "^5.0.1",
80
80
  "eslint-plugin-promise": "^6.1.1",
81
- "eslint-plugin-svelte": "^2.34.0",
81
+ "eslint-plugin-svelte": "^2.34.1",
82
82
  "eslint-plugin-unicorn": "^48.0.1",
83
+ "filenamify": "^6.0.0",
83
84
  "imagemin-mozjpeg": "^10.0.0",
84
85
  "imagemin-optipng": "^8.0.0",
85
86
  "imagemin-pngquant": "^9.0.2",
@@ -91,10 +92,10 @@
91
92
  "prettier-package-json": "^2.8.0",
92
93
  "prettier-plugin-svelte": "^3.0.3",
93
94
  "rollup-plugin-visualizer": "^5.9.2",
94
- "sass": "^1.69.4",
95
+ "sass": "^1.69.5",
95
96
  "stylelint": "^15.11.0",
96
97
  "svelte": "^3.59.2",
97
- "terser": "^5.22.0",
98
+ "terser": "^5.24.0",
98
99
  "vite": "v4.5.0",
99
100
  "vite-plugin-banner": "^0.7.1",
100
101
  "vite-plugin-checker": "^0.6.2",
@@ -103,20 +104,21 @@
103
104
  "vite-plugin-html": "3.2.0",
104
105
  "vite-plugin-live-reload": "^3.0.2",
105
106
  "vite-plugin-mkcert": "1.16.0",
106
- "vite-tsconfig-paths": "^4.2.1"
107
+ "vite-tsconfig-paths": "^4.2.1",
108
+ "zip-a-folder": "^3.1.3"
107
109
  },
108
110
  "devDependencies": {
109
- "@microsoft/api-extractor": "7.38.0",
111
+ "@microsoft/api-extractor": "7.38.2",
110
112
  "@rollup/plugin-node-resolve": "^15.2.3",
111
113
  "@rollup/plugin-typescript": "^11.1.5",
112
- "@sveltejs/kit": "^1.26.0",
114
+ "@sveltejs/kit": "^1.27.3",
113
115
  "@types/ejs": "^3.1.4",
114
- "@types/estree": "^1.0.3",
116
+ "@types/estree": "^1.0.4",
115
117
  "@types/html-minifier-terser": "^7.0.1",
116
118
  "@types/imagemin": "^8.0.3",
117
119
  "@types/imagemin-mozjpeg": "^8.0.3",
118
120
  "@types/imagemin-optipng": "^5.2.3",
119
- "@types/node": "^20.8.7",
121
+ "@types/node": "^20.8.10",
120
122
  "rimraf": "^5.0.5",
121
123
  "rollup": "^3.29.4",
122
124
  "typescript": "4.9.5",
package/dist/config.d.ts DELETED
@@ -1,2 +0,0 @@
1
- import type { ConfigEnv, UserConfig } from 'vite';
2
- export declare function defineKloekViteConfig(environment: ConfigEnv): Promise<UserConfig>;
package/dist/index.d.ts DELETED
@@ -1,25 +0,0 @@
1
- import { type TypedFlags } from 'meow';
2
- export declare function kloekDevelopment(flags: TypedFlags<{
3
- mode: {
4
- type: 'string';
5
- shortFlag: string;
6
- default?: string;
7
- };
8
- }>): Promise<void>;
9
- export declare function kloekBuild(flags: TypedFlags<{
10
- emptyOutDir: {
11
- type: 'boolean';
12
- shortFlag: string;
13
- default: true;
14
- };
15
- base: {
16
- type: 'string';
17
- shortFlag: string;
18
- default: string;
19
- };
20
- mode: {
21
- type: 'string';
22
- shortFlag: string;
23
- default?: string;
24
- };
25
- }>): Promise<void>;
package/dist/index.js DELETED
@@ -1,565 +0,0 @@
1
- import { normalizePath, createServer, build } from 'vite';
2
- import path from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { svelte, vitePreprocess } from '@sveltejs/vite-plugin-svelte';
5
- import tsconfigPathsPlugin from 'vite-tsconfig-paths';
6
- import { readFileSync, existsSync, promises } from 'node:fs';
7
- import process from 'node:process';
8
- import os from 'node:os';
9
- import viteHandlebarsPlugin from 'vite-plugin-handlebars';
10
- import legacyPlugin from '@vitejs/plugin-legacy';
11
- import bannerPlugin from 'vite-plugin-banner';
12
- import { createHtmlPlugin } from 'vite-plugin-html';
13
- import viteImagemin from '@vheemstra/vite-plugin-imagemin';
14
- import imageminMozjpeg from 'imagemin-mozjpeg';
15
- import imageminPngQuant from 'imagemin-pngquant';
16
- import imageminOptiPng from 'imagemin-optipng';
17
- import { visualizer } from 'rollup-plugin-visualizer';
18
- import fullReload from 'vite-plugin-full-reload';
19
- import mkcert from 'vite-plugin-mkcert';
20
- import checker from 'vite-plugin-checker';
21
-
22
- function mergeGameSettings(generic, game, infoTypes) {
23
- const settings = {};
24
- // Alle props op één level diep mergen
25
- for (const property of infoTypes) {
26
- settings[property] = {
27
- ...generic[property],
28
- ...game[property],
29
- };
30
- }
31
- return settings;
32
- }
33
- function parsePackageGamesSettings(packageSettings) {
34
- // Merge settings
35
- const infoTypes = Object.keys(packageSettings.generic);
36
- const { generic } = packageSettings;
37
- const allSettings = {
38
- development: generic,
39
- games: {},
40
- };
41
- for (const game of packageSettings.games ?? []) {
42
- const settings = mergeGameSettings(generic, game, infoTypes);
43
- // Zorg er voor dat page altijd gezet is
44
- const pageId = settings.info.page ?? settings.info.id ?? 'unknown';
45
- settings.info.page = pageId;
46
- // Sla settings op onder page id
47
- allSettings.games[pageId] = settings;
48
- }
49
- return allSettings;
50
- }
51
- function getPageToServe(config, settings) {
52
- // Hoeveel pages zijn er?
53
- const pageIds = Object.keys(settings);
54
- const page = pageIds.length === 1 ? pageIds[0] : 'development';
55
- return path.posix.join(config.build.basePath, `${page}.html${config.dev.serveParams ?? ''}`);
56
- }
57
- function getPageIdFromUrl(url) {
58
- if (!url) {
59
- return '';
60
- }
61
- let pathname;
62
- try {
63
- pathname = new URL(url, 'https://studiokloek.nl').pathname;
64
- }
65
- catch {
66
- return '';
67
- }
68
- // If request is not html , directly return next()
69
- if (!pathname.endsWith('.html') && pathname !== '/') {
70
- return '';
71
- }
72
- // Pagina id opvragen
73
- const index = pathname.lastIndexOf('/');
74
- const fileName = index === -1 ? pathname : pathname.slice(index + 1);
75
- return fileName.replace('.html', '');
76
- }
77
-
78
- function defineBuildConfig(options) {
79
- const input = {};
80
- for (const gameId of Object.keys(options.settings.games)) {
81
- input[gameId] = path.resolve(options.root, `${gameId}.html`);
82
- }
83
- // Libs die aparte js krijgen:
84
- const vendorChunks = ['pixi', 'capacitor', 'firebase', 'lodash', 'gsap', 'studiokloek'];
85
- return {
86
- reportCompressedSize: true,
87
- chunkSizeWarningLimit: 1000,
88
- outDir: '../public',
89
- assetsDir: 'generated',
90
- minify: 'terser',
91
- sourcemap: options.config.build.sourceMaps === true,
92
- rollupOptions: {
93
- input,
94
- output: {
95
- manualChunks(id) {
96
- if (id.includes('node_modules')) {
97
- const name = id
98
- .toString()
99
- .split('node_modules/')[1]
100
- .split('/')[0]
101
- .toString();
102
- for (const value of vendorChunks) {
103
- if (name.includes(value)) {
104
- return value;
105
- }
106
- }
107
- return 'vendor';
108
- }
109
- return undefined;
110
- },
111
- },
112
- },
113
- };
114
- }
115
-
116
- function readJSON(path) {
117
- try {
118
- const data = readFileSync(path);
119
- return JSON.parse(data.toString());
120
- }
121
- catch {
122
- //
123
- }
124
- return false;
125
- }
126
- const cwd = normalizePath(process.cwd());
127
-
128
- // Helpers voor handlebars
129
- function handlebarsPlugin(partialDirectory, options) {
130
- return viteHandlebarsPlugin({
131
- partialDirectory,
132
- helpers: {
133
- json: (object, indent = 0) => JSON.stringify(object, undefined, indent),
134
- concat: (...arguments_) => arguments_.slice(0, -1).join(''),
135
- eq: (a, b) => a === b,
136
- neq: (a, b) => a !== b,
137
- isdefined: (value) => value !== undefined,
138
- 'resolve-root'(p) {
139
- // Tijdelijke hack voor bug in handlebars plugin
140
- // zie ook https://github.com/alexlafroscia/vite-plugin-handlebars/pull/129
141
- const resolvedPath = path.resolve(options.root, p);
142
- return os.platform() === 'win32' ? `/${resolvedPath}` : resolvedPath;
143
- },
144
- },
145
- context(pagePath) {
146
- const gameId = getPageIdFromUrl(pagePath);
147
- if (!gameId) {
148
- return {};
149
- }
150
- if (gameId === 'development') {
151
- // Pagina settings teruggeven
152
- return {
153
- env: options.environment,
154
- data: options.settings.development,
155
- games: options.settings.games,
156
- };
157
- }
158
- // Op basis van pad data bepalen
159
- const settings = options.settings.games[gameId];
160
- // Pagina settings teruggeven
161
- return {
162
- env: options.environment,
163
- data: settings ?? {},
164
- };
165
- },
166
- });
167
- }
168
-
169
- const PAGE_TEMPLATE = '{{> game data=data}}';
170
- const DEVELOPMENT_TEMPLATE = '{{> development data=data}}';
171
- async function renderTemporaryFile(filePath) {
172
- // Bestaat die file nog niet?
173
- if (!existsSync(filePath)) {
174
- // Aanmaken
175
- await promises.writeFile(filePath, PAGE_TEMPLATE);
176
- }
177
- }
178
- function htmlPlugin(games) {
179
- return {
180
- name: 'vite-plugin-kloek-html',
181
- enforce: 'pre',
182
- async config(_config, environment) {
183
- // Bij een build maken we tijdelijk files aan
184
- if (environment.command === 'build') {
185
- const actions = [];
186
- for (const pageId of Object.keys(games)) {
187
- // Pad naar file
188
- const filePath = path.resolve(cwd, 'source', `${pageId}.html`);
189
- actions.push(renderTemporaryFile(filePath));
190
- }
191
- await Promise.all(actions);
192
- }
193
- },
194
- configureServer(server) {
195
- return () => {
196
- // Zorg er voor dat tijdens development de pagina ge-rendered terug gegeven wordt wordt
197
- server.middlewares.use('/', async (request, response, next) => {
198
- const url = request?.url ?? '';
199
- const pageId = getPageIdFromUrl(url);
200
- if (!pageId) {
201
- next();
202
- }
203
- if (pageId === 'development') {
204
- // Development? geef terug...
205
- response.end(await server.transformIndexHtml(url, DEVELOPMENT_TEMPLATE, request.originalUrl));
206
- }
207
- else if (Object.keys(games).includes(pageId)) {
208
- // Bestaande game? zorg er voor dat de template ge-rendered wordt
209
- response.end(await server.transformIndexHtml(url, PAGE_TEMPLATE, request.originalUrl));
210
- }
211
- else {
212
- // Niks gevonden
213
- response.end();
214
- }
215
- });
216
- };
217
- },
218
- async closeBundle() {
219
- // Verwijder de aangemaakte files
220
- const actions = [];
221
- for (const pageId of Object.keys(games)) {
222
- // Pad naar file
223
- const filePath = path.resolve(cwd, 'source', `${pageId}.html`);
224
- if (existsSync(filePath)) {
225
- try {
226
- actions.push(promises.rm(filePath));
227
- }
228
- catch {
229
- //
230
- }
231
- }
232
- }
233
- await Promise.all(actions);
234
- },
235
- };
236
- }
237
-
238
- function basePlugins(options) {
239
- return [
240
- htmlPlugin(options.settings.games),
241
- ...svelte({
242
- preprocess: vitePreprocess(),
243
- onwarn(warning, warn) {
244
- if (!warn) {
245
- return;
246
- }
247
- // No a11y warnings...
248
- if (warning.code.startsWith('a11y-')) {
249
- return;
250
- }
251
- warn(warning);
252
- },
253
- }),
254
- tsconfigPathsPlugin({
255
- root: path.resolve(cwd),
256
- // extensions: ['.ts', '.json'],
257
- loose: true,
258
- }),
259
- handlebarsPlugin(options.config.serve.partials, options),
260
- ];
261
- }
262
-
263
- function imageminPlugin(environment, options) {
264
- if (environment.mode !== 'production') {
265
- return;
266
- }
267
- return viteImagemin({
268
- skipIfLarger: true,
269
- verbose: true,
270
- root: path.join(path.resolve(cwd), 'public'),
271
- plugins: {
272
- jpg: [
273
- imageminMozjpeg({
274
- quality: options?.jpeg ?? 80,
275
- })
276
- ],
277
- png: [
278
- imageminPngQuant({
279
- strip: true,
280
- speed: 2,
281
- dithering: 0.25,
282
- quality: options?.png ?? [0.5, 0.7],
283
- }),
284
- imageminOptiPng()
285
- ]
286
- }
287
- });
288
- }
289
-
290
- function renderGameManifest(pageId, settings, config) {
291
- const manifest = {
292
- short_name: `${settings.meta.apptitle}`,
293
- name: `${settings.meta.title}`,
294
- description: `${settings.meta.description}`,
295
- scope: `${config.base}${pageId}.html`,
296
- start_url: `${config.base}${pageId}.html`,
297
- display: 'fullscreen',
298
- orientation: `${settings.options.orientation ?? 'landscape'}`,
299
- icons: [
300
- {
301
- src: `${config.base}meta/${settings.info.id}/icons/chrome-touch-icon-192x192.png`,
302
- type: 'image/png',
303
- sizes: '192x192',
304
- },
305
- {
306
- src: `${config.base}meta/${settings.info.id}/icons/icon.png`,
307
- type: 'image/png',
308
- sizes: '1024x1024',
309
- },
310
- ],
311
- background_color: `${settings.options.backgroundColor}`,
312
- theme_color: `${settings.options.backgroundColor}`,
313
- };
314
- return `${JSON.stringify(manifest, null, 2)}\n`;
315
- }
316
- function manifestPlugin(games) {
317
- let config;
318
- return {
319
- name: 'vite-plugin-kloek-manifest',
320
- enforce: 'post',
321
- apply: 'build',
322
- async configResolved(resolvedConfig) {
323
- config = resolvedConfig;
324
- },
325
- generateBundle(_, bundle) {
326
- // Voor iedere app een manifest maken:
327
- for (const [pageId, settings] of Object.entries(games)) {
328
- bundle[`${pageId}.webmanifest`] = {
329
- needsCodeReference: false,
330
- type: 'asset',
331
- name: undefined,
332
- source: renderGameManifest(pageId, settings, config),
333
- fileName: `${pageId}.webmanifest`,
334
- };
335
- bundle[`${pageId}-serviceworker.js`] = {
336
- needsCodeReference: false,
337
- type: 'asset',
338
- name: undefined,
339
- source: "self.addEventListener('fetch', function() { return; });",
340
- fileName: `${pageId}-serviceworker.js`,
341
- };
342
- }
343
- },
344
- };
345
- }
346
-
347
- // Build plugins
348
- function buildPlugins(options) {
349
- // No build? no plugins..
350
- if (options.environment.command !== 'build') {
351
- return [];
352
- }
353
- const plugins = [];
354
- if (options.config.build.legacy) {
355
- // Make sure the page works in older browsers
356
- plugins.push(...legacyPlugin({
357
- targets: options.config.build.browserslist ?? 'defaults',
358
- }));
359
- }
360
- const pages = Object.keys(options.settings.games).map((gameId) => {
361
- return {
362
- filename: `${gameId}.html`,
363
- template: `${gameId}.html`,
364
- };
365
- });
366
- plugins.push(
367
- // Minify image assets
368
- imageminPlugin(options.environment, options.config.build.imageQuality),
369
- // Make the html output smaller
370
- ...createHtmlPlugin({ minify: true, pages }),
371
- // Add a banner to generated js/css
372
- bannerPlugin(`
373
- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
374
-
375
- __ , _ _
376
- / ) | o /| / | | | |
377
- \\__ _|_ __| __ |__/ | | __ _ | |
378
- \\ | | | / | | / \\_ | \\ |/ / \\_|/ |/_)
379
- (___/ |_/ \\_/|_/\\_/|_/|_/\\__/ | \\_/|__/\\__/ |__/| \\_/
380
-
381
- Concept, ontwerp & ontwikkeling
382
- https://studiokloek.nl
383
-
384
- Studio Kloek ❤ PixiJS, GSAP & howler.js
385
-
386
- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
387
-
388
- `));
389
- // Create a manifest and minimal webworker for every game
390
- if (options.config.build.manifest) {
391
- plugins.push(manifestPlugin(options.settings.games));
392
- }
393
- if (options.config.build.analyzeBundle) {
394
- plugins.push(visualizer({
395
- template: "treemap",
396
- open: true,
397
- gzipSize: true,
398
- filename: "bundle-analyse.html", // will be saved in project's root
399
- }));
400
- }
401
- return plugins.filter(plugin => plugin !== undefined);
402
- }
403
-
404
- function servePlugins() {
405
- return [
406
- fullReload(['script/**/*.ts', 'svelte/**/*.svelte'], {
407
- root: path.join(path.resolve(cwd), 'source'),
408
- log: true,
409
- always: true,
410
- }),
411
- mkcert(),
412
- checker({
413
- typescript: true,
414
- }),
415
- ];
416
- }
417
-
418
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
419
- async function defineKloekViteConfig(environment) {
420
- const pkg = readJSON(path.resolve(cwd, 'package.json'));
421
- const kloekConfig = pkg.vite;
422
- const browserslist = pkg.browserslist;
423
- const options = {
424
- root: path.resolve(cwd, 'source'),
425
- environment,
426
- settings: parsePackageGamesSettings(pkg.settings),
427
- config: {
428
- ...kloekConfig,
429
- build: { ...kloekConfig.build, browserslist },
430
- serve: {
431
- partials: [
432
- path.resolve(__dirname, 'partials'),
433
- path.resolve(cwd, 'source', 'partials'),
434
- ],
435
- },
436
- },
437
- };
438
- const config = {
439
- logLevel: 'info',
440
- base: kloekConfig.build.basePath,
441
- root: options.root,
442
- envDir: path.resolve(cwd, 'env'),
443
- envPrefix: ['KLOEK_', 'VITE_'],
444
- publicDir: 'static',
445
- define: {},
446
- esbuild: {
447
- legalComments: 'none',
448
- },
449
- resolve: {
450
- alias: {
451
- lodash: 'lodash-es',
452
- '@meta': path.resolve(cwd, 'source', 'static', 'meta'),
453
- '@fonts': path.resolve(cwd, 'source', 'static', 'fonts'),
454
- },
455
- dedupe: [
456
- '@studiokloek/ts-core-lib',
457
- '@capacitor/app',
458
- '@capacitor/app',
459
- '@capacitor/core',
460
- '@capacitor/device',
461
- '@capacitor/network',
462
- '@capacitor/preferences',
463
- '@capacitor/splash-screen',
464
- '@capacitor/status-bar',
465
- 'bowser',
466
- 'date-fns-tz',
467
- 'date-fns',
468
- 'error-stack-parser-es',
469
- 'firebase',
470
- 'fontfaceobserver',
471
- 'gsap',
472
- 'howler',
473
- 'lodash-decorators-esm',
474
- 'lodash-es',
475
- 'overmind',
476
- 'pixi-spine',
477
- 'pixi.js',
478
- 'pubsub-js',
479
- 'random-js',
480
- 'ress',
481
- 'slugify',
482
- 'superagent',
483
- 'ts-events',
484
- 'ts-mixer',
485
- 'tslib',
486
- ],
487
- },
488
- css: {
489
- preprocessorOptions: {
490
- scss: {
491
- charset: false,
492
- // AdditionalData: `@charset "UTF-8"`,
493
- },
494
- },
495
- },
496
- plugins: [...basePlugins(options)],
497
- };
498
- switch (environment.command) {
499
- case 'serve':
500
- config.server = {
501
- host: true,
502
- cors: options.config.dev.cors ?? true,
503
- https: options.config.dev.https ?? true,
504
- open: getPageToServe(options.config, options.settings.games),
505
- };
506
- config.plugins = [
507
- ...(config.plugins ? config.plugins : []),
508
- ...servePlugins(),
509
- ];
510
- break;
511
- case 'build':
512
- config.build = defineBuildConfig(options);
513
- config.plugins = [
514
- ...(config.plugins ? config.plugins : []),
515
- ...buildPlugins(options),
516
- ];
517
- break;
518
- }
519
- return config;
520
- }
521
-
522
- async function kloekDevelopment(flags) {
523
- const config = await defineKloekViteConfig({
524
- command: 'serve',
525
- mode: 'development',
526
- });
527
- // Different mode
528
- if (typeof flags.mode === 'string') {
529
- config.mode = flags.mode;
530
- }
531
- const server = await createServer({
532
- configFile: false,
533
- ...config,
534
- });
535
- await server.listen();
536
- server.printUrls();
537
- }
538
- async function kloekBuild(flags) {
539
- const config = await defineKloekViteConfig({
540
- command: 'build',
541
- mode: 'production',
542
- });
543
- // Empty out the Output dir before building?
544
- if (flags.emptyOutDir !== undefined) {
545
- config.build = {
546
- ...config.build,
547
- emptyOutDir: flags.emptyOutDir,
548
- };
549
- }
550
- // Different base path
551
- if (typeof flags.base === 'string') {
552
- config.base = flags.base;
553
- }
554
- // Different mode
555
- if (typeof flags.mode === 'string') {
556
- config.mode = flags.mode;
557
- }
558
- await build({
559
- configFile: false,
560
- ...config,
561
- });
562
- }
563
-
564
- export { kloekBuild, kloekDevelopment };
565
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9nYW1lLnRzIiwiLi4vc3JjL3V0aWxzL2J1aWxkLnRzIiwiLi4vc3JjL3V0aWxzL2luZGV4LnRzIiwiLi4vc3JjL3BsdWdpbnMvbGliL2hhbmRsZWJhcnMtcGx1Z2luLnRzIiwiLi4vc3JjL3BsdWdpbnMvbGliL2h0bWwtcGx1Z2luLnRzIiwiLi4vc3JjL3BsdWdpbnMvYmFzZS50cyIsIi4uL3NyYy9wbHVnaW5zL2xpYi9pbWFnZS1wbHVnaW4udHMiLCIuLi9zcmMvcGx1Z2lucy9saWIvbWFuaWZlc3QtcGx1Z2luLnRzIiwiLi4vc3JjL3BsdWdpbnMvYnVpbGQudHMiLCIuLi9zcmMvcGx1Z2lucy9zZXJ2ZS50cyIsIi4uL3NyYy9jb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHtcbiAgR2FtZVNldHRpbmdzLFxuICBHYW1lU2V0dGluZ3NQcm9wZXJ0eSxcbiAgR2FtZXNTZXR0aW5ncyxcbiAgR2FtZXNTZXR0aW5nc0RhdGEsXG4gIEtsb2VrVml0ZUNvbmZpZyxcbiAgUGFja2FnZUdhbWVzU2V0dGluZ3MsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmZ1bmN0aW9uIG1lcmdlR2FtZVNldHRpbmdzKFxuICBnZW5lcmljOiBHYW1lU2V0dGluZ3MsXG4gIGdhbWU6IEdhbWVTZXR0aW5ncyxcbiAgaW5mb1R5cGVzOiBHYW1lU2V0dGluZ3NQcm9wZXJ0eVtdLFxuKTogR2FtZVNldHRpbmdzIHtcbiAgY29uc3Qgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLy8gQWxsZSBwcm9wcyBvcCDDqcOpbiBsZXZlbCBkaWVwIG1lcmdlblxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGluZm9UeXBlcykge1xuICAgIHNldHRpbmdzW3Byb3BlcnR5XSA9IHtcbiAgICAgIC4uLmdlbmVyaWNbcHJvcGVydHldLFxuICAgICAgLi4uZ2FtZVtwcm9wZXJ0eV0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzZXR0aW5ncyBhcyB1bmtub3duIGFzIEdhbWVTZXR0aW5ncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGFja2FnZUdhbWVzU2V0dGluZ3MoXG4gIHBhY2thZ2VTZXR0aW5nczogUGFja2FnZUdhbWVzU2V0dGluZ3MsXG4pOiBHYW1lc1NldHRpbmdzRGF0YSB7XG4gIC8vIE1lcmdlIHNldHRpbmdzXG4gIGNvbnN0IGluZm9UeXBlcyA9IE9iamVjdC5rZXlzKFxuICAgIHBhY2thZ2VTZXR0aW5ncy5nZW5lcmljLFxuICApIGFzIEdhbWVTZXR0aW5nc1Byb3BlcnR5W107XG4gIGNvbnN0IHtnZW5lcmljfSA9IHBhY2thZ2VTZXR0aW5ncztcbiAgY29uc3QgYWxsU2V0dGluZ3M6IEdhbWVzU2V0dGluZ3NEYXRhID0ge1xuICAgIGRldmVsb3BtZW50OiBnZW5lcmljLFxuICAgIGdhbWVzOiB7fSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IGdhbWUgb2YgcGFja2FnZVNldHRpbmdzLmdhbWVzID8/IFtdKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBtZXJnZUdhbWVTZXR0aW5ncyhnZW5lcmljLCBnYW1lLCBpbmZvVHlwZXMpO1xuXG4gICAgLy8gWm9yZyBlciB2b29yIGRhdCBwYWdlIGFsdGlqZCBnZXpldCBpc1xuICAgIGNvbnN0IHBhZ2VJZCA9IHNldHRpbmdzLmluZm8ucGFnZSA/PyBzZXR0aW5ncy5pbmZvLmlkID8/ICd1bmtub3duJztcbiAgICBzZXR0aW5ncy5pbmZvLnBhZ2UgPSBwYWdlSWQ7XG5cbiAgICAvLyBTbGEgc2V0dGluZ3Mgb3Agb25kZXIgcGFnZSBpZFxuICAgIGFsbFNldHRpbmdzLmdhbWVzW3BhZ2VJZF0gPSBzZXR0aW5ncztcbiAgfVxuXG4gIHJldHVybiBhbGxTZXR0aW5ncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhUb0dhbWVEYXRhKFxuICBmdWxsRmlsZVBhdGg6IHN0cmluZyxcbiAgc2V0dGluZ3M6IEdhbWVzU2V0dGluZ3MsXG4pOiBHYW1lU2V0dGluZ3MgfCB1bmRlZmluZWQge1xuICAvLyBEZXRlcm1pbmUgZmlsZW5hbWUgd2l0aG91dCBleHRlbnNpb25cbiAgbGV0IGZpbGVQYXRoID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZVBhdGgsIHBhdGguZXh0bmFtZShmdWxsRmlsZVBhdGgpKTtcblxuICAvLyBEZXRlcm1pbmUgZGlyICYgcmVtb3ZlIGxlYWRpbmcgc2xhc2hcbiAgbGV0IGZpbGVEaXJlY3RvcnkgPSBwYXRoLmRpcm5hbWUoZnVsbEZpbGVQYXRoKTtcbiAgZmlsZURpcmVjdG9yeSA9IGZpbGVEaXJlY3RvcnkucmVwbGFjZSgvXlxcLysvZywgJycpO1xuXG4gIGlmIChmaWxlRGlyZWN0b3J5KSB7XG4gICAgZmlsZVBhdGggPSBgJHtmaWxlRGlyZWN0b3J5fS8ke2ZpbGVQYXRofWA7XG4gIH1cblxuICByZXR1cm4gc2V0dGluZ3NbZmlsZVBhdGhdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFnZVRvU2VydmUoXG4gIGNvbmZpZzogS2xvZWtWaXRlQ29uZmlnLFxuICBzZXR0aW5nczogR2FtZXNTZXR0aW5ncyxcbik6IHN0cmluZyB7XG4gIC8vIEhvZXZlZWwgcGFnZXMgemlqbiBlcj9cbiAgY29uc3QgcGFnZUlkcyA9IE9iamVjdC5rZXlzKHNldHRpbmdzKTtcbiAgY29uc3QgcGFnZSA9IHBhZ2VJZHMubGVuZ3RoID09PSAxID8gcGFnZUlkc1swXSA6ICdkZXZlbG9wbWVudCc7XG5cbiAgcmV0dXJuIHBhdGgucG9zaXguam9pbihcbiAgICBjb25maWcuYnVpbGQuYmFzZVBhdGgsXG4gICAgYCR7cGFnZX0uaHRtbCR7Y29uZmlnLmRldi5zZXJ2ZVBhcmFtcyA/PyAnJ31gLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFnZUlkRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgbGV0IHBhdGhuYW1lOiBzdHJpbmc7XG5cbiAgdHJ5IHtcbiAgICBwYXRobmFtZSA9IG5ldyBVUkwodXJsLCAnaHR0cHM6Ly9zdHVkaW9rbG9lay5ubCcpLnBhdGhuYW1lO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvLyBJZiByZXF1ZXN0IGlzIG5vdCBodG1sICwgZGlyZWN0bHkgcmV0dXJuIG5leHQoKVxuICBpZiAoIXBhdGhuYW1lLmVuZHNXaXRoKCcuaHRtbCcpICYmIHBhdGhuYW1lICE9PSAnLycpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvLyBQYWdpbmEgaWQgb3B2cmFnZW5cbiAgY29uc3QgaW5kZXggPSBwYXRobmFtZS5sYXN0SW5kZXhPZignLycpO1xuICBjb25zdCBmaWxlTmFtZSA9IGluZGV4ID09PSAtMSA/IHBhdGhuYW1lIDogcGF0aG5hbWUuc2xpY2UoaW5kZXggKyAxKTtcblxuICByZXR1cm4gZmlsZU5hbWUucmVwbGFjZSgnLmh0bWwnLCAnJyk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUge0J1aWxkT3B0aW9uc30gZnJvbSAndml0ZSc7XG5pbXBvcnQgdHlwZSB7Vml0ZU9wdGlvbnN9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVCdWlsZENvbmZpZyhvcHRpb25zOiBWaXRlT3B0aW9ucyk6IEJ1aWxkT3B0aW9ucyB7XG4gIGNvbnN0IGlucHV0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBnYW1lSWQgb2YgT2JqZWN0LmtleXMob3B0aW9ucy5zZXR0aW5ncy5nYW1lcykpIHtcbiAgICBpbnB1dFtnYW1lSWRdID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMucm9vdCwgYCR7Z2FtZUlkfS5odG1sYCk7XG4gIH1cblxuICAvLyBMaWJzIGRpZSBhcGFydGUganMga3JpamdlbjpcbiAgY29uc3QgdmVuZG9yQ2h1bmtzID0gWydwaXhpJywgJ2NhcGFjaXRvcicsICdmaXJlYmFzZScsICdsb2Rhc2gnLCAnZ3NhcCcsICdzdHVkaW9rbG9layddO1xuXG4gIHJldHVybiB7XG4gICAgcmVwb3J0Q29tcHJlc3NlZFNpemU6IHRydWUsXG4gICAgY2h1bmtTaXplV2FybmluZ0xpbWl0OiAxMDAwLFxuICAgIG91dERpcjogJy4uL3B1YmxpYycsXG4gICAgYXNzZXRzRGlyOiAnZ2VuZXJhdGVkJyxcbiAgICBtaW5pZnk6ICd0ZXJzZXInLFxuICAgIHNvdXJjZW1hcDogb3B0aW9ucy5jb25maWcuYnVpbGQuc291cmNlTWFwcyA9PT0gdHJ1ZSxcbiAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICBpbnB1dCxcbiAgICAgIG91dHB1dDoge1xuICAgICAgICBtYW51YWxDaHVua3MoaWQpIHtcbiAgICAgICAgICBpZiAoaWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcycpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gaWRcbiAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgLnNwbGl0KCdub2RlX21vZHVsZXMvJylbMV1cbiAgICAgICAgICAgICAgLnNwbGl0KCcvJylbMF1cbiAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmVuZG9yQ2h1bmtzKSB7XG4gICAgICAgICAgICAgIGlmIChuYW1lLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJ3ZlbmRvcic7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCB7cmVhZEZpbGVTeW5jfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge25vcm1hbGl6ZVBhdGh9IGZyb20gJ3ZpdGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEpTT04ocGF0aDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IHJlYWRGaWxlU3luYyhwYXRoKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhLnRvU3RyaW5nKCkpO1xuICB9IGNhdGNoIHtcbiAgICAvL1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3QgY3dkID0gbm9ybWFsaXplUGF0aChwcm9jZXNzLmN3ZCgpKTtcblxuZXhwb3J0ICogZnJvbSAnLi9nYW1lJztcbmV4cG9ydCAqIGZyb20gJy4vYnVpbGQnO1xuIiwiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHtQbHVnaW59IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHZpdGVIYW5kbGViYXJzUGx1Z2luIGZyb20gJ3ZpdGUtcGx1Z2luLWhhbmRsZWJhcnMnO1xuaW1wb3J0IHR5cGUge1ZpdGVPcHRpb25zfSBmcm9tICcuLi8uLi91dGlscy9pbnRlcmZhY2VzJztcbmltcG9ydCB7Z2V0UGFnZUlkRnJvbVVybH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG4vLyBIZWxwZXJzIHZvb3IgaGFuZGxlYmFyc1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZWJhcnNQbHVnaW4oXG4gIHBhcnRpYWxEaXJlY3Rvcnk6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBvcHRpb25zOiBWaXRlT3B0aW9ucyxcbik6IFBsdWdpbiB7XG4gIHJldHVybiB2aXRlSGFuZGxlYmFyc1BsdWdpbih7XG4gICAgcGFydGlhbERpcmVjdG9yeSxcblxuICAgIGhlbHBlcnM6IHtcbiAgICAgIGpzb246IChvYmplY3Q6IGFueSwgaW5kZW50ID0gMCkgPT5cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkob2JqZWN0LCB1bmRlZmluZWQsIGluZGVudCksXG4gICAgICBjb25jYXQ6ICguLi5hcmd1bWVudHNfOiBhbnlbXSkgPT4gYXJndW1lbnRzXy5zbGljZSgwLCAtMSkuam9pbignJyksXG4gICAgICBlcTogKGE6IGFueSwgYjogYW55KSA9PiBhID09PSBiLFxuICAgICAgbmVxOiAoYTogYW55LCBiOiBhbnkpID0+IGEgIT09IGIsXG4gICAgICBpc2RlZmluZWQ6ICh2YWx1ZTogdW5kZWZpbmVkKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgJ3Jlc29sdmUtcm9vdCcocDogc3RyaW5nKSB7XG4gICAgICAgIC8vIFRpamRlbGlqa2UgaGFjayB2b29yIGJ1ZyBpbiBoYW5kbGViYXJzIHBsdWdpblxuICAgICAgICAvLyB6aWUgb29rIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGV4bGFmcm9zY2lhL3ZpdGUtcGx1Z2luLWhhbmRsZWJhcnMvcHVsbC8xMjlcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMucm9vdCwgcCk7XG4gICAgICAgIHJldHVybiBvcy5wbGF0Zm9ybSgpID09PSAnd2luMzInID8gYC8ke3Jlc29sdmVkUGF0aH1gIDogcmVzb2x2ZWRQYXRoO1xuICAgICAgfSxcbiAgICB9LFxuXG4gICAgY29udGV4dChwYWdlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgY29uc3QgZ2FtZUlkID0gZ2V0UGFnZUlkRnJvbVVybChwYWdlUGF0aCk7XG5cbiAgICAgIGlmICghZ2FtZUlkKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdhbWVJZCA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAvLyBQYWdpbmEgc2V0dGluZ3MgdGVydWdnZXZlblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVudjogb3B0aW9ucy5lbnZpcm9ubWVudCxcbiAgICAgICAgICBkYXRhOiBvcHRpb25zLnNldHRpbmdzLmRldmVsb3BtZW50LFxuICAgICAgICAgIGdhbWVzOiBvcHRpb25zLnNldHRpbmdzLmdhbWVzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBPcCBiYXNpcyB2YW4gcGFkIGRhdGEgYmVwYWxlblxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBvcHRpb25zLnNldHRpbmdzLmdhbWVzW2dhbWVJZF07XG5cbiAgICAgIC8vIFBhZ2luYSBzZXR0aW5ncyB0ZXJ1Z2dldmVuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnY6IG9wdGlvbnMuZW52aXJvbm1lbnQsXG4gICAgICAgIGRhdGE6IHNldHRpbmdzID8/IHt9LFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcbn1cbiIsImltcG9ydCB7ZXhpc3RzU3luYywgcHJvbWlzZXN9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHtDb25maWdFbnYsIFBsdWdpbiwgVXNlckNvbmZpZywgVml0ZURldlNlcnZlcn0gZnJvbSAndml0ZSc7XG5pbXBvcnQgdHlwZSB7R2FtZXNTZXR0aW5nc30gZnJvbSAnLi4vLi4vdXRpbHMvaW50ZXJmYWNlcyc7XG5pbXBvcnQge2N3ZCwgZ2V0UGFnZUlkRnJvbVVybH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5jb25zdCBQQUdFX1RFTVBMQVRFID0gJ3t7PiBnYW1lIGRhdGE9ZGF0YX19JztcbmNvbnN0IERFVkVMT1BNRU5UX1RFTVBMQVRFID0gJ3t7PiBkZXZlbG9wbWVudCBkYXRhPWRhdGF9fSc7XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbmRlclRlbXBvcmFyeUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBCZXN0YWF0IGRpZSBmaWxlIG5vZyBuaWV0P1xuICBpZiAoIWV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgLy8gQWFubWFrZW5cbiAgICBhd2FpdCBwcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIFBBR0VfVEVNUExBVEUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodG1sUGx1Z2luKGdhbWVzOiBHYW1lc1NldHRpbmdzKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAndml0ZS1wbHVnaW4ta2xvZWstaHRtbCcsXG4gICAgZW5mb3JjZTogJ3ByZScsXG5cbiAgICBhc3luYyBjb25maWcoX2NvbmZpZzogVXNlckNvbmZpZywgZW52aXJvbm1lbnQ6IENvbmZpZ0Vudikge1xuICAgICAgLy8gQmlqIGVlbiBidWlsZCBtYWtlbiB3ZSB0aWpkZWxpamsgZmlsZXMgYWFuXG4gICAgICBpZiAoZW52aXJvbm1lbnQuY29tbWFuZCA9PT0gJ2J1aWxkJykge1xuICAgICAgICBjb25zdCBhY3Rpb25zOiBBcnJheTxQcm9taXNlPHZvaWQ+PiA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFnZUlkIG9mIE9iamVjdC5rZXlzKGdhbWVzKSkge1xuICAgICAgICAgIC8vIFBhZCBuYWFyIGZpbGVcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICdzb3VyY2UnLCBgJHtwYWdlSWR9Lmh0bWxgKTtcbiAgICAgICAgICBhY3Rpb25zLnB1c2gocmVuZGVyVGVtcG9yYXJ5RmlsZShmaWxlUGF0aCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYWN0aW9ucyk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbmZpZ3VyZVNlcnZlcihzZXJ2ZXI6IFZpdGVEZXZTZXJ2ZXIpIHtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIC8vIFpvcmcgZXIgdm9vciBkYXQgdGlqZGVucyBkZXZlbG9wbWVudCBkZSBwYWdpbmEgZ2UtcmVuZGVyZWQgdGVydWcgZ2VnZXZlbiB3b3JkdCB3b3JkdFxuICAgICAgICBzZXJ2ZXIubWlkZGxld2FyZXMudXNlKCcvJywgYXN5bmMgKHJlcXVlc3QsIHJlc3BvbnNlLCBuZXh0KSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdD8udXJsID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHBhZ2VJZCA9IGdldFBhZ2VJZEZyb21VcmwodXJsKTtcblxuICAgICAgICAgIGlmICghcGFnZUlkKSB7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhZ2VJZCA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgICAgLy8gRGV2ZWxvcG1lbnQ/IGdlZWYgdGVydWcuLi5cbiAgICAgICAgICAgIHJlc3BvbnNlLmVuZChcbiAgICAgICAgICAgICAgYXdhaXQgc2VydmVyLnRyYW5zZm9ybUluZGV4SHRtbChcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgREVWRUxPUE1FTlRfVEVNUExBVEUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vcmlnaW5hbFVybCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChPYmplY3Qua2V5cyhnYW1lcykuaW5jbHVkZXMocGFnZUlkKSkge1xuICAgICAgICAgICAgLy8gQmVzdGFhbmRlIGdhbWU/IHpvcmcgZXIgdm9vciBkYXQgZGUgdGVtcGxhdGUgZ2UtcmVuZGVyZWQgd29yZHRcbiAgICAgICAgICAgIHJlc3BvbnNlLmVuZChcbiAgICAgICAgICAgICAgYXdhaXQgc2VydmVyLnRyYW5zZm9ybUluZGV4SHRtbChcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgUEFHRV9URU1QTEFURSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9yaWdpbmFsVXJsLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTmlrcyBnZXZvbmRlblxuICAgICAgICAgICAgcmVzcG9uc2UuZW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGFzeW5jIGNsb3NlQnVuZGxlKCkge1xuICAgICAgLy8gVmVyd2lqZGVyIGRlIGFhbmdlbWFha3RlIGZpbGVzXG4gICAgICBjb25zdCBhY3Rpb25zOiBBcnJheTxQcm9taXNlPHZvaWQ+PiA9IFtdO1xuICAgICAgZm9yIChjb25zdCBwYWdlSWQgb2YgT2JqZWN0LmtleXMoZ2FtZXMpKSB7XG4gICAgICAgIC8vIFBhZCBuYWFyIGZpbGVcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY3dkLCAnc291cmNlJywgYCR7cGFnZUlkfS5odG1sYCk7XG4gICAgICAgIGlmIChleGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2gocHJvbWlzZXMucm0oZmlsZVBhdGgpKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFjdGlvbnMpO1xuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtzdmVsdGUsIHZpdGVQcmVwcm9jZXNzfSBmcm9tICdAc3ZlbHRlanMvdml0ZS1wbHVnaW4tc3ZlbHRlJztcbmltcG9ydCB7dHlwZSBQbHVnaW4sIHR5cGUgUGx1Z2luT3B0aW9ufSBmcm9tICd2aXRlJztcbmltcG9ydCB0c2NvbmZpZ1BhdGhzUGx1Z2luIGZyb20gJ3ZpdGUtdHNjb25maWctcGF0aHMnO1xuaW1wb3J0IHt0eXBlIFZpdGVPcHRpb25zfSBmcm9tICcuLi91dGlscy9pbnRlcmZhY2VzJztcbmltcG9ydCB7Y3dkfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge2hhbmRsZWJhcnNQbHVnaW59IGZyb20gJy4vbGliL2hhbmRsZWJhcnMtcGx1Z2luJztcbmltcG9ydCB7aHRtbFBsdWdpbn0gZnJvbSAnLi9saWIvaHRtbC1wbHVnaW4nO1xuXG5leHBvcnQgZnVuY3Rpb24gYmFzZVBsdWdpbnMoXG4gIG9wdGlvbnM6IFZpdGVPcHRpb25zLFxuKTogQXJyYXk8UGx1Z2luIHwgUGx1Z2luT3B0aW9uPiB7XG4gIHJldHVybiBbXG4gICAgaHRtbFBsdWdpbihvcHRpb25zLnNldHRpbmdzLmdhbWVzKSxcblxuICAgIC4uLnN2ZWx0ZSh7XG4gICAgICBwcmVwcm9jZXNzOnZpdGVQcmVwcm9jZXNzKCksXG5cbiAgICAgIG9ud2Fybih3YXJuaW5nLCB3YXJuKSB7XG4gICAgICAgIGlmICghd2Fybikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGExMXkgd2FybmluZ3MuLi5cbiAgICAgICAgaWYgKHdhcm5pbmcuY29kZS5zdGFydHNXaXRoKCdhMTF5LScpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgd2Fybih3YXJuaW5nKTtcbiAgICAgIH0sXG4gICAgfSksXG5cbiAgICB0c2NvbmZpZ1BhdGhzUGx1Z2luKHtcbiAgICAgIHJvb3Q6IHBhdGgucmVzb2x2ZShjd2QpLFxuICAgICAgLy8gZXh0ZW5zaW9uczogWycudHMnLCAnLmpzb24nXSxcbiAgICAgIGxvb3NlOiB0cnVlLFxuICAgIH0pLFxuICBcbiAgICBoYW5kbGViYXJzUGx1Z2luKG9wdGlvbnMuY29uZmlnLnNlcnZlLnBhcnRpYWxzLCBvcHRpb25zKSxcbiAgXTtcbn1cbiIsIlxuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7Y3dkfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgdHlwZSB7Q29uZmlnRW52LCBQbHVnaW59IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHR5cGUge0ltYWdlUXVhbGl0eUNvbmZpZ30gZnJvbSAnLi4vLi4vdXRpbHMvaW50ZXJmYWNlcyc7IFxuXG5pbXBvcnQgdml0ZUltYWdlbWluIGZyb20gJ0B2aGVlbXN0cmEvdml0ZS1wbHVnaW4taW1hZ2VtaW4nXG5cbi8vIFRoZSBtaW5pZmllcnMgeW91IHdhbnQgdG8gdXNlOlxuaW1wb3J0IGltYWdlbWluTW96anBlZyBmcm9tICdpbWFnZW1pbi1tb3pqcGVnJ1xuaW1wb3J0IGltYWdlbWluUG5nUXVhbnQgZnJvbSAnaW1hZ2VtaW4tcG5ncXVhbnQnXG5pbXBvcnQgaW1hZ2VtaW5PcHRpUG5nIGZyb20gJ2ltYWdlbWluLW9wdGlwbmcnXG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZW1pblBsdWdpbihcbiAgZW52aXJvbm1lbnQ6IENvbmZpZ0VudixcbiAgb3B0aW9uczogSW1hZ2VRdWFsaXR5Q29uZmlnLFxuKTogUGx1Z2luIHwgdW5kZWZpbmVkIHtcblxuICBpZiAoZW52aXJvbm1lbnQubW9kZSAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIHZpdGVJbWFnZW1pbih7XG4gICAgc2tpcElmTGFyZ2VyOiB0cnVlLFxuICAgIHZlcmJvc2U6IHRydWUsXG4gICAgcm9vdDogcGF0aC5qb2luKHBhdGgucmVzb2x2ZShjd2QpLCAncHVibGljJyksXG4gICAgcGx1Z2luczoge1xuICAgICAganBnOiBbXG4gICAgICAgIGltYWdlbWluTW96anBlZyh7XG4gICAgICAgICAgcXVhbGl0eTogb3B0aW9ucz8uanBlZyA/PyA4MCxcbiAgICAgICAgfSlcbiAgICAgIF0sXG4gICAgICBwbmc6IFtcbiAgICAgICAgaW1hZ2VtaW5QbmdRdWFudCh7XG4gICAgICAgICAgc3RyaXA6IHRydWUsXG4gICAgICAgICAgc3BlZWQ6IDIsXG4gICAgICAgICAgZGl0aGVyaW5nOiAwLjI1LFxuICAgICAgICAgIHF1YWxpdHk6IG9wdGlvbnM/LnBuZyA/PyBbMC41LCAwLjddLFxuICAgICAgICB9KSwgXG4gICAgICAgIGltYWdlbWluT3B0aVBuZygpXG4gICAgICBdXG4gICAgfVxuICB9KSBhcyBQbHVnaW47XG59O1xuIiwiaW1wb3J0IHR5cGUge1BsdWdpbiwgUmVzb2x2ZWRDb25maWd9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHR5cGUge0dhbWVTZXR0aW5ncywgR2FtZXNTZXR0aW5nc30gZnJvbSAnLi4vLi4vdXRpbHMvaW50ZXJmYWNlcyc7XG5cbmZ1bmN0aW9uIHJlbmRlckdhbWVNYW5pZmVzdChcbiAgcGFnZUlkOiBzdHJpbmcsXG4gIHNldHRpbmdzOiBHYW1lU2V0dGluZ3MsXG4gIGNvbmZpZzogUmVzb2x2ZWRDb25maWcsXG4pOiBzdHJpbmcge1xuICBjb25zdCBtYW5pZmVzdCA9IHtcbiAgICBzaG9ydF9uYW1lOiBgJHtzZXR0aW5ncy5tZXRhLmFwcHRpdGxlfWAsXG4gICAgbmFtZTogYCR7c2V0dGluZ3MubWV0YS50aXRsZX1gLFxuICAgIGRlc2NyaXB0aW9uOiBgJHtzZXR0aW5ncy5tZXRhLmRlc2NyaXB0aW9ufWAsXG4gICAgc2NvcGU6IGAke2NvbmZpZy5iYXNlfSR7cGFnZUlkfS5odG1sYCxcbiAgICBzdGFydF91cmw6IGAke2NvbmZpZy5iYXNlfSR7cGFnZUlkfS5odG1sYCxcbiAgICBkaXNwbGF5OiAnZnVsbHNjcmVlbicsXG4gICAgb3JpZW50YXRpb246IGAke3NldHRpbmdzLm9wdGlvbnMub3JpZW50YXRpb24gPz8gJ2xhbmRzY2FwZSd9YCxcbiAgICBpY29uczogW1xuICAgICAge1xuICAgICAgICBzcmM6IGAke2NvbmZpZy5iYXNlfW1ldGEvJHtzZXR0aW5ncy5pbmZvLmlkfS9pY29ucy9jaHJvbWUtdG91Y2gtaWNvbi0xOTJ4MTkyLnBuZ2AsXG4gICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxuICAgICAgICBzaXplczogJzE5MngxOTInLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3JjOiBgJHtjb25maWcuYmFzZX1tZXRhLyR7c2V0dGluZ3MuaW5mby5pZH0vaWNvbnMvaWNvbi5wbmdgLFxuICAgICAgICB0eXBlOiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgc2l6ZXM6ICcxMDI0eDEwMjQnLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGJhY2tncm91bmRfY29sb3I6IGAke3NldHRpbmdzLm9wdGlvbnMuYmFja2dyb3VuZENvbG9yfWAsXG4gICAgdGhlbWVfY29sb3I6IGAke3NldHRpbmdzLm9wdGlvbnMuYmFja2dyb3VuZENvbG9yfWAsXG4gIH07XG5cbiAgcmV0dXJuIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFuaWZlc3RQbHVnaW4oZ2FtZXM6IEdhbWVzU2V0dGluZ3MpOiBQbHVnaW4ge1xuICBsZXQgY29uZmlnOiBSZXNvbHZlZENvbmZpZztcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd2aXRlLXBsdWdpbi1rbG9lay1tYW5pZmVzdCcsXG4gICAgZW5mb3JjZTogJ3Bvc3QnLFxuICAgIGFwcGx5OiAnYnVpbGQnLFxuICAgIGFzeW5jIGNvbmZpZ1Jlc29sdmVkKHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZENvbmZpZykge1xuICAgICAgY29uZmlnID0gcmVzb2x2ZWRDb25maWc7XG4gICAgfSxcbiAgICBnZW5lcmF0ZUJ1bmRsZShfLCBidW5kbGUpIHtcbiAgICAgIC8vIFZvb3IgaWVkZXJlIGFwcCBlZW4gbWFuaWZlc3QgbWFrZW46XG4gICAgICBmb3IgKGNvbnN0IFtwYWdlSWQsIHNldHRpbmdzXSBvZiBPYmplY3QuZW50cmllcyhnYW1lcykpIHtcbiAgICAgICAgYnVuZGxlW2Ake3BhZ2VJZH0ud2VibWFuaWZlc3RgXSA9IHtcbiAgICAgICAgICBuZWVkc0NvZGVSZWZlcmVuY2U6IGZhbHNlLFxuICAgICAgICAgIHR5cGU6ICdhc3NldCcsXG4gICAgICAgICAgbmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHNvdXJjZTogcmVuZGVyR2FtZU1hbmlmZXN0KHBhZ2VJZCwgc2V0dGluZ3MsIGNvbmZpZyksXG4gICAgICAgICAgZmlsZU5hbWU6IGAke3BhZ2VJZH0ud2VibWFuaWZlc3RgLFxuICAgICAgICB9O1xuXG4gICAgICAgIGJ1bmRsZVtgJHtwYWdlSWR9LXNlcnZpY2V3b3JrZXIuanNgXSA9IHtcbiAgICAgICAgICBuZWVkc0NvZGVSZWZlcmVuY2U6IGZhbHNlLFxuICAgICAgICAgIHR5cGU6ICdhc3NldCcsXG4gICAgICAgICAgbmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHNvdXJjZTogXCJzZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ2ZldGNoJywgZnVuY3Rpb24oKSB7IHJldHVybjsgfSk7XCIsXG4gICAgICAgICAgZmlsZU5hbWU6IGAke3BhZ2VJZH0tc2VydmljZXdvcmtlci5qc2AsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBsZWdhY3lQbHVnaW4gZnJvbSAnQHZpdGVqcy9wbHVnaW4tbGVnYWN5JztcbmltcG9ydCB0eXBlIHtQbHVnaW4sIFBsdWdpbk9wdGlvbn0gZnJvbSAndml0ZSc7XG5pbXBvcnQgYmFubmVyUGx1Z2luIGZyb20gJ3ZpdGUtcGx1Z2luLWJhbm5lcic7XG5pbXBvcnQge2NyZWF0ZUh0bWxQbHVnaW59IGZyb20gJ3ZpdGUtcGx1Z2luLWh0bWwnO1xuaW1wb3J0IHR5cGUge1ZpdGVPcHRpb25zfSBmcm9tICcuLi91dGlscy9pbnRlcmZhY2VzJztcbmltcG9ydCB7aW1hZ2VtaW5QbHVnaW59IGZyb20gJy4vbGliL2ltYWdlLXBsdWdpbic7XG5pbXBvcnQge21hbmlmZXN0UGx1Z2lufSBmcm9tICcuL2xpYi9tYW5pZmVzdC1wbHVnaW4nO1xuaW1wb3J0IHt2aXN1YWxpemVyfSBmcm9tICdyb2xsdXAtcGx1Z2luLXZpc3VhbGl6ZXInO1xuXG4vLyBCdWlsZCBwbHVnaW5zXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbHVnaW5zKFxuICBvcHRpb25zOiBWaXRlT3B0aW9ucyxcbik6IEFycmF5PFBsdWdpbiB8IFBsdWdpbk9wdGlvbj4ge1xuICAvLyBObyBidWlsZD8gbm8gcGx1Z2lucy4uXG4gIGlmIChvcHRpb25zLmVudmlyb25tZW50LmNvbW1hbmQgIT09ICdidWlsZCcpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwbHVnaW5zOiBBcnJheTxQbHVnaW4gfCBQbHVnaW5PcHRpb24gfCB1bmRlZmluZWQ+ID0gW107XG5cbiAgaWYgKG9wdGlvbnMuY29uZmlnLmJ1aWxkLmxlZ2FjeSkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgcGFnZSB3b3JrcyBpbiBvbGRlciBicm93c2Vyc1xuICAgIHBsdWdpbnMucHVzaChcbiAgICAgIC4uLmxlZ2FjeVBsdWdpbih7XG4gICAgICAgIHRhcmdldHM6IChvcHRpb25zLmNvbmZpZy5idWlsZC5icm93c2Vyc2xpc3QgYXMgc3RyaW5nW10pID8/ICdkZWZhdWx0cycsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcGFnZXMgPSBPYmplY3Qua2V5cyhvcHRpb25zLnNldHRpbmdzLmdhbWVzKS5tYXAoKGdhbWVJZCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogYCR7Z2FtZUlkfS5odG1sYCxcbiAgICAgIHRlbXBsYXRlOiBgJHtnYW1lSWR9Lmh0bWxgLFxuICAgIH07XG4gIH0pO1xuXG4gIHBsdWdpbnMucHVzaChcbiAgICAvLyBNaW5pZnkgaW1hZ2UgYXNzZXRzXG4gICAgaW1hZ2VtaW5QbHVnaW4ob3B0aW9ucy5lbnZpcm9ubWVudCwgb3B0aW9ucy5jb25maWcuYnVpbGQuaW1hZ2VRdWFsaXR5KSxcblxuICAgIC8vIE1ha2UgdGhlIGh0bWwgb3V0cHV0IHNtYWxsZXJcbiAgICAuLi4oY3JlYXRlSHRtbFBsdWdpbih7bWluaWZ5OiB0cnVlLCBwYWdlc30pIGFzIFBsdWdpbltdKSxcblxuICAgIC8vIEFkZCBhIGJhbm5lciB0byBnZW5lcmF0ZWQganMvY3NzXG4gICAgYmFubmVyUGx1Z2luKFxuICAgICAgYFxuICAgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC5cblxuICAgICAgICAgX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgICAgICBfICAgICAgICAgICAgX1xuICAgICAgICAvICApICAgICAgICAgICAgICB8ICBvICAgICAgICAgL3wgICAvIHwgfCAgICAgICAgICB8IHxcbiAgICAgICAgXFxcXF9fIF98XyAgICAgICAgIF9ffCAgICAgIF9fICAgICB8X18vICB8IHwgIF9fICAgXyAgfCB8XG4gICAgICAgICAgIFxcXFwgfCAgfCAgIHwgIC8gIHwgIHwgIC8gIFxcXFxfICAgfCBcXFxcICAgfC8gIC8gIFxcXFxffC8gIHwvXylcbiAgICAgICAoX19fLyB8Xy8gXFxcXF8vfF8vXFxcXF8vfF8vfF8vXFxcXF9fLyAgICB8ICBcXFxcXy98X18vXFxcXF9fLyB8X18vfCBcXFxcXy9cblxuICAgICAgICBDb25jZXB0LCBvbnR3ZXJwICYgb250d2lra2VsaW5nXG4gICAgICAgIGh0dHBzOi8vc3R1ZGlva2xvZWsubmxcblxuICAgICAgICBTdHVkaW8gS2xvZWsg4p2kIFBpeGlKUywgR1NBUCAmIGhvd2xlci5qc1xuXG4gICAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLlxuXG4gICAgYCxcbiAgICApLFxuICApO1xuXG4gIC8vIENyZWF0ZSBhIG1hbmlmZXN0IGFuZCBtaW5pbWFsIHdlYndvcmtlciBmb3IgZXZlcnkgZ2FtZVxuICBpZiAob3B0aW9ucy5jb25maWcuYnVpbGQubWFuaWZlc3QpIHtcbiAgICBwbHVnaW5zLnB1c2gobWFuaWZlc3RQbHVnaW4ob3B0aW9ucy5zZXR0aW5ncy5nYW1lcykpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuY29uZmlnLmJ1aWxkLmFuYWx5emVCdW5kbGUpIHtcbiAgICBwbHVnaW5zLnB1c2godmlzdWFsaXplcih7XG4gICAgICB0ZW1wbGF0ZTogXCJ0cmVlbWFwXCIsIC8vIG9yIHN1bmJ1cnN0XG4gICAgICBvcGVuOiB0cnVlLFxuICAgICAgZ3ppcFNpemU6IHRydWUsXG4gICAgICBmaWxlbmFtZTogXCJidW5kbGUtYW5hbHlzZS5odG1sXCIsIC8vIHdpbGwgYmUgc2F2ZWQgaW4gcHJvamVjdCdzIHJvb3RcbiAgICB9KSBhcyBQbHVnaW5PcHRpb24pO1xuICB9XG5cbiAgcmV0dXJuIHBsdWdpbnMuZmlsdGVyKHBsdWdpbiA9PiBwbHVnaW4gIT09IHVuZGVmaW5lZCk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHt0eXBlIFBsdWdpbiwgdHlwZSBQbHVnaW5PcHRpb259IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IGZ1bGxSZWxvYWQgZnJvbSAndml0ZS1wbHVnaW4tZnVsbC1yZWxvYWQnO1xuaW1wb3J0IG1rY2VydCBmcm9tICd2aXRlLXBsdWdpbi1ta2NlcnQnO1xuaW1wb3J0IGNoZWNrZXIgZnJvbSAndml0ZS1wbHVnaW4tY2hlY2tlcic7XG5pbXBvcnQge2N3ZH0gZnJvbSAnLi4vdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlUGx1Z2lucygpOiBBcnJheTxQbHVnaW4gfCBQbHVnaW5PcHRpb24+IHtcbiAgcmV0dXJuIFtcbiAgICBmdWxsUmVsb2FkKFsnc2NyaXB0LyoqLyoudHMnLCAnc3ZlbHRlLyoqLyouc3ZlbHRlJ10sIHtcbiAgICAgIHJvb3Q6IHBhdGguam9pbihwYXRoLnJlc29sdmUoY3dkKSwgJ3NvdXJjZScpLFxuICAgICAgbG9nOiB0cnVlLFxuICAgICAgYWx3YXlzOiB0cnVlLFxuICAgIH0pIGFzIFBsdWdpbixcblxuICAgIG1rY2VydCgpLFxuXG4gICAgY2hlY2tlcih7XG4gICAgICB0eXBlc2NyaXB0OiB0cnVlLFxuICAgIH0pLFxuICBdO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHR5cGUge0NvbmZpZ0VudiwgVXNlckNvbmZpZ30gZnJvbSAndml0ZSc7XG5pbXBvcnQge2Jhc2VQbHVnaW5zfSBmcm9tICcuL3BsdWdpbnMvYmFzZSc7XG5pbXBvcnQge2J1aWxkUGx1Z2luc30gZnJvbSAnLi9wbHVnaW5zL2J1aWxkJztcbmltcG9ydCB7c2VydmVQbHVnaW5zfSBmcm9tICcuL3BsdWdpbnMvc2VydmUnO1xuaW1wb3J0IHtcbiAgY3dkLFxuICBkZWZpbmVCdWlsZENvbmZpZyxcbiAgZ2V0UGFnZVRvU2VydmUsXG4gIHBhcnNlUGFja2FnZUdhbWVzU2V0dGluZ3MsXG4gIHJlYWRKU09OLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB0eXBlIHtcbiAgS2xvZWtWaXRlQ29uZmlnLFxuICBQYWNrYWdlR2FtZXNTZXR0aW5ncyxcbiAgVml0ZU9wdGlvbnMsXG59IGZyb20gJy4vdXRpbHMvaW50ZXJmYWNlcyc7XG5cbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVmaW5lS2xvZWtWaXRlQ29uZmlnKFxuICBlbnZpcm9ubWVudDogQ29uZmlnRW52LFxuKTogUHJvbWlzZTxVc2VyQ29uZmlnPiB7XG4gIGNvbnN0IHBrZyA9IHJlYWRKU09OKHBhdGgucmVzb2x2ZShjd2QsICdwYWNrYWdlLmpzb24nKSkgYXMgUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB1bmtub3duXG4gID47XG4gIGNvbnN0IGtsb2VrQ29uZmlnID0gcGtnLnZpdGUgYXMgS2xvZWtWaXRlQ29uZmlnO1xuICBjb25zdCBicm93c2Vyc2xpc3QgPSBwa2cuYnJvd3NlcnNsaXN0IGFzIHN0cmluZyB8IHN0cmluZ1tdO1xuICBjb25zdCBvcHRpb25zOiBWaXRlT3B0aW9ucyA9IHtcbiAgICByb290OiBwYXRoLnJlc29sdmUoY3dkLCAnc291cmNlJyksXG4gICAgZW52aXJvbm1lbnQsXG4gICAgc2V0dGluZ3M6IHBhcnNlUGFja2FnZUdhbWVzU2V0dGluZ3MocGtnLnNldHRpbmdzIGFzIFBhY2thZ2VHYW1lc1NldHRpbmdzKSxcbiAgICBjb25maWc6IHtcbiAgICAgIC4uLmtsb2VrQ29uZmlnLFxuICAgICAgYnVpbGQ6IHsuLi5rbG9la0NvbmZpZy5idWlsZCwgYnJvd3NlcnNsaXN0fSxcbiAgICAgIHNlcnZlOiB7XG4gICAgICAgIHBhcnRpYWxzOiBbXG4gICAgICAgICAgcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3BhcnRpYWxzJyksXG4gICAgICAgICAgcGF0aC5yZXNvbHZlKGN3ZCwgJ3NvdXJjZScsICdwYXJ0aWFscycpLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGNvbmZpZzogVXNlckNvbmZpZyA9IHtcbiAgICBsb2dMZXZlbDogJ2luZm8nLFxuICAgIGJhc2U6IGtsb2VrQ29uZmlnLmJ1aWxkLmJhc2VQYXRoLFxuICAgIHJvb3Q6IG9wdGlvbnMucm9vdCxcbiAgICBlbnZEaXI6IHBhdGgucmVzb2x2ZShjd2QsICdlbnYnKSxcbiAgICBlbnZQcmVmaXg6IFsnS0xPRUtfJywgJ1ZJVEVfJ10sXG4gICAgcHVibGljRGlyOiAnc3RhdGljJyxcbiAgICBkZWZpbmU6IHt9LFxuXG4gICAgZXNidWlsZDoge1xuICAgICAgbGVnYWxDb21tZW50czogJ25vbmUnLFxuICAgIH0sXG5cbiAgICByZXNvbHZlOiB7XG4gICAgICBhbGlhczoge1xuICAgICAgICBsb2Rhc2g6ICdsb2Rhc2gtZXMnLFxuICAgICAgICAnQG1ldGEnOiBwYXRoLnJlc29sdmUoY3dkLCAnc291cmNlJywgJ3N0YXRpYycsICdtZXRhJyksXG4gICAgICAgICdAZm9udHMnOiBwYXRoLnJlc29sdmUoY3dkLCAnc291cmNlJywgJ3N0YXRpYycsICdmb250cycpLFxuICAgICAgfSxcbiAgICAgIGRlZHVwZTogWyAgICAgICAgICAgIFxuICAgICAgICAnQHN0dWRpb2tsb2VrL3RzLWNvcmUtbGliJyxcbiAgICAgICAgJ0BjYXBhY2l0b3IvYXBwJyxcbiAgICAgICAgJ0BjYXBhY2l0b3IvYXBwJyxcbiAgICAgICAgJ0BjYXBhY2l0b3IvY29yZScsXG4gICAgICAgICdAY2FwYWNpdG9yL2RldmljZScsXG4gICAgICAgICdAY2FwYWNpdG9yL25ldHdvcmsnLFxuICAgICAgICAnQGNhcGFjaXRvci9wcmVmZXJlbmNlcycsXG4gICAgICAgICdAY2FwYWNpdG9yL3NwbGFzaC1zY3JlZW4nLFxuICAgICAgICAnQGNhcGFjaXRvci9zdGF0dXMtYmFyJyxcbiAgICAgICAgJ2Jvd3NlcicsXG4gICAgICAgICdkYXRlLWZucy10eicsXG4gICAgICAgICdkYXRlLWZucycsXG4gICAgICAgICdlcnJvci1zdGFjay1wYXJzZXItZXMnLFxuICAgICAgICAnZmlyZWJhc2UnLFxuICAgICAgICAnZm9udGZhY2VvYnNlcnZlcicsXG4gICAgICAgICdnc2FwJyxcbiAgICAgICAgJ2hvd2xlcicsXG4gICAgICAgICdsb2Rhc2gtZGVjb3JhdG9ycy1lc20nLFxuICAgICAgICAnbG9kYXNoLWVzJyxcbiAgICAgICAgJ292ZXJtaW5kJyxcbiAgICAgICAgJ3BpeGktc3BpbmUnLFxuICAgICAgICAncGl4aS5qcycsXG4gICAgICAgICdwdWJzdWItanMnLFxuICAgICAgICAncmFuZG9tLWpzJyxcbiAgICAgICAgJ3Jlc3MnLFxuICAgICAgICAnc2x1Z2lmeScsXG4gICAgICAgICdzdXBlcmFnZW50JyxcbiAgICAgICAgJ3RzLWV2ZW50cycsXG4gICAgICAgICd0cy1taXhlcicsXG4gICAgICAgICd0c2xpYicsXG4gICAgICBdLFxuICAgIH0sXG5cbiAgICBjc3M6IHtcbiAgICAgIHByZXByb2Nlc3Nvck9wdGlvbnM6IHtcbiAgICAgICAgc2Nzczoge1xuICAgICAgICAgIGNoYXJzZXQ6IGZhbHNlLFxuICAgICAgICAgIC8vIEFkZGl0aW9uYWxEYXRhOiBgQGNoYXJzZXQgXCJVVEYtOFwiYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHBsdWdpbnM6IFsuLi5iYXNlUGx1Z2lucyhvcHRpb25zKV0sXG4gIH07XG5cbiAgc3dpdGNoIChlbnZpcm9ubWVudC5jb21tYW5kKSB7XG4gICAgY2FzZSAnc2VydmUnOlxuICAgICAgY29uZmlnLnNlcnZlciA9IHtcbiAgICAgICAgaG9zdDogdHJ1ZSxcbiAgICAgICAgY29yczogb3B0aW9ucy5jb25maWcuZGV2LmNvcnMgPz8gdHJ1ZSxcbiAgICAgICAgaHR0cHM6IG9wdGlvbnMuY29uZmlnLmRldi5odHRwcyA/PyB0cnVlLFxuICAgICAgICBvcGVuOiBnZXRQYWdlVG9TZXJ2ZShvcHRpb25zLmNvbmZpZywgb3B0aW9ucy5zZXR0aW5ncy5nYW1lcyksXG4gICAgICB9O1xuICAgICAgY29uZmlnLnBsdWdpbnMgPSBbXG4gICAgICAgIC4uLihjb25maWcucGx1Z2lucyA/IGNvbmZpZy5wbHVnaW5zIDogW10pLFxuICAgICAgICAuLi5zZXJ2ZVBsdWdpbnMoKSxcbiAgICAgIF07XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYnVpbGQnOlxuICAgICAgY29uZmlnLmJ1aWxkID0gZGVmaW5lQnVpbGRDb25maWcob3B0aW9ucyk7XG4gICAgICBjb25maWcucGx1Z2lucyA9IFtcbiAgICAgICAgLi4uKGNvbmZpZy5wbHVnaW5zID8gY29uZmlnLnBsdWdpbnMgOiBbXSksXG4gICAgICAgIC4uLmJ1aWxkUGx1Z2lucyhvcHRpb25zKSxcbiAgICAgIF07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gIH1cblxuICByZXR1cm4gY29uZmlnO1xufVxuIiwiaW1wb3J0IHt0eXBlIFR5cGVkRmxhZ3N9IGZyb20gJ21lb3cnO1xuaW1wb3J0IHtidWlsZCwgY3JlYXRlU2VydmVyfSBmcm9tICd2aXRlJztcbmltcG9ydCB7ZGVmaW5lS2xvZWtWaXRlQ29uZmlnfSBmcm9tICcuL2NvbmZpZyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBrbG9la0RldmVsb3BtZW50KFxuICBmbGFnczogVHlwZWRGbGFnczx7XG4gICAgbW9kZToge1xuICAgICAgdHlwZTogJ3N0cmluZyc7XG4gICAgICBzaG9ydEZsYWc6IHN0cmluZztcbiAgICAgIGRlZmF1bHQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgfT4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgZGVmaW5lS2xvZWtWaXRlQ29uZmlnKHtcbiAgICBjb21tYW5kOiAnc2VydmUnLFxuICAgIG1vZGU6ICdkZXZlbG9wbWVudCcsXG4gIH0pO1xuXG4gIC8vIERpZmZlcmVudCBtb2RlXG4gIGlmICh0eXBlb2YgZmxhZ3MubW9kZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25maWcubW9kZSA9IGZsYWdzLm1vZGU7XG4gIH1cblxuICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVTZXJ2ZXIoe1xuICAgIGNvbmZpZ0ZpbGU6IGZhbHNlLFxuICAgIC4uLmNvbmZpZyxcbiAgfSk7XG5cbiAgYXdhaXQgc2VydmVyLmxpc3RlbigpO1xuICBzZXJ2ZXIucHJpbnRVcmxzKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBrbG9la0J1aWxkKFxuICBmbGFnczogVHlwZWRGbGFnczx7XG4gICAgZW1wdHlPdXREaXI6IHtcbiAgICAgIHR5cGU6ICdib29sZWFuJztcbiAgICAgIHNob3J0RmxhZzogc3RyaW5nO1xuICAgICAgZGVmYXVsdDogdHJ1ZTtcbiAgICB9O1xuICAgIGJhc2U6IHtcbiAgICAgIHR5cGU6ICdzdHJpbmcnO1xuICAgICAgc2hvcnRGbGFnOiBzdHJpbmc7XG4gICAgICBkZWZhdWx0OiBzdHJpbmc7XG4gICAgfTtcbiAgICBtb2RlOiB7XG4gICAgICB0eXBlOiAnc3RyaW5nJztcbiAgICAgIHNob3J0RmxhZzogc3RyaW5nO1xuICAgICAgZGVmYXVsdD86IHN0cmluZztcbiAgICB9O1xuICB9Pixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBkZWZpbmVLbG9la1ZpdGVDb25maWcoe1xuICAgIGNvbW1hbmQ6ICdidWlsZCcsXG4gICAgbW9kZTogJ3Byb2R1Y3Rpb24nLFxuICB9KTtcblxuICAvLyBFbXB0eSBvdXQgdGhlIE91dHB1dCBkaXIgYmVmb3JlIGJ1aWxkaW5nP1xuICBpZiAoZmxhZ3MuZW1wdHlPdXREaXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmZpZy5idWlsZCA9IHtcbiAgICAgIC4uLmNvbmZpZy5idWlsZCxcbiAgICAgIGVtcHR5T3V0RGlyOiBmbGFncy5lbXB0eU91dERpcixcbiAgICB9O1xuICB9XG5cbiAgLy8gRGlmZmVyZW50IGJhc2UgcGF0aFxuICBpZiAodHlwZW9mIGZsYWdzLmJhc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnLmJhc2UgPSBmbGFncy5iYXNlO1xuICB9XG5cbiAgLy8gRGlmZmVyZW50IG1vZGVcbiAgaWYgKHR5cGVvZiBmbGFncy5tb2RlID09PSAnc3RyaW5nJykge1xuICAgIGNvbmZpZy5tb2RlID0gZmxhZ3MubW9kZTtcbiAgfVxuXG4gIGF3YWl0IGJ1aWxkKHtcbiAgICBjb25maWdGaWxlOiBmYWxzZSxcbiAgICAuLi5jb25maWcsXG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLFNBQVMsaUJBQWlCLENBQ3hCLE9BQXFCLEVBQ3JCLElBQWtCLEVBQ2xCLFNBQWlDLEVBQUE7SUFFakMsTUFBTSxRQUFRLEdBQTRCLEVBQUUsQ0FBQzs7QUFHN0MsSUFBQSxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRTtRQUNoQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUc7WUFDbkIsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ3BCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUNsQixDQUFDO0FBQ0gsS0FBQTtBQUVELElBQUEsT0FBTyxRQUFtQyxDQUFDO0FBQzdDLENBQUM7QUFFSyxTQUFVLHlCQUF5QixDQUN2QyxlQUFxQyxFQUFBOztJQUdyQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUMzQixlQUFlLENBQUMsT0FBTyxDQUNFLENBQUM7QUFDNUIsSUFB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
@@ -1,3 +0,0 @@
1
- import { type Plugin, type PluginOption } from 'vite';
2
- import { type ViteOptions } from '../utils/interfaces';
3
- export declare function basePlugins(options: ViteOptions): Array<Plugin | PluginOption>;
@@ -1,3 +0,0 @@
1
- import type { Plugin, PluginOption } from 'vite';
2
- import type { ViteOptions } from '../utils/interfaces';
3
- export declare function buildPlugins(options: ViteOptions): Array<Plugin | PluginOption>;
@@ -1,3 +0,0 @@
1
- import type { Plugin } from 'vite';
2
- import type { ViteOptions } from '../../utils/interfaces';
3
- export declare function handlebarsPlugin(partialDirectory: string | string[], options: ViteOptions): Plugin;
@@ -1,3 +0,0 @@
1
- import type { Plugin } from 'vite';
2
- import type { GamesSettings } from '../../utils/interfaces';
3
- export declare function htmlPlugin(games: GamesSettings): Plugin;
@@ -1,3 +0,0 @@
1
- import type { ConfigEnv, Plugin } from 'vite';
2
- import type { ImageQualityConfig } from '../../utils/interfaces';
3
- export declare function imageminPlugin(environment: ConfigEnv, options: ImageQualityConfig): Plugin | undefined;
@@ -1,3 +0,0 @@
1
- import type { Plugin } from 'vite';
2
- import type { GamesSettings } from '../../utils/interfaces';
3
- export declare function manifestPlugin(games: GamesSettings): Plugin;
@@ -1,2 +0,0 @@
1
- import { type Plugin, type PluginOption } from 'vite';
2
- export declare function servePlugins(): Array<Plugin | PluginOption>;
package/dist/public.d.ts DELETED
@@ -1,29 +0,0 @@
1
- import { TypedFlags } from 'meow';
2
-
3
- export declare function kloekBuild(flags: TypedFlags<{
4
- emptyOutDir: {
5
- type: 'boolean';
6
- shortFlag: string;
7
- default: true;
8
- };
9
- base: {
10
- type: 'string';
11
- shortFlag: string;
12
- default: string;
13
- };
14
- mode: {
15
- type: 'string';
16
- shortFlag: string;
17
- default?: string;
18
- };
19
- }>): Promise<void>;
20
-
21
- export declare function kloekDevelopment(flags: TypedFlags<{
22
- mode: {
23
- type: 'string';
24
- shortFlag: string;
25
- default?: string;
26
- };
27
- }>): Promise<void>;
28
-
29
- export { }
@@ -1,3 +0,0 @@
1
- import type { BuildOptions } from 'vite';
2
- import type { ViteOptions } from './interfaces';
3
- export declare function defineBuildConfig(options: ViteOptions): BuildOptions;
@@ -1,5 +0,0 @@
1
- import type { GameSettings, GamesSettings, GamesSettingsData, KloekViteConfig, PackageGamesSettings } from './interfaces';
2
- export declare function parsePackageGamesSettings(packageSettings: PackageGamesSettings): GamesSettingsData;
3
- export declare function pathToGameData(fullFilePath: string, settings: GamesSettings): GameSettings | undefined;
4
- export declare function getPageToServe(config: KloekViteConfig, settings: GamesSettings): string;
5
- export declare function getPageIdFromUrl(url: string): string;
@@ -1,4 +0,0 @@
1
- export declare function readJSON(path: string): unknown;
2
- export declare const cwd: string;
3
- export * from './game';
4
- export * from './build';
@@ -1,62 +0,0 @@
1
- import type { ConfigEnv } from 'vite';
2
- export type ImageQualityConfig = {
3
- jpeg: number;
4
- png: [number, number];
5
- };
6
- export type KloekViteDevConfig = {
7
- serveParams: string;
8
- cors?: boolean;
9
- https?: boolean;
10
- };
11
- export type KloekViteServeConfig = {
12
- partials: string | string[];
13
- };
14
- export type KloekViteBuildConfig = {
15
- basePath: string;
16
- legacy?: boolean;
17
- browserslist?: string | string[];
18
- imageQuality: ImageQualityConfig;
19
- manifest?: boolean;
20
- analyzeBundle?: boolean;
21
- sourceMaps?: boolean;
22
- };
23
- export type KloekViteConfig = {
24
- dev: KloekViteDevConfig;
25
- serve: KloekViteServeConfig;
26
- build: KloekViteBuildConfig;
27
- };
28
- export type GameSettingsProperty = 'info' | 'meta' | 'options';
29
- export type GameSettings = {
30
- info: {
31
- id: string;
32
- page: string;
33
- version: number;
34
- client: string;
35
- year: number;
36
- };
37
- meta: {
38
- title: string;
39
- description: string;
40
- apptitle: string;
41
- };
42
- options: {
43
- backgroundColor: string;
44
- orientation: string;
45
- fullscreen: string;
46
- };
47
- };
48
- export type GamesSettings = Record<string, GameSettings>;
49
- export type GamesSettingsData = {
50
- development: GameSettings;
51
- games: GamesSettings;
52
- };
53
- export type PackageGamesSettings = {
54
- generic: GameSettings;
55
- games: GameSettings[];
56
- };
57
- export type ViteOptions = {
58
- root: string;
59
- environment: ConfigEnv;
60
- settings: GamesSettingsData;
61
- config: KloekViteConfig;
62
- };