@nlabs/lex 1.52.6 → 1.52.10

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.
@@ -1,6 +1,6 @@
1
1
  // Mock implementation of LexConfig
2
2
  const defaultConfigValues = {
3
- bundler: 'webpack',
3
+ bundler: 'swc',
4
4
  useTypescript: false,
5
5
  useGraphQl: false,
6
6
  targetEnvironment: 'web',
@@ -109,8 +109,6 @@ export const buildWithSWC = async (spinner, commandOptions, callback)=>{
109
109
  };
110
110
  export const buildWithWebpack = async (spinner, cmd, callback)=>{
111
111
  const { analyze, cliName = 'Lex', config, configName, defineProcessEnvNodeEnv, devtool, disableInterpret, entry, env, failOnWarnings, json, merge, mode, name, nodeEnv, noDevtool, noStats, noTarget, noWatch, noWatchOptionsStdin, outputPath, quiet = false, stats, target, watch, watchOptionsStdin } = cmd;
112
- console.log('entry:', entry, 'type:', typeof entry);
113
- console.log('outputPath:', outputPath, 'type:', typeof outputPath);
114
112
  const entryValue = Array.isArray(entry) ? entry[0] : entry;
115
113
  let webpackConfig;
116
114
  if (config) {
@@ -127,8 +125,6 @@ export const buildWithWebpack = async (spinner, cmd, callback)=>{
127
125
  webpackConfig = resolvedConfig;
128
126
  }
129
127
  }
130
- console.log('webpackConfig path:', webpackConfig);
131
- console.log('webpackConfig exists:', existsSync(webpackConfig));
132
128
  if (!existsSync(webpackConfig)) {
133
129
  const lexPackagePath = getLexPackageJsonPath();
134
130
  const lexPackageDir = dirname(lexPackagePath);
@@ -192,10 +188,6 @@ export const buildWithWebpack = async (spinner, cmd, callback)=>{
192
188
  ...webpackOptions
193
189
  ];
194
190
  }
195
- console.log('webpackPath:', webpackPath);
196
- console.log('executablePath:', executablePath);
197
- console.log('finalWebpackOptions:', JSON.stringify(finalWebpackOptions));
198
- console.log('finalWebpackOptions type:', Array.isArray(finalWebpackOptions) ? 'Array' : typeof finalWebpackOptions);
199
191
  const childProcess = execa(executablePath, finalWebpackOptions, {
200
192
  encoding: 'utf8',
201
193
  stdio: 'pipe'
@@ -398,8 +390,6 @@ What are the key optimization opportunities for this build configuration? Consid
398
390
  all: true
399
391
  });
400
392
  if (result.exitCode !== 0) {
401
- // TypeScript may have errors but still generate some declarations
402
- // Log warnings but don't fail if declarations were generated
403
393
  const hasDeclarations = result.all?.includes('Writing') || result.all?.includes('Declaration') || false;
404
394
  const errorOutput = result.stderr || result.stdout || result.all || 'Unknown error';
405
395
  if (!hasDeclarations) {
@@ -450,4 +440,4 @@ What are the key optimization opportunities for this build configuration? Consid
450
440
  };
451
441
  export default build;
452
442
 
453
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQge2V4ZWNhfSBmcm9tICdleGVjYSc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCB7XG4gIGRpcm5hbWUsXG4gIHJlbGF0aXZlIGFzIHBhdGhSZWxhdGl2ZSxcbiAgcmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZVxufSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NoZWNrTGlua2VkTW9kdWxlcywgY29weUNvbmZpZ3VyZWRGaWxlcywgY3JlYXRlU3Bpbm5lciwgY3JlYXRlUHJvZ3Jlc3NCYXIsIGhhbmRsZVdlYnBhY2tQcm9ncmVzcywgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlV2VicGFja1BhdGhzLFxuICBnZXRMZXhQYWNrYWdlSnNvblBhdGgsXG4gIHJlc29sdmVCaW5hcnlQYXRoXG59IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQge3Byb2Nlc3NUcmFuc2xhdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3RyYW5zbGF0aW9ucy5qcyc7XG5pbXBvcnQge2FpRnVuY3Rpb259IGZyb20gJy4uL2FpL2FpLmpzJztcbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5pbXBvcnQgdHlwZSB7U1dDT3B0aW9uc30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcblxubGV0IGN1cnJlbnRGaWxlbmFtZTogc3RyaW5nO1xubGV0IGN1cnJlbnREaXJuYW1lOiBzdHJpbmc7XG5cbnRyeSB7XG4gIGN1cnJlbnRGaWxlbmFtZSA9IGV2YWwoJ3JlcXVpcmUoXCJ1cmxcIikuZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpJyk7XG4gIGN1cnJlbnREaXJuYW1lID0gZGlybmFtZShjdXJyZW50RmlsZW5hbWUpO1xufSBjYXRjaCB7XG4gIGN1cnJlbnRGaWxlbmFtZSA9IHByb2Nlc3MuY3dkKCk7XG4gIGN1cnJlbnREaXJuYW1lID0gcHJvY2Vzcy5jd2QoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICByZWFkb25seSBhc3Npc3Q/OiBib29sZWFuO1xuICByZWFkb25seSBhbmFseXplPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYnVuZGxlcj86ICd3ZWJwYWNrJyB8ICdzd2MnO1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBlbnRyeT86IHN0cmluZztcbiAgcmVhZG9ubHkgZm9ybWF0Pzogc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXRQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xuICByZWFkb25seSB0cmFuc2xhdGlvbnM/OiBib29sZWFuO1xuICByZWFkb25seSB2YXJpYWJsZXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdhdGNoPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRDYWxsYmFjayA9IChzdGF0dXM6IG51bWJlcikgPT4gdm9pZDtcblxuY29uc3QgZGlzcGxheUJ1aWxkU3RhdHVzID0gKGJ1bmRsZXI6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nLCBxdWlldDogYm9vbGVhbiwgc3RhdHM/OiB7bW9kdWxlcz86IG51bWJlcjsgYXNzZXRzPzogbnVtYmVyOyBzaXplPzogc3RyaW5nfSkgPT4ge1xuICBpZihxdWlldCkgcmV0dXJuO1xuXG4gIGxldCBzdGF0c0luZm8gPSAnJztcbiAgaWYoc3RhdHMgJiYgc3RhdHMubW9kdWxlcyAmJiBzdGF0cy5hc3NldHMpIHtcbiAgICBzdGF0c0luZm8gPSBgXFxuJHtjaGFsay5ncmVlbignTW9kdWxlczonKX0gICAgJHtjaGFsay5jeWFuKHN0YXRzLm1vZHVsZXMpfVxcbmAgK1xuICAgICAgYCR7Y2hhbGsuZ3JlZW4oJ0Fzc2V0czonKX0gICAgICR7Y2hhbGsuY3lhbihzdGF0cy5hc3NldHMpfVxcbmAgK1xuICAgICAgYCR7Y2hhbGsuZ3JlZW4oJ1NpemU6Jyl9ICAgICAgICR7Y2hhbGsuY3lhbihzdGF0cy5zaXplKX1cXG5gO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzQm94ID0gYm94ZW4oXG4gICAgYCR7Y2hhbGsuY3lhbi5ib2xkKCfwn4+X77iPICBCdWlsZCBDb21wbGV0ZWQgU3VjY2Vzc2Z1bGx5ICcpfVxcblxcbmAgK1xuICAgIGAke2NoYWxrLmdyZWVuKCdCdW5kbGVyOicpfSAgICAke2NoYWxrLmN5YW4oYnVuZGxlcil9XFxuYCArXG4gICAgYCR7Y2hhbGsuZ3JlZW4oJ091dHB1dDonKX0gICAgICR7Y2hhbGsudW5kZXJsaW5lKG91dHB1dFBhdGgpfSR7c3RhdHNJbmZvfVxcbmAgK1xuICAgIGAke2NoYWxrLnllbGxvdygnUmVhZHkgZm9yIGRlcGxveW1lbnQhIPCfmoAnKX1gLFxuICAgIHtcbiAgICAgIHBhZGRpbmc6IDEsXG4gICAgICBtYXJnaW46IDEsXG4gICAgICBib3JkZXJTdHlsZTogJ3JvdW5kJyxcbiAgICAgIGJvcmRlckNvbG9yOiAnZ3JlZW4nLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzFhMWExYSdcbiAgICB9XG4gICk7XG5cbiAgY29uc29sZS5sb2coJ1xcbicgKyBzdGF0dXNCb3ggKyAnXFxuJyk7XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbGRXaXRoU1dDID0gYXN5bmMgKHNwaW5uZXIsIGNvbW1hbmRPcHRpb25zOiBCdWlsZE9wdGlvbnMsIGNhbGxiYWNrOiBCdWlsZENhbGxiYWNrKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgZm9ybWF0ID0gJ2VzbScsXG4gICAgb3V0cHV0UGF0aCxcbiAgICBxdWlldCxcbiAgICBzb3VyY2VQYXRoLFxuICAgIHdhdGNoXG4gIH0gPSBjb21tYW5kT3B0aW9ucztcbiAgY29uc3Qge1xuICAgIG91dHB1dEZ1bGxQYXRoLFxuICAgIHNvdXJjZUZ1bGxQYXRoLFxuICAgIHN3Yzogc3djQ29uZmlnLFxuICAgIHRhcmdldEVudmlyb25tZW50LFxuICAgIHVzZUdyYXBoUWwsXG4gICAgdXNlVHlwZXNjcmlwdFxuICB9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3Qgc291cmNlRGlyOiBzdHJpbmcgPSBzb3VyY2VQYXRoID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgYC4vJHtzb3VyY2VQYXRofWApIDogc291cmNlRnVsbFBhdGggfHwgJyc7XG5cbiAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7XG4gICAgYWJzb2x1dGU6IHRydWUsXG4gICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgZG90OiBmYWxzZSxcbiAgICBub2RpcjogdHJ1ZSxcbiAgICBub3NvcnQ6IHRydWVcbiAgfTtcbiAgY29uc3QgdHNGaWxlczogc3RyaW5nW10gPSBnbG9iU3luYyhgKiovISgqLnNwZWN8Ki50ZXN0KS50cypgLCBnbG9iT3B0aW9ucyk7XG4gIGNvbnN0IGpzRmlsZXM6IHN0cmluZ1tdID0gZ2xvYlN5bmMoYCoqLyEoKi5zcGVjfCoudGVzdCkuanNgLCBnbG9iT3B0aW9ucyk7XG4gIGNvbnN0IHNvdXJjZUZpbGVzOiBzdHJpbmdbXSA9IFsuLi50c0ZpbGVzLCAuLi5qc0ZpbGVzXTtcblxuICBjb25zdCBvdXRwdXREaXI6IHN0cmluZyA9IG91dHB1dFBhdGhcbiAgICA/IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksIG91dHB1dFBhdGgpXG4gICAgOiAob3V0cHV0RnVsbFBhdGggfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4vbGliJykpO1xuXG4gIHRyeSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQnVpbGRpbmcgd2l0aCBTV0MuLi4nKTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybVByb21pc2VzID0gc291cmNlRmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUmVsYXRpdmVUb1NvdXJjZSA9IHBhdGhSZWxhdGl2ZShzb3VyY2VEaXIsIGZpbGUpO1xuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IGZpbGU7IC8vIGZpbGUgaXMgYWxyZWFkeSBhYnNvbHV0ZVxuICAgICAgY29uc3Qgb3V0cHV0RmlsZSA9IGZpbGVSZWxhdGl2ZVRvU291cmNlLnJlcGxhY2UoL1xcLih0c3x0c3gpJC8sICcuanMnKTtcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoUmVzb2x2ZShvdXRwdXREaXIsIG91dHB1dEZpbGUpO1xuICAgICAgY29uc3Qgb3V0cHV0RGlyUGF0aCA9IGRpcm5hbWUob3V0cHV0UGF0aCk7XG5cbiAgICAgIGlmKCFleGlzdHNTeW5jKG91dHB1dERpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IHtta2RpclN5bmN9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgICAgICBta2RpclN5bmMob3V0cHV0RGlyUGF0aCwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VDb2RlID0gcmVhZEZpbGVTeW5jKHNvdXJjZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBzd2NPcHRpb25zID0ge1xuICAgICAgICAuLi5zd2NDb25maWcsXG4gICAgICAgIGZpbGVuYW1lOiBmaWxlLFxuICAgICAgICBtb2R1bGU6IHtcbiAgICAgICAgICB0eXBlOiBmb3JtYXQgPT09ICdjanMnID8gJ2NvbW1vbmpzJyBhcyBjb25zdCA6IChzd2NDb25maWc/Lm1vZHVsZT8udHlwZSBhcyAnZXM2JyB8fCAnZXM2JyksXG4gICAgICAgICAgLi4uc3djQ29uZmlnPy5tb2R1bGVcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgUGFydGlhbDxTV0NPcHRpb25zPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3JtKHNvdXJjZUNvZGUsIHN3Y09wdGlvbnMpO1xuXG4gICAgICBjb25zdCB7d3JpdGVGaWxlU3luY30gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgICB3cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIHJlc3VsdC5jb2RlKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHRyYW5zZm9ybVByb21pc2VzKTtcblxuICAgIHNwaW5uZXIuc3VjY2VlZCgnQnVpbGQgY29tcGxldGVkIHdpdGggU1dDJyk7XG4gICAgZGlzcGxheUJ1aWxkU3RhdHVzKCdTV0MnLCBvdXRwdXREaXIsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjb21tYW5kT3B0aW9ucy5jbGlOYW1lIHx8ICdMZXgnfSBFcnJvcjogU1dDIGJ1aWxkIGZhaWxlZGAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBsb2coYFxcbkVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgaWYoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYoZXJyb3Iuc3RhY2spIHtcbiAgICAgICAgbG9nKGBcXG5TdGFjayBUcmFjZTpcXG4ke2Vycm9yLnN0YWNrfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIH1cblxuICAgICAgaWYoJ2ZpbGVuYW1lJyBpbiBlcnJvciB8fCAnZmlsZScgaW4gZXJyb3IpIHtcbiAgICAgICAgbG9nKGBcXG5GaWxlOiAkeyhlcnJvciBhcyBhbnkpLmZpbGVuYW1lIHx8IChlcnJvciBhcyBhbnkpLmZpbGV9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNwaW5uZXIuZmFpbCgnQnVpbGQgZmFpbGVkIHdpdGggU1dDJyk7XG4gICAgaWYoIXF1aWV0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdcXG5GdWxsIEVycm9yIERldGFpbHM6JywgZXJyb3IpO1xuICAgIH1cbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkV2l0aFdlYnBhY2sgPSBhc3luYyAoc3Bpbm5lciwgY21kLCBjYWxsYmFjaykgPT4ge1xuICBjb25zdCB7XG4gICAgYW5hbHl6ZSxcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgY29uZmlnLFxuICAgIGNvbmZpZ05hbWUsXG4gICAgZGVmaW5lUHJvY2Vzc0Vudk5vZGVFbnYsXG4gICAgZGV2dG9vbCxcbiAgICBkaXNhYmxlSW50ZXJwcmV0LFxuICAgIGVudHJ5LFxuICAgIGVudixcbiAgICBmYWlsT25XYXJuaW5ncyxcbiAgICBqc29uLFxuICAgIG1lcmdlLFxuICAgIG1vZGUsXG4gICAgbmFtZSxcbiAgICBub2RlRW52LFxuICAgIG5vRGV2dG9vbCxcbiAgICBub1N0YXRzLFxuICAgIG5vVGFyZ2V0LFxuICAgIG5vV2F0Y2gsXG4gICAgbm9XYXRjaE9wdGlvbnNTdGRpbixcbiAgICBvdXRwdXRQYXRoLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgc3RhdHMsXG4gICAgdGFyZ2V0LFxuICAgIHdhdGNoLFxuICAgIHdhdGNoT3B0aW9uc1N0ZGluXG4gIH0gPSBjbWQ7XG5cbiAgY29uc29sZS5sb2coJ2VudHJ5OicsIGVudHJ5LCAndHlwZTonLCB0eXBlb2YgZW50cnkpO1xuICBjb25zb2xlLmxvZygnb3V0cHV0UGF0aDonLCBvdXRwdXRQYXRoLCAndHlwZTonLCB0eXBlb2Ygb3V0cHV0UGF0aCk7XG5cbiAgY29uc3QgZW50cnlWYWx1ZSA9IEFycmF5LmlzQXJyYXkoZW50cnkpID8gZW50cnlbMF0gOiBlbnRyeTtcblxuICBsZXQgd2VicGFja0NvbmZpZzogc3RyaW5nO1xuXG4gIGlmKGNvbmZpZykge1xuICAgIGNvbnN0IGlzUmVsYXRpdmVDb25maWc6IGJvb2xlYW4gPSBjb25maWcuc3Vic3RyKDAsIDIpID09PSAnLi8nO1xuICAgIHdlYnBhY2tDb25maWcgPSBpc1JlbGF0aXZlQ29uZmlnID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnKSA6IGNvbmZpZztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZy5qcycpO1xuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoVHMgPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcudHMnKTtcbiAgICBjb25zdCBoYXNQcm9qZWN0Q29uZmlnID0gZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkgfHwgZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aFRzKTtcblxuICAgIGlmKGhhc1Byb2plY3RDb25maWcpIHtcbiAgICAgIHdlYnBhY2tDb25maWcgPSBleGlzdHNTeW5jKHByb2plY3RDb25maWdQYXRoVHMpID8gcHJvamVjdENvbmZpZ1BhdGhUcyA6IHByb2plY3RDb25maWdQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7d2VicGFja0NvbmZpZzogcmVzb2x2ZWRDb25maWd9ID0gcmVzb2x2ZVdlYnBhY2tQYXRocyhjdXJyZW50RGlybmFtZSk7XG4gICAgICB3ZWJwYWNrQ29uZmlnID0gcmVzb2x2ZWRDb25maWc7XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coJ3dlYnBhY2tDb25maWcgcGF0aDonLCB3ZWJwYWNrQ29uZmlnKTtcbiAgY29uc29sZS5sb2coJ3dlYnBhY2tDb25maWcgZXhpc3RzOicsIGV4aXN0c1N5bmMod2VicGFja0NvbmZpZykpO1xuXG4gIGlmKCFleGlzdHNTeW5jKHdlYnBhY2tDb25maWcpKSB7XG4gICAgY29uc3QgbGV4UGFja2FnZVBhdGggPSBnZXRMZXhQYWNrYWdlSnNvblBhdGgoKTtcbiAgICBjb25zdCBsZXhQYWNrYWdlRGlyID0gZGlybmFtZShsZXhQYWNrYWdlUGF0aCk7XG4gICAgY29uc3QgbGV4V2VicGFja0NvbmZpZyA9IHBhdGhSZXNvbHZlKGxleFBhY2thZ2VEaXIsICd3ZWJwYWNrLmNvbmZpZy5qcycpO1xuXG4gICAgaWYoZXhpc3RzU3luYyhsZXhXZWJwYWNrQ29uZmlnKSkge1xuICAgICAgd2VicGFja0NvbmZpZyA9IGxleFdlYnBhY2tDb25maWc7XG4gICAgICBjb25zb2xlLmxvZygnVXNpbmcgTGV4IHdlYnBhY2sgY29uZmlnOicsIHdlYnBhY2tDb25maWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvdWxkIG5vdCBmaW5kIHdlYnBhY2suY29uZmlnLmpzYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdCdWlsZCBmYWlsZWQuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHdlYnBhY2tPcHRpb25zOiBzdHJpbmdbXSA9IFtcbiAgICAnLS1jb2xvcicsXG4gICAgJy0tcHJvZ3Jlc3MnLFxuICAgICctLWNvbmZpZycsIHdlYnBhY2tDb25maWdcbiAgXTtcblxuICBpZihhbmFseXplKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWFuYWx5emUnKTtcbiAgaWYoY29uZmlnTmFtZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1jb25maWdOYW1lJywgY29uZmlnTmFtZSk7XG4gIGlmKGRlZmluZVByb2Nlc3NFbnZOb2RlRW52KSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWRlZmluZVByb2Nlc3NFbnZOb2RlRW52JywgZGVmaW5lUHJvY2Vzc0Vudk5vZGVFbnYpO1xuICBpZihkZXZ0b29sKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWRldnRvb2wnLCBkZXZ0b29sKTtcbiAgaWYoZGlzYWJsZUludGVycHJldCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1kaXNhYmxlSW50ZXJwcmV0Jyk7XG4gIGlmKGVudHJ5VmFsdWUpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZW50cnknLCBlbnRyeVZhbHVlLnRvU3RyaW5nKCkpO1xuICBpZihlbnYpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZW52JywgZW52KTtcbiAgaWYoZmFpbE9uV2FybmluZ3MpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZmFpbE9uV2FybmluZ3MnKTtcbiAgaWYoanNvbikgd2VicGFja09wdGlvbnMucHVzaCgnLS1qc29uJywganNvbik7XG4gIGlmKG1vZGUpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbW9kZScsIG1vZGUpO1xuICBpZihtZXJnZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1tZXJnZScpO1xuICBpZihuYW1lKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5hbWUnLCBuYW1lKTtcbiAgaWYobm9EZXZ0b29sKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vRGV2dG9vbCcpO1xuICBpZihub1N0YXRzKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vU3RhdHMnKTtcbiAgaWYobm9UYXJnZXQpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9UYXJnZXQnKTtcbiAgaWYobm9XYXRjaCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub1dhdGNoJyk7XG4gIGlmKG5vV2F0Y2hPcHRpb25zU3RkaW4pIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9XYXRjaE9wdGlvbnNTdGRpbicpO1xuICBpZihub2RlRW52KSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vZGVFbnYnLCBub2RlRW52KTtcbiAgaWYob3V0cHV0UGF0aCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1vdXRwdXQtcGF0aCcsIG91dHB1dFBhdGgudG9TdHJpbmcoKSk7IC8vIENvbnZlcnQgdG8gc3RyaW5nXG4gIGlmKHN0YXRzKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLXN0YXRzJywgc3RhdHMpO1xuICBpZih0YXJnZXQpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tdGFyZ2V0JywgdGFyZ2V0KTtcbiAgaWYod2F0Y2gpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0td2F0Y2gnKTtcbiAgaWYod2F0Y2hPcHRpb25zU3RkaW4pIHdlYnBhY2tPcHRpb25zLnB1c2goJy0td2F0Y2hPcHRpb25zU3RkaW4nKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHt3ZWJwYWNrUGF0aH0gPSByZXNvbHZlV2VicGFja1BhdGhzKGN1cnJlbnREaXJuYW1lKTtcblxuICAgIGxldCBleGVjdXRhYmxlUGF0aCA9IHdlYnBhY2tQYXRoO1xuICAgIGxldCBmaW5hbFdlYnBhY2tPcHRpb25zOiBzdHJpbmdbXTtcblxuICAgIGlmKHdlYnBhY2tQYXRoID09PSAnbnB4Jykge1xuICAgICAgZmluYWxXZWJwYWNrT3B0aW9ucyA9IFsnd2VicGFjaycsIC4uLndlYnBhY2tPcHRpb25zXTtcbiAgICB9IGVsc2UgaWYod2VicGFja1BhdGguZW5kc1dpdGgoJy5qcycpKSB7XG4gICAgICBleGVjdXRhYmxlUGF0aCA9ICdub2RlJztcbiAgICAgIGZpbmFsV2VicGFja09wdGlvbnMgPSBbd2VicGFja1BhdGgsIC4uLndlYnBhY2tPcHRpb25zXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmluYWxXZWJwYWNrT3B0aW9ucyA9IFsuLi53ZWJwYWNrT3B0aW9uc107XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ3dlYnBhY2tQYXRoOicsIHdlYnBhY2tQYXRoKTtcbiAgICBjb25zb2xlLmxvZygnZXhlY3V0YWJsZVBhdGg6JywgZXhlY3V0YWJsZVBhdGgpO1xuICAgIGNvbnNvbGUubG9nKCdmaW5hbFdlYnBhY2tPcHRpb25zOicsIEpTT04uc3RyaW5naWZ5KGZpbmFsV2VicGFja09wdGlvbnMpKTtcbiAgICBjb25zb2xlLmxvZygnZmluYWxXZWJwYWNrT3B0aW9ucyB0eXBlOicsIEFycmF5LmlzQXJyYXkoZmluYWxXZWJwYWNrT3B0aW9ucykgPyAnQXJyYXknIDogdHlwZW9mIGZpbmFsV2VicGFja09wdGlvbnMpO1xuXG4gICAgY29uc3QgY2hpbGRQcm9jZXNzID0gZXhlY2EoZXhlY3V0YWJsZVBhdGgsIGZpbmFsV2VicGFja09wdGlvbnMsIHtlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnfSk7XG5cbiAgICBsZXQgYnVpbGRDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICBsZXQgYnVpbGRTdGF0cyA9IHtcbiAgICAgIG1vZHVsZXM6IDAsXG4gICAgICBhc3NldHM6IDAsXG4gICAgICBzaXplOiAnMCBCJ1xuICAgIH07XG5cbiAgICBjaGlsZFByb2Nlc3Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKTtcblxuICAgICAgaGFuZGxlV2VicGFja1Byb2dyZXNzKG91dHB1dCwgc3Bpbm5lciwgcXVpZXQsICfwn4+X77iPJywgJ1dlYnBhY2sgQnVpbGRpbmcnKTtcblxuICAgICAgaWYoIWJ1aWxkQ29tcGxldGVkICYmIG91dHB1dC5pbmNsdWRlcygnY29tcGlsZWQgc3VjY2Vzc2Z1bGx5JykpIHtcbiAgICAgICAgYnVpbGRDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0J1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJyk7XG5cbiAgICAgICAgY29uc3QgbW9kdWxlTWF0Y2ggPSBvdXRwdXQubWF0Y2goLyhcXGQrKSBtb2R1bGVzLyk7XG4gICAgICAgIGNvbnN0IGFzc2V0TWF0Y2ggPSBvdXRwdXQubWF0Y2goLyhcXGQrKSBhc3NldHMvKTtcbiAgICAgICAgY29uc3Qgc2l6ZU1hdGNoID0gb3V0cHV0Lm1hdGNoKC9hc3NldHMgYnkgc3RhdHVzIChbXFxkLl0rIFxcdyspLykgfHwgb3V0cHV0Lm1hdGNoKC9hc3NldHMgYnkgcGF0aC4qPyhbXFxkLl0rIFxcdyspLyk7XG5cbiAgICAgICAgaWYobW9kdWxlTWF0Y2gpIGJ1aWxkU3RhdHMubW9kdWxlcyA9IHBhcnNlSW50KG1vZHVsZU1hdGNoWzFdLCAxMCk7XG4gICAgICAgIGlmKGFzc2V0TWF0Y2gpIGJ1aWxkU3RhdHMuYXNzZXRzID0gcGFyc2VJbnQoYXNzZXRNYXRjaFsxXSwgMTApO1xuICAgICAgICBpZihzaXplTWF0Y2gpIGJ1aWxkU3RhdHMuc2l6ZSA9IHNpemVNYXRjaFsxXTtcblxuICAgICAgICBkaXNwbGF5QnVpbGRTdGF0dXMoJ3dlYnBhY2snLCBMZXhDb25maWcuY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8ICdsaWInLCBxdWlldCwgYnVpbGRTdGF0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZFByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKTtcblxuICAgICAgaGFuZGxlV2VicGFja1Byb2dyZXNzKG91dHB1dCwgc3Bpbm5lciwgcXVpZXQsICfwn4+X77iPJywgJ1dlYnBhY2sgQnVpbGRpbmcnKTtcblxuICAgICAgaWYoIWJ1aWxkQ29tcGxldGVkICYmIG91dHB1dC5pbmNsdWRlcygnY29tcGlsZWQgc3VjY2Vzc2Z1bGx5JykpIHtcbiAgICAgICAgYnVpbGRDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0J1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJyk7XG5cbiAgICAgICAgY29uc3QgbW9kdWxlTWF0Y2ggPSBvdXRwdXQubWF0Y2goLyhcXGQrKSBtb2R1bGVzLyk7XG4gICAgICAgIGNvbnN0IGFzc2V0TWF0Y2ggPSBvdXRwdXQubWF0Y2goLyhcXGQrKSBhc3NldHMvKTtcbiAgICAgICAgY29uc3Qgc2l6ZU1hdGNoID0gb3V0cHV0Lm1hdGNoKC9hc3NldHMgYnkgc3RhdHVzIChbXFxkLl0rIFxcdyspLykgfHwgb3V0cHV0Lm1hdGNoKC9hc3NldHMgYnkgcGF0aC4qPyhbXFxkLl0rIFxcdyspLyk7XG5cbiAgICAgICAgaWYobW9kdWxlTWF0Y2gpIGJ1aWxkU3RhdHMubW9kdWxlcyA9IHBhcnNlSW50KG1vZHVsZU1hdGNoWzFdLCAxMCk7XG4gICAgICAgIGlmKGFzc2V0TWF0Y2gpIGJ1aWxkU3RhdHMuYXNzZXRzID0gcGFyc2VJbnQoYXNzZXRNYXRjaFsxXSwgMTApO1xuICAgICAgICBpZihzaXplTWF0Y2gpIGJ1aWxkU3RhdHMuc2l6ZSA9IHNpemVNYXRjaFsxXTtcblxuICAgICAgICBkaXNwbGF5QnVpbGRTdGF0dXMoJ3dlYnBhY2snLCBMZXhDb25maWcuY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8ICdsaWInLCBxdWlldCwgYnVpbGRTdGF0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCBjaGlsZFByb2Nlc3M7XG5cbiAgICBpZighYnVpbGRDb21wbGV0ZWQpIHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEnKTtcbiAgICAgIGRpc3BsYXlCdWlsZFN0YXR1cygnd2VicGFjaycsIExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgJ2xpYicsIHF1aWV0LCBidWlsZFN0YXRzKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogV2VicGFjayBidWlsZCBmYWlsZWRgLCAnZXJyb3InLCBxdWlldCk7XG4gICAgbG9nKGBcXG5FcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIGlmKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmKGVycm9yLnN0YWNrKSB7XG4gICAgICAgIGxvZyhgXFxuU3RhY2sgVHJhY2U6XFxuJHtlcnJvci5zdGFja31gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nKGBcXG5XZWJwYWNrIE9wdGlvbnM6ICR7d2VicGFja09wdGlvbnMuc2xpY2UoMCwgNSkuam9pbignICcpfS4uLmAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIHNwaW5uZXIuZmFpbCgnQnVpbGQgZmFpbGVkLicpO1xuXG4gICAgaWYoY21kLmFzc2lzdCkge1xuICAgICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRoZSB3ZWJwYWNrIGVycm9yLi4uJyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe1xuICAgICAgICAgIHByb21wdDogYEZpeCB0aGlzIHdlYnBhY2sgYnVpbGQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1cXG5cXG5FcnJvciBkZXRhaWxzOlxcbiR7ZXJyb3IudG9TdHJpbmcoKX1cXG5cXG5Db25maWd1cmF0aW9uIHVzZWQ6XFxuJHtKU09OLnN0cmluZ2lmeSh3ZWJwYWNrT3B0aW9ucywgbnVsbCwgMil9YCxcbiAgICAgICAgICB0YXNrOiAnaGVscCcsXG4gICAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgICBxdWlldFxuICAgICAgICB9KTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIGFuYWx5c2lzIGNvbXBsZXRlJyk7XG4gICAgICB9IGNhdGNoKGFpRXJyb3IpIHtcbiAgICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgYXNzaXN0YW5jZScpO1xuICAgICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBSSBhc3Npc3RhbmNlIGVycm9yOicsIGFpRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoIXF1aWV0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdcXG5GdWxsIEVycm9yIERldGFpbHM6JywgZXJyb3IpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbGQgPSBhc3luYyAoY21kOiBCdWlsZE9wdGlvbnMsIGNhbGxiYWNrOiBCdWlsZENhbGxiYWNrID0gKCkgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBidW5kbGVyID0gJ3dlYnBhY2snLFxuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIHJlbW92ZSA9IGZhbHNlLFxuICAgIHRlc3QgPSBmYWxzZSxcbiAgICB0cmFuc2xhdGlvbnMgPSBmYWxzZSxcbiAgICB2YXJpYWJsZXMgPSAne30nXG4gIH0gPSBjbWQ7XG5cbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIGxvZyhgJHtjbGlOYW1lfSBidWlsZGluZy4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIGNvbnN0IHtvdXRwdXRGdWxsUGF0aCwgdXNlVHlwZXNjcmlwdH0gPSBMZXhDb25maWcuY29uZmlnO1xuXG4gIGNoZWNrTGlua2VkTW9kdWxlcygpO1xuXG4gIGxldCB2YXJpYWJsZXNPYmo6IG9iamVjdCA9IHtOT0RFX0VOVjogJ3Byb2R1Y3Rpb24nfTtcblxuICBpZih2YXJpYWJsZXMpIHtcbiAgICB0cnkge1xuICAgICAgdmFyaWFibGVzT2JqID0gSlNPTi5wYXJzZSh2YXJpYWJsZXMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRW52aXJvbm1lbnQgdmFyaWFibGVzIG9wdGlvbiBpcyBub3QgYSB2YWxpZCBKU09OIG9iamVjdC5gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzcy5lbnYgPSB7Li4ucHJvY2Vzcy5lbnYsIC4uLnZhcmlhYmxlc09ian07XG5cbiAgaWYodGVzdCkge1xuICAgIGxvZygnVGVzdCBtb2RlOiBCdWlsZCBlbnZpcm9ubWVudCBsb2FkZWQsIGV4aXRpbmcnLCAnaW5mbycsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmKHRyYW5zbGF0aW9ucykge1xuICAgIHNwaW5uZXIuc3RhcnQoJ1Byb2Nlc3NpbmcgdHJhbnNsYXRpb25zLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IExleENvbmZpZy5jb25maWcuc291cmNlRnVsbFBhdGggfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBMZXhDb25maWcuY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8ICdsaWInO1xuXG4gICAgICBhd2FpdCBwcm9jZXNzVHJhbnNsYXRpb25zKHNvdXJjZVBhdGgsIG91dHB1dFBhdGgsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnVHJhbnNsYXRpb25zIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkhJyk7XG4gICAgfSBjYXRjaCh0cmFuc2xhdGlvbkVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEZhaWxlZCB0byBwcm9jZXNzIHRyYW5zbGF0aW9uczogJHt0cmFuc2xhdGlvbkVycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gcHJvY2VzcyB0cmFuc2xhdGlvbnMuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHNwaW5uZXIuc3RhcnQoJ0J1aWxkaW5nIGNvZGUuLi4nKTtcblxuICBpZihyZW1vdmUpIHtcbiAgICBhd2FpdCByZW1vdmVGaWxlcyhvdXRwdXRGdWxsUGF0aCB8fCAnJyk7XG4gIH1cblxuICBsZXQgYnVpbGRSZXN1bHQgPSAwO1xuXG4gIGlmKGJ1bmRsZXIgPT09ICdzd2MnKSB7XG4gICAgYnVpbGRSZXN1bHQgPSBhd2FpdCBidWlsZFdpdGhTV0Moc3Bpbm5lciwgY21kLCAoc3RhdHVzKSA9PiB7XG4gICAgICBidWlsZFJlc3VsdCA9IHN0YXR1cztcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBidWlsZFJlc3VsdCA9IGF3YWl0IGJ1aWxkV2l0aFdlYnBhY2soc3Bpbm5lciwgY21kLCAoc3RhdHVzKSA9PiB7XG4gICAgICBidWlsZFJlc3VsdCA9IHN0YXR1cztcbiAgICB9KTtcbiAgfVxuXG4gIGlmKGJ1aWxkUmVzdWx0ID09PSAwICYmIGNtZC5hbmFseXplKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRoZSBidWlsZCBvdXRwdXQgZm9yIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSB7XG4gICAgICAgIG91dHB1dFBhdGg6IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGgsXG4gICAgICAgIGVudHJ5UG9pbnRzOiBidW5kbGVyID09PSAnc3djJyA/XG4gICAgICAgICAgYFNvdXJjZSBmaWxlczogJHtMZXhDb25maWcuY29uZmlnLnNvdXJjZUZ1bGxQYXRofS8qKi8qLnt0cyxqc31gIDpcbiAgICAgICAgICBMZXhDb25maWcuY29uZmlnLndlYnBhY2s/LmVudHJ5IHx8ICdVbmtub3duIGVudHJ5IHBvaW50cydcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe1xuICAgICAgICBwcm9tcHQ6IGBBbmFseXplIHRoaXMgYnVpbGQgZm9yIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzOlxuXG5CdWlsZCBUeXBlOiAke2J1bmRsZXJ9XG5Gb3JtYXQ6ICR7Y21kLmZvcm1hdCB8fCAnZGVmYXVsdCd9XG5FbnZpcm9ubWVudDogJHtMZXhDb25maWcuY29uZmlnLnRhcmdldEVudmlyb25tZW50fVxuJHtKU09OLnN0cmluZ2lmeShzdGF0cywgbnVsbCwgMil9XG5cbldoYXQgYXJlIHRoZSBrZXkgb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXMgZm9yIHRoaXMgYnVpbGQgY29uZmlndXJhdGlvbj8gQ29uc2lkZXI6XG4xLiBCdW5kbGUgc2l6ZSBvcHRpbWl6YXRpb24gc3RyYXRlZ2llc1xuMi4gQ29kZSBzcGxpdHRpbmcgcmVjb21tZW5kYXRpb25zXG4zLiBUcmVlLXNoYWtpbmcgaW1wcm92ZW1lbnRzXG40LiBQZXJmb3JtYW5jZSBlbmhhbmNlbWVudHNcbjUuIERlcGVuZGVuY3kgb3B0aW1pemF0aW9uc2AsXG4gICAgICAgIHRhc2s6ICdvcHRpbWl6ZScsXG4gICAgICAgIGNvbnRleHQ6IHRydWUsXG4gICAgICAgIHF1aWV0XG4gICAgICB9KTtcblxuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdBSSBidWlsZCBhbmFseXNpcyBjb21wbGV0ZScpO1xuICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgb3B0aW1pemF0aW9uIGFuYWx5c2lzJyk7XG4gICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQUkgYW5hbHlzaXMgZXJyb3I6JywgYWlFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYoYnVpbGRSZXN1bHQgPT09IDApIHtcbiAgICB0cnkge1xuICAgICAgaWYodXNlVHlwZXNjcmlwdCAmJiBidW5kbGVyID09PSAnc3djJykge1xuICAgICAgICBjb25zdCB0eXBlc2NyaXB0UGF0aCA9IHJlc29sdmVCaW5hcnlQYXRoKCd0c2MnLCAndHlwZXNjcmlwdCcpO1xuXG4gICAgICAgIGlmKHR5cGVzY3JpcHRQYXRoKSB7XG4gICAgICAgICAgc3Bpbm5lci5zdGFydCgnR2VuZXJhdGluZyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucy4uLicpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGdWxsUGF0aCA9IExleENvbmZpZy5jb25maWcuc291cmNlRnVsbFBhdGggfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4vc3JjJyk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRGdWxsUGF0aCA9IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4vbGliJyk7XG4gICAgICAgICAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgY3dkOiBzb3VyY2VGdWxsUGF0aCxcbiAgICAgICAgICAgICAgZG90OiBmYWxzZSxcbiAgICAgICAgICAgICAgbm9kaXI6IHRydWUsXG4gICAgICAgICAgICAgIGFic29sdXRlOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgdHNGaWxlcyA9IGdsb2JTeW5jKGAqKi8hKCouc3BlY3wqLnRlc3R8Ki5pbnRlZ3JhdGlvbikudHNgLCBnbG9iT3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCB0c3hGaWxlcyA9IGdsb2JTeW5jKGAqKi8hKCouc3BlY3wqLnRlc3R8Ki5pbnRlZ3JhdGlvbikudHN4YCwgZ2xvYk9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgYWxsU291cmNlRmlsZXMgPSBbLi4udHNGaWxlcywgLi4udHN4RmlsZXNdO1xuICAgICAgICAgICAgY29uc3QgdHlwZXNjcmlwdE9wdGlvbnMgPSBbXG4gICAgICAgICAgICAgIC4uLkxleENvbmZpZy5nZXRUeXBlU2NyaXB0RGVjbGFyYXRpb25GbGFncygpLFxuICAgICAgICAgICAgICAuLi5hbGxTb3VyY2VGaWxlc1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWNhKHR5cGVzY3JpcHRQYXRoLCB0eXBlc2NyaXB0T3B0aW9ucywge1xuICAgICAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIGFsbDogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAvLyBUeXBlU2NyaXB0IG1heSBoYXZlIGVycm9ycyBidXQgc3RpbGwgZ2VuZXJhdGUgc29tZSBkZWNsYXJhdGlvbnNcbiAgICAgICAgICAgICAgLy8gTG9nIHdhcm5pbmdzIGJ1dCBkb24ndCBmYWlsIGlmIGRlY2xhcmF0aW9ucyB3ZXJlIGdlbmVyYXRlZFxuICAgICAgICAgICAgICBjb25zdCBoYXNEZWNsYXJhdGlvbnMgPSByZXN1bHQuYWxsPy5pbmNsdWRlcygnV3JpdGluZycpIHx8IHJlc3VsdC5hbGw/LmluY2x1ZGVzKCdEZWNsYXJhdGlvbicpIHx8IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCBlcnJvck91dHB1dCA9IHJlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dCB8fCByZXN1bHQuYWxsIHx8ICdVbmtub3duIGVycm9yJztcblxuICAgICAgICAgICAgICBpZighaGFzRGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGdlbmVyYXRpb24gZmFpbGVkYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgICAgIGxvZyhgXFxuRXhpdCBDb2RlOiAke3Jlc3VsdC5leGl0Q29kZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgbG9nKGBcXG5UeXBlU2NyaXB0IENvbW1hbmQ6ICR7dHlwZXNjcmlwdFBhdGh9ICR7dHlwZXNjcmlwdE9wdGlvbnMuc2xpY2UoMCwgMTApLmpvaW4oJyAnKX0uLi5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgbG9nKGBcXG5FcnJvciBPdXRwdXQ6XFxuJHtlcnJvck91dHB1dH1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvckxpbmVzID0gZXJyb3JPdXRwdXQuc3BsaXQoJ1xcbicpLmZpbHRlcihsaW5lID0+XG4gICAgICAgICAgICAgICAgICBsaW5lLmluY2x1ZGVzKCdlcnJvciBUUycpIHx8XG4gICAgICAgICAgICAgICAgICBsaW5lLmluY2x1ZGVzKCdFcnJvcjonKSB8fFxuICAgICAgICAgICAgICAgICAgbGluZS50cmltKCkuc3RhcnRzV2l0aCgnc3JjLycpIHx8XG4gICAgICAgICAgICAgICAgICBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdUUycpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmKGVycm9yTGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgbG9nKGBcXG5LZXkgRXJyb3JzOmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICAgIGVycm9yTGluZXMuc2xpY2UoMCwgMTApLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZyhgICAke2xpbmV9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZihlcnJvckxpbmVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZyhgICAuLi4gYW5kICR7ZXJyb3JMaW5lcy5sZW5ndGggLSAxMH0gbW9yZSBlcnJvcnNgLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3Bpbm5lci5mYWlsKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGdlbmVyYXRpb24gaGFkIGVycm9ycyAoY29udGludWluZyBhbnl3YXkpLicpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBXYXJuaW5nOiBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGdlbmVyYXRpb24gY29tcGxldGVkIHdpdGggZXJyb3JzYCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgaWYoIXF1aWV0ICYmIGVycm9yT3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgICBsb2coYFxcbldhcm5pbmdzOlxcbiR7ZXJyb3JPdXRwdXR9YCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnVHlwZVNjcmlwdCBkZWNsYXJhdGlvbnMgZ2VuZXJhdGVkICh3aXRoIHdhcm5pbmdzKS4nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucyBnZW5lcmF0ZWQhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGdlbmVyYXRpb24gZXhjZXB0aW9uYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgbG9nKGBcXG5FcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgIGlmKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3Iuc3RhY2spIHtcbiAgICAgICAgICAgICAgbG9nKGBcXG5TdGFjazpcXG4ke2Vycm9yLnN0YWNrfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwaW5uZXIuZmFpbCgnVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBnZW5lcmF0aW9uIGhhZCBpc3N1ZXMgKGNvbnRpbnVpbmcgYW55d2F5KS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgY29weUNvbmZpZ3VyZWRGaWxlcyhzcGlubmVyLCBMZXhDb25maWcuY29uZmlnLCBxdWlldCk7XG4gICAgfSBjYXRjaChjb3B5RXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIGNvcHkgY29uZmlndXJlZCBmaWxlczogJHtjb3B5RXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGJ1aWxkUmVzdWx0KTtcbiAgcmV0dXJuIGJ1aWxkUmVzdWx0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgYnVpbGQ7XG4iXSwibmFtZXMiOlsidHJhbnNmb3JtIiwiZXhlY2EiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwic3luYyIsImdsb2JTeW5jIiwiZGlybmFtZSIsInJlbGF0aXZlIiwicGF0aFJlbGF0aXZlIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiTGV4Q29uZmlnIiwiY2hlY2tMaW5rZWRNb2R1bGVzIiwiY29weUNvbmZpZ3VyZWRGaWxlcyIsImNyZWF0ZVNwaW5uZXIiLCJoYW5kbGVXZWJwYWNrUHJvZ3Jlc3MiLCJyZW1vdmVGaWxlcyIsInJlc29sdmVXZWJwYWNrUGF0aHMiLCJnZXRMZXhQYWNrYWdlSnNvblBhdGgiLCJyZXNvbHZlQmluYXJ5UGF0aCIsImxvZyIsInByb2Nlc3NUcmFuc2xhdGlvbnMiLCJhaUZ1bmN0aW9uIiwiYm94ZW4iLCJjaGFsayIsImN1cnJlbnRGaWxlbmFtZSIsImN1cnJlbnREaXJuYW1lIiwiZXZhbCIsInByb2Nlc3MiLCJjd2QiLCJkaXNwbGF5QnVpbGRTdGF0dXMiLCJidW5kbGVyIiwib3V0cHV0UGF0aCIsInF1aWV0Iiwic3RhdHMiLCJzdGF0c0luZm8iLCJtb2R1bGVzIiwiYXNzZXRzIiwiZ3JlZW4iLCJjeWFuIiwic2l6ZSIsInN0YXR1c0JveCIsImJvbGQiLCJ1bmRlcmxpbmUiLCJ5ZWxsb3ciLCJwYWRkaW5nIiwibWFyZ2luIiwiYm9yZGVyU3R5bGUiLCJib3JkZXJDb2xvciIsImJhY2tncm91bmRDb2xvciIsImNvbnNvbGUiLCJidWlsZFdpdGhTV0MiLCJzcGlubmVyIiwiY29tbWFuZE9wdGlvbnMiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJmb3JtYXQiLCJzb3VyY2VQYXRoIiwid2F0Y2giLCJvdXRwdXRGdWxsUGF0aCIsInNvdXJjZUZ1bGxQYXRoIiwic3djIiwic3djQ29uZmlnIiwidGFyZ2V0RW52aXJvbm1lbnQiLCJ1c2VHcmFwaFFsIiwidXNlVHlwZXNjcmlwdCIsImNvbmZpZyIsInNvdXJjZURpciIsImdsb2JPcHRpb25zIiwiYWJzb2x1dGUiLCJkb3QiLCJub2RpciIsIm5vc29ydCIsInRzRmlsZXMiLCJqc0ZpbGVzIiwic291cmNlRmlsZXMiLCJvdXRwdXREaXIiLCJzdGFydCIsInRyYW5zZm9ybVByb21pc2VzIiwibWFwIiwiZmlsZSIsImZpbGVSZWxhdGl2ZVRvU291cmNlIiwib3V0cHV0RmlsZSIsInJlcGxhY2UiLCJvdXRwdXREaXJQYXRoIiwibWtkaXJTeW5jIiwicmVjdXJzaXZlIiwic291cmNlQ29kZSIsInN3Y09wdGlvbnMiLCJmaWxlbmFtZSIsIm1vZHVsZSIsInR5cGUiLCJyZXN1bHQiLCJ3cml0ZUZpbGVTeW5jIiwiY29kZSIsIlByb21pc2UiLCJhbGwiLCJzdWNjZWVkIiwiZXJyb3IiLCJtZXNzYWdlIiwiRXJyb3IiLCJzdGFjayIsImZhaWwiLCJidWlsZFdpdGhXZWJwYWNrIiwiY21kIiwiYW5hbHl6ZSIsImNvbmZpZ05hbWUiLCJkZWZpbmVQcm9jZXNzRW52Tm9kZUVudiIsImRldnRvb2wiLCJkaXNhYmxlSW50ZXJwcmV0IiwiZW50cnkiLCJlbnYiLCJmYWlsT25XYXJuaW5ncyIsImpzb24iLCJtZXJnZSIsIm1vZGUiLCJuYW1lIiwibm9kZUVudiIsIm5vRGV2dG9vbCIsIm5vU3RhdHMiLCJub1RhcmdldCIsIm5vV2F0Y2giLCJub1dhdGNoT3B0aW9uc1N0ZGluIiwidGFyZ2V0Iiwid2F0Y2hPcHRpb25zU3RkaW4iLCJlbnRyeVZhbHVlIiwiQXJyYXkiLCJpc0FycmF5Iiwid2VicGFja0NvbmZpZyIsImlzUmVsYXRpdmVDb25maWciLCJzdWJzdHIiLCJwcm9qZWN0Q29uZmlnUGF0aCIsInByb2plY3RDb25maWdQYXRoVHMiLCJoYXNQcm9qZWN0Q29uZmlnIiwicmVzb2x2ZWRDb25maWciLCJsZXhQYWNrYWdlUGF0aCIsImxleFBhY2thZ2VEaXIiLCJsZXhXZWJwYWNrQ29uZmlnIiwid2VicGFja09wdGlvbnMiLCJwdXNoIiwidG9TdHJpbmciLCJ3ZWJwYWNrUGF0aCIsImV4ZWN1dGFibGVQYXRoIiwiZmluYWxXZWJwYWNrT3B0aW9ucyIsImVuZHNXaXRoIiwiSlNPTiIsInN0cmluZ2lmeSIsImNoaWxkUHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJidWlsZENvbXBsZXRlZCIsImJ1aWxkU3RhdHMiLCJzdGRvdXQiLCJvbiIsImRhdGEiLCJvdXRwdXQiLCJpbmNsdWRlcyIsIm1vZHVsZU1hdGNoIiwibWF0Y2giLCJhc3NldE1hdGNoIiwic2l6ZU1hdGNoIiwicGFyc2VJbnQiLCJzdGRlcnIiLCJzbGljZSIsImpvaW4iLCJhc3Npc3QiLCJwcm9tcHQiLCJ0YXNrIiwiY29udGV4dCIsImFpRXJyb3IiLCJidWlsZCIsInJlbW92ZSIsInRlc3QiLCJ0cmFuc2xhdGlvbnMiLCJ2YXJpYWJsZXMiLCJwYXJzZUNvbmZpZyIsInZhcmlhYmxlc09iaiIsIk5PREVfRU5WIiwicGFyc2UiLCJ0cmFuc2xhdGlvbkVycm9yIiwiYnVpbGRSZXN1bHQiLCJzdGF0dXMiLCJlbnRyeVBvaW50cyIsIndlYnBhY2siLCJ0eXBlc2NyaXB0UGF0aCIsInRzeEZpbGVzIiwiYWxsU291cmNlRmlsZXMiLCJ0eXBlc2NyaXB0T3B0aW9ucyIsImdldFR5cGVTY3JpcHREZWNsYXJhdGlvbkZsYWdzIiwicmVqZWN0IiwiZXhpdENvZGUiLCJoYXNEZWNsYXJhdGlvbnMiLCJlcnJvck91dHB1dCIsImVycm9yTGluZXMiLCJzcGxpdCIsImZpbHRlciIsImxpbmUiLCJ0cmltIiwic3RhcnRzV2l0aCIsImxlbmd0aCIsImZvckVhY2giLCJjb3B5RXJyb3IiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFNBQVMsUUFBTyxZQUFZO0FBQ3BDLFNBQVFDLEtBQUssUUFBTyxRQUFRO0FBQzVCLFNBQVFDLFVBQVUsRUFBRUMsWUFBWSxRQUFPLEtBQUs7QUFDNUMsU0FBUUMsUUFBUUMsUUFBUSxRQUFPLE9BQU87QUFDdEMsU0FDRUMsT0FBTyxFQUNQQyxZQUFZQyxZQUFZLEVBQ3hCQyxXQUFXQyxXQUFXLFFBQ2pCLE9BQU87QUFFZCxTQUFRQyxTQUFTLFFBQU8scUJBQXFCO0FBQzdDLFNBQVFDLGtCQUFrQixFQUFFQyxtQkFBbUIsRUFBRUMsYUFBYSxFQUFxQkMscUJBQXFCLEVBQUVDLFdBQVcsUUFBTyxxQkFBcUI7QUFDakosU0FDRUMsbUJBQW1CLEVBQ25CQyxxQkFBcUIsRUFDckJDLGlCQUFpQixRQUNaLHNCQUFzQjtBQUM3QixTQUFRQyxHQUFHLFFBQU8scUJBQXFCO0FBQ3ZDLFNBQVFDLG1CQUFtQixRQUFPLDhCQUE4QjtBQUNoRSxTQUFRQyxVQUFVLFFBQU8sY0FBYztBQUN2QyxPQUFPQyxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsV0FBVyxRQUFRO0FBSTFCLElBQUlDO0FBQ0osSUFBSUM7QUFFSixJQUFJO0lBQ0ZELGtCQUFrQkUsS0FBSztJQUN2QkQsaUJBQWlCcEIsUUFBUW1CO0FBQzNCLEVBQUUsT0FBTTtJQUNOQSxrQkFBa0JHLFFBQVFDLEdBQUc7SUFDN0JILGlCQUFpQkUsUUFBUUMsR0FBRztBQUM5QjtBQXFC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
443
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQge2V4ZWNhfSBmcm9tICdleGVjYSc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCB7XG4gIGRpcm5hbWUsXG4gIHJlbGF0aXZlIGFzIHBhdGhSZWxhdGl2ZSxcbiAgcmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZVxufSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NoZWNrTGlua2VkTW9kdWxlcywgY29weUNvbmZpZ3VyZWRGaWxlcywgY3JlYXRlU3Bpbm5lciwgY3JlYXRlUHJvZ3Jlc3NCYXIsIGhhbmRsZVdlYnBhY2tQcm9ncmVzcywgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlV2VicGFja1BhdGhzLFxuICBnZXRMZXhQYWNrYWdlSnNvblBhdGgsXG4gIHJlc29sdmVCaW5hcnlQYXRoXG59IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQge3Byb2Nlc3NUcmFuc2xhdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3RyYW5zbGF0aW9ucy5qcyc7XG5pbXBvcnQge2FpRnVuY3Rpb259IGZyb20gJy4uL2FpL2FpLmpzJztcbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5pbXBvcnQgdHlwZSB7U1dDT3B0aW9uc30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcblxubGV0IGN1cnJlbnRGaWxlbmFtZTogc3RyaW5nO1xubGV0IGN1cnJlbnREaXJuYW1lOiBzdHJpbmc7XG5cbnRyeSB7XG4gIGN1cnJlbnRGaWxlbmFtZSA9IGV2YWwoJ3JlcXVpcmUoXCJ1cmxcIikuZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpJyk7XG4gIGN1cnJlbnREaXJuYW1lID0gZGlybmFtZShjdXJyZW50RmlsZW5hbWUpO1xufSBjYXRjaCB7XG4gIGN1cnJlbnRGaWxlbmFtZSA9IHByb2Nlc3MuY3dkKCk7XG4gIGN1cnJlbnREaXJuYW1lID0gcHJvY2Vzcy5jd2QoKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICByZWFkb25seSBhc3Npc3Q/OiBib29sZWFuO1xuICByZWFkb25seSBhbmFseXplPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYnVuZGxlcj86ICd3ZWJwYWNrJyB8ICdzd2MnO1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBlbnRyeT86IHN0cmluZztcbiAgcmVhZG9ubHkgZm9ybWF0Pzogc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXRQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xuICByZWFkb25seSB0cmFuc2xhdGlvbnM/OiBib29sZWFuO1xuICByZWFkb25seSB2YXJpYWJsZXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdhdGNoPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGRDYWxsYmFjayA9IChzdGF0dXM6IG51bWJlcikgPT4gdm9pZDtcblxuY29uc3QgZGlzcGxheUJ1aWxkU3RhdHVzID0gKGJ1bmRsZXI6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nLCBxdWlldDogYm9vbGVhbiwgc3RhdHM/OiB7bW9kdWxlcz86IG51bWJlcjsgYXNzZXRzPzogbnVtYmVyOyBzaXplPzogc3RyaW5nfSkgPT4ge1xuICBpZihxdWlldCkgcmV0dXJuO1xuXG4gIGxldCBzdGF0c0luZm8gPSAnJztcbiAgaWYoc3RhdHMgJiYgc3RhdHMubW9kdWxlcyAmJiBzdGF0cy5hc3NldHMpIHtcbiAgICBzdGF0c0luZm8gPSBgXFxuJHtjaGFsay5ncmVlbignTW9kdWxlczonKX0gICAgJHtjaGFsay5jeWFuKHN0YXRzLm1vZHVsZXMpfVxcbmAgK1xuICAgICAgYCR7Y2hhbGsuZ3JlZW4oJ0Fzc2V0czonKX0gICAgICR7Y2hhbGsuY3lhbihzdGF0cy5hc3NldHMpfVxcbmAgK1xuICAgICAgYCR7Y2hhbGsuZ3JlZW4oJ1NpemU6Jyl9ICAgICAgICR7Y2hhbGsuY3lhbihzdGF0cy5zaXplKX1cXG5gO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzQm94ID0gYm94ZW4oXG4gICAgYCR7Y2hhbGsuY3lhbi5ib2xkKCfwn4+X77iPICBCdWlsZCBDb21wbGV0ZWQgU3VjY2Vzc2Z1bGx5ICcpfVxcblxcbmAgK1xuICAgIGAke2NoYWxrLmdyZWVuKCdCdW5kbGVyOicpfSAgICAke2NoYWxrLmN5YW4oYnVuZGxlcil9XFxuYCArXG4gICAgYCR7Y2hhbGsuZ3JlZW4oJ091dHB1dDonKX0gICAgICR7Y2hhbGsudW5kZXJsaW5lKG91dHB1dFBhdGgpfSR7c3RhdHNJbmZvfVxcbmAgK1xuICAgIGAke2NoYWxrLnllbGxvdygnUmVhZHkgZm9yIGRlcGxveW1lbnQhIPCfmoAnKX1gLFxuICAgIHtcbiAgICAgIHBhZGRpbmc6IDEsXG4gICAgICBtYXJnaW46IDEsXG4gICAgICBib3JkZXJTdHlsZTogJ3JvdW5kJyxcbiAgICAgIGJvcmRlckNvbG9yOiAnZ3JlZW4nLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzFhMWExYSdcbiAgICB9XG4gICk7XG5cbiAgY29uc29sZS5sb2coJ1xcbicgKyBzdGF0dXNCb3ggKyAnXFxuJyk7XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbGRXaXRoU1dDID0gYXN5bmMgKHNwaW5uZXIsIGNvbW1hbmRPcHRpb25zOiBCdWlsZE9wdGlvbnMsIGNhbGxiYWNrOiBCdWlsZENhbGxiYWNrKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgZm9ybWF0ID0gJ2VzbScsXG4gICAgb3V0cHV0UGF0aCxcbiAgICBxdWlldCxcbiAgICBzb3VyY2VQYXRoLFxuICAgIHdhdGNoXG4gIH0gPSBjb21tYW5kT3B0aW9ucztcbiAgY29uc3Qge1xuICAgIG91dHB1dEZ1bGxQYXRoLFxuICAgIHNvdXJjZUZ1bGxQYXRoLFxuICAgIHN3Yzogc3djQ29uZmlnLFxuICAgIHRhcmdldEVudmlyb25tZW50LFxuICAgIHVzZUdyYXBoUWwsXG4gICAgdXNlVHlwZXNjcmlwdFxuICB9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3Qgc291cmNlRGlyOiBzdHJpbmcgPSBzb3VyY2VQYXRoID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgYC4vJHtzb3VyY2VQYXRofWApIDogc291cmNlRnVsbFBhdGggfHwgJyc7XG5cbiAgY29uc3QgZ2xvYk9wdGlvbnMgPSB7XG4gICAgYWJzb2x1dGU6IHRydWUsXG4gICAgY3dkOiBzb3VyY2VEaXIsXG4gICAgZG90OiBmYWxzZSxcbiAgICBub2RpcjogdHJ1ZSxcbiAgICBub3NvcnQ6IHRydWVcbiAgfTtcbiAgY29uc3QgdHNGaWxlczogc3RyaW5nW10gPSBnbG9iU3luYyhgKiovISgqLnNwZWN8Ki50ZXN0KS50cypgLCBnbG9iT3B0aW9ucyk7XG4gIGNvbnN0IGpzRmlsZXM6IHN0cmluZ1tdID0gZ2xvYlN5bmMoYCoqLyEoKi5zcGVjfCoudGVzdCkuanNgLCBnbG9iT3B0aW9ucyk7XG4gIGNvbnN0IHNvdXJjZUZpbGVzOiBzdHJpbmdbXSA9IFsuLi50c0ZpbGVzLCAuLi5qc0ZpbGVzXTtcblxuICBjb25zdCBvdXRwdXREaXI6IHN0cmluZyA9IG91dHB1dFBhdGhcbiAgICA/IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksIG91dHB1dFBhdGgpXG4gICAgOiAob3V0cHV0RnVsbFBhdGggfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4vbGliJykpO1xuXG4gIHRyeSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQnVpbGRpbmcgd2l0aCBTV0MuLi4nKTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybVByb21pc2VzID0gc291cmNlRmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUmVsYXRpdmVUb1NvdXJjZSA9IHBhdGhSZWxhdGl2ZShzb3VyY2VEaXIsIGZpbGUpO1xuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IGZpbGU7IC8vIGZpbGUgaXMgYWxyZWFkeSBhYnNvbHV0ZVxuICAgICAgY29uc3Qgb3V0cHV0RmlsZSA9IGZpbGVSZWxhdGl2ZVRvU291cmNlLnJlcGxhY2UoL1xcLih0c3x0c3gpJC8sICcuanMnKTtcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoUmVzb2x2ZShvdXRwdXREaXIsIG91dHB1dEZpbGUpO1xuICAgICAgY29uc3Qgb3V0cHV0RGlyUGF0aCA9IGRpcm5hbWUob3V0cHV0UGF0aCk7XG5cbiAgICAgIGlmKCFleGlzdHNTeW5jKG91dHB1dERpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IHtta2RpclN5bmN9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgICAgICBta2RpclN5bmMob3V0cHV0RGlyUGF0aCwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VDb2RlID0gcmVhZEZpbGVTeW5jKHNvdXJjZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBzd2NPcHRpb25zID0ge1xuICAgICAgICAuLi5zd2NDb25maWcsXG4gICAgICAgIGZpbGVuYW1lOiBmaWxlLFxuICAgICAgICBtb2R1bGU6IHtcbiAgICAgICAgICB0eXBlOiBmb3JtYXQgPT09ICdjanMnID8gJ2NvbW1vbmpzJyBhcyBjb25zdCA6IChzd2NDb25maWc/Lm1vZHVsZT8udHlwZSBhcyAnZXM2JyB8fCAnZXM2JyksXG4gICAgICAgICAgLi4uc3djQ29uZmlnPy5tb2R1bGVcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgUGFydGlhbDxTV0NPcHRpb25zPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3JtKHNvdXJjZUNvZGUsIHN3Y09wdGlvbnMpO1xuXG4gICAgICBjb25zdCB7d3JpdGVGaWxlU3luY30gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgICB3cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIHJlc3VsdC5jb2RlKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHRyYW5zZm9ybVByb21pc2VzKTtcblxuICAgIHNwaW5uZXIuc3VjY2VlZCgnQnVpbGQgY29tcGxldGVkIHdpdGggU1dDJyk7XG4gICAgZGlzcGxheUJ1aWxkU3RhdHVzKCdTV0MnLCBvdXRwdXREaXIsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjb21tYW5kT3B0aW9ucy5jbGlOYW1lIHx8ICdMZXgnfSBFcnJvcjogU1dDIGJ1aWxkIGZhaWxlZGAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBsb2coYFxcbkVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgaWYoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYoZXJyb3Iuc3RhY2spIHtcbiAgICAgICAgbG9nKGBcXG5TdGFjayBUcmFjZTpcXG4ke2Vycm9yLnN0YWNrfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIH1cblxuICAgICAgaWYoJ2ZpbGVuYW1lJyBpbiBlcnJvciB8fCAnZmlsZScgaW4gZXJyb3IpIHtcbiAgICAgICAgbG9nKGBcXG5GaWxlOiAkeyhlcnJvciBhcyBhbnkpLmZpbGVuYW1lIHx8IChlcnJvciBhcyBhbnkpLmZpbGV9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNwaW5uZXIuZmFpbCgnQnVpbGQgZmFpbGVkIHdpdGggU1dDJyk7XG4gICAgaWYoIXF1aWV0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdcXG5GdWxsIEVycm9yIERldGFpbHM6JywgZXJyb3IpO1xuICAgIH1cbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkV2l0aFdlYnBhY2sgPSBhc3luYyAoc3Bpbm5lciwgY21kLCBjYWxsYmFjaykgPT4ge1xuICBjb25zdCB7XG4gICAgYW5hbHl6ZSxcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgY29uZmlnLFxuICAgIGNvbmZpZ05hbWUsXG4gICAgZGVmaW5lUHJvY2Vzc0Vudk5vZGVFbnYsXG4gICAgZGV2dG9vbCxcbiAgICBkaXNhYmxlSW50ZXJwcmV0LFxuICAgIGVudHJ5LFxuICAgIGVudixcbiAgICBmYWlsT25XYXJuaW5ncyxcbiAgICBqc29uLFxuICAgIG1lcmdlLFxuICAgIG1vZGUsXG4gICAgbmFtZSxcbiAgICBub2RlRW52LFxuICAgIG5vRGV2dG9vbCxcbiAgICBub1N0YXRzLFxuICAgIG5vVGFyZ2V0LFxuICAgIG5vV2F0Y2gsXG4gICAgbm9XYXRjaE9wdGlvbnNTdGRpbixcbiAgICBvdXRwdXRQYXRoLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgc3RhdHMsXG4gICAgdGFyZ2V0LFxuICAgIHdhdGNoLFxuICAgIHdhdGNoT3B0aW9uc1N0ZGluXG4gIH0gPSBjbWQ7XG5cbiAgY29uc3QgZW50cnlWYWx1ZSA9IEFycmF5LmlzQXJyYXkoZW50cnkpID8gZW50cnlbMF0gOiBlbnRyeTtcblxuICBsZXQgd2VicGFja0NvbmZpZzogc3RyaW5nO1xuXG4gIGlmKGNvbmZpZykge1xuICAgIGNvbnN0IGlzUmVsYXRpdmVDb25maWc6IGJvb2xlYW4gPSBjb25maWcuc3Vic3RyKDAsIDIpID09PSAnLi8nO1xuICAgIHdlYnBhY2tDb25maWcgPSBpc1JlbGF0aXZlQ29uZmlnID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnKSA6IGNvbmZpZztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZy5qcycpO1xuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoVHMgPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcudHMnKTtcbiAgICBjb25zdCBoYXNQcm9qZWN0Q29uZmlnID0gZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkgfHwgZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aFRzKTtcblxuICAgIGlmKGhhc1Byb2plY3RDb25maWcpIHtcbiAgICAgIHdlYnBhY2tDb25maWcgPSBleGlzdHNTeW5jKHByb2plY3RDb25maWdQYXRoVHMpID8gcHJvamVjdENvbmZpZ1BhdGhUcyA6IHByb2plY3RDb25maWdQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7d2VicGFja0NvbmZpZzogcmVzb2x2ZWRDb25maWd9ID0gcmVzb2x2ZVdlYnBhY2tQYXRocyhjdXJyZW50RGlybmFtZSk7XG4gICAgICB3ZWJwYWNrQ29uZmlnID0gcmVzb2x2ZWRDb25maWc7XG4gICAgfVxuICB9XG5cbiAgaWYoIWV4aXN0c1N5bmMod2VicGFja0NvbmZpZykpIHtcbiAgICBjb25zdCBsZXhQYWNrYWdlUGF0aCA9IGdldExleFBhY2thZ2VKc29uUGF0aCgpO1xuICAgIGNvbnN0IGxleFBhY2thZ2VEaXIgPSBkaXJuYW1lKGxleFBhY2thZ2VQYXRoKTtcbiAgICBjb25zdCBsZXhXZWJwYWNrQ29uZmlnID0gcGF0aFJlc29sdmUobGV4UGFja2FnZURpciwgJ3dlYnBhY2suY29uZmlnLmpzJyk7XG5cbiAgICBpZihleGlzdHNTeW5jKGxleFdlYnBhY2tDb25maWcpKSB7XG4gICAgICB3ZWJwYWNrQ29uZmlnID0gbGV4V2VicGFja0NvbmZpZztcbiAgICAgIGNvbnNvbGUubG9nKCdVc2luZyBMZXggd2VicGFjayBjb25maWc6Jywgd2VicGFja0NvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogQ291bGQgbm90IGZpbmQgd2VicGFjay5jb25maWcuanNgLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBzcGlubmVyLmZhaWwoJ0J1aWxkIGZhaWxlZC4nKTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgd2VicGFja09wdGlvbnM6IHN0cmluZ1tdID0gW1xuICAgICctLWNvbG9yJyxcbiAgICAnLS1wcm9ncmVzcycsXG4gICAgJy0tY29uZmlnJywgd2VicGFja0NvbmZpZ1xuICBdO1xuXG4gIGlmKGFuYWx5emUpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tYW5hbHl6ZScpO1xuICBpZihjb25maWdOYW1lKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWNvbmZpZ05hbWUnLCBjb25maWdOYW1lKTtcbiAgaWYoZGVmaW5lUHJvY2Vzc0Vudk5vZGVFbnYpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZGVmaW5lUHJvY2Vzc0Vudk5vZGVFbnYnLCBkZWZpbmVQcm9jZXNzRW52Tm9kZUVudik7XG4gIGlmKGRldnRvb2wpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZGV2dG9vbCcsIGRldnRvb2wpO1xuICBpZihkaXNhYmxlSW50ZXJwcmV0KSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWRpc2FibGVJbnRlcnByZXQnKTtcbiAgaWYoZW50cnlWYWx1ZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1lbnRyeScsIGVudHJ5VmFsdWUudG9TdHJpbmcoKSk7XG4gIGlmKGVudikgd2VicGFja09wdGlvbnMucHVzaCgnLS1lbnYnLCBlbnYpO1xuICBpZihmYWlsT25XYXJuaW5ncykgd2VicGFja09wdGlvbnMucHVzaCgnLS1mYWlsT25XYXJuaW5ncycpO1xuICBpZihqc29uKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWpzb24nLCBqc29uKTtcbiAgaWYobW9kZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1tb2RlJywgbW9kZSk7XG4gIGlmKG1lcmdlKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW1lcmdlJyk7XG4gIGlmKG5hbWUpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbmFtZScsIG5hbWUpO1xuICBpZihub0RldnRvb2wpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9EZXZ0b29sJyk7XG4gIGlmKG5vU3RhdHMpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9TdGF0cycpO1xuICBpZihub1RhcmdldCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub1RhcmdldCcpO1xuICBpZihub1dhdGNoKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vV2F0Y2gnKTtcbiAgaWYobm9XYXRjaE9wdGlvbnNTdGRpbikgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub1dhdGNoT3B0aW9uc1N0ZGluJyk7XG4gIGlmKG5vZGVFbnYpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9kZUVudicsIG5vZGVFbnYpO1xuICBpZihvdXRwdXRQYXRoKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW91dHB1dC1wYXRoJywgb3V0cHV0UGF0aC50b1N0cmluZygpKTsgLy8gQ29udmVydCB0byBzdHJpbmdcbiAgaWYoc3RhdHMpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tc3RhdHMnLCBzdGF0cyk7XG4gIGlmKHRhcmdldCkgd2VicGFja09wdGlvbnMucHVzaCgnLS10YXJnZXQnLCB0YXJnZXQpO1xuICBpZih3YXRjaCkgd2VicGFja09wdGlvbnMucHVzaCgnLS13YXRjaCcpO1xuICBpZih3YXRjaE9wdGlvbnNTdGRpbikgd2VicGFja09wdGlvbnMucHVzaCgnLS13YXRjaE9wdGlvbnNTdGRpbicpO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qge3dlYnBhY2tQYXRofSA9IHJlc29sdmVXZWJwYWNrUGF0aHMoY3VycmVudERpcm5hbWUpO1xuXG4gICAgbGV0IGV4ZWN1dGFibGVQYXRoID0gd2VicGFja1BhdGg7XG4gICAgbGV0IGZpbmFsV2VicGFja09wdGlvbnM6IHN0cmluZ1tdO1xuXG4gICAgaWYod2VicGFja1BhdGggPT09ICducHgnKSB7XG4gICAgICBmaW5hbFdlYnBhY2tPcHRpb25zID0gWyd3ZWJwYWNrJywgLi4ud2VicGFja09wdGlvbnNdO1xuICAgIH0gZWxzZSBpZih3ZWJwYWNrUGF0aC5lbmRzV2l0aCgnLmpzJykpIHtcbiAgICAgIGV4ZWN1dGFibGVQYXRoID0gJ25vZGUnO1xuICAgICAgZmluYWxXZWJwYWNrT3B0aW9ucyA9IFt3ZWJwYWNrUGF0aCwgLi4ud2VicGFja09wdGlvbnNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbFdlYnBhY2tPcHRpb25zID0gWy4uLndlYnBhY2tPcHRpb25zXTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFByb2Nlc3MgPSBleGVjYShleGVjdXRhYmxlUGF0aCwgZmluYWxXZWJwYWNrT3B0aW9ucywge2VuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZSd9KTtcblxuICAgIGxldCBidWlsZENvbXBsZXRlZCA9IGZhbHNlO1xuICAgIGxldCBidWlsZFN0YXRzID0ge1xuICAgICAgbW9kdWxlczogMCxcbiAgICAgIGFzc2V0czogMCxcbiAgICAgIHNpemU6ICcwIEInXG4gICAgfTtcblxuICAgIGNoaWxkUHJvY2Vzcy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gZGF0YS50b1N0cmluZygpO1xuXG4gICAgICBoYW5kbGVXZWJwYWNrUHJvZ3Jlc3Mob3V0cHV0LCBzcGlubmVyLCBxdWlldCwgJ/Cfj5fvuI8nLCAnV2VicGFjayBCdWlsZGluZycpO1xuXG4gICAgICBpZighYnVpbGRDb21wbGV0ZWQgJiYgb3V0cHV0LmluY2x1ZGVzKCdjb21waWxlZCBzdWNjZXNzZnVsbHknKSkge1xuICAgICAgICBidWlsZENvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEnKTtcblxuICAgICAgICBjb25zdCBtb2R1bGVNYXRjaCA9IG91dHB1dC5tYXRjaCgvKFxcZCspIG1vZHVsZXMvKTtcbiAgICAgICAgY29uc3QgYXNzZXRNYXRjaCA9IG91dHB1dC5tYXRjaCgvKFxcZCspIGFzc2V0cy8pO1xuICAgICAgICBjb25zdCBzaXplTWF0Y2ggPSBvdXRwdXQubWF0Y2goL2Fzc2V0cyBieSBzdGF0dXMgKFtcXGQuXSsgXFx3KykvKSB8fCBvdXRwdXQubWF0Y2goL2Fzc2V0cyBieSBwYXRoLio/KFtcXGQuXSsgXFx3KykvKTtcblxuICAgICAgICBpZihtb2R1bGVNYXRjaCkgYnVpbGRTdGF0cy5tb2R1bGVzID0gcGFyc2VJbnQobW9kdWxlTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgaWYoYXNzZXRNYXRjaCkgYnVpbGRTdGF0cy5hc3NldHMgPSBwYXJzZUludChhc3NldE1hdGNoWzFdLCAxMCk7XG4gICAgICAgIGlmKHNpemVNYXRjaCkgYnVpbGRTdGF0cy5zaXplID0gc2l6ZU1hdGNoWzFdO1xuXG4gICAgICAgIGRpc3BsYXlCdWlsZFN0YXR1cygnd2VicGFjaycsIExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgJ2xpYicsIHF1aWV0LCBidWlsZFN0YXRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNoaWxkUHJvY2Vzcy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gZGF0YS50b1N0cmluZygpO1xuXG4gICAgICBoYW5kbGVXZWJwYWNrUHJvZ3Jlc3Mob3V0cHV0LCBzcGlubmVyLCBxdWlldCwgJ/Cfj5fvuI8nLCAnV2VicGFjayBCdWlsZGluZycpO1xuXG4gICAgICBpZighYnVpbGRDb21wbGV0ZWQgJiYgb3V0cHV0LmluY2x1ZGVzKCdjb21waWxlZCBzdWNjZXNzZnVsbHknKSkge1xuICAgICAgICBidWlsZENvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEnKTtcblxuICAgICAgICBjb25zdCBtb2R1bGVNYXRjaCA9IG91dHB1dC5tYXRjaCgvKFxcZCspIG1vZHVsZXMvKTtcbiAgICAgICAgY29uc3QgYXNzZXRNYXRjaCA9IG91dHB1dC5tYXRjaCgvKFxcZCspIGFzc2V0cy8pO1xuICAgICAgICBjb25zdCBzaXplTWF0Y2ggPSBvdXRwdXQubWF0Y2goL2Fzc2V0cyBieSBzdGF0dXMgKFtcXGQuXSsgXFx3KykvKSB8fCBvdXRwdXQubWF0Y2goL2Fzc2V0cyBieSBwYXRoLio/KFtcXGQuXSsgXFx3KykvKTtcblxuICAgICAgICBpZihtb2R1bGVNYXRjaCkgYnVpbGRTdGF0cy5tb2R1bGVzID0gcGFyc2VJbnQobW9kdWxlTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgaWYoYXNzZXRNYXRjaCkgYnVpbGRTdGF0cy5hc3NldHMgPSBwYXJzZUludChhc3NldE1hdGNoWzFdLCAxMCk7XG4gICAgICAgIGlmKHNpemVNYXRjaCkgYnVpbGRTdGF0cy5zaXplID0gc2l6ZU1hdGNoWzFdO1xuXG4gICAgICAgIGRpc3BsYXlCdWlsZFN0YXR1cygnd2VicGFjaycsIExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgJ2xpYicsIHF1aWV0LCBidWlsZFN0YXRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF3YWl0IGNoaWxkUHJvY2VzcztcblxuICAgIGlmKCFidWlsZENvbXBsZXRlZCkge1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdCdWlsZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICAgICAgZGlzcGxheUJ1aWxkU3RhdHVzKCd3ZWJwYWNrJywgTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCAnbGliJywgcXVpZXQsIGJ1aWxkU3RhdHMpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBXZWJwYWNrIGJ1aWxkIGZhaWxlZGAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBsb2coYFxcbkVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgaWYoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYoZXJyb3Iuc3RhY2spIHtcbiAgICAgICAgbG9nKGBcXG5TdGFjayBUcmFjZTpcXG4ke2Vycm9yLnN0YWNrfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2coYFxcbldlYnBhY2sgT3B0aW9uczogJHt3ZWJwYWNrT3B0aW9ucy5zbGljZSgwLCA1KS5qb2luKCcgJyl9Li4uYCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgc3Bpbm5lci5mYWlsKCdCdWlsZCBmYWlsZWQuJyk7XG5cbiAgICBpZihjbWQuYXNzaXN0KSB7XG4gICAgICBzcGlubmVyLnN0YXJ0KCdBSSBpcyBhbmFseXppbmcgdGhlIHdlYnBhY2sgZXJyb3IuLi4nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYWlGdW5jdGlvbih7XG4gICAgICAgICAgcHJvbXB0OiBgRml4IHRoaXMgd2VicGFjayBidWlsZCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfVxcblxcbkVycm9yIGRldGFpbHM6XFxuJHtlcnJvci50b1N0cmluZygpfVxcblxcbkNvbmZpZ3VyYXRpb24gdXNlZDpcXG4ke0pTT04uc3RyaW5naWZ5KHdlYnBhY2tPcHRpb25zLCBudWxsLCAyKX1gLFxuICAgICAgICAgIHRhc2s6ICdoZWxwJyxcbiAgICAgICAgICBjb250ZXh0OiB0cnVlLFxuICAgICAgICAgIHF1aWV0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQUkgYW5hbHlzaXMgY29tcGxldGUnKTtcbiAgICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgICBzcGlubmVyLmZhaWwoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBBSSBhc3Npc3RhbmNlJyk7XG4gICAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FJIGFzc2lzdGFuY2UgZXJyb3I6JywgYWlFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZighcXVpZXQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1xcbkZ1bGwgRXJyb3IgRGV0YWlsczonLCBlcnJvcik7XG4gICAgfVxuXG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBidWlsZCA9IGFzeW5jIChjbWQ6IEJ1aWxkT3B0aW9ucywgY2FsbGJhY2s6IEJ1aWxkQ2FsbGJhY2sgPSAoKSA9PiAoe30pKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge1xuICAgIGJ1bmRsZXIgPSAnd2VicGFjaycsXG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgcmVtb3ZlID0gZmFsc2UsXG4gICAgdGVzdCA9IGZhbHNlLFxuICAgIHRyYW5zbGF0aW9ucyA9IGZhbHNlLFxuICAgIHZhcmlhYmxlcyA9ICd7fSdcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IGJ1aWxkaW5nLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgY29uc3Qge291dHB1dEZ1bGxQYXRoLCB1c2VUeXBlc2NyaXB0fSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgY2hlY2tMaW5rZWRNb2R1bGVzKCk7XG5cbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAncHJvZHVjdGlvbid9O1xuXG4gIGlmKHZhcmlhYmxlcykge1xuICAgIHRyeSB7XG4gICAgICB2YXJpYWJsZXNPYmogPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzLmVudiA9IHsuLi5wcm9jZXNzLmVudiwgLi4udmFyaWFibGVzT2JqfTtcblxuICBpZih0ZXN0KSB7XG4gICAgbG9nKCdUZXN0IG1vZGU6IEJ1aWxkIGVudmlyb25tZW50IGxvYWRlZCwgZXhpdGluZycsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYodHJhbnNsYXRpb25zKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnUHJvY2Vzc2luZyB0cmFuc2xhdGlvbnMuLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgJ2xpYic7XG5cbiAgICAgIGF3YWl0IHByb2Nlc3NUcmFuc2xhdGlvbnMoc291cmNlUGF0aCwgb3V0cHV0UGF0aCwgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdUcmFuc2xhdGlvbnMgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseSEnKTtcbiAgICB9IGNhdGNoKHRyYW5zbGF0aW9uRXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIHByb2Nlc3MgdHJhbnNsYXRpb25zOiAke3RyYW5zbGF0aW9uRXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBwcm9jZXNzIHRyYW5zbGF0aW9ucy4nKTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgc3Bpbm5lci5zdGFydCgnQnVpbGRpbmcgY29kZS4uLicpO1xuXG4gIGlmKHJlbW92ZSkge1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKG91dHB1dEZ1bGxQYXRoIHx8ICcnKTtcbiAgfVxuXG4gIGxldCBidWlsZFJlc3VsdCA9IDA7XG5cbiAgaWYoYnVuZGxlciA9PT0gJ3N3YycpIHtcbiAgICBidWlsZFJlc3VsdCA9IGF3YWl0IGJ1aWxkV2l0aFNXQyhzcGlubmVyLCBjbWQsIChzdGF0dXMpID0+IHtcbiAgICAgIGJ1aWxkUmVzdWx0ID0gc3RhdHVzO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJ1aWxkUmVzdWx0ID0gYXdhaXQgYnVpbGRXaXRoV2VicGFjayhzcGlubmVyLCBjbWQsIChzdGF0dXMpID0+IHtcbiAgICAgIGJ1aWxkUmVzdWx0ID0gc3RhdHVzO1xuICAgIH0pO1xuICB9XG5cbiAgaWYoYnVpbGRSZXN1bHQgPT09IDAgJiYgY21kLmFuYWx5emUpIHtcbiAgICBzcGlubmVyLnN0YXJ0KCdBSSBpcyBhbmFseXppbmcgdGhlIGJ1aWxkIG91dHB1dCBmb3Igb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXMuLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IHtcbiAgICAgICAgb3V0cHV0UGF0aDogTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCxcbiAgICAgICAgZW50cnlQb2ludHM6IGJ1bmRsZXIgPT09ICdzd2MnID9cbiAgICAgICAgICBgU291cmNlIGZpbGVzOiAke0xleENvbmZpZy5jb25maWcuc291cmNlRnVsbFBhdGh9LyoqLyoue3RzLGpzfWAgOlxuICAgICAgICAgIExleENvbmZpZy5jb25maWcud2VicGFjaz8uZW50cnkgfHwgJ1Vua25vd24gZW50cnkgcG9pbnRzJ1xuICAgICAgfTtcblxuICAgICAgYXdhaXQgYWlGdW5jdGlvbih7XG4gICAgICAgIHByb21wdDogYEFuYWx5emUgdGhpcyBidWlsZCBmb3Igb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXM6XG5cbkJ1aWxkIFR5cGU6ICR7YnVuZGxlcn1cbkZvcm1hdDogJHtjbWQuZm9ybWF0IHx8ICdkZWZhdWx0J31cbkVudmlyb25tZW50OiAke0xleENvbmZpZy5jb25maWcudGFyZ2V0RW52aXJvbm1lbnR9XG4ke0pTT04uc3RyaW5naWZ5KHN0YXRzLCBudWxsLCAyKX1cblxuV2hhdCBhcmUgdGhlIGtleSBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcyBmb3IgdGhpcyBidWlsZCBjb25maWd1cmF0aW9uPyBDb25zaWRlcjpcbjEuIEJ1bmRsZSBzaXplIG9wdGltaXphdGlvbiBzdHJhdGVnaWVzXG4yLiBDb2RlIHNwbGl0dGluZyByZWNvbW1lbmRhdGlvbnNcbjMuIFRyZWUtc2hha2luZyBpbXByb3ZlbWVudHNcbjQuIFBlcmZvcm1hbmNlIGVuaGFuY2VtZW50c1xuNS4gRGVwZW5kZW5jeSBvcHRpbWl6YXRpb25zYCxcbiAgICAgICAgdGFzazogJ29wdGltaXplJyxcbiAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgcXVpZXRcbiAgICAgIH0pO1xuXG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIGJ1aWxkIGFuYWx5c2lzIGNvbXBsZXRlJyk7XG4gICAgfSBjYXRjaChhaUVycm9yKSB7XG4gICAgICBzcGlubmVyLmZhaWwoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBBSSBvcHRpbWl6YXRpb24gYW5hbHlzaXMnKTtcbiAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBSSBhbmFseXNpcyBlcnJvcjonLCBhaUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZihidWlsZFJlc3VsdCA9PT0gMCkge1xuICAgIHRyeSB7XG4gICAgICBpZih1c2VUeXBlc2NyaXB0ICYmIGJ1bmRsZXIgPT09ICdzd2MnKSB7XG4gICAgICAgIGNvbnN0IHR5cGVzY3JpcHRQYXRoID0gcmVzb2x2ZUJpbmFyeVBhdGgoJ3RzYycsICd0eXBlc2NyaXB0Jyk7XG5cbiAgICAgICAgaWYodHlwZXNjcmlwdFBhdGgpIHtcbiAgICAgICAgICBzcGlubmVyLnN0YXJ0KCdHZW5lcmF0aW5nIFR5cGVTY3JpcHQgZGVjbGFyYXRpb25zLi4uJyk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZ1bGxQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLi9zcmMnKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEZ1bGxQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLi9saWInKTtcbiAgICAgICAgICAgIGNvbnN0IGdsb2JPcHRpb25zID0ge1xuICAgICAgICAgICAgICBjd2Q6IHNvdXJjZUZ1bGxQYXRoLFxuICAgICAgICAgICAgICBkb3Q6IGZhbHNlLFxuICAgICAgICAgICAgICBub2RpcjogdHJ1ZSxcbiAgICAgICAgICAgICAgYWJzb2x1dGU6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0c0ZpbGVzID0gZ2xvYlN5bmMoYCoqLyEoKi5zcGVjfCoudGVzdHwqLmludGVncmF0aW9uKS50c2AsIGdsb2JPcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IHRzeEZpbGVzID0gZ2xvYlN5bmMoYCoqLyEoKi5zcGVjfCoudGVzdHwqLmludGVncmF0aW9uKS50c3hgLCBnbG9iT3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBhbGxTb3VyY2VGaWxlcyA9IFsuLi50c0ZpbGVzLCAuLi50c3hGaWxlc107XG4gICAgICAgICAgICBjb25zdCB0eXBlc2NyaXB0T3B0aW9ucyA9IFtcbiAgICAgICAgICAgICAgLi4uTGV4Q29uZmlnLmdldFR5cGVTY3JpcHREZWNsYXJhdGlvbkZsYWdzKCksXG4gICAgICAgICAgICAgIC4uLmFsbFNvdXJjZUZpbGVzXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY2EodHlwZXNjcmlwdFBhdGgsIHR5cGVzY3JpcHRPcHRpb25zLCB7XG4gICAgICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgcmVqZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgYWxsOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhhc0RlY2xhcmF0aW9ucyA9IHJlc3VsdC5hbGw/LmluY2x1ZGVzKCdXcml0aW5nJykgfHwgcmVzdWx0LmFsbD8uaW5jbHVkZXMoJ0RlY2xhcmF0aW9uJykgfHwgZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yT3V0cHV0ID0gcmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0IHx8IHJlc3VsdC5hbGwgfHwgJ1Vua25vd24gZXJyb3InO1xuXG4gICAgICAgICAgICAgIGlmKCFoYXNEZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZ2VuZXJhdGlvbiBmYWlsZWRgLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgbG9nKGBcXG5FeGl0IENvZGU6ICR7cmVzdWx0LmV4aXRDb2RlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICBsb2coYFxcblR5cGVTY3JpcHQgQ29tbWFuZDogJHt0eXBlc2NyaXB0UGF0aH0gJHt0eXBlc2NyaXB0T3B0aW9ucy5zbGljZSgwLCAxMCkuam9pbignICcpfS4uLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICBsb2coYFxcbkVycm9yIE91dHB1dDpcXG4ke2Vycm9yT3V0cHV0fWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTGluZXMgPSBlcnJvck91dHB1dC5zcGxpdCgnXFxuJykuZmlsdGVyKGxpbmUgPT5cbiAgICAgICAgICAgICAgICAgIGxpbmUuaW5jbHVkZXMoJ2Vycm9yIFRTJykgfHxcbiAgICAgICAgICAgICAgICAgIGxpbmUuaW5jbHVkZXMoJ0Vycm9yOicpIHx8XG4gICAgICAgICAgICAgICAgICBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdzcmMvJykgfHxcbiAgICAgICAgICAgICAgICAgIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoJ1RTJylcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYoZXJyb3JMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBsb2coYFxcbktleSBFcnJvcnM6YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgICAgICAgZXJyb3JMaW5lcy5zbGljZSgwLCAxMCkuZm9yRWFjaChsaW5lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKGAgICR7bGluZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmKGVycm9yTGluZXMubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKGAgIC4uLiBhbmQgJHtlcnJvckxpbmVzLmxlbmd0aCAtIDEwfSBtb3JlIGVycm9yc2AsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzcGlubmVyLmZhaWwoJ1R5cGVTY3JpcHQgZGVjbGFyYXRpb24gZ2VuZXJhdGlvbiBoYWQgZXJyb3JzIChjb250aW51aW5nIGFueXdheSkuJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IFdhcm5pbmc6IFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZ2VuZXJhdGlvbiBjb21wbGV0ZWQgd2l0aCBlcnJvcnNgLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICBpZighcXVpZXQgJiYgZXJyb3JPdXRwdXQpIHtcbiAgICAgICAgICAgICAgICAgIGxvZyhgXFxuV2FybmluZ3M6XFxuJHtlcnJvck91dHB1dH1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucyBnZW5lcmF0ZWQgKHdpdGggd2FybmluZ3MpLicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ1R5cGVTY3JpcHQgZGVjbGFyYXRpb25zIGdlbmVyYXRlZCEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZ2VuZXJhdGlvbiBleGNlcHRpb25gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICBsb2coYFxcbkVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgaWYoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5zdGFjaykge1xuICAgICAgICAgICAgICBsb2coYFxcblN0YWNrOlxcbiR7ZXJyb3Iuc3RhY2t9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bpbm5lci5mYWlsKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGdlbmVyYXRpb24gaGFkIGlzc3VlcyAoY29udGludWluZyBhbnl3YXkpLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjb3B5Q29uZmlndXJlZEZpbGVzKHNwaW5uZXIsIExleENvbmZpZy5jb25maWcsIHF1aWV0KTtcbiAgICB9IGNhdGNoKGNvcHlFcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gY29weSBjb25maWd1cmVkIGZpbGVzOiAke2NvcHlFcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soYnVpbGRSZXN1bHQpO1xuICByZXR1cm4gYnVpbGRSZXN1bHQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBidWlsZDtcbiJdLCJuYW1lcyI6WyJ0cmFuc2Zvcm0iLCJleGVjYSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJkaXJuYW1lIiwicmVsYXRpdmUiLCJwYXRoUmVsYXRpdmUiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJMZXhDb25maWciLCJjaGVja0xpbmtlZE1vZHVsZXMiLCJjb3B5Q29uZmlndXJlZEZpbGVzIiwiY3JlYXRlU3Bpbm5lciIsImhhbmRsZVdlYnBhY2tQcm9ncmVzcyIsInJlbW92ZUZpbGVzIiwicmVzb2x2ZVdlYnBhY2tQYXRocyIsImdldExleFBhY2thZ2VKc29uUGF0aCIsInJlc29sdmVCaW5hcnlQYXRoIiwibG9nIiwicHJvY2Vzc1RyYW5zbGF0aW9ucyIsImFpRnVuY3Rpb24iLCJib3hlbiIsImNoYWxrIiwiY3VycmVudEZpbGVuYW1lIiwiY3VycmVudERpcm5hbWUiLCJldmFsIiwicHJvY2VzcyIsImN3ZCIsImRpc3BsYXlCdWlsZFN0YXR1cyIsImJ1bmRsZXIiLCJvdXRwdXRQYXRoIiwicXVpZXQiLCJzdGF0cyIsInN0YXRzSW5mbyIsIm1vZHVsZXMiLCJhc3NldHMiLCJncmVlbiIsImN5YW4iLCJzaXplIiwic3RhdHVzQm94IiwiYm9sZCIsInVuZGVybGluZSIsInllbGxvdyIsInBhZGRpbmciLCJtYXJnaW4iLCJib3JkZXJTdHlsZSIsImJvcmRlckNvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwiY29uc29sZSIsImJ1aWxkV2l0aFNXQyIsInNwaW5uZXIiLCJjb21tYW5kT3B0aW9ucyIsImNhbGxiYWNrIiwiY2xpTmFtZSIsImZvcm1hdCIsInNvdXJjZVBhdGgiLCJ3YXRjaCIsIm91dHB1dEZ1bGxQYXRoIiwic291cmNlRnVsbFBhdGgiLCJzd2MiLCJzd2NDb25maWciLCJ0YXJnZXRFbnZpcm9ubWVudCIsInVzZUdyYXBoUWwiLCJ1c2VUeXBlc2NyaXB0IiwiY29uZmlnIiwic291cmNlRGlyIiwiZ2xvYk9wdGlvbnMiLCJhYnNvbHV0ZSIsImRvdCIsIm5vZGlyIiwibm9zb3J0IiwidHNGaWxlcyIsImpzRmlsZXMiLCJzb3VyY2VGaWxlcyIsIm91dHB1dERpciIsInN0YXJ0IiwidHJhbnNmb3JtUHJvbWlzZXMiLCJtYXAiLCJmaWxlIiwiZmlsZVJlbGF0aXZlVG9Tb3VyY2UiLCJvdXRwdXRGaWxlIiwicmVwbGFjZSIsIm91dHB1dERpclBhdGgiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJzb3VyY2VDb2RlIiwic3djT3B0aW9ucyIsImZpbGVuYW1lIiwibW9kdWxlIiwidHlwZSIsInJlc3VsdCIsIndyaXRlRmlsZVN5bmMiLCJjb2RlIiwiUHJvbWlzZSIsImFsbCIsInN1Y2NlZWQiLCJlcnJvciIsIm1lc3NhZ2UiLCJFcnJvciIsInN0YWNrIiwiZmFpbCIsImJ1aWxkV2l0aFdlYnBhY2siLCJjbWQiLCJhbmFseXplIiwiY29uZmlnTmFtZSIsImRlZmluZVByb2Nlc3NFbnZOb2RlRW52IiwiZGV2dG9vbCIsImRpc2FibGVJbnRlcnByZXQiLCJlbnRyeSIsImVudiIsImZhaWxPbldhcm5pbmdzIiwianNvbiIsIm1lcmdlIiwibW9kZSIsIm5hbWUiLCJub2RlRW52Iiwibm9EZXZ0b29sIiwibm9TdGF0cyIsIm5vVGFyZ2V0Iiwibm9XYXRjaCIsIm5vV2F0Y2hPcHRpb25zU3RkaW4iLCJ0YXJnZXQiLCJ3YXRjaE9wdGlvbnNTdGRpbiIsImVudHJ5VmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJ3ZWJwYWNrQ29uZmlnIiwiaXNSZWxhdGl2ZUNvbmZpZyIsInN1YnN0ciIsInByb2plY3RDb25maWdQYXRoIiwicHJvamVjdENvbmZpZ1BhdGhUcyIsImhhc1Byb2plY3RDb25maWciLCJyZXNvbHZlZENvbmZpZyIsImxleFBhY2thZ2VQYXRoIiwibGV4UGFja2FnZURpciIsImxleFdlYnBhY2tDb25maWciLCJ3ZWJwYWNrT3B0aW9ucyIsInB1c2giLCJ0b1N0cmluZyIsIndlYnBhY2tQYXRoIiwiZXhlY3V0YWJsZVBhdGgiLCJmaW5hbFdlYnBhY2tPcHRpb25zIiwiZW5kc1dpdGgiLCJjaGlsZFByb2Nlc3MiLCJlbmNvZGluZyIsInN0ZGlvIiwiYnVpbGRDb21wbGV0ZWQiLCJidWlsZFN0YXRzIiwic3Rkb3V0Iiwib24iLCJkYXRhIiwib3V0cHV0IiwiaW5jbHVkZXMiLCJtb2R1bGVNYXRjaCIsIm1hdGNoIiwiYXNzZXRNYXRjaCIsInNpemVNYXRjaCIsInBhcnNlSW50Iiwic3RkZXJyIiwic2xpY2UiLCJqb2luIiwiYXNzaXN0IiwicHJvbXB0IiwiSlNPTiIsInN0cmluZ2lmeSIsInRhc2siLCJjb250ZXh0IiwiYWlFcnJvciIsImJ1aWxkIiwicmVtb3ZlIiwidGVzdCIsInRyYW5zbGF0aW9ucyIsInZhcmlhYmxlcyIsInBhcnNlQ29uZmlnIiwidmFyaWFibGVzT2JqIiwiTk9ERV9FTlYiLCJwYXJzZSIsInRyYW5zbGF0aW9uRXJyb3IiLCJidWlsZFJlc3VsdCIsInN0YXR1cyIsImVudHJ5UG9pbnRzIiwid2VicGFjayIsInR5cGVzY3JpcHRQYXRoIiwidHN4RmlsZXMiLCJhbGxTb3VyY2VGaWxlcyIsInR5cGVzY3JpcHRPcHRpb25zIiwiZ2V0VHlwZVNjcmlwdERlY2xhcmF0aW9uRmxhZ3MiLCJyZWplY3QiLCJleGl0Q29kZSIsImhhc0RlY2xhcmF0aW9ucyIsImVycm9yT3V0cHV0IiwiZXJyb3JMaW5lcyIsInNwbGl0IiwiZmlsdGVyIiwibGluZSIsInRyaW0iLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwiZm9yRWFjaCIsImNvcHlFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsU0FBUyxRQUFPLFlBQVk7QUFDcEMsU0FBUUMsS0FBSyxRQUFPLFFBQVE7QUFDNUIsU0FBUUMsVUFBVSxFQUFFQyxZQUFZLFFBQU8sS0FBSztBQUM1QyxTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxTQUNFQyxPQUFPLEVBQ1BDLFlBQVlDLFlBQVksRUFDeEJDLFdBQVdDLFdBQVcsUUFDakIsT0FBTztBQUVkLFNBQVFDLFNBQVMsUUFBTyxxQkFBcUI7QUFDN0MsU0FBUUMsa0JBQWtCLEVBQUVDLG1CQUFtQixFQUFFQyxhQUFhLEVBQXFCQyxxQkFBcUIsRUFBRUMsV0FBVyxRQUFPLHFCQUFxQjtBQUNqSixTQUNFQyxtQkFBbUIsRUFDbkJDLHFCQUFxQixFQUNyQkMsaUJBQWlCLFFBQ1osc0JBQXNCO0FBQzdCLFNBQVFDLEdBQUcsUUFBTyxxQkFBcUI7QUFDdkMsU0FBUUMsbUJBQW1CLFFBQU8sOEJBQThCO0FBQ2hFLFNBQVFDLFVBQVUsUUFBTyxjQUFjO0FBQ3ZDLE9BQU9D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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nlabs/lex",
3
- "version": "1.52.6",
3
+ "version": "1.52.10",
4
4
  "description": "Lex",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -160,12 +160,15 @@
160
160
  "latest-version": "9.0.0",
161
161
  "lodash": "^4.17.21",
162
162
  "luxon": "^3.7.2",
163
+ "math-expression-evaluator": "^2.0.7",
164
+ "mini-css-extract-plugin": "^2.9.4",
163
165
  "net": "^1.0.2",
164
166
  "npm-check-updates": "^19.1.2",
165
167
  "openai": "^6.10.0",
166
168
  "ora": "9.0.0",
167
169
  "os-browserify": "^0.3.0",
168
170
  "path-browserify": "^1.0.1",
171
+ "postcss": "^8.5.6",
169
172
  "postcss-browser-reporter": "^0.7.0",
170
173
  "postcss-cli": "^11.0.1",
171
174
  "postcss-custom-properties": "^14.0.6",
@@ -177,12 +180,10 @@
177
180
  "postcss-nesting": "^13.0.2",
178
181
  "postcss-percentage": "^0.0.0",
179
182
  "postcss-preset-env": "^10.5.0",
180
- "postcss-value-parser": "^4.2.0",
181
- "math-expression-evaluator": "^2.0.7",
182
183
  "postcss-simple-vars": "^7.0.1",
183
184
  "postcss-svgo": "7.1.0",
184
185
  "postcss-url": "10.1.3",
185
- "postcss": "^8.5.6",
186
+ "postcss-value-parser": "^4.2.0",
186
187
  "process": "^0.11.10",
187
188
  "randombytes": "^2.1.0",
188
189
  "react": "^19.2.1",
package/webpack.config.js CHANGED
@@ -14,6 +14,7 @@ import FaviconsWebpackPlugin from 'favicons-webpack-plugin';
14
14
  import {existsSync} from 'fs';
15
15
  import {sync as globSync} from 'glob';
16
16
  import HtmlWebPackPlugin from 'html-webpack-plugin';
17
+ import MiniCssExtractPlugin from 'mini-css-extract-plugin';
17
18
  import isEmpty from 'lodash/isEmpty.js';
18
19
  import {resolve as pathResolve} from 'path';
19
20
  import postcssBrowserReporter from 'postcss-browser-reporter';
@@ -25,6 +26,7 @@ import postcssPresetEnv from 'postcss-preset-env';
25
26
  import postcssUrl from 'postcss-url';
26
27
  import SVGSpriteMapPlugin from 'svg-spritemap-webpack-plugin';
27
28
  import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin';
29
+ import {createRequire} from 'module';
28
30
  import {URL} from 'url';
29
31
  import {default as webpack} from 'webpack';
30
32
  import {BundleAnalyzerPlugin} from 'webpack-bundle-analyzer';
@@ -40,6 +42,7 @@ const {ProgressPlugin, ProvidePlugin} = webpack;
40
42
  const isProduction = process.env.NODE_ENV === 'production';
41
43
  const lexConfig = JSON.parse(process.env.LEX_CONFIG) || {};
42
44
  const dirName = new URL('.', import.meta.url).pathname;
45
+ const require = createRequire(import.meta.url);
43
46
 
44
47
  const {
45
48
  isStatic,
@@ -231,38 +234,13 @@ if(staticPaths.length) {
231
234
  if(existsSync(`${sourceFullPath}/${lexConfig.entryHTML}`)) {
232
235
  plugins.push(
233
236
  new HtmlWebPackPlugin({
234
- chunks: ['index'],
235
- filename: lexConfig.entryHTML || './index.html',
237
+ filename: 'index.html',
236
238
  minify: isProduction,
237
- scriptLoading: 'defer',
238
239
  showErrors: !isProduction,
239
240
  template: `${sourceFullPath}/${lexConfig.entryHTML}`,
240
241
  inject: true
241
242
  })
242
243
  );
243
-
244
- const missingAssets = [];
245
- const requiredAssets = ['favicon.ico', 'images/logo-icon-64.png', 'manifest.json'];
246
-
247
- requiredAssets.forEach(asset => {
248
- if (!existsSync(`${sourceFullPath}/${asset}`)) {
249
- missingAssets.push(asset);
250
- }
251
- });
252
-
253
- if (missingAssets.length > 0) {
254
- plugins.push(
255
- new CopyWebpackPlugin({
256
- patterns: missingAssets.map(asset => ({
257
- from: pathResolve(dirName, 'emptyModule.js'),
258
- to: `${outputFullPath}/${asset}`,
259
- transform() {
260
- return '';
261
- }
262
- }))
263
- })
264
- );
265
- }
266
244
  }
267
245
 
268
246
  let outputFilename = outputFile;
@@ -286,6 +264,7 @@ const swcLoaderPath = relativeNodePath('swc-loader', dirName);
286
264
  const cssLoaderPath = relativeNodePath('css-loader', dirName);
287
265
  const graphqlLoaderPath = relativeNodePath('graphql-tag/loader', dirName);
288
266
  const htmlLoaderPath = relativeNodePath('html-loader', dirName);
267
+ const miniCssExtractPluginPath = relativeNodePath('mini-css-extract-plugin', dirName);
289
268
  const postcssLoaderPath = relativeNodePath('postcss-loader', dirName);
290
269
  const sourceMapLoaderPath = relativeNodePath('source-map-loader', dirName);
291
270
  const styleLoaderPath = relativeNodePath('style-loader', dirName);
@@ -486,7 +465,13 @@ export default (webpackEnv, webpackOptions) => {
486
465
  {
487
466
  test: /\.css$/,
488
467
  use: [
489
- styleLoaderPath,
468
+ // In production, extract CSS to separate files for injection into HTML
469
+ // In development, inject CSS via style-loader for HMR
470
+ ...(isProduction && isWeb
471
+ ? [{
472
+ loader: require(miniCssExtractPluginPath).loader
473
+ }]
474
+ : [styleLoaderPath]),
490
475
  {
491
476
  loader: cssLoaderPath,
492
477
  options: {
@@ -684,7 +669,7 @@ export default (webpackEnv, webpackOptions) => {
684
669
  historyFallback: {
685
670
  disableDotRule: true,
686
671
  htmlAcceptHeaders: ['text/html', '*/*'],
687
- index: '/index.html', // Always point to the output HTML file (webpack always outputs index.html)
672
+ index: '/index.html',
688
673
  logger: console.log.bind(console),
689
674
  rewrites: [
690
675
  {
@@ -755,7 +740,7 @@ export default (webpackEnv, webpackOptions) => {
755
740
  open: process.env.WEBPACK_DEV_OPEN === 'true',
756
741
  port: finalPort,
757
742
  progress: 'minimal',
758
- static: outputFullPath ? [outputFullPath] : [], // Always include output path to serve generated HTML
743
+ static: outputFullPath ? [outputFullPath] : [],
759
744
  status: true
760
745
  })
761
746
  );
@@ -774,6 +759,18 @@ export default (webpackEnv, webpackOptions) => {
774
759
  };
775
760
  }
776
761
  } else {
762
+ // In production, extract CSS to separate files for injection into HTML
763
+ if(isProduction && isWeb) {
764
+ const MiniCssExtractPlugin = require(miniCssExtractPluginPath);
765
+ plugins.push(
766
+ new MiniCssExtractPlugin({
767
+ filename: outputHash ? 'css/[name].[contenthash].css' : 'css/[name].css',
768
+ chunkFilename: outputHash ? 'css/[name].[contenthash].chunk.css' : 'css/[name].chunk.css'
769
+ })
770
+ );
771
+ webpackConfig.optimization.moduleIds = 'deterministic';
772
+ }
773
+
777
774
  const siteLogo = `${sourceFullPath}/images/logo.png`;
778
775
 
779
776
  if(existsSync(siteLogo)) {
@@ -801,10 +798,6 @@ export default (webpackEnv, webpackOptions) => {
801
798
  new StaticSitePlugin()
802
799
  );
803
800
  }
804
-
805
- if(isProduction && isWeb) {
806
- webpackConfig.optimization.moduleIds = 'deterministic';
807
- }
808
801
  }
809
802
 
810
803
  if (process.env.LEX_CONFIG_DEBUG) {
@@ -853,19 +846,16 @@ export default (webpackEnv, webpackOptions) => {
853
846
 
854
847
  const mergedConfig = merge(webpackConfig, webpackConfigFiltered);
855
848
 
856
- // Filter out PostCSS plugin objects from webpack plugins array
857
- // PostCSS plugins have 'postcssPlugin' property and should only be in postcssOptions
858
849
  if (Array.isArray(mergedConfig.plugins)) {
859
850
  mergedConfig.plugins = mergedConfig.plugins.filter((plugin) => {
860
- // Keep webpack plugins (have 'apply' method or are instances with constructor)
861
851
  if (typeof plugin === 'function' || (plugin && typeof plugin.apply === 'function')) {
862
852
  return true;
863
853
  }
864
- // Filter out PostCSS plugin objects (have 'postcssPlugin' property)
854
+
865
855
  if (plugin && typeof plugin === 'object' && 'postcssPlugin' in plugin) {
866
856
  return false;
867
857
  }
868
- // Keep other valid webpack plugins
858
+
869
859
  return true;
870
860
  });
871
861
  }