@studiokloek/vite-config 0.10.1 → 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.1",
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.",
@@ -68,9 +68,9 @@
68
68
  "@sveltejs/vite-plugin-svelte": "^2.4.6",
69
69
  "@typescript-eslint/eslint-plugin": "^6.9.1",
70
70
  "@typescript-eslint/parser": "^6.9.1",
71
- "@vheemstra/vite-plugin-imagemin": "^1.0.11",
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",
@@ -94,7 +95,7 @@
94
95
  "sass": "^1.69.5",
95
96
  "stylelint": "^15.11.0",
96
97
  "svelte": "^3.59.2",
97
- "terser": "^5.23.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,13 +104,14 @@
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.1",
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.27.2",
114
+ "@sveltejs/kit": "^1.27.3",
113
115
  "@types/ejs": "^3.1.4",
114
116
  "@types/estree": "^1.0.4",
115
117
  "@types/html-minifier-terser": "^7.0.1",
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', 'firebase', 'lodash', 'gsap', 'studiokloek'];
85
- return {
86
- reportCompressedSize: true,
87
- chunkSizeWarningLimit: 2000,
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+ID0ge307XG5cbiAgZm9yIChjb25zdCBnYW1lSWQgb2YgT2JqZWN0LmtleXMob3B0aW9ucy5zZXR0aW5ncy5nYW1lcykpIHtcbiAgICBpbnB1dFtnYW1lSWRdID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMucm9vdCwgYCR7Z2FtZUlkfS5odG1sYCk7XG4gIH1cblxuICAvLyBMaWJzIGRpZSBhcGFydGUganMga3JpamdlbjpcbiAgY29uc3QgdmVuZG9yQ2h1bmtzID0gWydwaXhpJywgJ2ZpcmViYXNlJywgJ2xvZGFzaCcsICdnc2FwJywgJ3N0dWRpb2tsb2VrJ107XG5cbiAgcmV0dXJuIHtcbiAgICByZXBvcnRDb21wcmVzc2VkU2l6ZTogdHJ1ZSxcbiAgICBjaHVua1NpemVXYXJuaW5nTGltaXQ6IDIwMDAsXG4gICAgb3V0RGlyOiAnLi4vcHVibGljJyxcbiAgICBhc3NldHNEaXI6ICdnZW5lcmF0ZWQnLFxuICAgIG1pbmlmeTogJ3RlcnNlcicsXG4gICAgc291cmNlbWFwOiBvcHRpb25zLmNvbmZpZy5idWlsZC5zb3VyY2VNYXBzID09PSB0cnVlLFxuICAgIHJvbGx1cE9wdGlvbnM6IHtcbiAgICAgIGlucHV0LFxuICAgICAgb3V0cHV0OiB7XG4gICAgICAgIG1hbnVhbENodW5rcyhpZCkge1xuICAgICAgICAgIGlmIChpZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpZFxuICAgICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAuc3BsaXQoJ25vZGVfbW9kdWxlcy8nKVsxXVxuICAgICAgICAgICAgICAuc3BsaXQoJy8nKVswXVxuICAgICAgICAgICAgICAudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2ZW5kb3JDaHVua3MpIHtcbiAgICAgICAgICAgICAgaWYgKG5hbWUuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAndmVuZG9yJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IHtyZWFkRmlsZVN5bmN9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7bm9ybWFsaXplUGF0aH0gZnJvbSAndml0ZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkSlNPTihwYXRoOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhID0gcmVhZEZpbGVTeW5jKHBhdGgpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vXG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBjd2QgPSBub3JtYWxpemVQYXRoKHByb2Nlc3MuY3dkKCkpO1xuXG5leHBvcnQgKiBmcm9tICcuL2dhbWUnO1xuZXhwb3J0ICogZnJvbSAnLi9idWlsZCc7XG4iLCJpbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUge1BsdWdpbn0gZnJvbSAndml0ZSc7XG5pbXBvcnQgdml0ZUhhbmRsZWJhcnNQbHVnaW4gZnJvbSAndml0ZS1wbHVnaW4taGFuZGxlYmFycyc7XG5pbXBvcnQgdHlwZSB7Vml0ZU9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtnZXRQYWdlSWRGcm9tVXJsfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbi8vIEhlbHBlcnMgdm9vciBoYW5kbGViYXJzXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlYmFyc1BsdWdpbihcbiAgcGFydGlhbERpcmVjdG9yeTogc3RyaW5nIHwgc3RyaW5nW10sXG4gIG9wdGlvbnM6IFZpdGVPcHRpb25zLFxuKTogUGx1Z2luIHtcbiAgcmV0dXJuIHZpdGVIYW5kbGViYXJzUGx1Z2luKHtcbiAgICBwYXJ0aWFsRGlyZWN0b3J5LFxuXG4gICAgaGVscGVyczoge1xuICAgICAganNvbjogKG9iamVjdDogYW55LCBpbmRlbnQgPSAwKSA9PlxuICAgICAgICBKU09OLnN0cmluZ2lmeShvYmplY3QsIHVuZGVmaW5lZCwgaW5kZW50KSxcbiAgICAgIGNvbmNhdDogKC4uLmFyZ3VtZW50c186IGFueVtdKSA9PiBhcmd1bWVudHNfLnNsaWNlKDAsIC0xKS5qb2luKCcnKSxcbiAgICAgIGVxOiAoYTogYW55LCBiOiBhbnkpID0+IGEgPT09IGIsXG4gICAgICBuZXE6IChhOiBhbnksIGI6IGFueSkgPT4gYSAhPT0gYixcbiAgICAgIGlzZGVmaW5lZDogKHZhbHVlOiB1bmRlZmluZWQpID0+IHZhbHVlICE9PSB1bmRlZmluZWQsXG4gICAgICAncmVzb2x2ZS1yb290JyhwOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gVGlqZGVsaWprZSBoYWNrIHZvb3IgYnVnIGluIGhhbmRsZWJhcnMgcGx1Z2luXG4gICAgICAgIC8vIHppZSBvb2sgaHR0cHM6Ly9naXRodWIuY29tL2FsZXhsYWZyb3NjaWEvdml0ZS1wbHVnaW4taGFuZGxlYmFycy9wdWxsLzEyOVxuICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUob3B0aW9ucy5yb290LCBwKTtcbiAgICAgICAgcmV0dXJuIG9zLnBsYXRmb3JtKCkgPT09ICd3aW4zMicgPyBgLyR7cmVzb2x2ZWRQYXRofWAgOiByZXNvbHZlZFBhdGg7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBjb250ZXh0KHBhZ2VQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgICBjb25zdCBnYW1lSWQgPSBnZXRQYWdlSWRGcm9tVXJsKHBhZ2VQYXRoKTtcblxuICAgICAgaWYgKCFnYW1lSWQpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2FtZUlkID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIC8vIFBhZ2luYSBzZXR0aW5ncyB0ZXJ1Z2dldmVuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW52OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgICAgICAgIGRhdGE6IG9wdGlvbnMuc2V0dGluZ3MuZGV2ZWxvcG1lbnQsXG4gICAgICAgICAgZ2FtZXM6IG9wdGlvbnMuc2V0dGluZ3MuZ2FtZXMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIE9wIGJhc2lzIHZhbiBwYWQgZGF0YSBiZXBhbGVuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IG9wdGlvbnMuc2V0dGluZ3MuZ2FtZXNbZ2FtZUlkXTtcblxuICAgICAgLy8gUGFnaW5hIHNldHRpbmdzIHRlcnVnZ2V2ZW5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudjogb3B0aW9ucy5lbnZpcm9ubWVudCxcbiAgICAgICAgZGF0YTogc2V0dGluZ3MgPz8ge30sXG4gICAgICB9O1xuICAgIH0sXG4gIH0pO1xufVxuIiwiaW1wb3J0IHtleGlzdHNTeW5jLCBwcm9taXNlc30gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUge0NvbmZpZ0VudiwgUGx1Z2luLCBVc2VyQ29uZmlnLCBWaXRlRGV2U2VydmVyfSBmcm9tICd2aXRlJztcbmltcG9ydCB0eXBlIHtHYW1lc1NldHRpbmdzfSBmcm9tICcuLi8uLi91dGlscy9pbnRlcmZhY2VzJztcbmltcG9ydCB7Y3dkLCBnZXRQYWdlSWRGcm9tVXJsfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbmNvbnN0IFBBR0VfVEVNUExBVEUgPSAne3s+IGdhbWUgZGF0YT1kYXRhfX0nO1xuY29uc3QgREVWRUxPUE1FTlRfVEVNUExBVEUgPSAne3s+IGRldmVsb3BtZW50IGRhdGE9ZGF0YX19JztcblxuYXN5bmMgZnVuY3Rpb24gcmVuZGVyVGVtcG9yYXJ5RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIEJlc3RhYXQgZGllIGZpbGUgbm9nIG5pZXQ/XG4gIGlmICghZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAvLyBBYW5tYWtlblxuICAgIGF3YWl0IHByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgUEFHRV9URU1QTEFURSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh0bWxQbHVnaW4oZ2FtZXM6IEdhbWVzU2V0dGluZ3MpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd2aXRlLXBsdWdpbi1rbG9lay1odG1sJyxcbiAgICBlbmZvcmNlOiAncHJlJyxcblxuICAgIGFzeW5jIGNvbmZpZyhfY29uZmlnOiBVc2VyQ29uZmlnLCBlbnZpcm9ubWVudDogQ29uZmlnRW52KSB7XG4gICAgICAvLyBCaWogZWVuIGJ1aWxkIG1ha2VuIHdlIHRpamRlbGlqayBmaWxlcyBhYW5cbiAgICAgIGlmIChlbnZpcm9ubWVudC5jb21tYW5kID09PSAnYnVpbGQnKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnM6IEFycmF5PFByb21pc2U8dm9pZD4+ID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwYWdlSWQgb2YgT2JqZWN0LmtleXMoZ2FtZXMpKSB7XG4gICAgICAgICAgLy8gUGFkIG5hYXIgZmlsZVxuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJ3NvdXJjZScsIGAke3BhZ2VJZH0uaHRtbGApO1xuICAgICAgICAgIGFjdGlvbnMucHVzaChyZW5kZXJUZW1wb3JhcnlGaWxlKGZpbGVQYXRoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChhY3Rpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcjogVml0ZURldlNlcnZlcikge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgLy8gWm9yZyBlciB2b29yIGRhdCB0aWpkZW5zIGRldmVsb3BtZW50IGRlIHBhZ2luYSBnZS1yZW5kZXJlZCB0ZXJ1ZyBnZWdldmVuIHdvcmR0IHdvcmR0XG4gICAgICAgIHNlcnZlci5taWRkbGV3YXJlcy51c2UoJy8nLCBhc3luYyAocmVxdWVzdCwgcmVzcG9uc2UsIG5leHQpID0+IHtcbiAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0Py51cmwgPz8gJyc7XG4gICAgICAgICAgY29uc3QgcGFnZUlkID0gZ2V0UGFnZUlkRnJvbVVybCh1cmwpO1xuXG4gICAgICAgICAgaWYgKCFwYWdlSWQpIHtcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocGFnZUlkID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgICAvLyBEZXZlbG9wbWVudD8gZ2VlZiB0ZXJ1Zy4uLlxuICAgICAgICAgICAgcmVzcG9uc2UuZW5kKFxuICAgICAgICAgICAgICBhd2FpdCBzZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKFxuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBERVZFTE9QTUVOVF9URU1QTEFURSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9yaWdpbmFsVXJsLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKE9iamVjdC5rZXlzKGdhbWVzKS5pbmNsdWRlcyhwYWdlSWQpKSB7XG4gICAgICAgICAgICAvLyBCZXN0YWFuZGUgZ2FtZT8gem9yZyBlciB2b29yIGRhdCBkZSB0ZW1wbGF0ZSBnZS1yZW5kZXJlZCB3b3JkdFxuICAgICAgICAgICAgcmVzcG9uc2UuZW5kKFxuICAgICAgICAgICAgICBhd2FpdCBzZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKFxuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBQQUdFX1RFTVBMQVRFLFxuICAgICAgICAgICAgICAgIHJlcXVlc3Qub3JpZ2luYWxVcmwsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOaWtzIGdldm9uZGVuXG4gICAgICAgICAgICByZXNwb25zZS5lbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY2xvc2VCdW5kbGUoKSB7XG4gICAgICAvLyBWZXJ3aWpkZXIgZGUgYWFuZ2VtYWFrdGUgZmlsZXNcbiAgICAgIGNvbnN0IGFjdGlvbnM6IEFycmF5PFByb21pc2U8dm9pZD4+ID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBhZ2VJZCBvZiBPYmplY3Qua2V5cyhnYW1lcykpIHtcbiAgICAgICAgLy8gUGFkIG5hYXIgZmlsZVxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICdzb3VyY2UnLCBgJHtwYWdlSWR9Lmh0bWxgKTtcbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaChwcm9taXNlcy5ybShmaWxlUGF0aCkpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYWN0aW9ucyk7XG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge3N2ZWx0ZSwgdml0ZVByZXByb2Nlc3N9IGZyb20gJ0BzdmVsdGVqcy92aXRlLXBsdWdpbi1zdmVsdGUnO1xuaW1wb3J0IHt0eXBlIFBsdWdpbiwgdHlwZSBQbHVnaW5PcHRpb259IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHRzY29uZmlnUGF0aHNQbHVnaW4gZnJvbSAndml0ZS10c2NvbmZpZy1wYXRocyc7XG5pbXBvcnQge3R5cGUgVml0ZU9wdGlvbnN9IGZyb20gJy4uL3V0aWxzL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtjd2R9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7aGFuZGxlYmFyc1BsdWdpbn0gZnJvbSAnLi9saWIvaGFuZGxlYmFycy1wbHVnaW4nO1xuaW1wb3J0IHtodG1sUGx1Z2lufSBmcm9tICcuL2xpYi9odG1sLXBsdWdpbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlUGx1Z2lucyhcbiAgb3B0aW9uczogVml0ZU9wdGlvbnMsXG4pOiBBcnJheTxQbHVnaW4gfCBQbHVnaW5PcHRpb24+IHtcbiAgcmV0dXJuIFtcbiAgICBodG1sUGx1Z2luKG9wdGlvbnMuc2V0dGluZ3MuZ2FtZXMpLFxuXG4gICAgLi4uc3ZlbHRlKHtcbiAgICAgIHByZXByb2Nlc3M6dml0ZVByZXByb2Nlc3MoKSxcblxuICAgICAgb253YXJuKHdhcm5pbmcsIHdhcm4pIHtcbiAgICAgICAgaWYgKCF3YXJuKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gYTExeSB3YXJuaW5ncy4uLlxuICAgICAgICBpZiAod2FybmluZy5jb2RlLnN0YXJ0c1dpdGgoJ2ExMXktJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB3YXJuKHdhcm5pbmcpO1xuICAgICAgfSxcbiAgICB9KSxcblxuICAgIHRzY29uZmlnUGF0aHNQbHVnaW4oe1xuICAgICAgcm9vdDogcGF0aC5yZXNvbHZlKGN3ZCksXG4gICAgICAvLyBleHRlbnNpb25zOiBbJy50cycsICcuanNvbiddLFxuICAgICAgbG9vc2U6IHRydWUsXG4gICAgfSksXG4gIFxuICAgIGhhbmRsZWJhcnNQbHVnaW4ob3B0aW9ucy5jb25maWcuc2VydmUucGFydGlhbHMsIG9wdGlvbnMpLFxuICBdO1xufVxuIiwiXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtjd2R9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB0eXBlIHtDb25maWdFbnYsIFBsdWdpbn0gZnJvbSAndml0ZSc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VRdWFsaXR5Q29uZmlnfSBmcm9tICcuLi8uLi91dGlscy9pbnRlcmZhY2VzJzsgXG5cbmltcG9ydCB2aXRlSW1hZ2VtaW4gZnJvbSAnQHZoZWVtc3RyYS92aXRlLXBsdWdpbi1pbWFnZW1pbidcblxuLy8gVGhlIG1pbmlmaWVycyB5b3Ugd2FudCB0byB1c2U6XG5pbXBvcnQgaW1hZ2VtaW5Nb3pqcGVnIGZyb20gJ2ltYWdlbWluLW1vempwZWcnXG5pbXBvcnQgaW1hZ2VtaW5QbmdRdWFudCBmcm9tICdpbWFnZW1pbi1wbmdxdWFudCdcbmltcG9ydCBpbWFnZW1pbk9wdGlQbmcgZnJvbSAnaW1hZ2VtaW4tb3B0aXBuZydcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlbWluUGx1Z2luKFxuICBlbnZpcm9ubWVudDogQ29uZmlnRW52LFxuICBvcHRpb25zOiBJbWFnZVF1YWxpdHlDb25maWcsXG4pOiBQbHVnaW4gfCB1bmRlZmluZWQge1xuXG4gIGlmIChlbnZpcm9ubWVudC5tb2RlICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gdml0ZUltYWdlbWluKHtcbiAgICBza2lwSWZMYXJnZXI6IHRydWUsXG4gICAgdmVyYm9zZTogdHJ1ZSxcbiAgICByb290OiBwYXRoLmpvaW4ocGF0aC5yZXNvbHZlKGN3ZCksICdwdWJsaWMnKSxcbiAgICBwbHVnaW5zOiB7XG4gICAgICBqcGc6IFtcbiAgICAgICAgaW1hZ2VtaW5Nb3pqcGVnKHtcbiAgICAgICAgICBxdWFsaXR5OiBvcHRpb25zPy5qcGVnID8/IDgwLFxuICAgICAgICB9KVxuICAgICAgXSxcbiAgICAgIHBuZzogW1xuICAgICAgICBpbWFnZW1pblBuZ1F1YW50KHtcbiAgICAgICAgICBzdHJpcDogdHJ1ZSxcbiAgICAgICAgICBzcGVlZDogMixcbiAgICAgICAgICBkaXRoZXJpbmc6IDAuMjUsXG4gICAgICAgICAgcXVhbGl0eTogb3B0aW9ucz8ucG5nID8/IFswLjUsIDAuN10sXG4gICAgICAgIH0pLCBcbiAgICAgICAgaW1hZ2VtaW5PcHRpUG5nKClcbiAgICAgIF1cbiAgICB9XG4gIH0pIGFzIFBsdWdpbjtcbn07XG4iLCJpbXBvcnQgdHlwZSB7UGx1Z2luLCBSZXNvbHZlZENvbmZpZ30gZnJvbSAndml0ZSc7XG5pbXBvcnQgdHlwZSB7R2FtZVNldHRpbmdzLCBHYW1lc1NldHRpbmdzfSBmcm9tICcuLi8uLi91dGlscy9pbnRlcmZhY2VzJztcblxuZnVuY3Rpb24gcmVuZGVyR2FtZU1hbmlmZXN0KFxuICBwYWdlSWQ6IHN0cmluZyxcbiAgc2V0dGluZ3M6IEdhbWVTZXR0aW5ncyxcbiAgY29uZmlnOiBSZXNvbHZlZENvbmZpZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1hbmlmZXN0ID0ge1xuICAgIHNob3J0X25hbWU6IGAke3NldHRpbmdzLm1ldGEuYXBwdGl0bGV9YCxcbiAgICBuYW1lOiBgJHtzZXR0aW5ncy5tZXRhLnRpdGxlfWAsXG4gICAgZGVzY3JpcHRpb246IGAke3NldHRpbmdzLm1ldGEuZGVzY3JpcHRpb259YCxcbiAgICBzY29wZTogYCR7Y29uZmlnLmJhc2V9JHtwYWdlSWR9Lmh0bWxgLFxuICAgIHN0YXJ0X3VybDogYCR7Y29uZmlnLmJhc2V9JHtwYWdlSWR9Lmh0bWxgLFxuICAgIGRpc3BsYXk6ICdmdWxsc2NyZWVuJyxcbiAgICBvcmllbnRhdGlvbjogYCR7c2V0dGluZ3Mub3B0aW9ucy5vcmllbnRhdGlvbiA/PyAnbGFuZHNjYXBlJ31gLFxuICAgIGljb25zOiBbXG4gICAgICB7XG4gICAgICAgIHNyYzogYCR7Y29uZmlnLmJhc2V9bWV0YS8ke3NldHRpbmdzLmluZm8uaWR9L2ljb25zL2Nocm9tZS10b3VjaC1pY29uLTE5MngxOTIucG5nYCxcbiAgICAgICAgdHlwZTogJ2ltYWdlL3BuZycsXG4gICAgICAgIHNpemVzOiAnMTkyeDE5MicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzcmM6IGAke2NvbmZpZy5iYXNlfW1ldGEvJHtzZXR0aW5ncy5pbmZvLmlkfS9pY29ucy9pY29uLnBuZ2AsXG4gICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnLFxuICAgICAgICBzaXplczogJzEwMjR4MTAyNCcsXG4gICAgICB9LFxuICAgIF0sXG4gICAgYmFja2dyb3VuZF9jb2xvcjogYCR7c2V0dGluZ3Mub3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3J9YCxcbiAgICB0aGVtZV9jb2xvcjogYCR7c2V0dGluZ3Mub3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3J9YCxcbiAgfTtcblxuICByZXR1cm4gYCR7SlNPTi5zdHJpbmdpZnkobWFuaWZlc3QsIG51bGwsIDIpfVxcbmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYW5pZmVzdFBsdWdpbihnYW1lczogR2FtZXNTZXR0aW5ncyk6IFBsdWdpbiB7XG4gIGxldCBjb25maWc6IFJlc29sdmVkQ29uZmlnO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3ZpdGUtcGx1Z2luLWtsb2VrLW1hbmlmZXN0JyxcbiAgICBlbmZvcmNlOiAncG9zdCcsXG4gICAgYXBwbHk6ICdidWlsZCcsXG4gICAgYXN5bmMgY29uZmlnUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkQ29uZmlnKSB7XG4gICAgICBjb25maWcgPSByZXNvbHZlZENvbmZpZztcbiAgICB9LFxuICAgIGdlbmVyYXRlQnVuZGxlKF8sIGJ1bmRsZSkge1xuICAgICAgLy8gVm9vciBpZWRlcmUgYXBwIGVlbiBtYW5pZmVzdCBtYWtlbjpcbiAgICAgIGZvciAoY29uc3QgW3BhZ2VJZCwgc2V0dGluZ3NdIG9mIE9iamVjdC5lbnRyaWVzKGdhbWVzKSkge1xuICAgICAgICBidW5kbGVbYCR7cGFnZUlkfS53ZWJtYW5pZmVzdGBdID0ge1xuICAgICAgICAgIG5lZWRzQ29kZVJlZmVyZW5jZTogZmFsc2UsXG4gICAgICAgICAgdHlwZTogJ2Fzc2V0JyxcbiAgICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgICAgc291cmNlOiByZW5kZXJHYW1lTWFuaWZlc3QocGFnZUlkLCBzZXR0aW5ncywgY29uZmlnKSxcbiAgICAgICAgICBmaWxlTmFtZTogYCR7cGFnZUlkfS53ZWJtYW5pZmVzdGAsXG4gICAgICAgIH07XG5cbiAgICAgICAgYnVuZGxlW2Ake3BhZ2VJZH0tc2VydmljZXdvcmtlci5qc2BdID0ge1xuICAgICAgICAgIG5lZWRzQ29kZVJlZmVyZW5jZTogZmFsc2UsXG4gICAgICAgICAgdHlwZTogJ2Fzc2V0JyxcbiAgICAgICAgICBuYW1lOiB1bmRlZmluZWQsXG4gICAgICAgICAgc291cmNlOiBcInNlbGYuYWRkRXZlbnRMaXN0ZW5lcignZmV0Y2gnLCBmdW5jdGlvbigpIHsgcmV0dXJuOyB9KTtcIixcbiAgICAgICAgICBmaWxlTmFtZTogYCR7cGFnZUlkfS1zZXJ2aWNld29ya2VyLmpzYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGxlZ2FjeVBsdWdpbiBmcm9tICdAdml0ZWpzL3BsdWdpbi1sZWdhY3knO1xuaW1wb3J0IHR5cGUge1BsdWdpbiwgUGx1Z2luT3B0aW9ufSBmcm9tICd2aXRlJztcbmltcG9ydCBiYW5uZXJQbHVnaW4gZnJvbSAndml0ZS1wbHVnaW4tYmFubmVyJztcbmltcG9ydCB7Y3JlYXRlSHRtbFBsdWdpbn0gZnJvbSAndml0ZS1wbHVnaW4taHRtbCc7XG5pbXBvcnQgdHlwZSB7Vml0ZU9wdGlvbnN9IGZyb20gJy4uL3V0aWxzL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtpbWFnZW1pblBsdWdpbn0gZnJvbSAnLi9saWIvaW1hZ2UtcGx1Z2luJztcbmltcG9ydCB7bWFuaWZlc3RQbHVnaW59IGZyb20gJy4vbGliL21hbmlmZXN0LXBsdWdpbic7XG5pbXBvcnQge3Zpc3VhbGl6ZXJ9IGZyb20gJ3JvbGx1cC1wbHVnaW4tdmlzdWFsaXplcic7XG5cbi8vIEJ1aWxkIHBsdWdpbnNcbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsdWdpbnMoXG4gIG9wdGlvbnM6IFZpdGVPcHRpb25zLFxuKTogQXJyYXk8UGx1Z2luIHwgUGx1Z2luT3B0aW9uPiB7XG4gIC8vIE5vIGJ1aWxkPyBubyBwbHVnaW5zLi5cbiAgaWYgKG9wdGlvbnMuZW52aXJvbm1lbnQuY29tbWFuZCAhPT0gJ2J1aWxkJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHBsdWdpbnM6IEFycmF5PFBsdWdpbiB8IFBsdWdpbk9wdGlvbiB8IHVuZGVmaW5lZD4gPSBbXTtcblxuICBpZiAob3B0aW9ucy5jb25maWcuYnVpbGQubGVnYWN5KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBwYWdlIHdvcmtzIGluIG9sZGVyIGJyb3dzZXJzXG4gICAgcGx1Z2lucy5wdXNoKFxuICAgICAgLi4ubGVnYWN5UGx1Z2luKHtcbiAgICAgICAgdGFyZ2V0czogKG9wdGlvbnMuY29uZmlnLmJ1aWxkLmJyb3dzZXJzbGlzdCBhcyBzdHJpbmdbXSkgPz8gJ2RlZmF1bHRzJyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwYWdlcyA9IE9iamVjdC5rZXlzKG9wdGlvbnMuc2V0dGluZ3MuZ2FtZXMpLm1hcCgoZ2FtZUlkKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lOiBgJHtnYW1lSWR9Lmh0bWxgLFxuICAgICAgdGVtcGxhdGU6IGAke2dhbWVJZH0uaHRtbGAsXG4gICAgfTtcbiAgfSk7XG5cbiAgcGx1Z2lucy5wdXNoKFxuICAgIC8vIE1pbmlmeSBpbWFnZSBhc3NldHNcbiAgICBpbWFnZW1pblBsdWdpbihvcHRpb25zLmVudmlyb25tZW50LCBvcHRpb25zLmNvbmZpZy5idWlsZC5pbWFnZVF1YWxpdHkpLFxuXG4gICAgLy8gTWFrZSB0aGUgaHRtbCBvdXRwdXQgc21hbGxlclxuICAgIC4uLihjcmVhdGVIdG1sUGx1Z2luKHttaW5pZnk6IHRydWUsIHBhZ2VzfSkgYXMgUGx1Z2luW10pLFxuXG4gICAgLy8gQWRkIGEgYmFubmVyIHRvIGdlbmVyYXRlZCBqcy9jc3NcbiAgICBiYW5uZXJQbHVnaW4oXG4gICAgICBgXG4gICAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLlxuXG4gICAgICAgICBfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAgICAgIF8gICAgICAgICAgICBfXG4gICAgICAgIC8gICkgICAgICAgICAgICAgIHwgIG8gICAgICAgICAvfCAgIC8gfCB8ICAgICAgICAgIHwgfFxuICAgICAgICBcXFxcX18gX3xfICAgICAgICAgX198ICAgICAgX18gICAgIHxfXy8gIHwgfCAgX18gICBfICB8IHxcbiAgICAgICAgICAgXFxcXCB8ICB8ICAgfCAgLyAgfCAgfCAgLyAgXFxcXF8gICB8IFxcXFwgICB8LyAgLyAgXFxcXF98LyAgfC9fKVxuICAgICAgIChfX18vIHxfLyBcXFxcXy98Xy9cXFxcXy98Xy98Xy9cXFxcX18vICAgIHwgIFxcXFxfL3xfXy9cXFxcX18vIHxfXy98IFxcXFxfL1xuXG4gICAgICAgIENvbmNlcHQsIG9udHdlcnAgJiBvbnR3aWtrZWxpbmdcbiAgICAgICAgaHR0cHM6Ly9zdHVkaW9rbG9lay5ubFxuXG4gICAgICAgIFN0dWRpbyBLbG9layDinaQgUGl4aUpTLCBHU0FQICYgaG93bGVyLmpzXG5cbiAgICAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuXG5cbiAgICBgLFxuICAgICksXG4gICk7XG5cbiAgLy8gQ3JlYXRlIGEgbWFuaWZlc3QgYW5kIG1pbmltYWwgd2Vid29ya2VyIGZvciBldmVyeSBnYW1lXG4gIGlmIChvcHRpb25zLmNvbmZpZy5idWlsZC5tYW5pZmVzdCkge1xuICAgIHBsdWdpbnMucHVzaChtYW5pZmVzdFBsdWdpbihvcHRpb25zLnNldHRpbmdzLmdhbWVzKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5jb25maWcuYnVpbGQuYW5hbHl6ZUJ1bmRsZSkge1xuICAgIHBsdWdpbnMucHVzaCh2aXN1YWxpemVyKHtcbiAgICAgIHRlbXBsYXRlOiBcInRyZWVtYXBcIiwgLy8gb3Igc3VuYnVyc3RcbiAgICAgIG9wZW46IHRydWUsXG4gICAgICBnemlwU2l6ZTogdHJ1ZSxcbiAgICAgIGZpbGVuYW1lOiBcImJ1bmRsZS1hbmFseXNlLmh0bWxcIiwgLy8gd2lsbCBiZSBzYXZlZCBpbiBwcm9qZWN0J3Mgcm9vdFxuICAgIH0pIGFzIFBsdWdpbk9wdGlvbik7XG4gIH1cblxuICByZXR1cm4gcGx1Z2lucy5maWx0ZXIocGx1Z2luID0+IHBsdWdpbiAhPT0gdW5kZWZpbmVkKTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge3R5cGUgUGx1Z2luLCB0eXBlIFBsdWdpbk9wdGlvbn0gZnJvbSAndml0ZSc7XG5pbXBvcnQgZnVsbFJlbG9hZCBmcm9tICd2aXRlLXBsdWdpbi1mdWxsLXJlbG9hZCc7XG5pbXBvcnQgbWtjZXJ0IGZyb20gJ3ZpdGUtcGx1Z2luLW1rY2VydCc7XG5pbXBvcnQgY2hlY2tlciBmcm9tICd2aXRlLXBsdWdpbi1jaGVja2VyJztcbmltcG9ydCB7Y3dkfSBmcm9tICcuLi91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gc2VydmVQbHVnaW5zKCk6IEFycmF5PFBsdWdpbiB8IFBsdWdpbk9wdGlvbj4ge1xuICByZXR1cm4gW1xuICAgIGZ1bGxSZWxvYWQoWydzY3JpcHQvKiovKi50cycsICdzdmVsdGUvKiovKi5zdmVsdGUnXSwge1xuICAgICAgcm9vdDogcGF0aC5qb2luKHBhdGgucmVzb2x2ZShjd2QpLCAnc291cmNlJyksXG4gICAgICBsb2c6IHRydWUsXG4gICAgICBhbHdheXM6IHRydWUsXG4gICAgfSkgYXMgUGx1Z2luLFxuXG4gICAgbWtjZXJ0KCksXG5cbiAgICBjaGVja2VyKHtcbiAgICAgIHR5cGVzY3JpcHQ6IHRydWUsXG4gICAgfSksXG4gIF07XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgdHlwZSB7Q29uZmlnRW52LCBVc2VyQ29uZmlnfSBmcm9tICd2aXRlJztcbmltcG9ydCB7YmFzZVBsdWdpbnN9IGZyb20gJy4vcGx1Z2lucy9iYXNlJztcbmltcG9ydCB7YnVpbGRQbHVnaW5zfSBmcm9tICcuL3BsdWdpbnMvYnVpbGQnO1xuaW1wb3J0IHtzZXJ2ZVBsdWdpbnN9IGZyb20gJy4vcGx1Z2lucy9zZXJ2ZSc7XG5pbXBvcnQge1xuICBjd2QsXG4gIGRlZmluZUJ1aWxkQ29uZmlnLFxuICBnZXRQYWdlVG9TZXJ2ZSxcbiAgcGFyc2VQYWNrYWdlR2FtZXNTZXR0aW5ncyxcbiAgcmVhZEpTT04sXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHR5cGUge1xuICBLbG9la1ZpdGVDb25maWcsXG4gIFBhY2thZ2VHYW1lc1NldHRpbmdzLFxuICBWaXRlT3B0aW9ucyxcbn0gZnJvbSAnLi91dGlscy9pbnRlcmZhY2VzJztcblxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWZpbmVLbG9la1ZpdGVDb25maWcoXG4gIGVudmlyb25tZW50OiBDb25maWdFbnYsXG4pOiBQcm9taXNlPFVzZXJDb25maWc+IHtcbiAgY29uc3QgcGtnID0gcmVhZEpTT04ocGF0aC5yZXNvbHZlKGN3ZCwgJ3BhY2thZ2UuanNvbicpKSBhcyBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHVua25vd25cbiAgPjtcbiAgY29uc3Qga2xvZWtDb25maWcgPSBwa2cudml0ZSBhcyBLbG9la1ZpdGVDb25maWc7XG4gIGNvbnN0IGJyb3dzZXJzbGlzdCA9IHBrZy5icm93c2Vyc2xpc3QgYXMgc3RyaW5nIHwgc3RyaW5nW107XG4gIGNvbnN0IG9wdGlvbnM6IFZpdGVPcHRpb25zID0ge1xuICAgIHJvb3Q6IHBhdGgucmVzb2x2ZShjd2QsICdzb3VyY2UnKSxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBzZXR0aW5nczogcGFyc2VQYWNrYWdlR2FtZXNTZXR0aW5ncyhwa2cuc2V0dGluZ3MgYXMgUGFja2FnZUdhbWVzU2V0dGluZ3MpLFxuICAgIGNvbmZpZzoge1xuICAgICAgLi4ua2xvZWtDb25maWcsXG4gICAgICBidWlsZDogey4uLmtsb2VrQ29uZmlnLmJ1aWxkLCBicm93c2Vyc2xpc3R9LFxuICAgICAgc2VydmU6IHtcbiAgICAgICAgcGFydGlhbHM6IFtcbiAgICAgICAgICBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAncGFydGlhbHMnKSxcbiAgICAgICAgICBwYXRoLnJlc29sdmUoY3dkLCAnc291cmNlJywgJ3BhcnRpYWxzJyksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgY29uZmlnOiBVc2VyQ29uZmlnID0ge1xuICAgIGxvZ0xldmVsOiAnaW5mbycsXG4gICAgYmFzZToga2xvZWtDb25maWcuYnVpbGQuYmFzZVBhdGgsXG4gICAgcm9vdDogb3B0aW9ucy5yb290LFxuICAgIGVudkRpcjogcGF0aC5yZXNvbHZlKGN3ZCwgJ2VudicpLFxuICAgIGVudlByZWZpeDogWydLTE9FS18nLCAnVklURV8nXSxcbiAgICBwdWJsaWNEaXI6ICdzdGF0aWMnLFxuICAgIGRlZmluZToge30sXG5cbiAgICBlc2J1aWxkOiB7XG4gICAgICBsZWdhbENvbW1lbnRzOiAnbm9uZScsXG4gICAgfSxcblxuICAgIHJlc29sdmU6IHtcbiAgICAgIGFsaWFzOiB7XG4gICAgICAgIGxvZGFzaDogJ2xvZGFzaC1lcycsXG4gICAgICAgICdAbWV0YSc6IHBhdGgucmVzb2x2ZShjd2QsICdzb3VyY2UnLCAnc3RhdGljJywgJ21ldGEnKSxcbiAgICAgICAgJ0Bmb250cyc6IHBhdGgucmVzb2x2ZShjd2QsICdzb3VyY2UnLCAnc3RhdGljJywgJ2ZvbnRzJyksXG4gICAgICB9LFxuICAgICAgZGVkdXBlOiBbICAgICAgICAgICAgXG4gICAgICAgICdAc3R1ZGlva2xvZWsvdHMtY29yZS1saWInLFxuICAgICAgICAnQGNhcGFjaXRvci9hcHAnLFxuICAgICAgICAnQGNhcGFjaXRvci9hcHAnLFxuICAgICAgICAnQGNhcGFjaXRvci9jb3JlJyxcbiAgICAgICAgJ0BjYXBhY2l0b3IvZGV2aWNlJyxcbiAgICAgICAgJ0BjYXBhY2l0b3IvbmV0d29yaycsXG4gICAgICAgICdAY2FwYWNpdG9yL3ByZWZlcmVuY2VzJyxcbiAgICAgICAgJ0BjYXBhY2l0b3Ivc3BsYXNoLXNjcmVlbicsXG4gICAgICAgICdAY2FwYWNpdG9yL3N0YXR1cy1iYXInLFxuICAgICAgICAnYm93c2VyJyxcbiAgICAgICAgJ2RhdGUtZm5zLXR6JyxcbiAgICAgICAgJ2RhdGUtZm5zJyxcbiAgICAgICAgJ2Vycm9yLXN0YWNrLXBhcnNlci1lcycsXG4gICAgICAgICdmaXJlYmFzZScsXG4gICAgICAgICdmb250ZmFjZW9ic2VydmVyJyxcbiAgICAgICAgJ2dzYXAnLFxuICAgICAgICAnaG93bGVyJyxcbiAgICAgICAgJ2xvZGFzaC1kZWNvcmF0b3JzLWVzbScsXG4gICAgICAgICdsb2Rhc2gtZXMnLFxuICAgICAgICAnb3Zlcm1pbmQnLFxuICAgICAgICAncGl4aS1zcGluZScsXG4gICAgICAgICdwaXhpLmpzJyxcbiAgICAgICAgJ3B1YnN1Yi1qcycsXG4gICAgICAgICdyYW5kb20tanMnLFxuICAgICAgICAncmVzcycsXG4gICAgICAgICdzbHVnaWZ5JyxcbiAgICAgICAgJ3N1cGVyYWdlbnQnLFxuICAgICAgICAndHMtZXZlbnRzJyxcbiAgICAgICAgJ3RzLW1peGVyJyxcbiAgICAgICAgJ3RzbGliJyxcbiAgICAgIF0sXG4gICAgfSxcblxuICAgIGNzczoge1xuICAgICAgcHJlcHJvY2Vzc29yT3B0aW9uczoge1xuICAgICAgICBzY3NzOiB7XG4gICAgICAgICAgY2hhcnNldDogZmFsc2UsXG4gICAgICAgICAgLy8gQWRkaXRpb25hbERhdGE6IGBAY2hhcnNldCBcIlVURi04XCJgLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgcGx1Z2luczogWy4uLmJhc2VQbHVnaW5zKG9wdGlvbnMpXSxcbiAgfTtcblxuICBzd2l0Y2ggKGVudmlyb25tZW50LmNvbW1hbmQpIHtcbiAgICBjYXNlICdzZXJ2ZSc6XG4gICAgICBjb25maWcuc2VydmVyID0ge1xuICAgICAgICBob3N0OiB0cnVlLFxuICAgICAgICBjb3JzOiBvcHRpb25zLmNvbmZpZy5kZXYuY29ycyA/PyB0cnVlLFxuICAgICAgICBodHRwczogb3B0aW9ucy5jb25maWcuZGV2Lmh0dHBzID8/IHRydWUsXG4gICAgICAgIG9wZW46IGdldFBhZ2VUb1NlcnZlKG9wdGlvbnMuY29uZmlnLCBvcHRpb25zLnNldHRpbmdzLmdhbWVzKSxcbiAgICAgIH07XG4gICAgICBjb25maWcucGx1Z2lucyA9IFtcbiAgICAgICAgLi4uKGNvbmZpZy5wbHVnaW5zID8gY29uZmlnLnBsdWdpbnMgOiBbXSksXG4gICAgICAgIC4uLnNlcnZlUGx1Z2lucygpLFxuICAgICAgXTtcblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdidWlsZCc6XG4gICAgICBjb25maWcuYnVpbGQgPSBkZWZpbmVCdWlsZENvbmZpZyhvcHRpb25zKTtcbiAgICAgIGNvbmZpZy5wbHVnaW5zID0gW1xuICAgICAgICAuLi4oY29uZmlnLnBsdWdpbnMgPyBjb25maWcucGx1Z2lucyA6IFtdKSxcbiAgICAgICAgLi4uYnVpbGRQbHVnaW5zKG9wdGlvbnMpLFxuICAgICAgXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG4iLCJpbXBvcnQge3R5cGUgVHlwZWRGbGFnc30gZnJvbSAnbWVvdyc7XG5pbXBvcnQge2J1aWxkLCBjcmVhdGVTZXJ2ZXJ9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHtkZWZpbmVLbG9la1ZpdGVDb25maWd9IGZyb20gJy4vY29uZmlnJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtsb2VrRGV2ZWxvcG1lbnQoXG4gIGZsYWdzOiBUeXBlZEZsYWdzPHtcbiAgICBtb2RlOiB7XG4gICAgICB0eXBlOiAnc3RyaW5nJztcbiAgICAgIHNob3J0RmxhZzogc3RyaW5nO1xuICAgICAgZGVmYXVsdD86IHN0cmluZztcbiAgICB9O1xuICB9Pixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBkZWZpbmVLbG9la1ZpdGVDb25maWcoe1xuICAgIGNvbW1hbmQ6ICdzZXJ2ZScsXG4gICAgbW9kZTogJ2RldmVsb3BtZW50JyxcbiAgfSk7XG5cbiAgLy8gRGlmZmVyZW50IG1vZGVcbiAgaWYgKHR5cGVvZiBmbGFncy5tb2RlID09PSAnc3RyaW5nJykge1xuICAgIGNvbmZpZy5tb2RlID0gZmxhZ3MubW9kZTtcbiAgfVxuXG4gIGNvbnN0IHNlcnZlciA9IGF3YWl0IGNyZWF0ZVNlcnZlcih7XG4gICAgY29uZmlnRmlsZTogZmFsc2UsXG4gICAgLi4uY29uZmlnLFxuICB9KTtcblxuICBhd2FpdCBzZXJ2ZXIubGlzdGVuKCk7XG4gIHNlcnZlci5wcmludFVybHMoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtsb2VrQnVpbGQoXG4gIGZsYWdzOiBUeXBlZEZsYWdzPHtcbiAgICBlbXB0eU91dERpcjoge1xuICAgICAgdHlwZTogJ2Jvb2xlYW4nO1xuICAgICAgc2hvcnRGbGFnOiBzdHJpbmc7XG4gICAgICBkZWZhdWx0OiB0cnVlO1xuICAgIH07XG4gICAgYmFzZToge1xuICAgICAgdHlwZTogJ3N0cmluZyc7XG4gICAgICBzaG9ydEZsYWc6IHN0cmluZztcbiAgICAgIGRlZmF1bHQ6IHN0cmluZztcbiAgICB9O1xuICAgIG1vZGU6IHtcbiAgICAgIHR5cGU6ICdzdHJpbmcnO1xuICAgICAgc2hvcnRGbGFnOiBzdHJpbmc7XG4gICAgICBkZWZhdWx0Pzogc3RyaW5nO1xuICAgIH07XG4gIH0+LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGRlZmluZUtsb2VrVml0ZUNvbmZpZyh7XG4gICAgY29tbWFuZDogJ2J1aWxkJyxcbiAgICBtb2RlOiAncHJvZHVjdGlvbicsXG4gIH0pO1xuXG4gIC8vIEVtcHR5IG91dCB0aGUgT3V0cHV0IGRpciBiZWZvcmUgYnVpbGRpbmc/XG4gIGlmIChmbGFncy5lbXB0eU91dERpciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLmJ1aWxkID0ge1xuICAgICAgLi4uY29uZmlnLmJ1aWxkLFxuICAgICAgZW1wdHlPdXREaXI6IGZsYWdzLmVtcHR5T3V0RGlyLFxuICAgIH07XG4gIH1cblxuICAvLyBEaWZmZXJlbnQgYmFzZSBwYXRoXG4gIGlmICh0eXBlb2YgZmxhZ3MuYmFzZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25maWcuYmFzZSA9IGZsYWdzLmJhc2U7XG4gIH1cblxuICAvLyBEaWZmZXJlbnQgbW9kZVxuICBpZiAodHlwZW9mIGZsYWdzLm1vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnLm1vZGUgPSBmbGFncy5tb2RlO1xuICB9XG5cbiAgYXdhaXQgYnVpbGQoe1xuICAgIGNvbmZpZ0ZpbGU6IGZhbHNlLFxuICAgIC4uLmNvbmZpZyxcbiAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsU0FBUyxpQkFBaUIsQ0FDeEIsT0FBcUIsRUFDckIsSUFBa0IsRUFDbEIsU0FBaUMsRUFBQTtJQUVqQyxNQUFNLFFBQVEsR0FBNEIsRUFBRSxDQUFDOztBQUc3QyxJQUFBLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFO1FBQ2hDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRztZQUNuQixHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDcEIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2xCLENBQUM7QUFDSCxLQUFBO0FBRUQsSUFBQSxPQUFPLFFBQW1DLENBQUM7QUFDN0MsQ0FBQztBQUVLLFNBQVUseUJBQXlCLENBQ3ZDLGVBQXFDLEVBQUE7O0lBR3JDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQzNCLGVBQWUsQ0FBQyxPQUFPLENBQ0UsQ0FBQztBQUM1QixJQUFBLE1BQU0sRUFBQyxP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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>;
@@ -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
- };