@nlabs/lex 1.55.0 → 1.55.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -148,6 +148,18 @@ lex dev --config ./custom.webpack.js
148
148
  lex dev --usePublicIp
149
149
  ```
150
150
 
151
+ Configure the default `lex dev` port in `lex.config.mjs`:
152
+
153
+ ```javascript
154
+ export default {
155
+ dev: {
156
+ port: 4200
157
+ }
158
+ };
159
+ ```
160
+
161
+ `--port` takes precedence over `dev.port`.
162
+
151
163
  **Public IP Caching**: Lex automatically caches your public IP address for 1 week to reduce API calls. Use `--usePublicIp` to force refresh the cache when needed.
152
164
 
153
165
  **Static Assets**: If your HTML template references static assets (like favicon.ico, manifest.json, or images) with absolute paths, ensure these files exist in your source directory or use relative paths to avoid webpack compilation errors.
@@ -174,6 +186,22 @@ lex serverless --debug --printOutput
174
186
 
175
187
  **Configuration**: Configure your serverless functions in `lex.config.mjs`. See the [Serverless Documentation](src/commands/serverless/serverless.docs.md) for detailed configuration options.
176
188
 
189
+ ```javascript
190
+ export default {
191
+ serverless: {
192
+ custom: {
193
+ 'serverless-offline': {
194
+ httpPort: 3100,
195
+ httpsPort: 3101,
196
+ wsPort: 3102
197
+ }
198
+ }
199
+ }
200
+ };
201
+ ```
202
+
203
+ `--httpPort`, `--httpsPort`, and `--wsPort` override these config values.
204
+
177
205
  **Environment Variables**: The serverless command automatically loads environment variables from `.env`, `.env.local`, and `.env.development` files, with command-line variables taking precedence.
178
206
 
179
207
  ### **Production Builds**
@@ -310,6 +338,7 @@ Lex provides extensive configuration options through the `lex.config.js` file. H
310
338
  |--------|------|---------|-------------|---------|
311
339
  | `entryHTML` | `string` | `'index.html'` | HTML template file | `entryHTML: 'app.html'` |
312
340
  | `entryJs` | `string` | `'index.js'` | Main JavaScript entry file | `entryJs: 'main.tsx'` |
341
+ | `dev.port` | `number` | `3000` | Default port used by `lex dev` when `--port` is not passed | `dev: { port: 4200 }` |
313
342
  | `outputFile` | `string` | `undefined` | Specific output filename | `outputFile: 'bundle.js'` |
314
343
  | `outputFullPath` | `string` | `path.resolve('./lib')` | Absolute output path for build artifacts. Used by webpack dev server for static file serving. | `outputFullPath: '/absolute/build'` |
315
344
  | `outputHash` | `boolean` | `false` | Add hash to output filenames | `outputHash: true` |
@@ -18,6 +18,9 @@ export interface AIConfig {
18
18
  maxTokens?: number;
19
19
  temperature?: number;
20
20
  }
21
+ export interface DevConfig {
22
+ port?: number;
23
+ }
21
24
  export interface ESLintConfig {
22
25
  [key: string]: unknown;
23
26
  extends?: string[];
@@ -27,6 +30,7 @@ export interface LexConfigType {
27
30
  ai?: AIConfig;
28
31
  configFiles?: string[];
29
32
  copyFiles?: string[];
33
+ dev?: DevConfig;
30
34
  entryHTML?: string;
31
35
  entryJs?: string;
32
36
  env?: object;
package/lib/LexConfig.js CHANGED
@@ -414,4 +414,4 @@ _define_property(LexConfig, "config", {
414
414
  ...defaultConfigValues
415
415
  });
416
416
 
417
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9MZXhDb25maWcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBmaW5kRmlsZVVwIGZyb20gJ2ZpbmQtZmlsZS11cCc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSBhcyBwYXRoRXh0bmFtZSxcbiAgcmVsYXRpdmUgYXMgcGF0aFJlbGF0aXZlLFxuICByZXNvbHZlIGFzIHBhdGhSZXNvbHZlXG59IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtVUkx9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7Z2V0TGV4UGFja2FnZUpzb25QYXRoLCByZWxhdGl2ZUZpbGVQYXRofSBmcm9tICcuL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4vdXRpbHMvbG9nLmpzJztcblxuaW1wb3J0IHR5cGUge09wdGlvbnN9IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQgdHlwZSB7TGludGVyfSBmcm9tICdlc2xpbnQnO1xuXG5jb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cblxuZXhwb3J0IGludGVyZmFjZSBWaXRlc3RDb25maWcge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYnBhY2tDb25maWcge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICBlbnRyeT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBvdXRwdXQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbW9kdWxlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBsdWdpbnM/OiB1bmtub3duW107XG4gIHN0YXRpY1BhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQUlDb25maWcge1xuICBwcm92aWRlcj86ICdjdXJzb3InIHwgJ2NvcGlsb3QnIHwgJ29wZW5haScgfCAnYW50aHJvcGljJyB8ICdub25lJztcbiAgYXBpS2V5Pzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFU0xpbnRDb25maWcge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICBleHRlbmRzPzogc3RyaW5nW107XG4gIHJ1bGVzPzogTGludGVyLlJ1bGVzUmVjb3JkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExleENvbmZpZ1R5cGUge1xuICBhaT86IEFJQ29uZmlnO1xuICBjb25maWdGaWxlcz86IHN0cmluZ1tdO1xuICBjb3B5RmlsZXM/OiBzdHJpbmdbXTtcbiAgZW50cnlIVE1MPzogc3RyaW5nO1xuICBlbnRyeUpzPzogc3RyaW5nO1xuICBlbnY/OiBvYmplY3Q7XG4gIGVzbGludD86IEVTTGludENvbmZpZztcbiAgZ2l0VXJsPzogc3RyaW5nO1xuICB2aXRlc3Q/OiBWaXRlc3RDb25maWc7XG4gIGxpYnJhcnlOYW1lPzogc3RyaW5nO1xuICBsaWJyYXJ5VGFyZ2V0Pzogc3RyaW5nO1xuICBvdXRwdXRGaWxlPzogc3RyaW5nO1xuICBvdXRwdXRGdWxsUGF0aD86IHN0cmluZztcbiAgb3V0cHV0SGFzaD86IGJvb2xlYW47XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIHBhY2thZ2VNYW5hZ2VyPzogJ25wbScgfCAneWFybic7XG4gIHByZXNldD86ICd3ZWInIHwgJ25vZGUnIHwgJ2xhbWJkYScgfCAnbW9iaWxlJztcbiAgc291cmNlRnVsbFBhdGg/OiBzdHJpbmc7XG4gIHNvdXJjZVBhdGg/OiBzdHJpbmc7XG4gIHN3Yz86IFNXQ09wdGlvbnM7XG4gIHRhcmdldEVudmlyb25tZW50PzogJ25vZGUnIHwgJ3dlYic7XG4gIHVzZUdyYXBoUWw/OiBib29sZWFuO1xuICB1c2VUeXBlc2NyaXB0PzogYm9vbGVhbjtcbiAgd2VicGFjaz86IFdlYnBhY2tDb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IExleENvbmZpZ1R5cGU7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnVmFsdWVzOiBMZXhDb25maWdUeXBlID0ge1xuICBhaToge1xuICAgIG1heFRva2VuczogNDAwMCxcbiAgICBtb2RlbDogJ2dwdC00bycsXG4gICAgcHJvdmlkZXI6ICdub25lJyxcbiAgICB0ZW1wZXJhdHVyZTogMC4xXG4gIH0sXG4gIGNvbmZpZ0ZpbGVzOiBbXSxcbiAgY29weUZpbGVzOiBbXSxcbiAgZW50cnlIVE1MOiAnaW5kZXguaHRtbCcsXG4gIGVudHJ5SnM6ICdpbmRleC5qcycsXG4gIGVudjogbnVsbCxcbiAgZXNsaW50OiB7fSxcbiAgdml0ZXN0OiB7fSxcbiAgb3V0cHV0RnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vbGliJyksXG4gIG91dHB1dEhhc2g6IGZhbHNlLFxuICBvdXRwdXRQYXRoOiAnLi9saWInLFxuICBwYWNrYWdlTWFuYWdlcjogJ25wbScsXG4gIHByZXNldDogJ3dlYicsXG4gIHNvdXJjZUZ1bGxQYXRoOiBwYXRoUmVzb2x2ZShjd2QsICcuL3NyYycpLFxuICBzb3VyY2VQYXRoOiAnLi9zcmMnLFxuICBzd2M6IHtcbiAgICBpbmxpbmVTb3VyY2VzQ29udGVudDogdHJ1ZSxcbiAgICBpc01vZHVsZTogdHJ1ZSxcbiAgICBqc2M6IHtcbiAgICAgIGV4dGVybmFsSGVscGVyczogZmFsc2UsXG4gICAgICBrZWVwQ2xhc3NOYW1lczogZmFsc2UsXG4gICAgICBsb29zZTogZmFsc2UsXG4gICAgICBwYXJzZXI6IHtcbiAgICAgICAgZGVjb3JhdG9yczogdHJ1ZSxcbiAgICAgICAgZHluYW1pY0ltcG9ydDogdHJ1ZSxcbiAgICAgICAgc3ludGF4OiAndHlwZXNjcmlwdCcsXG4gICAgICAgIHRzeDogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHRhcmdldDogJ2VzMjAyMycsXG4gICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgcmVhY3Q6IHtcbiAgICAgICAgICBydW50aW1lOiAnYXV0b21hdGljJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBtaW5pZnk6IGZhbHNlLFxuICAgIG1vZHVsZToge1xuICAgICAgbGF6eTogZmFsc2UsXG4gICAgICBub0ludGVyb3A6IGZhbHNlLFxuICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICAgIHN0cmljdE1vZGU6IHRydWUsXG4gICAgICB0eXBlOiAnZXM2J1xuICAgIH0sXG4gICAgc291cmNlTWFwczogJ2lubGluZSdcbiAgfSxcbiAgdGFyZ2V0RW52aXJvbm1lbnQ6ICd3ZWInLFxuICB1c2VHcmFwaFFsOiBmYWxzZSxcbiAgdXNlVHlwZXNjcmlwdDogZmFsc2UsXG4gIHdlYnBhY2s6IHtcbiAgICBzdGF0aWNQYXRoOiAnLi9zcmMvc3RhdGljJ1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UGFja2FnZURpciA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBjdXJyZW50UGtnUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgJ3BhY2thZ2UuanNvbicpO1xuXG4gIGlmKGV4aXN0c1N5bmMoY3VycmVudFBrZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGN1cnJlbnRQa2dQYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmKCFwa2cud29ya3NwYWNlcykge1xuICAgICAgICByZXR1cm4gY3dkO1xuICAgICAgfVxuICAgIH0gY2F0Y2h7XG4gICAgICByZXR1cm4gY3dkO1xuICAgIH1cbiAgfVxuXG4gIGxldCBzZWFyY2hEaXIgPSBjd2Q7XG5cbiAgZm9yKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICBjb25zdCBwa2dQYXRoID0gcGF0aFJlc29sdmUoc2VhcmNoRGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhwa2dQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGtnUGF0aCwgJ3V0ZjgnKSk7XG5cbiAgICAgICAgaWYoIXBrZy53b3Jrc3BhY2VzKSB7XG4gICAgICAgICAgcmV0dXJuIHNlYXJjaERpcjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaHtcbiAgICAgICAgLy8gQ29udGludWUgc2VhcmNoaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShzZWFyY2hEaXIpO1xuXG4gICAgaWYocGFyZW50ID09PSBzZWFyY2hEaXIpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzZWFyY2hEaXIgPSBwYXJlbnQ7XG4gIH1cblxuICBjb25zdCBjb25maWdGb3JtYXRzID0gWydqcycsICdtanMnLCAnY2pzJywgJ3RzJywgJ2pzb24nXTtcblxuICBmb3IoY29uc3QgZm9ybWF0IG9mIGNvbmZpZ0Zvcm1hdHMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gZmluZEZpbGVVcC5zeW5jKGBsZXguY29uZmlnLiR7Zm9ybWF0fWAsIGN3ZCwgNSk7XG5cbiAgICBpZihjb25maWdQYXRoKSB7XG4gICAgICByZXR1cm4gZGlybmFtZShjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3dkO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVTY3JpcHRDb25maWdQYXRoID0gKGNvbmZpZ05hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHBhY2thZ2VEaXIgPSBnZXRQYWNrYWdlRGlyKCk7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgaWYoY29uZmlnTmFtZSA9PT0gJ3RzY29uZmlnLmJ1aWxkLmpzb24nKSB7XG4gICAgY29uc3QgcHJvamVjdEJ1aWxkQ29uZmlnID0gcGF0aFJlc29sdmUocGFja2FnZURpciwgJ3RzY29uZmlnLmJ1aWxkLmpzb24nKTtcblxuICAgIGlmKGV4aXN0c1N5bmMocHJvamVjdEJ1aWxkQ29uZmlnKSkge1xuICAgICAgcmV0dXJuIHByb2plY3RCdWlsZENvbmZpZztcbiAgICB9XG5cbiAgICBjb25zdCByb290QnVpbGRDb25maWcgPSBwYXRoUmVzb2x2ZShjd2QsICd0c2NvbmZpZy5idWlsZC5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhyb290QnVpbGRDb25maWcpKSB7XG4gICAgICByZXR1cm4gcm9vdEJ1aWxkQ29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIGlmKGNvbmZpZ05hbWUgPT09ICd0c2NvbmZpZy5saW50Lmpzb24nKSB7XG4gICAgY29uc3QgcHJvamVjdExpbnRDb25maWcgPSBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAndHNjb25maWcuZXNsaW50Lmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHByb2plY3RMaW50Q29uZmlnKSkge1xuICAgICAgcmV0dXJuIHByb2plY3RMaW50Q29uZmlnO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3RMaW50Q29uZmlnID0gcGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcuZXNsaW50Lmpzb24nKTtcblxuICAgIGlmKGV4aXN0c1N5bmMocm9vdExpbnRDb25maWcpKSB7XG4gICAgICByZXR1cm4gcm9vdExpbnRDb25maWc7XG4gICAgfVxuICB9XG5cbiAgaWYoY29uZmlnTmFtZSA9PT0gJ3RzY29uZmlnLnRlc3QuanNvbicpIHtcbiAgICBjb25zdCBwcm9qZWN0VGVzdENvbmZpZyA9IHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsICd0c2NvbmZpZy50ZXN0Lmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHByb2plY3RUZXN0Q29uZmlnKSkge1xuICAgICAgcmV0dXJuIHByb2plY3RUZXN0Q29uZmlnO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3RUZXN0Q29uZmlnID0gcGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcudGVzdC5qc29uJyk7XG5cbiAgICBpZihleGlzdHNTeW5jKHJvb3RUZXN0Q29uZmlnKSkge1xuICAgICAgcmV0dXJuIHJvb3RUZXN0Q29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3RDb25maWdQYXRoID0gcGF0aFJlc29sdmUocGFja2FnZURpciwgY29uZmlnTmFtZSk7XG5cbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0Q29uZmlnUGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdENvbmZpZ1BhdGg7XG4gIH1cblxuICBjb25zdCByb290Q29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgY29uZmlnTmFtZSk7XG5cbiAgaWYoZXhpc3RzU3luYyhyb290Q29uZmlnUGF0aCkpIHtcbiAgICByZXR1cm4gcm9vdENvbmZpZ1BhdGg7XG4gIH1cblxuICBjb25zdCBsZXhEaXIgPSBMZXhDb25maWcuZ2V0TGV4RGlyKCk7XG5cbiAgcmV0dXJuIHBhdGhSZXNvbHZlKGxleERpciwgY29uZmlnTmFtZSk7XG59O1xuXG5leHBvcnQgY2xhc3MgTGV4Q29uZmlnIHtcbiAgc3RhdGljIGNvbmZpZzogTGV4Q29uZmlnVHlwZSA9IHtcbiAgICAuLi5kZWZhdWx0Q29uZmlnVmFsdWVzXG4gIH07XG5cbiAgc3RhdGljIHNldCB1c2VUeXBlc2NyaXB0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgTGV4Q29uZmlnLmNvbmZpZy51c2VUeXBlc2NyaXB0ID0gdmFsdWU7XG4gICAgY29uc3Qge2VudHJ5SnMsIHNvdXJjZUZ1bGxQYXRoLCB0YXJnZXRFbnZpcm9ubWVudH0gPSBMZXhDb25maWcuY29uZmlnO1xuXG4gICAgaWYoZW50cnlKcyA9PT0gJ2luZGV4LmpzJyAmJiB2YWx1ZSkge1xuICAgICAgY29uc3QgaW5kZXhQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShjd2QsIHNvdXJjZUZ1bGxQYXRoLCAnaW5kZXgudHN4Jyk7XG4gICAgICBjb25zdCBoYXNJbmRleFRzeDogYm9vbGVhbiA9IGV4aXN0c1N5bmMoaW5kZXhQYXRoKTtcblxuICAgICAgaWYoaGFzSW5kZXhUc3gpIHtcbiAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy5lbnRyeUpzID0gJ2luZGV4LnRzeCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmVudHJ5SnMgPSAnaW5kZXgudHMnO1xuICAgICAgfVxuICAgIH1cblxuICAgIExleENvbmZpZy5jb25maWcuc3djLmpzYy5wYXJzZXIgPSB7XG4gICAgICBzeW50YXg6ICd0eXBlc2NyaXB0JyxcbiAgICAgIHRzeDogdHJ1ZVxuICAgIH07XG5cbiAgICBpZih0YXJnZXRFbnZpcm9ubWVudCA9PT0gJ3dlYicpIHtcbiAgICAgIExleENvbmZpZy5jb25maWcuc3djLmpzYy50cmFuc2Zvcm0gPSB7XG4gICAgICAgIHJlYWN0OiB7XG4gICAgICAgICAgcnVudGltZTogJ2F1dG9tYXRpYydcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TGV4RGlyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRpcm5hbWUoZ2V0TGV4UGFja2FnZUpzb25QYXRoKCkpO1xuICB9XG5cbiAgc3RhdGljIHVwZGF0ZUNvbmZpZyh1cGRhdGVkQ29uZmlnOiBMZXhDb25maWdUeXBlKTogTGV4Q29uZmlnVHlwZSB7XG4gICAgY29uc3Qge291dHB1dEZ1bGxQYXRoLCBvdXRwdXRQYXRoLCBzb3VyY2VQYXRoLCBzb3VyY2VGdWxsUGF0aCwgdXNlVHlwZXNjcmlwdCwgYWl9ID0gdXBkYXRlZENvbmZpZztcbiAgICBjb25zdCBwYWNrYWdlRGlyID0gZ2V0UGFja2FnZURpcigpO1xuXG4gICAgaWYodXNlVHlwZXNjcmlwdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBMZXhDb25maWcudXNlVHlwZXNjcmlwdCA9IHVzZVR5cGVzY3JpcHQ7XG4gICAgfVxuXG4gICAgaWYob3V0cHV0UGF0aCAhPT0gdW5kZWZpbmVkICYmIG91dHB1dEZ1bGxQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHVwZGF0ZWRDb25maWcub3V0cHV0RnVsbFBhdGggPSBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCBvdXRwdXRQYXRoKTtcbiAgICB9XG5cbiAgICBpZihzb3VyY2VQYXRoICE9PSB1bmRlZmluZWQgJiYgc291cmNlRnVsbFBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBkYXRlZENvbmZpZy5zb3VyY2VGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsIHNvdXJjZVBhdGgpO1xuICAgIH1cblxuICAgIGlmKGFpKSB7XG4gICAgICBMZXhDb25maWcuY29uZmlnLmFpID0gey4uLkxleENvbmZpZy5jb25maWcuYWksIC4uLmFpfTtcblxuICAgICAgaWYocHJvY2Vzcy5lbnYuQ1VSU09SX0lERSA9PT0gJ3RydWUnICYmIExleENvbmZpZy5jb25maWcuYWkucHJvdmlkZXIgPT09ICdub25lJykge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmFpLnByb3ZpZGVyID0gJ2N1cnNvcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgTGV4Q29uZmlnLmNvbmZpZyA9IHsuLi5MZXhDb25maWcuY29uZmlnLCAuLi51cGRhdGVkQ29uZmlnfTtcblxuICAgIHJldHVybiBMZXhDb25maWcuY29uZmlnO1xuICB9XG5cbiAgc3RhdGljIGFkZENvbmZpZ1BhcmFtcyhjbWQsIHBhcmFtczogTGV4Q29uZmlnVHlwZSkge1xuICAgIGNvbnN0IG5hbWVQcm9wZXJ0eTogc3RyaW5nID0gJ19uYW1lJztcbiAgICBjb25zdCB7ZW52aXJvbm1lbnQsIG91dHB1dFBhdGgsIHNvdXJjZVBhdGgsIHR5cGVzY3JpcHR9ID0gY21kO1xuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBnZXRQYWNrYWdlRGlyKCk7XG5cbiAgICBpZihvdXRwdXRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5vdXRwdXRQYXRoID0gb3V0cHV0UGF0aDtcbiAgICAgIHBhcmFtcy5vdXRwdXRGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsIG91dHB1dFBhdGgpO1xuICAgIH0gZWxzZSBpZihwYXJhbXMub3V0cHV0UGF0aCAmJiAhcGFyYW1zLm91dHB1dEZ1bGxQYXRoKSB7XG4gICAgICBwYXJhbXMub3V0cHV0RnVsbFBhdGggPSBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCBwYXJhbXMub3V0cHV0UGF0aCk7XG4gICAgfVxuXG4gICAgaWYoc291cmNlUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMuc291cmNlUGF0aCA9IHNvdXJjZVBhdGg7XG4gICAgICBwYXJhbXMuc291cmNlRnVsbFBhdGggPSBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCBzb3VyY2VQYXRoKTtcbiAgICB9IGVsc2UgaWYocGFyYW1zLnNvdXJjZVBhdGggJiYgIXBhcmFtcy5zb3VyY2VGdWxsUGF0aCkge1xuICAgICAgcGFyYW1zLnNvdXJjZUZ1bGxQYXRoID0gcGF0aFJlc29sdmUocGFja2FnZURpciwgcGFyYW1zLnNvdXJjZVBhdGgpO1xuICAgIH1cblxuICAgIGlmKHR5cGVzY3JpcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnVzZVR5cGVzY3JpcHQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmKGVudmlyb25tZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy50YXJnZXRFbnZpcm9ubWVudCA9IGVudmlyb25tZW50ID09PSAnd2ViJyA/ICd3ZWInIDogJ25vZGUnO1xuICAgIH1cblxuICAgIHByb2Nlc3MuZW52LkxFWF9DT05GSUcgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgIHtcbiAgICAgICAgLi4uTGV4Q29uZmlnLnVwZGF0ZUNvbmZpZyhwYXJhbXMpLFxuICAgICAgICBjb21tYW5kTmFtZTogY21kW25hbWVQcm9wZXJ0eV0sXG4gICAgICAgIGlzU3RhdGljOiBjbWQuc3RhdGljXG4gICAgICB9LCBudWxsLCAwXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBwYXJzZUNvbmZpZyhjbWQsIGlzUm9vdDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7Y2xpTmFtZSA9ICdMZXgnLCBsZXhDb25maWcsIGxleENvbmZpZ05hbWUsIHF1aWV0LCB0eXBlc2NyaXB0LCBkZWJ1ZyA9IGZhbHNlfSA9IGNtZDtcbiAgICBjb25zdCBjb25maWdGb3JtYXRzID0gWydqcycsICdtanMnLCAnY2pzJywgJ3RzJywgJ2pzb24nXTtcbiAgICBjb25zdCBjb25maWdCYXNlTmFtZTogc3RyaW5nID0gbGV4Q29uZmlnTmFtZSB8fCAnbGV4LmNvbmZpZyc7XG4gICAgbGV0IGNvbmZpZ1BhdGg6IHN0cmluZyA9IGxleENvbmZpZyB8fCAnJztcbiAgICBsZXQgY29uZmlnRXhpc3RzOiBib29sZWFuID0gbGV4Q29uZmlnID8gZXhpc3RzU3luYyhjb25maWdQYXRoKSA6IGZhbHNlO1xuXG4gICAgaWYoIWNvbmZpZ1BhdGggfHwgIWNvbmZpZ0V4aXN0cykge1xuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKGBTZWFyY2hpbmcgZm9yIGNvbmZpZyBmaWxlcyB3aXRoIGJhc2UgbmFtZTogJHtjb25maWdCYXNlTmFtZX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cblxuICAgICAgZm9yKGNvbnN0IGZvcm1hdCBvZiBjb25maWdGb3JtYXRzKSB7XG4gICAgICAgIGNvbnN0IHBvdGVudGlhbFBhdGggPSBpc1Jvb3RcbiAgICAgICAgICA/IHBhdGhSZXNvbHZlKGN3ZCwgYC4vJHtjb25maWdCYXNlTmFtZX0uJHtmb3JtYXR9YClcbiAgICAgICAgICA6IHJlbGF0aXZlRmlsZVBhdGgoYCR7Y29uZmlnQmFzZU5hbWV9LiR7Zm9ybWF0fWAsIGN3ZCk7XG5cbiAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICBsb2coYENoZWNraW5nIGZvciBjb25maWcgZmlsZTogJHtwb3RlbnRpYWxQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoZXhpc3RzU3luYyhwb3RlbnRpYWxQYXRoKSkge1xuICAgICAgICAgIGNvbmZpZ1BhdGggPSBwb3RlbnRpYWxQYXRoO1xuICAgICAgICAgIGNvbmZpZ0V4aXN0cyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihjb25maWdFeGlzdHMpIHtcbiAgICAgIGxvZyhgVXNpbmcgJHtjbGlOYW1lfSBjb25maWd1cmF0aW9uIGZpbGU6ICR7Y29uZmlnUGF0aH1gLCAnbm90ZScsIHF1aWV0KTtcbiAgICAgIGNvbnN0IGV4dDogc3RyaW5nID0gcGF0aEV4dG5hbWUoY29uZmlnUGF0aCk7XG5cbiAgICAgIGlmKGV4dCA9PT0gJy5qc29uJykge1xuICAgICAgICBjb25zdCBjb25maWdDb250ZW50OiBzdHJpbmcgPSByZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKTtcblxuICAgICAgICBpZihjb25maWdDb250ZW50KSB7XG4gICAgICAgICAgbGV0IGNvbmZpZ0pzb246IExleENvbmZpZ1R5cGU7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uZmlnSnNvbiA9IEpTT04ucGFyc2UoY29uZmlnQ29udGVudCk/LmRlZmF1bHQgfHwge307XG4gICAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gcGFyc2UgSlNPTiBjb25maWc6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICBjb25maWdKc29uID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgTGV4Q29uZmlnLmFkZENvbmZpZ1BhcmFtcyhjbWQsIGNvbmZpZ0pzb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogQ29uZmlnIGZpbGUgbWFsZm9ybWVkLCAke2NvbmZpZ1BhdGh9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYoWycuanMnLCAnLm1qcycsICcuY2pzJywgJy50cyddLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsZXQgbGV4Q3VzdG9tQ29uZmlnO1xuXG4gICAgICAgICAgaWYoZXh0ID09PSAnLmNqcycpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmwgPSBuZXcgVVJMKGBmaWxlOi8vLyR7cGF0aFJlc29sdmUoY29uZmlnUGF0aCl9YCkuaHJlZjtcblxuICAgICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgICAgbG9nKGBMb2FkaW5nIENvbW1vbkpTIGNvbmZpZyBmcm9tOiAke2ZpbGVVcmx9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXhDdXN0b21Db25maWcgPSBhd2FpdCBpbXBvcnQoZmlsZVVybCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICAgIGxvZyhgTG9hZGluZyBFU00vVFMgY29uZmlnIGZyb206ICR7Y29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV4Q3VzdG9tQ29uZmlnID0gYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGxleEN1c3RvbUNvbmZpZy5kZWZhdWx0IHx8IGxleEN1c3RvbUNvbmZpZztcblxuICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICBsb2coYExvYWRlZCBjb25maWc6ICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZighY29uZmlnKSB7XG4gICAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gV2FybmluZzogQ29uZmlnIGZpbGUgbG9hZGVkIGJ1dCBubyBjb25maWd1cmF0aW9uIGZvdW5kYCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgTGV4Q29uZmlnLmFkZENvbmZpZ1BhcmFtcyhjbWQsIGNvbmZpZyB8fCB7fSk7XG4gICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEZhaWxlZCB0byBsb2FkIGNvbmZpZyBmaWxlOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvbmZpZyBmaWxlIG11c3QgYmUgYSBKUywgQ0pTLCBNSlMsIFRTLCBvciBKU09OIGZpbGUuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coJ05vIGNvbmZpZyBmaWxlIGZvdW5kLiBVc2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIExleENvbmZpZy51c2VUeXBlc2NyaXB0ID0gISF0eXBlc2NyaXB0O1xuICAgICAgTGV4Q29uZmlnLmFkZENvbmZpZ1BhcmFtcyhjbWQsIExleENvbmZpZy5jb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGVja1R5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgcGFja2FnZURpciA9IGdldFBhY2thZ2VEaXIoKTtcbiAgICBjb25zdCB0c2NvbmZpZ1BhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsICcuL3RzY29uZmlnLmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbnN0IGxleERpciA9IExleENvbmZpZy5nZXRMZXhEaXIoKTtcbiAgICAgIGNvbnN0IGJhc2VDb25maWdQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcuYmFzZS5qc29uJyk7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUNvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsICd0c2NvbmZpZy50ZW1wbGF0ZS5qc29uJyk7XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gZXhpc3RzU3luYyhiYXNlQ29uZmlnUGF0aCkgPyBiYXNlQ29uZmlnUGF0aCA6IHRlbXBsYXRlQ29uZmlnUGF0aDtcblxuICAgICAgaWYoZXhpc3RzU3luYyhzb3VyY2VQYXRoKSkge1xuICAgICAgICB3cml0ZUZpbGVTeW5jKHRzY29uZmlnUGF0aCwgcmVhZEZpbGVTeW5jKHNvdXJjZVBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0VHlwZVNjcmlwdERlY2xhcmF0aW9uRmxhZ3MoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IExleENvbmZpZy5jb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInO1xuICAgIGNvbnN0IG91dHB1dEZ1bGxQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCBwYXRoUmVzb2x2ZShjd2QsIG91dHB1dFBhdGgpO1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBMZXhDb25maWcuY29uZmlnLnNvdXJjZVBhdGggfHwgJy4vc3JjJztcbiAgICBjb25zdCBzb3VyY2VGdWxsUGF0aCA9IExleENvbmZpZy5jb25maWcuc291cmNlRnVsbFBhdGggfHwgcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VQYXRoKTtcbiAgICBjb25zdCByZWxhdGl2ZU91dERpciA9IHBhdGhSZWxhdGl2ZShjd2QsIG91dHB1dEZ1bGxQYXRoKSB8fCAnLi9saWInO1xuICAgIGNvbnN0IHJlbGF0aXZlUm9vdERpciA9IHBhdGhSZWxhdGl2ZShjd2QsIHNvdXJjZUZ1bGxQYXRoKSB8fCAnLi9zcmMnO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICctLWVtaXREZWNsYXJhdGlvbk9ubHknLCAvLyBDUklUSUNBTDogT25seSBlbWl0IC5kLnRzIGZpbGVzLCBubyBKUyBmaWxlc1xuICAgICAgJy0tZGVjbGFyYXRpb24nLCAvLyBHZW5lcmF0ZSBkZWNsYXJhdGlvbiBmaWxlc1xuICAgICAgJy0tZGVjbGFyYXRpb25NYXAnLCAvLyBHZW5lcmF0ZSBzb3VyY2UgbWFwcyBmb3IgZGVjbGFyYXRpb25zXG4gICAgICAnLS1vdXREaXInLCByZWxhdGl2ZU91dERpcixcbiAgICAgICctLXJvb3REaXInLCByZWxhdGl2ZVJvb3REaXIsXG4gICAgICAnLS1za2lwTGliQ2hlY2snLCAvLyBTa2lwIHR5cGUgY2hlY2tpbmcgb2YgZGVjbGFyYXRpb24gZmlsZXMgKGZhc3RlciwgbW9yZSBsZW5pZW50KVxuICAgICAgJy0tZXNNb2R1bGVJbnRlcm9wJyxcbiAgICAgICctLWFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMnLFxuICAgICAgJy0tbW9kdWxlJywgJ05vZGVOZXh0JyxcbiAgICAgICctLW1vZHVsZVJlc29sdXRpb24nLCAnTm9kZU5leHQnLFxuICAgICAgJy0tdGFyZ2V0JywgJ0VTTmV4dCcsXG4gICAgICAnLS1qc3gnLCAncmVhY3QtanN4JyxcbiAgICAgICctLWlzb2xhdGVkTW9kdWxlcycsXG4gICAgICAnLS1yZXNvbHZlSnNvbk1vZHVsZScsXG4gICAgICAnLS1hbGxvd0pzJ1xuICAgICAgLy8gTm90ZTogLS1ub1VudXNlZExvY2FscyBhbmQgLS1ub1VudXNlZFBhcmFtZXRlcnMgYXJlIG5vdCBuZWVkZWQgZm9yIGRlY2xhcmF0aW9uIGdlbmVyYXRpb25cbiAgICAgIC8vIGFuZCB3b3VsZCBhY3R1YWxseSBlbmFibGUgc3RyaWN0IGNoZWNraW5nLCB3aGljaCB3ZSB3YW50IHRvIGF2b2lkIGZvciBmYXN0ZXIgZGVjbGFyYXRpb24gZ2VuZXJhdGlvblxuICAgIF07XG4gIH1cblxuICBzdGF0aWMgY2hlY2tMaW50VHlwZXNjcmlwdENvbmZpZygpIHtcbiAgICBjb25zdCBsZXhEaXIgPSBMZXhDb25maWcuZ2V0TGV4RGlyKCk7XG4gICAgY29uc3QgdHNjb25maWdMaW50UGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUobGV4RGlyLCAnLi90c2NvbmZpZy5saW50Lmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnTGludFBhdGgpKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsICd0c2NvbmZpZy5saW50Lmpzb24nKTtcbiAgICAgIGlmKGV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgICB3cml0ZUZpbGVTeW5jKHRzY29uZmlnTGludFBhdGgsIHJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2tUZXN0VHlwZXNjcmlwdENvbmZpZygpIHtcbiAgICBjb25zdCBsZXhEaXIgPSBMZXhDb25maWcuZ2V0TGV4RGlyKCk7XG4gICAgY29uc3QgdHNjb25maWdUZXN0UGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUobGV4RGlyLCAnLi90c2NvbmZpZy50ZXN0Lmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnVGVzdFBhdGgpKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsICd0c2NvbmZpZy50ZXN0Lmpzb24nKTtcbiAgICAgIGlmKGV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgICB3cml0ZUZpbGVTeW5jKHRzY29uZmlnVGVzdFBhdGgsIHJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgU1dDT3B0aW9ucyA9IE9wdGlvbnM7XG4iXSwibmFtZXMiOlsiZmluZEZpbGVVcCIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiZGlybmFtZSIsImV4dG5hbWUiLCJwYXRoRXh0bmFtZSIsInJlbGF0aXZlIiwicGF0aFJlbGF0aXZlIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiVVJMIiwiZ2V0TGV4UGFja2FnZUpzb25QYXRoIiwicmVsYXRpdmVGaWxlUGF0aCIsImxvZyIsImN3ZCIsInByb2Nlc3MiLCJkZWZhdWx0Q29uZmlnVmFsdWVzIiwiYWkiLCJtYXhUb2tlbnMiLCJtb2RlbCIsInByb3ZpZGVyIiwidGVtcGVyYXR1cmUiLCJjb25maWdGaWxlcyIsImNvcHlGaWxlcyIsImVudHJ5SFRNTCIsImVudHJ5SnMiLCJlbnYiLCJlc2xpbnQiLCJ2aXRlc3QiLCJvdXRwdXRGdWxsUGF0aCIsIm91dHB1dEhhc2giLCJvdXRwdXRQYXRoIiwicGFja2FnZU1hbmFnZXIiLCJwcmVzZXQiLCJzb3VyY2VGdWxsUGF0aCIsInNvdXJjZVBhdGgiLCJzd2MiLCJpbmxpbmVTb3VyY2VzQ29udGVudCIsImlzTW9kdWxlIiwianNjIiwiZXh0ZXJuYWxIZWxwZXJzIiwia2VlcENsYXNzTmFtZXMiLCJsb29zZSIsInBhcnNlciIsImRlY29yYXRvcnMiLCJkeW5hbWljSW1wb3J0Iiwic3ludGF4IiwidHN4IiwidGFyZ2V0IiwidHJhbnNmb3JtIiwicmVhY3QiLCJydW50aW1lIiwibWluaWZ5IiwibW9kdWxlIiwibGF6eSIsIm5vSW50ZXJvcCIsInN0cmljdCIsInN0cmljdE1vZGUiLCJ0eXBlIiwic291cmNlTWFwcyIsInRhcmdldEVudmlyb25tZW50IiwidXNlR3JhcGhRbCIsInVzZVR5cGVzY3JpcHQiLCJ3ZWJwYWNrIiwic3RhdGljUGF0aCIsImdldFBhY2thZ2VEaXIiLCJjdXJyZW50UGtnUGF0aCIsInBrZyIsIkpTT04iLCJwYXJzZSIsIndvcmtzcGFjZXMiLCJzZWFyY2hEaXIiLCJpIiwicGtnUGF0aCIsInBhcmVudCIsImNvbmZpZ0Zvcm1hdHMiLCJmb3JtYXQiLCJjb25maWdQYXRoIiwic3luYyIsImdldFR5cGVTY3JpcHRDb25maWdQYXRoIiwiY29uZmlnTmFtZSIsInBhY2thZ2VEaXIiLCJwcm9qZWN0QnVpbGRDb25maWciLCJyb290QnVpbGRDb25maWciLCJwcm9qZWN0TGludENvbmZpZyIsInJvb3RMaW50Q29uZmlnIiwicHJvamVjdFRlc3RDb25maWciLCJyb290VGVzdENvbmZpZyIsInByb2plY3RDb25maWdQYXRoIiwicm9vdENvbmZpZ1BhdGgiLCJsZXhEaXIiLCJMZXhDb25maWciLCJnZXRMZXhEaXIiLCJ2YWx1ZSIsImNvbmZpZyIsImluZGV4UGF0aCIsImhhc0luZGV4VHN4IiwidXBkYXRlQ29uZmlnIiwidXBkYXRlZENvbmZpZyIsInVuZGVmaW5lZCIsIkNVUlNPUl9JREUiLCJhZGRDb25maWdQYXJhbXMiLCJjbWQiLCJwYXJhbXMiLCJuYW1lUHJvcGVydHkiLCJlbnZpcm9ubWVudCIsInR5cGVzY3JpcHQiLCJMRVhfQ09ORklHIiwic3RyaW5naWZ5IiwiY29tbWFuZE5hbWUiLCJpc1N0YXRpYyIsInN0YXRpYyIsInBhcnNlQ29uZmlnIiwiaXNSb290IiwiY2xpTmFtZSIsImxleENvbmZpZyIsImxleENvbmZpZ05hbWUiLCJxdWlldCIsImRlYnVnIiwiY29uZmlnQmFzZU5hbWUiLCJjb25maWdFeGlzdHMiLCJwb3RlbnRpYWxQYXRoIiwiZXh0IiwiY29uZmlnQ29udGVudCIsImNvbmZpZ0pzb24iLCJkZWZhdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwiaW5jbHVkZXMiLCJsZXhDdXN0b21Db25maWciLCJmaWxlVXJsIiwiaHJlZiIsImNvbnNvbGUiLCJjaGVja1R5cGVzY3JpcHRDb25maWciLCJ0c2NvbmZpZ1BhdGgiLCJiYXNlQ29uZmlnUGF0aCIsInRlbXBsYXRlQ29uZmlnUGF0aCIsImdldFR5cGVTY3JpcHREZWNsYXJhdGlvbkZsYWdzIiwicmVsYXRpdmVPdXREaXIiLCJyZWxhdGl2ZVJvb3REaXIiLCJjaGVja0xpbnRUeXBlc2NyaXB0Q29uZmlnIiwidHNjb25maWdMaW50UGF0aCIsInRlbXBsYXRlUGF0aCIsImNoZWNrVGVzdFR5cGVzY3JpcHRDb25maWciLCJ0c2NvbmZpZ1Rlc3RQYXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7OztDQUdDLEdBQ0QsT0FBT0EsZ0JBQWdCLGVBQWU7QUFDdEMsU0FBUUMsVUFBVSxFQUFFQyxZQUFZLEVBQUVDLGFBQWEsUUFBTyxLQUFLO0FBQzNELFNBQ0VDLE9BQU8sRUFDUEMsV0FBV0MsV0FBVyxFQUN0QkMsWUFBWUMsWUFBWSxFQUN4QkMsV0FBV0MsV0FBVyxRQUNqQixPQUFPO0FBQ2QsU0FBUUMsR0FBRyxRQUFPLE1BQU07QUFFeEIsU0FBUUMscUJBQXFCLEVBQUVDLGdCQUFnQixRQUFPLGtCQUFrQjtBQUN4RSxTQUFRQyxHQUFHLFFBQU8saUJBQWlCO0FBS25DLE1BQU1DLE1BQWNDLFFBQVFELEdBQUc7QUEyRC9CLE9BQU8sTUFBTUUsc0JBQXFDO0lBQ2hEQyxJQUFJO1FBQ0ZDLFdBQVc7UUFDWEMsT0FBTztRQUNQQyxVQUFVO1FBQ1ZDLGFBQWE7SUFDZjtJQUNBQyxhQUFhLEVBQUU7SUFDZkMsV0FBVyxFQUFFO0lBQ2JDLFdBQVc7SUFDWEMsU0FBUztJQUNUQyxLQUFLO0lBQ0xDLFFBQVEsQ0FBQztJQUNUQyxRQUFRLENBQUM7SUFDVEMsZ0JBQWdCcEIsWUFBWUssS0FBSztJQUNqQ2dCLFlBQVk7SUFDWkMsWUFBWTtJQUNaQyxnQkFBZ0I7SUFDaEJDLFFBQVE7SUFDUkMsZ0JBQWdCekIsWUFBWUssS0FBSztJQUNqQ3FCLFlBQVk7SUFD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
417
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9MZXhDb25maWcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBmaW5kRmlsZVVwIGZyb20gJ2ZpbmQtZmlsZS11cCc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSBhcyBwYXRoRXh0bmFtZSxcbiAgcmVsYXRpdmUgYXMgcGF0aFJlbGF0aXZlLFxuICByZXNvbHZlIGFzIHBhdGhSZXNvbHZlXG59IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtVUkx9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7Z2V0TGV4UGFja2FnZUpzb25QYXRoLCByZWxhdGl2ZUZpbGVQYXRofSBmcm9tICcuL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4vdXRpbHMvbG9nLmpzJztcblxuaW1wb3J0IHR5cGUge09wdGlvbnN9IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQgdHlwZSB7TGludGVyfSBmcm9tICdlc2xpbnQnO1xuXG5jb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cblxuZXhwb3J0IGludGVyZmFjZSBWaXRlc3RDb25maWcge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYnBhY2tDb25maWcge1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICBlbnRyeT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBvdXRwdXQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbW9kdWxlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBsdWdpbnM/OiB1bmtub3duW107XG4gIHN0YXRpY1BhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQUlDb25maWcge1xuICBwcm92aWRlcj86ICdjdXJzb3InIHwgJ2NvcGlsb3QnIHwgJ29wZW5haScgfCAnYW50aHJvcGljJyB8ICdub25lJztcbiAgYXBpS2V5Pzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXZDb25maWcge1xuICBwb3J0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVTTGludENvbmZpZyB7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gIGV4dGVuZHM/OiBzdHJpbmdbXTtcbiAgcnVsZXM/OiBMaW50ZXIuUnVsZXNSZWNvcmQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGV4Q29uZmlnVHlwZSB7XG4gIGFpPzogQUlDb25maWc7XG4gIGNvbmZpZ0ZpbGVzPzogc3RyaW5nW107XG4gIGNvcHlGaWxlcz86IHN0cmluZ1tdO1xuICBkZXY/OiBEZXZDb25maWc7XG4gIGVudHJ5SFRNTD86IHN0cmluZztcbiAgZW50cnlKcz86IHN0cmluZztcbiAgZW52Pzogb2JqZWN0O1xuICBlc2xpbnQ/OiBFU0xpbnRDb25maWc7XG4gIGdpdFVybD86IHN0cmluZztcbiAgdml0ZXN0PzogVml0ZXN0Q29uZmlnO1xuICBsaWJyYXJ5TmFtZT86IHN0cmluZztcbiAgbGlicmFyeVRhcmdldD86IHN0cmluZztcbiAgb3V0cHV0RmlsZT86IHN0cmluZztcbiAgb3V0cHV0RnVsbFBhdGg/OiBzdHJpbmc7XG4gIG91dHB1dEhhc2g/OiBib29sZWFuO1xuICBvdXRwdXRQYXRoPzogc3RyaW5nO1xuICBwYWNrYWdlTWFuYWdlcj86ICducG0nIHwgJ3lhcm4nO1xuICBwcmVzZXQ/OiAnd2ViJyB8ICdub2RlJyB8ICdsYW1iZGEnIHwgJ21vYmlsZSc7XG4gIHNvdXJjZUZ1bGxQYXRoPzogc3RyaW5nO1xuICBzb3VyY2VQYXRoPzogc3RyaW5nO1xuICBzd2M/OiBTV0NPcHRpb25zO1xuICB0YXJnZXRFbnZpcm9ubWVudD86ICdub2RlJyB8ICd3ZWInO1xuICB1c2VHcmFwaFFsPzogYm9vbGVhbjtcbiAgdXNlVHlwZXNjcmlwdD86IGJvb2xlYW47XG4gIHdlYnBhY2s/OiBXZWJwYWNrQ29uZmlnO1xufVxuXG5leHBvcnQgdHlwZSBDb25maWcgPSBMZXhDb25maWdUeXBlO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZ1ZhbHVlczogTGV4Q29uZmlnVHlwZSA9IHtcbiAgYWk6IHtcbiAgICBtYXhUb2tlbnM6IDQwMDAsXG4gICAgbW9kZWw6ICdncHQtNG8nLFxuICAgIHByb3ZpZGVyOiAnbm9uZScsXG4gICAgdGVtcGVyYXR1cmU6IDAuMVxuICB9LFxuICBjb25maWdGaWxlczogW10sXG4gIGNvcHlGaWxlczogW10sXG4gIGVudHJ5SFRNTDogJ2luZGV4Lmh0bWwnLFxuICBlbnRyeUpzOiAnaW5kZXguanMnLFxuICBlbnY6IG51bGwsXG4gIGVzbGludDoge30sXG4gIHZpdGVzdDoge30sXG4gIG91dHB1dEZ1bGxQYXRoOiBwYXRoUmVzb2x2ZShjd2QsICcuL2xpYicpLFxuICBvdXRwdXRIYXNoOiBmYWxzZSxcbiAgb3V0cHV0UGF0aDogJy4vbGliJyxcbiAgcGFja2FnZU1hbmFnZXI6ICducG0nLFxuICBwcmVzZXQ6ICd3ZWInLFxuICBzb3VyY2VGdWxsUGF0aDogcGF0aFJlc29sdmUoY3dkLCAnLi9zcmMnKSxcbiAgc291cmNlUGF0aDogJy4vc3JjJyxcbiAgc3djOiB7XG4gICAgaW5saW5lU291cmNlc0NvbnRlbnQ6IHRydWUsXG4gICAgaXNNb2R1bGU6IHRydWUsXG4gICAganNjOiB7XG4gICAgICBleHRlcm5hbEhlbHBlcnM6IGZhbHNlLFxuICAgICAga2VlcENsYXNzTmFtZXM6IGZhbHNlLFxuICAgICAgbG9vc2U6IGZhbHNlLFxuICAgICAgcGFyc2VyOiB7XG4gICAgICAgIGRlY29yYXRvcnM6IHRydWUsXG4gICAgICAgIGR5bmFtaWNJbXBvcnQ6IHRydWUsXG4gICAgICAgIHN5bnRheDogJ3R5cGVzY3JpcHQnLFxuICAgICAgICB0c3g6IHRydWVcbiAgICAgIH0sXG4gICAgICB0YXJnZXQ6ICdlczIwMjMnLFxuICAgICAgdHJhbnNmb3JtOiB7XG4gICAgICAgIHJlYWN0OiB7XG4gICAgICAgICAgcnVudGltZTogJ2F1dG9tYXRpYydcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbWluaWZ5OiBmYWxzZSxcbiAgICBtb2R1bGU6IHtcbiAgICAgIGxhenk6IGZhbHNlLFxuICAgICAgbm9JbnRlcm9wOiBmYWxzZSxcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICBzdHJpY3RNb2RlOiB0cnVlLFxuICAgICAgdHlwZTogJ2VzNidcbiAgICB9LFxuICAgIHNvdXJjZU1hcHM6ICdpbmxpbmUnXG4gIH0sXG4gIHRhcmdldEVudmlyb25tZW50OiAnd2ViJyxcbiAgdXNlR3JhcGhRbDogZmFsc2UsXG4gIHVzZVR5cGVzY3JpcHQ6IGZhbHNlLFxuICB3ZWJwYWNrOiB7XG4gICAgc3RhdGljUGF0aDogJy4vc3JjL3N0YXRpYydcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldFBhY2thZ2VEaXIgPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgY3VycmVudFBrZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsICdwYWNrYWdlLmpzb24nKTtcblxuICBpZihleGlzdHNTeW5jKGN1cnJlbnRQa2dQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhjdXJyZW50UGtnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICBpZighcGtnLndvcmtzcGFjZXMpIHtcbiAgICAgICAgcmV0dXJuIGN3ZDtcbiAgICAgIH1cbiAgICB9IGNhdGNoe1xuICAgICAgcmV0dXJuIGN3ZDtcbiAgICB9XG4gIH1cblxuICBsZXQgc2VhcmNoRGlyID0gY3dkO1xuXG4gIGZvcihsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgY29uc3QgcGtnUGF0aCA9IHBhdGhSZXNvbHZlKHNlYXJjaERpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmKGV4aXN0c1N5bmMocGtnUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBrZyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBrZ1BhdGgsICd1dGY4JykpO1xuXG4gICAgICAgIGlmKCFwa2cud29ya3NwYWNlcykge1xuICAgICAgICAgIHJldHVybiBzZWFyY2hEaXI7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2h7XG4gICAgICAgIC8vIENvbnRpbnVlIHNlYXJjaGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoc2VhcmNoRGlyKTtcblxuICAgIGlmKHBhcmVudCA9PT0gc2VhcmNoRGlyKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2VhcmNoRGlyID0gcGFyZW50O1xuICB9XG5cbiAgY29uc3QgY29uZmlnRm9ybWF0cyA9IFsnanMnLCAnbWpzJywgJ2NqcycsICd0cycsICdqc29uJ107XG5cbiAgZm9yKGNvbnN0IGZvcm1hdCBvZiBjb25maWdGb3JtYXRzKSB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRGaWxlVXAuc3luYyhgbGV4LmNvbmZpZy4ke2Zvcm1hdH1gLCBjd2QsIDUpO1xuXG4gICAgaWYoY29uZmlnUGF0aCkge1xuICAgICAgcmV0dXJuIGRpcm5hbWUoY29uZmlnUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGN3ZDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUeXBlU2NyaXB0Q29uZmlnUGF0aCA9IChjb25maWdOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwYWNrYWdlRGlyID0gZ2V0UGFja2FnZURpcigpO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGlmKGNvbmZpZ05hbWUgPT09ICd0c2NvbmZpZy5idWlsZC5qc29uJykge1xuICAgIGNvbnN0IHByb2plY3RCdWlsZENvbmZpZyA9IHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsICd0c2NvbmZpZy5idWlsZC5qc29uJyk7XG5cbiAgICBpZihleGlzdHNTeW5jKHByb2plY3RCdWlsZENvbmZpZykpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0QnVpbGRDb25maWc7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdEJ1aWxkQ29uZmlnID0gcGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcuYnVpbGQuanNvbicpO1xuICAgIGlmKGV4aXN0c1N5bmMocm9vdEJ1aWxkQ29uZmlnKSkge1xuICAgICAgcmV0dXJuIHJvb3RCdWlsZENvbmZpZztcbiAgICB9XG4gIH1cblxuICBpZihjb25maWdOYW1lID09PSAndHNjb25maWcubGludC5qc29uJykge1xuICAgIGNvbnN0IHByb2plY3RMaW50Q29uZmlnID0gcGF0aFJlc29sdmUocGFja2FnZURpciwgJ3RzY29uZmlnLmVzbGludC5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhwcm9qZWN0TGludENvbmZpZykpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0TGludENvbmZpZztcbiAgICB9XG5cbiAgICBjb25zdCByb290TGludENvbmZpZyA9IHBhdGhSZXNvbHZlKGN3ZCwgJ3RzY29uZmlnLmVzbGludC5qc29uJyk7XG5cbiAgICBpZihleGlzdHNTeW5jKHJvb3RMaW50Q29uZmlnKSkge1xuICAgICAgcmV0dXJuIHJvb3RMaW50Q29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIGlmKGNvbmZpZ05hbWUgPT09ICd0c2NvbmZpZy50ZXN0Lmpzb24nKSB7XG4gICAgY29uc3QgcHJvamVjdFRlc3RDb25maWcgPSBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAndHNjb25maWcudGVzdC5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhwcm9qZWN0VGVzdENvbmZpZykpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0VGVzdENvbmZpZztcbiAgICB9XG5cbiAgICBjb25zdCByb290VGVzdENvbmZpZyA9IHBhdGhSZXNvbHZlKGN3ZCwgJ3RzY29uZmlnLnRlc3QuanNvbicpO1xuXG4gICAgaWYoZXhpc3RzU3luYyhyb290VGVzdENvbmZpZykpIHtcbiAgICAgIHJldHVybiByb290VGVzdENvbmZpZztcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsIGNvbmZpZ05hbWUpO1xuXG4gIGlmKGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGgpKSB7XG4gICAgcmV0dXJuIHByb2plY3RDb25maWdQYXRoO1xuICB9XG5cbiAgY29uc3Qgcm9vdENvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShjd2QsIGNvbmZpZ05hbWUpO1xuXG4gIGlmKGV4aXN0c1N5bmMocm9vdENvbmZpZ1BhdGgpKSB7XG4gICAgcmV0dXJuIHJvb3RDb25maWdQYXRoO1xuICB9XG5cbiAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuXG4gIHJldHVybiBwYXRoUmVzb2x2ZShsZXhEaXIsIGNvbmZpZ05hbWUpO1xufTtcblxuZXhwb3J0IGNsYXNzIExleENvbmZpZyB7XG4gIHN0YXRpYyBjb25maWc6IExleENvbmZpZ1R5cGUgPSB7XG4gICAgLi4uZGVmYXVsdENvbmZpZ1ZhbHVlc1xuICB9O1xuXG4gIHN0YXRpYyBzZXQgdXNlVHlwZXNjcmlwdCh2YWx1ZTogYm9vbGVhbikge1xuICAgIExleENvbmZpZy5jb25maWcudXNlVHlwZXNjcmlwdCA9IHZhbHVlO1xuICAgIGNvbnN0IHtlbnRyeUpzLCBzb3VyY2VGdWxsUGF0aCwgdGFyZ2V0RW52aXJvbm1lbnR9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAgIGlmKGVudHJ5SnMgPT09ICdpbmRleC5qcycgJiYgdmFsdWUpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VGdWxsUGF0aCwgJ2luZGV4LnRzeCcpO1xuICAgICAgY29uc3QgaGFzSW5kZXhUc3g6IGJvb2xlYW4gPSBleGlzdHNTeW5jKGluZGV4UGF0aCk7XG5cbiAgICAgIGlmKGhhc0luZGV4VHN4KSB7XG4gICAgICAgIExleENvbmZpZy5jb25maWcuZW50cnlKcyA9ICdpbmRleC50c3gnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy5lbnRyeUpzID0gJ2luZGV4LnRzJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBMZXhDb25maWcuY29uZmlnLnN3Yy5qc2MucGFyc2VyID0ge1xuICAgICAgc3ludGF4OiAndHlwZXNjcmlwdCcsXG4gICAgICB0c3g6IHRydWVcbiAgICB9O1xuXG4gICAgaWYodGFyZ2V0RW52aXJvbm1lbnQgPT09ICd3ZWInKSB7XG4gICAgICBMZXhDb25maWcuY29uZmlnLnN3Yy5qc2MudHJhbnNmb3JtID0ge1xuICAgICAgICByZWFjdDoge1xuICAgICAgICAgIHJ1bnRpbWU6ICdhdXRvbWF0aWMnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldExleERpcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBkaXJuYW1lKGdldExleFBhY2thZ2VKc29uUGF0aCgpKTtcbiAgfVxuXG4gIHN0YXRpYyB1cGRhdGVDb25maWcodXBkYXRlZENvbmZpZzogTGV4Q29uZmlnVHlwZSk6IExleENvbmZpZ1R5cGUge1xuICAgIGNvbnN0IHtvdXRwdXRGdWxsUGF0aCwgb3V0cHV0UGF0aCwgc291cmNlUGF0aCwgc291cmNlRnVsbFBhdGgsIHVzZVR5cGVzY3JpcHQsIGFpfSA9IHVwZGF0ZWRDb25maWc7XG4gICAgY29uc3QgcGFja2FnZURpciA9IGdldFBhY2thZ2VEaXIoKTtcblxuICAgIGlmKHVzZVR5cGVzY3JpcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgTGV4Q29uZmlnLnVzZVR5cGVzY3JpcHQgPSB1c2VUeXBlc2NyaXB0O1xuICAgIH1cblxuICAgIGlmKG91dHB1dFBhdGggIT09IHVuZGVmaW5lZCAmJiBvdXRwdXRGdWxsUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVkQ29uZmlnLm91dHB1dEZ1bGxQYXRoID0gcGF0aFJlc29sdmUocGFja2FnZURpciwgb3V0cHV0UGF0aCk7XG4gICAgfVxuXG4gICAgaWYoc291cmNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZUZ1bGxQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHVwZGF0ZWRDb25maWcuc291cmNlRnVsbFBhdGggPSBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCBzb3VyY2VQYXRoKTtcbiAgICB9XG5cbiAgICBpZihhaSkge1xuICAgICAgTGV4Q29uZmlnLmNvbmZpZy5haSA9IHsuLi5MZXhDb25maWcuY29uZmlnLmFpLCAuLi5haX07XG5cbiAgICAgIGlmKHByb2Nlc3MuZW52LkNVUlNPUl9JREUgPT09ICd0cnVlJyAmJiBMZXhDb25maWcuY29uZmlnLmFpLnByb3ZpZGVyID09PSAnbm9uZScpIHtcbiAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy5haS5wcm92aWRlciA9ICdjdXJzb3InO1xuICAgICAgfVxuICAgIH1cblxuICAgIExleENvbmZpZy5jb25maWcgPSB7Li4uTGV4Q29uZmlnLmNvbmZpZywgLi4udXBkYXRlZENvbmZpZ307XG5cbiAgICByZXR1cm4gTGV4Q29uZmlnLmNvbmZpZztcbiAgfVxuXG4gIHN0YXRpYyBhZGRDb25maWdQYXJhbXMoY21kLCBwYXJhbXM6IExleENvbmZpZ1R5cGUpIHtcbiAgICBjb25zdCBuYW1lUHJvcGVydHk6IHN0cmluZyA9ICdfbmFtZSc7XG4gICAgY29uc3Qge2Vudmlyb25tZW50LCBvdXRwdXRQYXRoLCBzb3VyY2VQYXRoLCB0eXBlc2NyaXB0fSA9IGNtZDtcbiAgICBjb25zdCBwYWNrYWdlRGlyID0gZ2V0UGFja2FnZURpcigpO1xuXG4gICAgaWYob3V0cHV0UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMub3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7XG4gICAgICBwYXJhbXMub3V0cHV0RnVsbFBhdGggPSBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCBvdXRwdXRQYXRoKTtcbiAgICB9IGVsc2UgaWYocGFyYW1zLm91dHB1dFBhdGggJiYgIXBhcmFtcy5vdXRwdXRGdWxsUGF0aCkge1xuICAgICAgcGFyYW1zLm91dHB1dEZ1bGxQYXRoID0gcGF0aFJlc29sdmUocGFja2FnZURpciwgcGFyYW1zLm91dHB1dFBhdGgpO1xuICAgIH1cblxuICAgIGlmKHNvdXJjZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnNvdXJjZVBhdGggPSBzb3VyY2VQYXRoO1xuICAgICAgcGFyYW1zLnNvdXJjZUZ1bGxQYXRoID0gcGF0aFJlc29sdmUocGFja2FnZURpciwgc291cmNlUGF0aCk7XG4gICAgfSBlbHNlIGlmKHBhcmFtcy5zb3VyY2VQYXRoICYmICFwYXJhbXMuc291cmNlRnVsbFBhdGgpIHtcbiAgICAgIHBhcmFtcy5zb3VyY2VGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsIHBhcmFtcy5zb3VyY2VQYXRoKTtcbiAgICB9XG5cbiAgICBpZih0eXBlc2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy51c2VUeXBlc2NyaXB0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZihlbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMudGFyZ2V0RW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudCA9PT0gJ3dlYicgPyAnd2ViJyA6ICdub2RlJztcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVudi5MRVhfQ09ORklHID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIC4uLkxleENvbmZpZy51cGRhdGVDb25maWcocGFyYW1zKSxcbiAgICAgICAgY29tbWFuZE5hbWU6IGNtZFtuYW1lUHJvcGVydHldLFxuICAgICAgICBpc1N0YXRpYzogY21kLnN0YXRpY1xuICAgICAgfSwgbnVsbCwgMFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcGFyc2VDb25maWcoY21kLCBpc1Jvb3Q6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge2NsaU5hbWUgPSAnTGV4JywgbGV4Q29uZmlnLCBsZXhDb25maWdOYW1lLCBxdWlldCwgdHlwZXNjcmlwdCwgZGVidWcgPSBmYWxzZX0gPSBjbWQ7XG4gICAgY29uc3QgY29uZmlnRm9ybWF0cyA9IFsnanMnLCAnbWpzJywgJ2NqcycsICd0cycsICdqc29uJ107XG4gICAgY29uc3QgY29uZmlnQmFzZU5hbWU6IHN0cmluZyA9IGxleENvbmZpZ05hbWUgfHwgJ2xleC5jb25maWcnO1xuICAgIGxldCBjb25maWdQYXRoOiBzdHJpbmcgPSBsZXhDb25maWcgfHwgJyc7XG4gICAgbGV0IGNvbmZpZ0V4aXN0czogYm9vbGVhbiA9IGxleENvbmZpZyA/IGV4aXN0c1N5bmMoY29uZmlnUGF0aCkgOiBmYWxzZTtcblxuICAgIGlmKCFjb25maWdQYXRoIHx8ICFjb25maWdFeGlzdHMpIHtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgU2VhcmNoaW5nIGZvciBjb25maWcgZmlsZXMgd2l0aCBiYXNlIG5hbWU6ICR7Y29uZmlnQmFzZU5hbWV9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIGZvcihjb25zdCBmb3JtYXQgb2YgY29uZmlnRm9ybWF0cykge1xuICAgICAgICBjb25zdCBwb3RlbnRpYWxQYXRoID0gaXNSb290XG4gICAgICAgICAgPyBwYXRoUmVzb2x2ZShjd2QsIGAuLyR7Y29uZmlnQmFzZU5hbWV9LiR7Zm9ybWF0fWApXG4gICAgICAgICAgOiByZWxhdGl2ZUZpbGVQYXRoKGAke2NvbmZpZ0Jhc2VOYW1lfS4ke2Zvcm1hdH1gLCBjd2QpO1xuXG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBDaGVja2luZyBmb3IgY29uZmlnIGZpbGU6ICR7cG90ZW50aWFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGV4aXN0c1N5bmMocG90ZW50aWFsUGF0aCkpIHtcbiAgICAgICAgICBjb25maWdQYXRoID0gcG90ZW50aWFsUGF0aDtcbiAgICAgICAgICBjb25maWdFeGlzdHMgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY29uZmlnRXhpc3RzKSB7XG4gICAgICBsb2coYFVzaW5nICR7Y2xpTmFtZX0gY29uZmlndXJhdGlvbiBmaWxlOiAke2NvbmZpZ1BhdGh9YCwgJ25vdGUnLCBxdWlldCk7XG4gICAgICBjb25zdCBleHQ6IHN0cmluZyA9IHBhdGhFeHRuYW1lKGNvbmZpZ1BhdGgpO1xuXG4gICAgICBpZihleHQgPT09ICcuanNvbicpIHtcbiAgICAgICAgY29uc3QgY29uZmlnQ29udGVudDogc3RyaW5nID0gcmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG5cbiAgICAgICAgaWYoY29uZmlnQ29udGVudCkge1xuICAgICAgICAgIGxldCBjb25maWdKc29uOiBMZXhDb25maWdUeXBlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbmZpZ0pzb24gPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpPy5kZWZhdWx0IHx8IHt9O1xuICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIHBhcnNlIEpTT04gY29uZmlnOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgY29uZmlnSnNvbiA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBjb25maWdKc29uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvbmZpZyBmaWxlIG1hbGZvcm1lZCwgJHtjb25maWdQYXRofWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKFsnLmpzJywgJy5tanMnLCAnLmNqcycsICcudHMnXS5pbmNsdWRlcyhleHQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IGxleEN1c3RvbUNvbmZpZztcblxuICAgICAgICAgIGlmKGV4dCA9PT0gJy5janMnKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJsID0gbmV3IFVSTChgZmlsZTovLy8ke3BhdGhSZXNvbHZlKGNvbmZpZ1BhdGgpfWApLmhyZWY7XG5cbiAgICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICAgIGxvZyhgTG9hZGluZyBDb21tb25KUyBjb25maWcgZnJvbTogJHtmaWxlVXJsfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV4Q3VzdG9tQ29uZmlnID0gYXdhaXQgaW1wb3J0KGZpbGVVcmwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgICBsb2coYExvYWRpbmcgRVNNL1RTIGNvbmZpZyBmcm9tOiAke2NvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxleEN1c3RvbUNvbmZpZyA9IGF3YWl0IGltcG9ydChjb25maWdQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb25maWcgPSBsZXhDdXN0b21Db25maWcuZGVmYXVsdCB8fCBsZXhDdXN0b21Db25maWc7XG5cbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgbG9nKGBMb2FkZWQgY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMil9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYoIWNvbmZpZykge1xuICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IFdhcm5pbmc6IENvbmZpZyBmaWxlIGxvYWRlZCBidXQgbm8gY29uZmlndXJhdGlvbiBmb3VuZGAsICd3YXJuJywgcXVpZXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBjb25maWcgfHwge30pO1xuICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gbG9hZCBjb25maWcgZmlsZTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBDb25maWcgZmlsZSBtdXN0IGJlIGEgSlMsIENKUywgTUpTLCBUUywgb3IgSlNPTiBmaWxlLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKCdObyBjb25maWcgZmlsZSBmb3VuZC4gVXNpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuXG4gICAgICBMZXhDb25maWcudXNlVHlwZXNjcmlwdCA9ICEhdHlwZXNjcmlwdDtcbiAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBMZXhDb25maWcuY29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2tUeXBlc2NyaXB0Q29uZmlnKCkge1xuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBnZXRQYWNrYWdlRGlyKCk7XG4gICAgY29uc3QgdHNjb25maWdQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAnLi90c2NvbmZpZy5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ1BhdGgpKSB7XG4gICAgICBjb25zdCBsZXhEaXIgPSBMZXhDb25maWcuZ2V0TGV4RGlyKCk7XG4gICAgICBjb25zdCBiYXNlQ29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKGxleERpciwgJ3RzY29uZmlnLmJhc2UuanNvbicpO1xuICAgICAgY29uc3QgdGVtcGxhdGVDb25maWdQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcudGVtcGxhdGUuanNvbicpO1xuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IGV4aXN0c1N5bmMoYmFzZUNvbmZpZ1BhdGgpID8gYmFzZUNvbmZpZ1BhdGggOiB0ZW1wbGF0ZUNvbmZpZ1BhdGg7XG5cbiAgICAgIGlmKGV4aXN0c1N5bmMoc291cmNlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ1BhdGgsIHJlYWRGaWxlU3luYyhzb3VyY2VQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFR5cGVTY3JpcHREZWNsYXJhdGlvbkZsYWdzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBMZXhDb25maWcuY29uZmlnLm91dHB1dFBhdGggfHwgJy4vbGliJztcbiAgICBjb25zdCBvdXRwdXRGdWxsUGF0aCA9IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgcGF0aFJlc29sdmUoY3dkLCBvdXRwdXRQYXRoKTtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5zb3VyY2VQYXRoIHx8ICcuL3NyYyc7XG4gICAgY29uc3Qgc291cmNlRnVsbFBhdGggPSBMZXhDb25maWcuY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlUGF0aCk7XG4gICAgY29uc3QgcmVsYXRpdmVPdXREaXIgPSBwYXRoUmVsYXRpdmUoY3dkLCBvdXRwdXRGdWxsUGF0aCkgfHwgJy4vbGliJztcbiAgICBjb25zdCByZWxhdGl2ZVJvb3REaXIgPSBwYXRoUmVsYXRpdmUoY3dkLCBzb3VyY2VGdWxsUGF0aCkgfHwgJy4vc3JjJztcblxuICAgIHJldHVybiBbXG4gICAgICAnLS1lbWl0RGVjbGFyYXRpb25Pbmx5JywgLy8gQ1JJVElDQUw6IE9ubHkgZW1pdCAuZC50cyBmaWxlcywgbm8gSlMgZmlsZXNcbiAgICAgICctLWRlY2xhcmF0aW9uJywgLy8gR2VuZXJhdGUgZGVjbGFyYXRpb24gZmlsZXNcbiAgICAgICctLWRlY2xhcmF0aW9uTWFwJywgLy8gR2VuZXJhdGUgc291cmNlIG1hcHMgZm9yIGRlY2xhcmF0aW9uc1xuICAgICAgJy0tb3V0RGlyJywgcmVsYXRpdmVPdXREaXIsXG4gICAgICAnLS1yb290RGlyJywgcmVsYXRpdmVSb290RGlyLFxuICAgICAgJy0tc2tpcExpYkNoZWNrJywgLy8gU2tpcCB0eXBlIGNoZWNraW5nIG9mIGRlY2xhcmF0aW9uIGZpbGVzIChmYXN0ZXIsIG1vcmUgbGVuaWVudClcbiAgICAgICctLWVzTW9kdWxlSW50ZXJvcCcsXG4gICAgICAnLS1hbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzJyxcbiAgICAgICctLW1vZHVsZScsICdOb2RlTmV4dCcsXG4gICAgICAnLS1tb2R1bGVSZXNvbHV0aW9uJywgJ05vZGVOZXh0JyxcbiAgICAgICctLXRhcmdldCcsICdFU05leHQnLFxuICAgICAgJy0tanN4JywgJ3JlYWN0LWpzeCcsXG4gICAgICAnLS1pc29sYXRlZE1vZHVsZXMnLFxuICAgICAgJy0tcmVzb2x2ZUpzb25Nb2R1bGUnLFxuICAgICAgJy0tYWxsb3dKcydcbiAgICAgIC8vIE5vdGU6IC0tbm9VbnVzZWRMb2NhbHMgYW5kIC0tbm9VbnVzZWRQYXJhbWV0ZXJzIGFyZSBub3QgbmVlZGVkIGZvciBkZWNsYXJhdGlvbiBnZW5lcmF0aW9uXG4gICAgICAvLyBhbmQgd291bGQgYWN0dWFsbHkgZW5hYmxlIHN0cmljdCBjaGVja2luZywgd2hpY2ggd2Ugd2FudCB0byBhdm9pZCBmb3IgZmFzdGVyIGRlY2xhcmF0aW9uIGdlbmVyYXRpb25cbiAgICBdO1xuICB9XG5cbiAgc3RhdGljIGNoZWNrTGludFR5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuICAgIGNvbnN0IHRzY29uZmlnTGludFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGxleERpciwgJy4vdHNjb25maWcubGludC5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ0xpbnRQYXRoKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcubGludC5qc29uJyk7XG4gICAgICBpZihleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ0xpbnRQYXRoLCByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNoZWNrVGVzdFR5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuICAgIGNvbnN0IHRzY29uZmlnVGVzdFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGxleERpciwgJy4vdHNjb25maWcudGVzdC5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ1Rlc3RQYXRoKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcudGVzdC5qc29uJyk7XG4gICAgICBpZihleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ1Rlc3RQYXRoLCByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIFNXQ09wdGlvbnMgPSBPcHRpb25zO1xuIl0sIm5hbWVzIjpbImZpbmRGaWxlVXAiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwid3JpdGVGaWxlU3luYyIsImRpcm5hbWUiLCJleHRuYW1lIiwicGF0aEV4dG5hbWUiLCJyZWxhdGl2ZSIsInBhdGhSZWxhdGl2ZSIsInJlc29sdmUiLCJwYXRoUmVzb2x2ZSIsIlVSTCIsImdldExleFBhY2thZ2VKc29uUGF0aCIsInJlbGF0aXZlRmlsZVBhdGgiLCJsb2ciLCJjd2QiLCJwcm9jZXNzIiwiZGVmYXVsdENvbmZpZ1ZhbHVlcyIsImFpIiwibWF4VG9rZW5zIiwibW9kZWwiLCJwcm92aWRlciIsInRlbXBlcmF0dXJlIiwiY29uZmlnRmlsZXMiLCJjb3B5RmlsZXMiLCJlbnRyeUhUTUwiLCJlbnRyeUpzIiwiZW52IiwiZXNsaW50Iiwidml0ZXN0Iiwib3V0cHV0RnVsbFBhdGgiLCJvdXRwdXRIYXNoIiwib3V0cHV0UGF0aCIsInBhY2thZ2VNYW5hZ2VyIiwicHJlc2V0Iiwic291cmNlRnVsbFBhdGgiLCJzb3VyY2VQYXRoIiwic3djIiwiaW5saW5lU291cmNlc0NvbnRlbnQiLCJpc01vZHVsZSIsImpzYyIsImV4dGVybmFsSGVscGVycyIsImtlZXBDbGFzc05hbWVzIiwibG9vc2UiLCJwYXJzZXIiLCJkZWNvcmF0b3JzIiwiZHluYW1pY0ltcG9ydCIsInN5bnRheCIsInRzeCIsInRhcmdldCIsInRyYW5zZm9ybSIsInJlYWN0IiwicnVudGltZSIsIm1pbmlmeSIsIm1vZHVsZSIsImxhenkiLCJub0ludGVyb3AiLCJzdHJpY3QiLCJzdHJpY3RNb2RlIiwidHlwZSIsInNvdXJjZU1hcHMiLCJ0YXJnZXRFbnZpcm9ubWVudCIsInVzZUdyYXBoUWwiLCJ1c2VUeXBlc2NyaXB0Iiwid2VicGFjayIsInN0YXRpY1BhdGgiLCJnZXRQYWNrYWdlRGlyIiwiY3VycmVudFBrZ1BhdGgiLCJwa2ciLCJKU09OIiwicGFyc2UiLCJ3b3Jrc3BhY2VzIiwic2VhcmNoRGlyIiwiaSIsInBrZ1BhdGgiLCJwYXJlbnQiLCJjb25maWdGb3JtYXRzIiwiZm9ybWF0IiwiY29uZmlnUGF0aCIsInN5bmMiLCJnZXRUeXBlU2NyaXB0Q29uZmlnUGF0aCIsImNvbmZpZ05hbWUiLCJwYWNrYWdlRGlyIiwicHJvamVjdEJ1aWxkQ29uZmlnIiwicm9vdEJ1aWxkQ29uZmlnIiwicHJvamVjdExpbnRDb25maWciLCJyb290TGludENvbmZpZyIsInByb2plY3RUZXN0Q29uZmlnIiwicm9vdFRlc3RDb25maWciLCJwcm9qZWN0Q29uZmlnUGF0aCIsInJvb3RDb25maWdQYXRoIiwibGV4RGlyIiwiTGV4Q29uZmlnIiwiZ2V0TGV4RGlyIiwidmFsdWUiLCJjb25maWciLCJpbmRleFBhdGgiLCJoYXNJbmRleFRzeCIsInVwZGF0ZUNvbmZpZyIsInVwZGF0ZWRDb25maWciLCJ1bmRlZmluZWQiLCJDVVJTT1JfSURFIiwiYWRkQ29uZmlnUGFyYW1zIiwiY21kIiwicGFyYW1zIiwibmFtZVByb3BlcnR5IiwiZW52aXJvbm1lbnQiLCJ0eXBlc2NyaXB0IiwiTEVYX0NPTkZJRyIsInN0cmluZ2lmeSIsImNvbW1hbmROYW1lIiwiaXNTdGF0aWMiLCJzdGF0aWMiLCJwYXJzZUNvbmZpZyIsImlzUm9vdCIsImNsaU5hbWUiLCJsZXhDb25maWciLCJsZXhDb25maWdOYW1lIiwicXVpZXQiLCJkZWJ1ZyIsImNvbmZpZ0Jhc2VOYW1lIiwiY29uZmlnRXhpc3RzIiwicG90ZW50aWFsUGF0aCIsImV4dCIsImNvbmZpZ0NvbnRlbnQiLCJjb25maWdKc29uIiwiZGVmYXVsdCIsImVycm9yIiwibWVzc2FnZSIsImluY2x1ZGVzIiwibGV4Q3VzdG9tQ29uZmlnIiwiZmlsZVVybCIsImhyZWYiLCJjb25zb2xlIiwiY2hlY2tUeXBlc2NyaXB0Q29uZmlnIiwidHNjb25maWdQYXRoIiwiYmFzZUNvbmZpZ1BhdGgiLCJ0ZW1wbGF0ZUNvbmZpZ1BhdGgiLCJnZXRUeXBlU2NyaXB0RGVjbGFyYXRpb25GbGFncyIsInJlbGF0aXZlT3V0RGlyIiwicmVsYXRpdmVSb290RGlyIiwiY2hlY2tMaW50VHlwZXNjcmlwdENvbmZpZyIsInRzY29uZmlnTGludFBhdGgiLCJ0ZW1wbGF0ZVBhdGgiLCJjaGVja1Rlc3RUeXBlc2NyaXB0Q29uZmlnIiwidHNjb25maWdUZXN0UGF0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOzs7Q0FHQyxHQUNELE9BQU9BLGdCQUFnQixlQUFlO0FBQ3RDLFNBQVFDLFVBQVUsRUFBRUMsWUFBWSxFQUFFQyxhQUFhLFFBQU8sS0FBSztBQUMzRCxTQUNFQyxPQUFPLEVBQ1BDLFdBQVdDLFdBQVcsRUFDdEJDLFlBQVlDLFlBQVksRUFDeEJDLFdBQVdDLFdBQVcsUUFDakIsT0FBTztBQUNkLFNBQVFDLEdBQUcsUUFBTyxNQUFNO0FBRXhCLFNBQVFDLHFCQUFxQixFQUFFQyxnQkFBZ0IsUUFBTyxrQkFBa0I7QUFDeEUsU0FBUUMsR0FBRyxRQUFPLGlCQUFpQjtBQUtuQyxNQUFNQyxNQUFjQyxRQUFRRCxHQUFHO0FBZ0UvQixPQUFPLE1BQU1FLHNCQUFxQztJQUNoREMsSUFBSTtRQUNGQyxXQUFXO1FBQ1hDLE9BQU87UUFDUEMsVUFBVTtRQUNWQyxhQUFhO0lBQ2Y7SUFDQUMsYUFBYSxFQUFFO0lBQ2ZDLFdBQVcsRUFBRTtJQUNiQyxXQUFXO0lBQ1hDLFNBQVM7SUFDVEMsS0FBSztJQUNMQyxRQUFRLENBQUM7SUFDVEMsUUFBUSxDQUFDO0lBQ1RDLGdCQUFnQnBCLFlBQVlLLEtBQUs7SUFDakNnQixZQUFZO0lBQ1pD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
@@ -12,4 +12,5 @@ export interface DevOptions {
12
12
  readonly variables?: string;
13
13
  }
14
14
  export type DevCallback = (status: number) => void;
15
+ export declare const DEFAULT_DEV_PORT = 3000;
15
16
  export declare const dev: (cmd: DevOptions, callback?: DevCallback) => Promise<number>;
@@ -23,6 +23,18 @@ try {
23
23
  currentFilename = process.cwd();
24
24
  currentDirname = process.cwd();
25
25
  }
26
+ // default port used by the development server when none is provided
27
+ export const DEFAULT_DEV_PORT = 3000;
28
+ const parsePort = (portValue)=>{
29
+ if (portValue === undefined || portValue === null || portValue === '') {
30
+ return undefined;
31
+ }
32
+ const parsed = Number(portValue);
33
+ if (Number.isInteger(parsed) && parsed > 0) {
34
+ return parsed;
35
+ }
36
+ return undefined;
37
+ };
26
38
  const getCacheDir = ()=>{
27
39
  const cacheDir = join(homedir(), '.lex-cache');
28
40
  if (!existsSync(cacheDir)) {
@@ -107,7 +119,7 @@ const getNetworkAddresses = ()=>{
107
119
  }
108
120
  return addresses;
109
121
  };
110
- const displayServerStatus = (port = 3000, quiet, publicIp)=>{
122
+ const displayServerStatus = (port = DEFAULT_DEV_PORT, quiet, publicIp)=>{
111
123
  if (quiet) {
112
124
  return;
113
125
  }
@@ -138,11 +150,12 @@ const displayServerStatus = (port = 3000, quiet, publicIp)=>{
138
150
  console.log(`\n${statusBox}\n`);
139
151
  };
140
152
  export const dev = async (cmd, callback = ()=>({}))=>{
141
- const { bundleAnalyzer, cliName = 'Lex', config, format = 'esm', open = false, port = 3000, quiet, remove, translations = false, usePublicIp, variables } = cmd;
153
+ const { bundleAnalyzer, cliName = 'Lex', config, format = 'esm', open = false, port: cliPort, quiet, remove, translations = false, usePublicIp, variables } = cmd;
142
154
  const spinner = createSpinner(quiet);
143
155
  log(`${cliName} start development server...`, 'info', quiet);
144
156
  await LexConfig.parseConfig(cmd);
145
- const { outputFullPath, useTypescript } = LexConfig.config;
157
+ const { dev: devConfig, outputFullPath, useTypescript } = LexConfig.config;
158
+ const finalPort = parsePort(cliPort) ?? parsePort(devConfig?.port) ?? DEFAULT_DEV_PORT;
146
159
  let variablesObj = {
147
160
  NODE_ENV: 'development'
148
161
  };
@@ -223,7 +236,7 @@ export const dev = async (cmd, callback = ()=>({}))=>{
223
236
  ...process.env,
224
237
  LEX_QUIET: quiet,
225
238
  WEBPACK_DEV_OPEN: open,
226
- WEBPACK_DEV_PORT: port.toString()
239
+ WEBPACK_DEV_PORT: finalPort.toString()
227
240
  },
228
241
  stdio: 'pipe'
229
242
  });
@@ -242,7 +255,7 @@ export const dev = async (cmd, callback = ()=>({}))=>{
242
255
  displayServerStatus(portToShow, quiet);
243
256
  }
244
257
  };
245
- let detectedPort = port;
258
+ let detectedPort = finalPort;
246
259
  childProcess.stdout?.on('data', (data)=>{
247
260
  const output = data.toString();
248
261
  handleWebpackProgress(output, spinner, quiet, '🚀', 'Webpack Building');
@@ -290,4 +303,4 @@ export const dev = async (cmd, callback = ()=>({}))=>{
290
303
  }
291
304
  };
292
305
 
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9kZXYvZGV2LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgYm94ZW4gZnJvbSAnYm94ZW4nO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jLCBta2RpclN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCBodHRwcyBmcm9tICdodHRwcyc7XG5pbXBvcnQge25ldHdvcmtJbnRlcmZhY2VzLCBob21lZGlyfSBmcm9tICdvcyc7XG5pbXBvcnQge2Rpcm5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmUsIGpvaW59IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lciwgaGFuZGxlV2VicGFja1Byb2dyZXNzLCByZW1vdmVGaWxlc30gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7cmVzb2x2ZVdlYnBhY2tQYXRoc30gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7cHJvY2Vzc1RyYW5zbGF0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvdHJhbnNsYXRpb25zLmpzJztcblxubGV0IGN1cnJlbnRGaWxlbmFtZTogc3RyaW5nO1xubGV0IGN1cnJlbnREaXJuYW1lOiBzdHJpbmc7XG5cbnRyeSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1ldmFsXG4gIGN1cnJlbnRGaWxlbmFtZSA9IGV2YWwoJ3JlcXVpcmUoXCJ1cmxcIikuZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpJyk7XG4gIGN1cnJlbnREaXJuYW1lID0gZGlybmFtZShjdXJyZW50RmlsZW5hbWUpO1xufSBjYXRjaHtcbiAgY3VycmVudEZpbGVuYW1lID0gcHJvY2Vzcy5jd2QoKTtcbiAgY3VycmVudERpcm5hbWUgPSBwcm9jZXNzLmN3ZCgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERldk9wdGlvbnMge1xuICByZWFkb25seSBidW5kbGVBbmFseXplcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZm9ybWF0Pzogc3RyaW5nO1xuICByZWFkb25seSBvcGVuPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSByZW1vdmU/OiBib29sZWFuO1xuICByZWFkb25seSB0cmFuc2xhdGlvbnM/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VQdWJsaWNJcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRGV2Q2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBQdWJsaWNJcENhY2hlIHtcbiAgaXA6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmNvbnN0IGdldENhY2hlRGlyID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gam9pbihob21lZGlyKCksICcubGV4LWNhY2hlJyk7XG4gIGlmKCFleGlzdHNTeW5jKGNhY2hlRGlyKSkge1xuICAgIG1rZGlyU3luYyhjYWNoZURpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICB9XG4gIHJldHVybiBjYWNoZURpcjtcbn07XG5cbmNvbnN0IGdldENhY2hlUGF0aCA9ICgpOiBzdHJpbmcgPT4gam9pbihnZXRDYWNoZURpcigpLCAncHVibGljLWlwLmpzb24nKTtcblxuY29uc3QgcmVhZFB1YmxpY0lwQ2FjaGUgPSAoKTogUHVibGljSXBDYWNoZSB8IG51bGwgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZURhdGEgPSByZWFkRmlsZVN5bmMoY2FjaGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0gSlNPTi5wYXJzZShjYWNoZURhdGEpO1xuICAgIGNvbnN0IG9uZVdlZWtNcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4gICAgaWYoRGF0ZS5ub3coKSAtIGNhY2hlLnRpbWVzdGFtcCA+IG9uZVdlZWtNcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlO1xuICB9IGNhdGNoe1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCB3cml0ZVB1YmxpY0lwQ2FjaGUgPSAoaXA6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSB7XG4gICAgaXAsXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gIH07XG4gIHdyaXRlRmlsZVN5bmMoY2FjaGVQYXRoLCBKU09OLnN0cmluZ2lmeShjYWNoZSwgbnVsbCwgMikpO1xufTtcblxuY29uc3QgZmV0Y2hQdWJsaWNJcCA9IChmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICBpZighZm9yY2VSZWZyZXNoKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcmVhZFB1YmxpY0lwQ2FjaGUoKTtcbiAgICBpZihjYWNoZWQpIHtcbiAgICAgIHJlc29sdmUoY2FjaGVkLmlwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBodHRwcy5nZXQoJ2h0dHBzOi8vYXBpLmlwaWZ5Lm9yZycsIChyZXMpID0+IHtcbiAgICBsZXQgZGF0YSA9ICcnO1xuICAgIHJlcy5vbignZGF0YScsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmspKTtcbiAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlwID0gZGF0YS50cmltKCk7XG4gICAgICBpZihpcCkge1xuICAgICAgICB3cml0ZVB1YmxpY0lwQ2FjaGUoaXApO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShpcCk7XG4gICAgfSk7XG4gIH0pLm9uKCdlcnJvcicsICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSk7XG59KTtcblxuY29uc3QgZ2V0TmV0d29ya0FkZHJlc3NlcyA9ICgpID0+IHtcbiAgY29uc3QgaW50ZXJmYWNlcyA9IG5ldHdvcmtJbnRlcmZhY2VzKCk7XG4gIGNvbnN0IGFkZHJlc3NlcyA9IHtcbiAgICBsb2NhbDogJ2xvY2FsaG9zdCcsXG4gICAgcHJpdmF0ZTogbnVsbCxcbiAgICBwdWJsaWM6IG51bGxcbiAgfTtcblxuICBmb3IoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhpbnRlcmZhY2VzKSkge1xuICAgIGNvbnN0IG5ldHdvcmtJbnRlcmZhY2UgPSBpbnRlcmZhY2VzW25hbWVdO1xuICAgIGlmKCFuZXR3b3JrSW50ZXJmYWNlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IoY29uc3QgaWZhY2Ugb2YgbmV0d29ya0ludGVyZmFjZSkge1xuICAgICAgaWYoaWZhY2UuZmFtaWx5ID09PSAnSVB2NCcgJiYgIWlmYWNlLmludGVybmFsKSB7XG4gICAgICAgIGNvbnN0IGlwID0gaWZhY2UuYWRkcmVzcztcblxuICAgICAgICBpZihpcC5zdGFydHNXaXRoKCcxMC4nKSB8fCBpcC5zdGFydHNXaXRoKCcxOTIuMTY4LicpIHx8IGlwLnN0YXJ0c1dpdGgoJzE3Mi4nKSkge1xuICAgICAgICAgIGlmKCFhZGRyZXNzZXMucHJpdmF0ZSkge1xuICAgICAgICAgICAgYWRkcmVzc2VzLnByaXZhdGUgPSBpcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYoIWFkZHJlc3Nlcy5wdWJsaWMpIHtcbiAgICAgICAgICAgIGFkZHJlc3Nlcy5wdWJsaWMgPSBpcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWRkcmVzc2VzO1xufTtcblxuY29uc3QgZGlzcGxheVNlcnZlclN0YXR1cyA9IChwb3J0OiBudW1iZXIgPSAzMDAwLCBxdWlldDogYm9vbGVhbiwgcHVibGljSXA/OiBzdHJpbmcpID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhZGRyZXNzZXMgPSBnZXROZXR3b3JrQWRkcmVzc2VzKCk7XG4gIGNvbnN0IGxvY2FsVXJsID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWA7XG4gIGNvbnN0IHByaXZhdGVVcmwgPSBhZGRyZXNzZXMucHJpdmF0ZSA/IGBodHRwOi8vJHthZGRyZXNzZXMucHJpdmF0ZX06JHtwb3J0fWAgOiBudWxsO1xuICBsZXQgcHVibGljVXJsID0gbnVsbDtcbiAgaWYocHVibGljSXApIHtcbiAgICBwdWJsaWNVcmwgPSBgaHR0cDovLyR7cHVibGljSXB9OiR7cG9ydH1gO1xuICB9IGVsc2UgaWYoYWRkcmVzc2VzLnB1YmxpYykge1xuICAgIHB1YmxpY1VybCA9IGBodHRwOi8vJHthZGRyZXNzZXMucHVibGljfToke3BvcnR9YDtcbiAgfVxuXG4gIGxldCB1cmxMaW5lcyA9IGAke2NoYWxrLmdyZWVuKCdMb2NhbDonKX0gICAgICR7Y2hhbGsudW5kZXJsaW5lKGxvY2FsVXJsKX1cXG5gO1xuXG4gIGlmKHByaXZhdGVVcmwpIHtcbiAgICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignUHJpdmF0ZTonKX0gICAke2NoYWxrLnVuZGVybGluZShwcml2YXRlVXJsKX1cXG5gO1xuICB9XG5cbiAgaWYocHVibGljVXJsKSB7XG4gICAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ1B1YmxpYzonKX0gICAgJHtjaGFsay51bmRlcmxpbmUocHVibGljVXJsKX1cXG5gO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzQm94ID0gYm94ZW4oXG4gICAgYCR7Y2hhbGsuY3lhbi5ib2xkKCfwn5qAIERldmVsb3BtZW50IFNlcnZlciBSdW5uaW5nJyl9XFxuXFxuJHt1cmxMaW5lc31cXG5gICtcbiAgICBgJHtjaGFsay55ZWxsb3coJ1ByZXNzIEN0cmwrQyB0byBzdG9wIHRoZSBzZXJ2ZXInKX1gLFxuICAgIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxYTFhMWEnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdjeWFuJyxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgcGFkZGluZzogMVxuICAgIH1cbiAgKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmxvZyhgXFxuJHtzdGF0dXNCb3h9XFxuYCk7XG59O1xuXG5leHBvcnQgY29uc3QgZGV2ID0gYXN5bmMgKGNtZDogRGV2T3B0aW9ucywgY2FsbGJhY2s6IERldkNhbGxiYWNrID0gKCkgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtidW5kbGVBbmFseXplciwgY2xpTmFtZSA9ICdMZXgnLCBjb25maWcsIGZvcm1hdCA9ICdlc20nLCBvcGVuID0gZmFsc2UsIHBvcnQgPSAzMDAwLCBxdWlldCwgcmVtb3ZlLCB0cmFuc2xhdGlvbnMgPSBmYWxzZSwgdXNlUHVibGljSXAsIHZhcmlhYmxlc30gPSBjbWQ7XG5cbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIGxvZyhgJHtjbGlOYW1lfSBzdGFydCBkZXZlbG9wbWVudCBzZXJ2ZXIuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBjb25zdCB7b3V0cHV0RnVsbFBhdGgsIHVzZVR5cGVzY3JpcHR9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdkZXZlbG9wbWVudCd9O1xuXG4gIGlmKHZhcmlhYmxlcykge1xuICAgIHRyeSB7XG4gICAgICB2YXJpYWJsZXNPYmogPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgfSBjYXRjaChfZXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRW52aXJvbm1lbnQgdmFyaWFibGVzIG9wdGlvbiBpcyBub3QgYSB2YWxpZCBKU09OIG9iamVjdC5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3MuZW52ID0gey4uLnByb2Nlc3MuZW52LCAuLi52YXJpYWJsZXNPYmp9O1xuXG4gIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICBMZXhDb25maWcuY2hlY2tUeXBlc2NyaXB0Q29uZmlnKCk7XG4gIH1cblxuICBpZihyZW1vdmUpIHtcbiAgICBzcGlubmVyLnN0YXJ0KCdDbGVhbmluZyBvdXRwdXQgZGlyZWN0b3J5Li4uJyk7XG5cbiAgICBhd2FpdCByZW1vdmVGaWxlcyhvdXRwdXRGdWxsUGF0aCB8fCAnJyk7XG5cbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIG91dHB1dCBkaXJlY3RvcnkhJyk7XG4gIH1cblxuICBpZih0cmFuc2xhdGlvbnMpIHtcbiAgICBzcGlubmVyLnN0YXJ0KCdQcm9jZXNzaW5nIHRyYW5zbGF0aW9ucy4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBMZXhDb25maWcuY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCAnbGliJztcblxuICAgICAgYXdhaXQgcHJvY2Vzc1RyYW5zbGF0aW9ucyhzb3VyY2VQYXRoLCBvdXRwdXRQYXRoLCBxdWlldCk7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ1RyYW5zbGF0aW9ucyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICAgIH0gY2F0Y2godHJhbnNsYXRpb25FcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gcHJvY2VzcyB0cmFuc2xhdGlvbnM6ICR7dHJhbnNsYXRpb25FcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHByb2Nlc3MgdHJhbnNsYXRpb25zLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBsZXQgd2VicGFja0NvbmZpZzogc3RyaW5nO1xuXG4gIGlmKGNvbmZpZykge1xuICAgIGNvbnN0IGlzUmVsYXRpdmVDb25maWc6IGJvb2xlYW4gPSBjb25maWcuc3Vic3RyKDAsIDIpID09PSAnLi8nO1xuICAgIHdlYnBhY2tDb25maWcgPSBpc1JlbGF0aXZlQ29uZmlnID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnKSA6IGNvbmZpZztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7d2VicGFja0NvbmZpZzogcmVzb2x2ZWRDb25maWd9ID0gcmVzb2x2ZVdlYnBhY2tQYXRocyhjdXJyZW50RGlybmFtZSk7XG4gICAgd2VicGFja0NvbmZpZyA9IHJlc29sdmVkQ29uZmlnO1xuICB9XG5cbiAgY29uc3Qge3dlYnBhY2tQYXRofSA9IHJlc29sdmVXZWJwYWNrUGF0aHMoY3VycmVudERpcm5hbWUpO1xuXG4gIGNvbnN0IHdlYnBhY2tPcHRpb25zOiBzdHJpbmdbXSA9IFtcbiAgICAnLS1jb2xvcicsXG4gICAgJy0td2F0Y2gnLFxuICAgICctLWNvbmZpZycsIHdlYnBhY2tDb25maWdcbiAgXTtcblxuICBpZihidW5kbGVBbmFseXplcikge1xuICAgIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tYnVuZGxlQW5hbHl6ZXInKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbGV0IGV4ZWN1dGFibGVQYXRoID0gd2VicGFja1BhdGg7XG4gICAgbGV0IGZpbmFsV2VicGFja09wdGlvbnM6IHN0cmluZ1tdO1xuXG4gICAgaWYod2VicGFja1BhdGggPT09ICducHgnKSB7XG4gICAgICBmaW5hbFdlYnBhY2tPcHRpb25zID0gWyd3ZWJwYWNrJywgLi4ud2VicGFja09wdGlvbnNdO1xuICAgIH0gZWxzZSBpZih3ZWJwYWNrUGF0aC5lbmRzV2l0aCgnLmpzJykpIHtcbiAgICAgIGV4ZWN1dGFibGVQYXRoID0gJ25vZGUnO1xuICAgICAgZmluYWxXZWJwYWNrT3B0aW9ucyA9IFt3ZWJwYWNrUGF0aCwgLi4ud2VicGFja09wdGlvbnNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbFdlYnBhY2tPcHRpb25zID0gd2VicGFja09wdGlvbnM7XG4gICAgfVxuXG4gICAgc3Bpbm5lci5zdGFydCgnU3RhcnRpbmcgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJyk7XG5cbiAgICBjb25zdCBjaGlsZFByb2Nlc3MgPSBleGVjYShleGVjdXRhYmxlUGF0aCwgZmluYWxXZWJwYWNrT3B0aW9ucywge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIGVudjoge1xuICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgTEVYX1FVSUVUOiBxdWlldCxcbiAgICAgICAgV0VCUEFDS19ERVZfT1BFTjogb3BlbixcbiAgICAgICAgV0VCUEFDS19ERVZfUE9SVDogcG9ydC50b1N0cmluZygpXG4gICAgICB9LFxuICAgICAgc3RkaW86ICdwaXBlJ1xuICAgIH0gYXMgYW55KTtcblxuICAgIGxldCBzZXJ2ZXJTdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IHN0YXR1c1Nob3duID0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd1N0YXR1c09uY2UgPSAocG9ydFRvU2hvdzogbnVtYmVyKSA9PiB7XG4gICAgICBpZihzdGF0dXNTaG93bikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdGF0dXNTaG93biA9IHRydWU7XG4gICAgICBpZih1c2VQdWJsaWNJcCkge1xuICAgICAgICBmZXRjaFB1YmxpY0lwKHVzZVB1YmxpY0lwKS50aGVuKChwdWJsaWNJcCkgPT4ge1xuICAgICAgICAgIGRpc3BsYXlTZXJ2ZXJTdGF0dXMocG9ydFRvU2hvdywgcXVpZXQsIHB1YmxpY0lwKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwbGF5U2VydmVyU3RhdHVzKHBvcnRUb1Nob3csIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGxldCBkZXRlY3RlZFBvcnQgPSBwb3J0O1xuXG4gICAgY2hpbGRQcm9jZXNzLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICAgIGhhbmRsZVdlYnBhY2tQcm9ncmVzcyhvdXRwdXQsIHNwaW5uZXIsIHF1aWV0LCAn8J+agCcsICdXZWJwYWNrIEJ1aWxkaW5nJyk7XG5cbiAgICAgIGlmKCFzZXJ2ZXJTdGFydGVkICYmIChvdXRwdXQuaW5jbHVkZXMoJ0xvY2FsOicpIHx8IG91dHB1dC5pbmNsdWRlcygnd2VicGFjayBjb21waWxlZCcpIHx8IG91dHB1dC5pbmNsdWRlcygnd2VicGFjay1wbHVnaW4tc2VydmUnKSB8fCBvdXRwdXQuaW5jbHVkZXMoJ2h0dHA6Ly9sb2NhbGhvc3QnKSB8fCBvdXRwdXQuaW5jbHVkZXMoJ2xpc3RlbmluZyBvbiBwb3J0JykpKSB7XG4gICAgICAgIHNlcnZlclN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0RldmVsb3BtZW50IHNlcnZlciBzdGFydGVkLicpO1xuXG4gICAgICAgIGNvbnN0IHBvcnRNYXRjaCA9IG91dHB1dC5tYXRjaCgvTG9jYWw6XFxzKmh0dHA6XFwvXFwvW146XSs6KFxcZCspLykgfHxcbiAgICAgICAgICBvdXRwdXQubWF0Y2goL2h0dHA6XFwvXFwvbG9jYWxob3N0OihcXGQrKS8pIHx8XG4gICAgICAgICAgb3V0cHV0Lm1hdGNoKC9wb3J0OlxccyooXFxkKykvKSB8fFxuICAgICAgICAgIG91dHB1dC5tYXRjaCgvbGlzdGVuaW5nIG9uIHBvcnQgKFxcZCspLykgfHxcbiAgICAgICAgICBvdXRwdXQubWF0Y2goL1dlYnBhY2tQbHVnaW5TZXJ2ZSBsaXN0ZW5pbmcgb24gcG9ydCAoXFxkKykvKTtcbiAgICAgICAgaWYocG9ydE1hdGNoKSB7XG4gICAgICAgICAgZGV0ZWN0ZWRQb3J0ID0gcGFyc2VJbnQocG9ydE1hdGNoWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dTdGF0dXNPbmNlKGRldGVjdGVkUG9ydCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZFByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKTtcblxuICAgICAgaGFuZGxlV2VicGFja1Byb2dyZXNzKG91dHB1dCwgc3Bpbm5lciwgcXVpZXQsICfwn5qAJywgJ1dlYnBhY2sgQnVpbGRpbmcnKTtcblxuICAgICAgaWYoIXNlcnZlclN0YXJ0ZWQgJiYgKG91dHB1dC5pbmNsdWRlcygnTG9jYWw6JykgfHwgb3V0cHV0LmluY2x1ZGVzKCd3ZWJwYWNrIGNvbXBpbGVkJykgfHwgb3V0cHV0LmluY2x1ZGVzKCd3ZWJwYWNrLXBsdWdpbi1zZXJ2ZScpIHx8IG91dHB1dC5pbmNsdWRlcygnaHR0cDovL2xvY2FsaG9zdCcpIHx8IG91dHB1dC5pbmNsdWRlcygnbGlzdGVuaW5nIG9uIHBvcnQnKSkpIHtcbiAgICAgICAgc2VydmVyU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnRGV2ZWxvcG1lbnQgc2VydmVyIHN0YXJ0ZWQuJyk7XG5cbiAgICAgICAgY29uc3QgcG9ydE1hdGNoID0gb3V0cHV0Lm1hdGNoKC9Mb2NhbDpcXHMqaHR0cDpcXC9cXC9bXjpdKzooXFxkKykvKSB8fFxuICAgICAgICAgIG91dHB1dC5tYXRjaCgvaHR0cDpcXC9cXC9sb2NhbGhvc3Q6KFxcZCspLykgfHxcbiAgICAgICAgICBvdXRwdXQubWF0Y2goL3BvcnQ6XFxzKihcXGQrKS8pIHx8XG4gICAgICAgICAgb3V0cHV0Lm1hdGNoKC9saXN0ZW5pbmcgb24gcG9ydCAoXFxkKykvKSB8fFxuICAgICAgICAgIG91dHB1dC5tYXRjaCgvV2VicGFja1BsdWdpblNlcnZlIGxpc3RlbmluZyBvbiBwb3J0IChcXGQrKS8pO1xuICAgICAgICBpZihwb3J0TWF0Y2gpIHtcbiAgICAgICAgICBkZXRlY3RlZFBvcnQgPSBwYXJzZUludChwb3J0TWF0Y2hbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvd1N0YXR1c09uY2UoZGV0ZWN0ZWRQb3J0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYoIXNlcnZlclN0YXJ0ZWQpIHtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdEZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKTtcbiAgICAgICAgc2hvd1N0YXR1c09uY2UoZGV0ZWN0ZWRQb3J0KTtcbiAgICAgIH1cbiAgICB9LCA1MDAwKTtcblxuICAgIGF3YWl0IGNoaWxkUHJvY2VzcztcblxuICAgIGlmKCFzZXJ2ZXJTdGFydGVkKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ0RldmVsb3BtZW50IHNlcnZlciBzdGFydGVkLicpO1xuICAgICAgc2hvd1N0YXR1c09uY2UoZGV0ZWN0ZWRQb3J0KTtcbiAgICB9XG5cbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIHNwaW5uZXIuZmFpbCgnVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJ1bm5pbmcgV2VicGFjay4nKTtcblxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59OyJdLCJuYW1lcyI6WyJib3hlbiIsImNoYWxrIiwiZXhlY2EiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwid3JpdGVGaWxlU3luYyIsIm1rZGlyU3luYyIsImh0dHBzIiwibmV0d29ya0ludGVyZmFjZXMiLCJob21lZGlyIiwiZGlybmFtZSIsInJlc29sdmUiLCJwYXRoUmVzb2x2ZSIsImpvaW4iLCJMZXhDb25maWciLCJjcmVhdGVTcGlubmVyIiwiaGFuZGxlV2VicGFja1Byb2dyZXNzIiwicmVtb3ZlRmlsZXMiLCJyZXNvbHZlV2VicGFja1BhdGhzIiwibG9nIiwicHJvY2Vzc1RyYW5zbGF0aW9ucyIsImN1cnJlbnRGaWxlbmFtZSIsImN1cnJlbnREaXJuYW1lIiwiZXZhbCIsInByb2Nlc3MiLCJjd2QiLCJnZXRDYWNoZURpciIsImNhY2hlRGlyIiwicmVjdXJzaXZlIiwiZ2V0Q2FjaGVQYXRoIiwicmVhZFB1YmxpY0lwQ2FjaGUiLCJjYWNoZVBhdGgiLCJjYWNoZURhdGEiLCJjYWNoZSIsIkpTT04iLCJwYXJzZSIsIm9uZVdlZWtNcyIsIkRhdGUiLCJub3ciLCJ0aW1lc3RhbXAiLCJ3cml0ZVB1YmxpY0lwQ2FjaGUiLCJpcCIsInN0cmluZ2lmeSIsImZldGNoUHVibGljSXAiLCJmb3JjZVJlZnJlc2giLCJQcm9taXNlIiwiY2FjaGVkIiwiZ2V0IiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJ0cmltIiwidW5kZWZpbmVkIiwiZ2V0TmV0d29ya0FkZHJlc3NlcyIsImludGVyZmFjZXMiLCJhZGRyZXNzZXMiLCJsb2NhbCIsInByaXZhdGUiLCJwdWJsaWMiLCJuYW1lIiwiT2JqZWN0Iiwia2V5cyIsIm5ldHdvcmtJbnRlcmZhY2UiLCJpZmFjZSIsImZhbWlseSIsImludGVybmFsIiwiYWRkcmVzcyIsInN0YXJ0c1dpdGgiLCJkaXNwbGF5U2VydmVyU3RhdHVzIiwicG9ydCIsInF1aWV0IiwicHVibGljSXAiLCJsb2NhbFVybCIsInByaXZhdGVVcmwiLCJwdWJsaWNVcmwiLCJ1cmxMaW5lcyIsImdyZWVuIiwidW5kZXJsaW5lIiwic3RhdHVzQm94IiwiY3lhbiIsImJvbGQiLCJ5ZWxsb3ciLCJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXJDb2xvciIsImJvcmRlclN0eWxlIiwibWFyZ2luIiwicGFkZGluZyIsImNvbnNvbGUiLCJkZXYiLCJjbWQiLCJjYWxsYmFjayIsImJ1bmRsZUFuYWx5emVyIiwiY2xpTmFtZSIsImNvbmZpZyIsImZvcm1hdCIsIm9wZW4iLCJyZW1vdmUiLCJ0cmFuc2xhdGlvbnMiLCJ1c2VQdWJsaWNJcCIsInZhcmlhYmxlcyIsInNwaW5uZXIiLCJwYXJzZUNvbmZpZyIsIm91dHB1dEZ1bGxQYXRoIiwidXNlVHlwZXNjcmlwdCIsInZhcmlhYmxlc09iaiIsIk5PREVfRU5WIiwiX2Vycm9yIiwiZW52IiwiY2hlY2tUeXBlc2NyaXB0Q29uZmlnIiwic3RhcnQiLCJzdWNjZWVkIiwic291cmNlUGF0aCIsInNvdXJjZUZ1bGxQYXRoIiwib3V0cHV0UGF0aCIsInRyYW5zbGF0aW9uRXJyb3IiLCJtZXNzYWdlIiwiZmFpbCIsIndlYnBhY2tDb25maWciLCJpc1JlbGF0aXZlQ29uZmlnIiwic3Vic3RyIiwicmVzb2x2ZWRDb25maWciLCJ3ZWJwYWNrUGF0aCIsIndlYnBhY2tPcHRpb25zIiwicHVzaCIsImV4ZWN1dGFibGVQYXRoIiwiZmluYWxXZWJwYWNrT3B0aW9ucyIsImVuZHNXaXRoIiwiY2hpbGRQcm9jZXNzIiwiZW5jb2RpbmciLCJMRVhfUVVJRVQiLCJXRUJQQUNLX0RFVl9PUEVOIiwiV0VCUEFDS19ERVZfUE9SVCIsInRvU3RyaW5nIiwic3RkaW8iLCJzZXJ2ZXJTdGFydGVkIiwic3RhdHVzU2hvd24iLCJzaG93U3RhdHVzT25jZSIsInBvcnRUb1Nob3ciLCJ0aGVuIiwiZGV0ZWN0ZWRQb3J0Iiwic3Rkb3V0Iiwib3V0cHV0IiwiaW5jbHVkZXMiLCJwb3J0TWF0Y2giLCJtYXRjaCIsInBhcnNlSW50Iiwic3RkZXJyIiwic2V0VGltZW91dCIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVFDLEtBQUssUUFBTyxRQUFRO0FBQzVCLFNBQVFDLFVBQVUsRUFBRUMsWUFBWSxFQUFFQyxhQUFhLEVBQUVDLFNBQVMsUUFBTyxLQUFLO0FBQ3RFLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFRQyxpQkFBaUIsRUFBRUMsT0FBTyxRQUFPLEtBQUs7QUFDOUMsU0FBUUMsT0FBTyxFQUFFQyxXQUFXQyxXQUFXLEVBQUVDLElBQUksUUFBTyxPQUFPO0FBRTNELFNBQVFDLFNBQVMsUUFBTyxxQkFBcUI7QUFDN0MsU0FBUUMsYUFBYSxFQUFFQyxxQkFBcUIsRUFBRUMsV0FBVyxRQUFPLHFCQUFxQjtBQUNyRixTQUFRQyxtQkFBbUIsUUFBTyxzQkFBc0I7QUFDeEQsU0FBUUMsR0FBRyxRQUFPLHFCQUFxQjtBQUN2QyxTQUFRQyxtQkFBbUIsUUFBTyw4QkFBOEI7QUFFaEUsSUFBSUM7QUFDSixJQUFJQztBQUVKLElBQUk7SUFDRixtQ0FBbUM7SUFDbkNELGtCQUFrQkUsS0FBSztJQUN2QkQsaUJBQWlCWixRQUFRVztBQUMzQixFQUFFLE9BQUs7SUFDTEEsa0JB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
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9kZXYvZGV2LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgYm94ZW4gZnJvbSAnYm94ZW4nO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jLCBta2RpclN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCBodHRwcyBmcm9tICdodHRwcyc7XG5pbXBvcnQge25ldHdvcmtJbnRlcmZhY2VzLCBob21lZGlyfSBmcm9tICdvcyc7XG5pbXBvcnQge2Rpcm5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmUsIGpvaW59IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lciwgaGFuZGxlV2VicGFja1Byb2dyZXNzLCByZW1vdmVGaWxlc30gZnJvbSAnLi4vLi4vdXRpbHMvYXBwLmpzJztcbmltcG9ydCB7cmVzb2x2ZVdlYnBhY2tQYXRoc30gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7cHJvY2Vzc1RyYW5zbGF0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvdHJhbnNsYXRpb25zLmpzJztcblxubGV0IGN1cnJlbnRGaWxlbmFtZTogc3RyaW5nO1xubGV0IGN1cnJlbnREaXJuYW1lOiBzdHJpbmc7XG5cbnRyeSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1ldmFsXG4gIGN1cnJlbnRGaWxlbmFtZSA9IGV2YWwoJ3JlcXVpcmUoXCJ1cmxcIikuZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpJyk7XG4gIGN1cnJlbnREaXJuYW1lID0gZGlybmFtZShjdXJyZW50RmlsZW5hbWUpO1xufSBjYXRjaHtcbiAgY3VycmVudEZpbGVuYW1lID0gcHJvY2Vzcy5jd2QoKTtcbiAgY3VycmVudERpcm5hbWUgPSBwcm9jZXNzLmN3ZCgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERldk9wdGlvbnMge1xuICByZWFkb25seSBidW5kbGVBbmFseXplcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZm9ybWF0Pzogc3RyaW5nO1xuICByZWFkb25seSBvcGVuPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSByZW1vdmU/OiBib29sZWFuO1xuICByZWFkb25seSB0cmFuc2xhdGlvbnM/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VQdWJsaWNJcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRGV2Q2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbi8vIGRlZmF1bHQgcG9ydCB1c2VkIGJ5IHRoZSBkZXZlbG9wbWVudCBzZXJ2ZXIgd2hlbiBub25lIGlzIHByb3ZpZGVkXG5leHBvcnQgY29uc3QgREVGQVVMVF9ERVZfUE9SVCA9IDMwMDA7XG5cbmludGVyZmFjZSBQdWJsaWNJcENhY2hlIHtcbiAgaXA6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmNvbnN0IHBhcnNlUG9ydCA9IChwb3J0VmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICBpZihwb3J0VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBwb3J0VmFsdWUgPT09IG51bGwgfHwgcG9ydFZhbHVlID09PSAnJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIocG9ydFZhbHVlKTtcbiAgaWYoTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpICYmIHBhcnNlZCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGdldENhY2hlRGlyID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNhY2hlRGlyID0gam9pbihob21lZGlyKCksICcubGV4LWNhY2hlJyk7XG4gIGlmKCFleGlzdHNTeW5jKGNhY2hlRGlyKSkge1xuICAgIG1rZGlyU3luYyhjYWNoZURpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICB9XG4gIHJldHVybiBjYWNoZURpcjtcbn07XG5cbmNvbnN0IGdldENhY2hlUGF0aCA9ICgpOiBzdHJpbmcgPT4gam9pbihnZXRDYWNoZURpcigpLCAncHVibGljLWlwLmpzb24nKTtcblxuY29uc3QgcmVhZFB1YmxpY0lwQ2FjaGUgPSAoKTogUHVibGljSXBDYWNoZSB8IG51bGwgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVQYXRoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjYWNoZURhdGEgPSByZWFkRmlsZVN5bmMoY2FjaGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0gSlNPTi5wYXJzZShjYWNoZURhdGEpO1xuICAgIGNvbnN0IG9uZVdlZWtNcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4gICAgaWYoRGF0ZS5ub3coKSAtIGNhY2hlLnRpbWVzdGFtcCA+IG9uZVdlZWtNcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlO1xuICB9IGNhdGNoe1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5jb25zdCB3cml0ZVB1YmxpY0lwQ2FjaGUgPSAoaXA6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCBjYWNoZVBhdGggPSBnZXRDYWNoZVBhdGgoKTtcbiAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSB7XG4gICAgaXAsXG4gICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gIH07XG4gIHdyaXRlRmlsZVN5bmMoY2FjaGVQYXRoLCBKU09OLnN0cmluZ2lmeShjYWNoZSwgbnVsbCwgMikpO1xufTtcblxuY29uc3QgZmV0Y2hQdWJsaWNJcCA9IChmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICBpZighZm9yY2VSZWZyZXNoKSB7XG4gICAgY29uc3QgY2FjaGVkID0gcmVhZFB1YmxpY0lwQ2FjaGUoKTtcbiAgICBpZihjYWNoZWQpIHtcbiAgICAgIHJlc29sdmUoY2FjaGVkLmlwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBodHRwcy5nZXQoJ2h0dHBzOi8vYXBpLmlwaWZ5Lm9yZycsIChyZXMpID0+IHtcbiAgICBsZXQgZGF0YSA9ICcnO1xuICAgIHJlcy5vbignZGF0YScsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmspKTtcbiAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGlwID0gZGF0YS50cmltKCk7XG4gICAgICBpZihpcCkge1xuICAgICAgICB3cml0ZVB1YmxpY0lwQ2FjaGUoaXApO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShpcCk7XG4gICAgfSk7XG4gIH0pLm9uKCdlcnJvcicsICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSk7XG59KTtcblxuY29uc3QgZ2V0TmV0d29ya0FkZHJlc3NlcyA9ICgpID0+IHtcbiAgY29uc3QgaW50ZXJmYWNlcyA9IG5ldHdvcmtJbnRlcmZhY2VzKCk7XG4gIGNvbnN0IGFkZHJlc3NlcyA9IHtcbiAgICBsb2NhbDogJ2xvY2FsaG9zdCcsXG4gICAgcHJpdmF0ZTogbnVsbCxcbiAgICBwdWJsaWM6IG51bGxcbiAgfTtcblxuICBmb3IoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhpbnRlcmZhY2VzKSkge1xuICAgIGNvbnN0IG5ldHdvcmtJbnRlcmZhY2UgPSBpbnRlcmZhY2VzW25hbWVdO1xuICAgIGlmKCFuZXR3b3JrSW50ZXJmYWNlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IoY29uc3QgaWZhY2Ugb2YgbmV0d29ya0ludGVyZmFjZSkge1xuICAgICAgaWYoaWZhY2UuZmFtaWx5ID09PSAnSVB2NCcgJiYgIWlmYWNlLmludGVybmFsKSB7XG4gICAgICAgIGNvbnN0IGlwID0gaWZhY2UuYWRkcmVzcztcblxuICAgICAgICBpZihpcC5zdGFydHNXaXRoKCcxMC4nKSB8fCBpcC5zdGFydHNXaXRoKCcxOTIuMTY4LicpIHx8IGlwLnN0YXJ0c1dpdGgoJzE3Mi4nKSkge1xuICAgICAgICAgIGlmKCFhZGRyZXNzZXMucHJpdmF0ZSkge1xuICAgICAgICAgICAgYWRkcmVzc2VzLnByaXZhdGUgPSBpcDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYoIWFkZHJlc3Nlcy5wdWJsaWMpIHtcbiAgICAgICAgICAgIGFkZHJlc3Nlcy5wdWJsaWMgPSBpcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWRkcmVzc2VzO1xufTtcblxuY29uc3QgZGlzcGxheVNlcnZlclN0YXR1cyA9IChwb3J0OiBudW1iZXIgPSBERUZBVUxUX0RFVl9QT1JULCBxdWlldDogYm9vbGVhbiwgcHVibGljSXA/OiBzdHJpbmcpID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhZGRyZXNzZXMgPSBnZXROZXR3b3JrQWRkcmVzc2VzKCk7XG4gIGNvbnN0IGxvY2FsVXJsID0gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWA7XG4gIGNvbnN0IHByaXZhdGVVcmwgPSBhZGRyZXNzZXMucHJpdmF0ZSA/IGBodHRwOi8vJHthZGRyZXNzZXMucHJpdmF0ZX06JHtwb3J0fWAgOiBudWxsO1xuICBsZXQgcHVibGljVXJsID0gbnVsbDtcbiAgaWYocHVibGljSXApIHtcbiAgICBwdWJsaWNVcmwgPSBgaHR0cDovLyR7cHVibGljSXB9OiR7cG9ydH1gO1xuICB9IGVsc2UgaWYoYWRkcmVzc2VzLnB1YmxpYykge1xuICAgIHB1YmxpY1VybCA9IGBodHRwOi8vJHthZGRyZXNzZXMucHVibGljfToke3BvcnR9YDtcbiAgfVxuXG4gIGxldCB1cmxMaW5lcyA9IGAke2NoYWxrLmdyZWVuKCdMb2NhbDonKX0gICAgICR7Y2hhbGsudW5kZXJsaW5lKGxvY2FsVXJsKX1cXG5gO1xuXG4gIGlmKHByaXZhdGVVcmwpIHtcbiAgICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignUHJpdmF0ZTonKX0gICAke2NoYWxrLnVuZGVybGluZShwcml2YXRlVXJsKX1cXG5gO1xuICB9XG5cbiAgaWYocHVibGljVXJsKSB7XG4gICAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ1B1YmxpYzonKX0gICAgJHtjaGFsay51bmRlcmxpbmUocHVibGljVXJsKX1cXG5gO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzQm94ID0gYm94ZW4oXG4gICAgYCR7Y2hhbGsuY3lhbi5ib2xkKCfwn5qAIERldmVsb3BtZW50IFNlcnZlciBSdW5uaW5nJyl9XFxuXFxuJHt1cmxMaW5lc31cXG5gICtcbiAgICBgJHtjaGFsay55ZWxsb3coJ1ByZXNzIEN0cmwrQyB0byBzdG9wIHRoZSBzZXJ2ZXInKX1gLFxuICAgIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxYTFhMWEnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdjeWFuJyxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgcGFkZGluZzogMVxuICAgIH1cbiAgKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmxvZyhgXFxuJHtzdGF0dXNCb3h9XFxuYCk7XG59O1xuXG5leHBvcnQgY29uc3QgZGV2ID0gYXN5bmMgKGNtZDogRGV2T3B0aW9ucywgY2FsbGJhY2s6IERldkNhbGxiYWNrID0gKCkgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtidW5kbGVBbmFseXplciwgY2xpTmFtZSA9ICdMZXgnLCBjb25maWcsIGZvcm1hdCA9ICdlc20nLCBvcGVuID0gZmFsc2UsIHBvcnQ6IGNsaVBvcnQsIHF1aWV0LCByZW1vdmUsIHRyYW5zbGF0aW9ucyA9IGZhbHNlLCB1c2VQdWJsaWNJcCwgdmFyaWFibGVzfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IHN0YXJ0IGRldmVsb3BtZW50IHNlcnZlci4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIGNvbnN0IHtkZXY6IGRldkNvbmZpZywgb3V0cHV0RnVsbFBhdGgsIHVzZVR5cGVzY3JpcHR9ID0gTGV4Q29uZmlnLmNvbmZpZztcbiAgY29uc3QgZmluYWxQb3J0ID0gcGFyc2VQb3J0KGNsaVBvcnQpID8/IHBhcnNlUG9ydChkZXZDb25maWc/LnBvcnQpID8/IERFRkFVTFRfREVWX1BPUlQ7XG5cbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAnZGV2ZWxvcG1lbnQnfTtcblxuICBpZih2YXJpYWJsZXMpIHtcbiAgICB0cnkge1xuICAgICAgdmFyaWFibGVzT2JqID0gSlNPTi5wYXJzZSh2YXJpYWJsZXMpO1xuICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVudmlyb25tZW50IHZhcmlhYmxlcyBvcHRpb24gaXMgbm90IGEgdmFsaWQgSlNPTiBvYmplY3QuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzLmVudiA9IHsuLi5wcm9jZXNzLmVudiwgLi4udmFyaWFibGVzT2JqfTtcblxuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgTGV4Q29uZmlnLmNoZWNrVHlwZXNjcmlwdENvbmZpZygpO1xuICB9XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ2xlYW5pbmcgb3V0cHV0IGRpcmVjdG9yeS4uLicpO1xuXG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMob3V0cHV0RnVsbFBhdGggfHwgJycpO1xuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdTdWNjZXNzZnVsbHkgY2xlYW5lZCBvdXRwdXQgZGlyZWN0b3J5IScpO1xuICB9XG5cbiAgaWYodHJhbnNsYXRpb25zKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnUHJvY2Vzc2luZyB0cmFuc2xhdGlvbnMuLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgJ2xpYic7XG5cbiAgICAgIGF3YWl0IHByb2Nlc3NUcmFuc2xhdGlvbnMoc291cmNlUGF0aCwgb3V0cHV0UGF0aCwgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdUcmFuc2xhdGlvbnMgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseSEnKTtcbiAgICB9IGNhdGNoKHRyYW5zbGF0aW9uRXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIHByb2Nlc3MgdHJhbnNsYXRpb25zOiAke3RyYW5zbGF0aW9uRXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBwcm9jZXNzIHRyYW5zbGF0aW9ucy4nKTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgbGV0IHdlYnBhY2tDb25maWc6IHN0cmluZztcblxuICBpZihjb25maWcpIHtcbiAgICBjb25zdCBpc1JlbGF0aXZlQ29uZmlnOiBib29sZWFuID0gY29uZmlnLnN1YnN0cigwLCAyKSA9PT0gJy4vJztcbiAgICB3ZWJwYWNrQ29uZmlnID0gaXNSZWxhdGl2ZUNvbmZpZyA/IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZykgOiBjb25maWc7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qge3dlYnBhY2tDb25maWc6IHJlc29sdmVkQ29uZmlnfSA9IHJlc29sdmVXZWJwYWNrUGF0aHMoY3VycmVudERpcm5hbWUpO1xuICAgIHdlYnBhY2tDb25maWcgPSByZXNvbHZlZENvbmZpZztcbiAgfVxuXG4gIGNvbnN0IHt3ZWJwYWNrUGF0aH0gPSByZXNvbHZlV2VicGFja1BhdGhzKGN1cnJlbnREaXJuYW1lKTtcblxuICBjb25zdCB3ZWJwYWNrT3B0aW9uczogc3RyaW5nW10gPSBbXG4gICAgJy0tY29sb3InLFxuICAgICctLXdhdGNoJyxcbiAgICAnLS1jb25maWcnLCB3ZWJwYWNrQ29uZmlnXG4gIF07XG5cbiAgaWYoYnVuZGxlQW5hbHl6ZXIpIHtcbiAgICB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWJ1bmRsZUFuYWx5emVyJyk7XG4gIH1cblxuICB0cnkge1xuICAgIGxldCBleGVjdXRhYmxlUGF0aCA9IHdlYnBhY2tQYXRoO1xuICAgIGxldCBmaW5hbFdlYnBhY2tPcHRpb25zOiBzdHJpbmdbXTtcblxuICAgIGlmKHdlYnBhY2tQYXRoID09PSAnbnB4Jykge1xuICAgICAgZmluYWxXZWJwYWNrT3B0aW9ucyA9IFsnd2VicGFjaycsIC4uLndlYnBhY2tPcHRpb25zXTtcbiAgICB9IGVsc2UgaWYod2VicGFja1BhdGguZW5kc1dpdGgoJy5qcycpKSB7XG4gICAgICBleGVjdXRhYmxlUGF0aCA9ICdub2RlJztcbiAgICAgIGZpbmFsV2VicGFja09wdGlvbnMgPSBbd2VicGFja1BhdGgsIC4uLndlYnBhY2tPcHRpb25zXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmluYWxXZWJwYWNrT3B0aW9ucyA9IHdlYnBhY2tPcHRpb25zO1xuICAgIH1cblxuICAgIHNwaW5uZXIuc3RhcnQoJ1N0YXJ0aW5nIGRldmVsb3BtZW50IHNlcnZlci4uLicpO1xuXG4gICAgY29uc3QgY2hpbGRQcm9jZXNzID0gZXhlY2EoZXhlY3V0YWJsZVBhdGgsIGZpbmFsV2VicGFja09wdGlvbnMsIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIExFWF9RVUlFVDogcXVpZXQsXG4gICAgICAgIFdFQlBBQ0tfREVWX09QRU46IG9wZW4sXG4gICAgICAgIFdFQlBBQ0tfREVWX1BPUlQ6IGZpbmFsUG9ydC50b1N0cmluZygpXG4gICAgICB9LFxuICAgICAgc3RkaW86ICdwaXBlJ1xuICAgIH0gYXMgYW55KTtcblxuICAgIGxldCBzZXJ2ZXJTdGFydGVkID0gZmFsc2U7XG4gICAgbGV0IHN0YXR1c1Nob3duID0gZmFsc2U7XG4gICAgY29uc3Qgc2hvd1N0YXR1c09uY2UgPSAocG9ydFRvU2hvdzogbnVtYmVyKSA9PiB7XG4gICAgICBpZihzdGF0dXNTaG93bikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdGF0dXNTaG93biA9IHRydWU7XG4gICAgICBpZih1c2VQdWJsaWNJcCkge1xuICAgICAgICBmZXRjaFB1YmxpY0lwKHVzZVB1YmxpY0lwKS50aGVuKChwdWJsaWNJcCkgPT4ge1xuICAgICAgICAgIGRpc3BsYXlTZXJ2ZXJTdGF0dXMocG9ydFRvU2hvdywgcXVpZXQsIHB1YmxpY0lwKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwbGF5U2VydmVyU3RhdHVzKHBvcnRUb1Nob3csIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGxldCBkZXRlY3RlZFBvcnQgPSBmaW5hbFBvcnQ7XG5cbiAgICBjaGlsZFByb2Nlc3Muc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKTtcblxuICAgICAgaGFuZGxlV2VicGFja1Byb2dyZXNzKG91dHB1dCwgc3Bpbm5lciwgcXVpZXQsICfwn5qAJywgJ1dlYnBhY2sgQnVpbGRpbmcnKTtcblxuICAgICAgaWYoIXNlcnZlclN0YXJ0ZWQgJiYgKG91dHB1dC5pbmNsdWRlcygnTG9jYWw6JykgfHwgb3V0cHV0LmluY2x1ZGVzKCd3ZWJwYWNrIGNvbXBpbGVkJykgfHwgb3V0cHV0LmluY2x1ZGVzKCd3ZWJwYWNrLXBsdWdpbi1zZXJ2ZScpIHx8IG91dHB1dC5pbmNsdWRlcygnaHR0cDovL2xvY2FsaG9zdCcpIHx8IG91dHB1dC5pbmNsdWRlcygnbGlzdGVuaW5nIG9uIHBvcnQnKSkpIHtcbiAgICAgICAgc2VydmVyU3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnRGV2ZWxvcG1lbnQgc2VydmVyIHN0YXJ0ZWQuJyk7XG5cbiAgICAgICAgY29uc3QgcG9ydE1hdGNoID0gb3V0cHV0Lm1hdGNoKC9Mb2NhbDpcXHMqaHR0cDpcXC9cXC9bXjpdKzooXFxkKykvKSB8fFxuICAgICAgICAgIG91dHB1dC5tYXRjaCgvaHR0cDpcXC9cXC9sb2NhbGhvc3Q6KFxcZCspLykgfHxcbiAgICAgICAgICBvdXRwdXQubWF0Y2goL3BvcnQ6XFxzKihcXGQrKS8pIHx8XG4gICAgICAgICAgb3V0cHV0Lm1hdGNoKC9saXN0ZW5pbmcgb24gcG9ydCAoXFxkKykvKSB8fFxuICAgICAgICAgIG91dHB1dC5tYXRjaCgvV2VicGFja1BsdWdpblNlcnZlIGxpc3RlbmluZyBvbiBwb3J0IChcXGQrKS8pO1xuICAgICAgICBpZihwb3J0TWF0Y2gpIHtcbiAgICAgICAgICBkZXRlY3RlZFBvcnQgPSBwYXJzZUludChwb3J0TWF0Y2hbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvd1N0YXR1c09uY2UoZGV0ZWN0ZWRQb3J0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNoaWxkUHJvY2Vzcy5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gZGF0YS50b1N0cmluZygpO1xuXG4gICAgICBoYW5kbGVXZWJwYWNrUHJvZ3Jlc3Mob3V0cHV0LCBzcGlubmVyLCBxdWlldCwgJ/CfmoAnLCAnV2VicGFjayBCdWlsZGluZycpO1xuXG4gICAgICBpZighc2VydmVyU3RhcnRlZCAmJiAob3V0cHV0LmluY2x1ZGVzKCdMb2NhbDonKSB8fCBvdXRwdXQuaW5jbHVkZXMoJ3dlYnBhY2sgY29tcGlsZWQnKSB8fCBvdXRwdXQuaW5jbHVkZXMoJ3dlYnBhY2stcGx1Z2luLXNlcnZlJykgfHwgb3V0cHV0LmluY2x1ZGVzKCdodHRwOi8vbG9jYWxob3N0JykgfHwgb3V0cHV0LmluY2x1ZGVzKCdsaXN0ZW5pbmcgb24gcG9ydCcpKSkge1xuICAgICAgICBzZXJ2ZXJTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdEZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKTtcblxuICAgICAgICBjb25zdCBwb3J0TWF0Y2ggPSBvdXRwdXQubWF0Y2goL0xvY2FsOlxccypodHRwOlxcL1xcL1teOl0rOihcXGQrKS8pIHx8XG4gICAgICAgICAgb3V0cHV0Lm1hdGNoKC9odHRwOlxcL1xcL2xvY2FsaG9zdDooXFxkKykvKSB8fFxuICAgICAgICAgIG91dHB1dC5tYXRjaCgvcG9ydDpcXHMqKFxcZCspLykgfHxcbiAgICAgICAgICBvdXRwdXQubWF0Y2goL2xpc3RlbmluZyBvbiBwb3J0IChcXGQrKS8pIHx8XG4gICAgICAgICAgb3V0cHV0Lm1hdGNoKC9XZWJwYWNrUGx1Z2luU2VydmUgbGlzdGVuaW5nIG9uIHBvcnQgKFxcZCspLyk7XG4gICAgICAgIGlmKHBvcnRNYXRjaCkge1xuICAgICAgICAgIGRldGVjdGVkUG9ydCA9IHBhcnNlSW50KHBvcnRNYXRjaFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBzaG93U3RhdHVzT25jZShkZXRlY3RlZFBvcnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZighc2VydmVyU3RhcnRlZCkge1xuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0RldmVsb3BtZW50IHNlcnZlciBzdGFydGVkLicpO1xuICAgICAgICBzaG93U3RhdHVzT25jZShkZXRlY3RlZFBvcnQpO1xuICAgICAgfVxuICAgIH0sIDUwMDApO1xuXG4gICAgYXdhaXQgY2hpbGRQcm9jZXNzO1xuXG4gICAgaWYoIXNlcnZlclN0YXJ0ZWQpIHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnRGV2ZWxvcG1lbnQgc2VydmVyIHN0YXJ0ZWQuJyk7XG4gICAgICBzaG93U3RhdHVzT25jZShkZXRlY3RlZFBvcnQpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgc3Bpbm5lci5mYWlsKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcnVubmluZyBXZWJwYWNrLicpO1xuXG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG4iXSwibmFtZXMiOlsiYm94ZW4iLCJjaGFsayIsImV4ZWNhIiwiZXhpc3RzU3luYyIsInJlYWRGaWxlU3luYyIsIndyaXRlRmlsZVN5bmMiLCJta2RpclN5bmMiLCJodHRwcyIsIm5ldHdvcmtJbnRlcmZhY2VzIiwiaG9tZWRpciIsImRpcm5hbWUiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJqb2luIiwiTGV4Q29uZmlnIiwiY3JlYXRlU3Bpbm5lciIsImhhbmRsZVdlYnBhY2tQcm9ncmVzcyIsInJlbW92ZUZpbGVzIiwicmVzb2x2ZVdlYnBhY2tQYXRocyIsImxvZyIsInByb2Nlc3NUcmFuc2xhdGlvbnMiLCJjdXJyZW50RmlsZW5hbWUiLCJjdXJyZW50RGlybmFtZSIsImV2YWwiLCJwcm9jZXNzIiwiY3dkIiwiREVGQVVMVF9ERVZfUE9SVCIsInBhcnNlUG9ydCIsInBvcnRWYWx1ZSIsInVuZGVmaW5lZCIsInBhcnNlZCIsIk51bWJlciIsImlzSW50ZWdlciIsImdldENhY2hlRGlyIiwiY2FjaGVEaXIiLCJyZWN1cnNpdmUiLCJnZXRDYWNoZVBhdGgiLCJyZWFkUHVibGljSXBDYWNoZSIsImNhY2hlUGF0aCIsImNhY2hlRGF0YSIsImNhY2hlIiwiSlNPTiIsInBhcnNlIiwib25lV2Vla01zIiwiRGF0ZSIsIm5vdyIsInRpbWVzdGFtcCIsIndyaXRlUHVibGljSXBDYWNoZSIsImlwIiwic3RyaW5naWZ5IiwiZmV0Y2hQdWJsaWNJcCIsImZvcmNlUmVmcmVzaCIsIlByb21pc2UiLCJjYWNoZWQiLCJnZXQiLCJyZXMiLCJkYXRhIiwib24iLCJjaHVuayIsInRyaW0iLCJnZXROZXR3b3JrQWRkcmVzc2VzIiwiaW50ZXJmYWNlcyIsImFkZHJlc3NlcyIsImxvY2FsIiwicHJpdmF0ZSIsInB1YmxpYyIsIm5hbWUiLCJPYmplY3QiLCJrZXlzIiwibmV0d29ya0ludGVyZmFjZSIsImlmYWNlIiwiZmFtaWx5IiwiaW50ZXJuYWwiLCJhZGRyZXNzIiwic3RhcnRzV2l0aCIsImRpc3BsYXlTZXJ2ZXJTdGF0dXMiLCJwb3J0IiwicXVpZXQiLCJwdWJsaWNJcCIsImxvY2FsVXJsIiwicHJpdmF0ZVVybCIsInB1YmxpY1VybCIsInVybExpbmVzIiwiZ3JlZW4iLCJ1bmRlcmxpbmUiLCJzdGF0dXNCb3giLCJjeWFuIiwiYm9sZCIsInllbGxvdyIsImJhY2tncm91bmRDb2xvciIsImJvcmRlckNvbG9yIiwiYm9yZGVyU3R5bGUiLCJtYXJnaW4iLCJwYWRkaW5nIiwiY29uc29sZSIsImRldiIsImNtZCIsImNhbGxiYWNrIiwiYnVuZGxlQW5hbHl6ZXIiLCJjbGlOYW1lIiwiY29uZmlnIiwiZm9ybWF0Iiwib3BlbiIsImNsaVBvcnQiLCJyZW1vdmUiLCJ0cmFuc2xhdGlvbnMiLCJ1c2VQdWJsaWNJcCIsInZhcmlhYmxlcyIsInNwaW5uZXIiLCJwYXJzZUNvbmZpZyIsImRldkNvbmZpZyIsIm91dHB1dEZ1bGxQYXRoIiwidXNlVHlwZXNjcmlwdCIsImZpbmFsUG9ydCIsInZhcmlhYmxlc09iaiIsIk5PREVfRU5WIiwiX2Vycm9yIiwiZW52IiwiY2hlY2tUeXBlc2NyaXB0Q29uZmlnIiwic3RhcnQiLCJzdWNjZWVkIiwic291cmNlUGF0aCIsInNvdXJjZUZ1bGxQYXRoIiwib3V0cHV0UGF0aCIsInRyYW5zbGF0aW9uRXJyb3IiLCJtZXNzYWdlIiwiZmFpbCIsIndlYnBhY2tDb25maWciLCJpc1JlbGF0aXZlQ29uZmlnIiwic3Vic3RyIiwicmVzb2x2ZWRDb25maWciLCJ3ZWJwYWNrUGF0aCIsIndlYnBhY2tPcHRpb25zIiwicHVzaCIsImV4ZWN1dGFibGVQYXRoIiwiZmluYWxXZWJwYWNrT3B0aW9ucyIsImVuZHNXaXRoIiwiY2hpbGRQcm9jZXNzIiwiZW5jb2RpbmciLCJMRVhfUVVJRVQiLCJXRUJQQUNLX0RFVl9PUEVOIiwiV0VCUEFDS19ERVZfUE9SVCIsInRvU3RyaW5nIiwic3RkaW8iLCJzZXJ2ZXJTdGFydGVkIiwic3RhdHVzU2hvd24iLCJzaG93U3RhdHVzT25jZSIsInBvcnRUb1Nob3ciLCJ0aGVuIiwiZGV0ZWN0ZWRQb3J0Iiwic3Rkb3V0Iiwib3V0cHV0IiwiaW5jbHVkZXMiLCJwb3J0TWF0Y2giLCJtYXRjaCIsInBhcnNlSW50Iiwic3RkZXJyIiwic2V0VGltZW91dCIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVFDLEtBQUssUUFBTyxRQUFRO0FBQzVCLFNBQVFDLFVBQVUsRUFBRUMsWUFBWSxFQUFFQyxhQUFhLEVBQUVDLFNBQVMsUUFBTyxLQUFLO0FBQ3RFLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFRQyxpQkFBaUIsRUFBRUMsT0FBTyxRQUFPLEtBQUs7QUFDOUMsU0FBUUMsT0FBTyxFQUFFQyxXQUFXQyxXQUFXLEVBQUVDLElBQUksUUFBTyxPQUFPO0FBRTNELFNBQVFDLFNBQVMsUUFBTyxxQkFBcUI7QUFDN0MsU0FBUUMsYUFBYSxFQUFFQyxxQkFBcUIsRUFBRUMsV0FBVyxRQUFPLHFCQUFxQjtBQUNyRixTQUFRQyxtQkFBbUIsUUFBTyxzQkFBc0I7QUFDeEQsU0FBUUMsR0FBRyxRQUFPLHFCQUFxQjtBQUN2QyxTQUFRQyxtQkFBbUIsUUFBTyw4QkFBOEI7QUFFaEUsSUFBSUM7QUFDSixJQUFJQztBQUVKLElBQUk7SUFDRixtQ0FBbUM7SUFDbkNELGtCQUFrQkUsS0FBSztJQUN2QkQsaUJBQWlCWixRQUFRVztBQUMzQixFQUFFLE9BQUs7SUFDTEEsa0JBQWtCRyxRQUFRQyxHQUFHO0lBQzdCSCxpQkFBaUJFLFFBQVFDLEdBQUc7QUFDOUI7QUFrQkEsb0VBQW9FO0FBQ3BFLE9BQU8sTUFBTUMsbUJBQW1CLEtBQUs7QUFPckMsTUFBTUMsWUFBWSxDQUFDQztJQUNqQixJQUFHQSxjQUFjQyxhQUFhRCxjQUFjLFFBQVFBLGNBQWMsSUFBSTtRQUNwRSxPQUFPQztJQUNUO0lBRUEsTUFBTUMsU0FBU0MsT0FBT0g7SUFDdEIsSUFBR0csT0FBT0MsU0FBUyxDQUFDRixXQUFXQSxTQUFTLEdBQUc7UUFDekMsT0FBT0E7SUFDVDtJQUVBLE9BQU9EO0FBQ1Q7QUFFQSxNQUFNSSxjQUFjO0lBQ2xCLE1BQU1DLFdBQVdyQixLQUFLSixXQUFXO0lBQ2pDLElBQUcsQ0FBQ04sV0FBVytCLFdBQVc7UUFDeEI1QixVQUFVNEIsVUFBVTtZQUFDQyxXQUFXO1FBQUk7SUFDdEM7SUFDQSxPQUFPRDtBQUNUO0FBRUEsTUFBTUUsZUFBZSxJQUFjdkIsS0FBS29CLGVBQWU7QUFFdkQsTUFBTUksb0JBQW9CO0lBQ3hCLE1BQU1DLFlBQVlGO0lBQ2xCLElBQUcsQ0FBQ2pDLFdBQVdtQyxZQUFZO1FBQ3pCLE9BQU87SUFDVDtJQUVBLElBQUk7UUFDRixNQUFNQyxZQUFZbkMsYUFBYWtDLFdBQVc7UUFDMUMsTUFBTUUsUUFBdUJDLEtBQUtDLEtBQUssQ0FBQ0g7UUFDeEMsTUFBTUksWUFBWSxJQUFJLEtBQUssS0FBSyxLQUFLO1FBRXJDLElBQUdDLEtBQUtDLEdBQUcsS0FBS0wsTUFBTU0sU0FBUyxHQUFHSCxXQUFXO1lBQzNDLE9BQU87UUFDVDtRQUVBLE9BQU9IO0lBQ1QsRUFBRSxPQUFLO1FBQ0wsT0FBTztJQUNUO0FBQ0Y7QUFFQSxNQUFNTyxxQkFBcUIsQ0FBQ0M7SUFDMUIsTUFBTVYsWUFBWUY7SUFDbEIsTUFBTUksUUFBdUI7UUFDM0JRO1FBQ0FGLFdBQVdGLEtBQUtDLEdBQUc7SUFDckI7SUFDQXhDLGNBQWNpQyxXQUFXRyxLQUFLUSxTQUFTLENBQUNULE9BQU8sTUFBTTtBQUN2RDtBQUVBLE1BQU1VLGdCQUFnQixDQUFDQyxlQUF3QixLQUFLLEdBQWtDLElBQUlDLFFBQVEsQ0FBQ3pDO1FBQ2pHLElBQUcsQ0FBQ3dDLGNBQWM7WUFDaEIsTUFBTUUsU0FBU2hCO1lBQ2YsSUFBR2dCLFFBQVE7Z0JBQ1QxQyxRQUFRMEMsT0FBT0wsRUFBRTtnQkFDakI7WUFDRjtRQUNGO1FBRUF6QyxNQUFNK0MsR0FBRyxDQUFDLHlCQUF5QixDQUFDQztZQUNsQyxJQUFJQyxPQUFPO1lBQ1hELElBQUlFLEVBQUUsQ0FBQyxRQUFRLENBQUNDLFFBQVdGLFFBQVFFO1lBQ25DSCxJQUFJRSxFQUFFLENBQUMsT0FBTztnQkFDWixNQUFNVCxLQUFLUSxLQUFLRyxJQUFJO2dCQUNwQixJQUFHWCxJQUFJO29CQUNMRCxtQkFBbUJDO2dCQUNyQjtnQkFDQXJDLFFBQVFxQztZQUNWO1FBQ0YsR0FBR1MsRUFBRSxDQUFDLFNBQVMsSUFBTTlDLFFBQVFrQjtJQUMvQjtBQUVBLE1BQU0rQixzQkFBc0I7SUFDMUIsTUFBTUMsYUFBYXJEO0lBQ25CLE1BQU1zRCxZQUFZO1FBQ2hCQyxPQUFPO1FBQ1BDLFNBQVM7UUFDVEMsUUFBUTtJQUNWO0lBRUEsS0FBSSxNQUFNQyxRQUFRQyxPQUFPQyxJQUFJLENBQUNQLFlBQWE7UUFDekMsTUFBTVEsbUJBQW1CUixVQUFVLENBQUNLLEtBQUs7UUFDekMsSUFBRyxDQUFDRyxrQkFBa0I7WUFDcEI7UUFDRjtRQUVBLEtBQUksTUFBTUMsU0FBU0QsaUJBQWtCO1lBQ25DLElBQUdDLE1BQU1DLE1BQU0sS0FBSyxVQUFVLENBQUNELE1BQU1FLFFBQVEsRUFBRTtnQkFDN0MsTUFBTXhCLEtBQUtzQixNQUFNRyxPQUFPO2dCQUV4QixJQUFHekIsR0FBRzBCLFVBQVUsQ0FBQyxVQUFVMUIsR0FBRzBCLFVBQVUsQ0FBQyxlQUFlMUIsR0FBRzBCLFVBQVUsQ0FBQyxTQUFTO29CQUM3RSxJQUFHLENBQUNaLFVBQVVFLE9BQU8sRUFBRTt3QkFDckJGLFVBQVVFLE9BQU8sR0FBR2hCO29CQUN0QjtnQkFDRixPQUFPO29CQUNMLElBQUcsQ0FBQ2MsVUFBVUcsTUFBTSxFQUFFO3dCQUNwQkgsVUFBVUcsTUFBTSxHQUFHakI7b0JBQ3JCO2dCQUNGO1lBQ0Y7UUFDRjtJQUNGO0lBRUEsT0FBT2M7QUFDVDtBQUVBLE1BQU1hLHNCQUFzQixDQUFDQyxPQUFlbEQsZ0JBQWdCLEVBQUVtRCxPQUFnQkM7SUFDNUUsSUFBR0QsT0FBTztRQUNSO0lBQ0Y7SUFFQSxNQUFNZixZQUFZRjtJQUNsQixNQUFNbUIsV0FBVyxDQUFDLGlCQUFpQixFQUFFSCxNQUFNO0lBQzNDLE1BQU1JLGFBQWFsQixVQUFVRSxPQUFPLEdBQUcsQ0FBQyxPQUFPLEVBQUVGLFVBQVVFLE9BQU8sQ0FBQyxDQUFDLEVBQUVZLE1BQU0sR0FBRztJQUMvRSxJQUFJSyxZQUFZO0lBQ2hCLElBQUdILFVBQVU7UUFDWEcsWUFBWSxDQUFDLE9BQU8sRUFBRUgsU0FBUyxDQUFDLEVBQUVGLE1BQU07SUFDMUMsT0FBTyxJQUFHZCxVQUFVRyxNQUFNLEVBQUU7UUFDMUJnQixZQUFZLENBQUMsT0FBTyxFQUFFbkIsVUFBVUcsTUFBTSxDQUFDLENBQUMsRUFBRVcsTUFBTTtJQUNsRDtJQUVBLElBQUlNLFdBQVcsR0FBR2pGLE1BQU1rRixLQUFLLENBQUMsVUFBVSxLQUFLLEVBQUVsRixNQUFNbUYsU0FBUyxDQUFDTCxVQUFVLEVBQUUsQ0FBQztJQUU1RSxJQUFHQyxZQUFZO1FBQ2JFLFlBQVksR0FBR2pGLE1BQU1rRixLQUFLLENBQUMsWUFBWSxHQUFHLEVBQUVsRixNQUFNbUYsU0FBUyxDQUFDSixZQUFZLEVBQUUsQ0FBQztJQUM3RTtJQUVBLElBQUdDLFdBQVc7UUFDWkMsWUFBWSxHQUFHakYsTUFBTWtGLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBRWxGLE1BQU1tRixTQUFTLENBQUNILFdBQVcsRUFBRSxDQUFDO0lBQzVFO0lBRUEsTUFBTUksWUFBWXJGLE1BQ2hCLEdBQUdDLE1BQU1xRixJQUFJLENBQUNDLElBQUksQ0FBQyxpQ0FBaUMsSUFBSSxFQUFFTCxTQUFTLEVBQUUsQ0FBQyxHQUN0RSxHQUFHakYsTUFBTXVGLE1BQU0sQ0FBQyxvQ0FBb0MsRUFDcEQ7UUFDRUMsaUJBQWlCO1FBQ2pCQyxhQUFhO1FBQ2JDLGFBQWE7UUFDYkMsUUFBUTtRQUNSQyxTQUFTO0lBQ1g7SUFHRixzQ0FBc0M7SUFDdENDLFFBQVEzRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUVrRSxVQUFVLEVBQUUsQ0FBQztBQUNoQztBQUVBLE9BQU8sTUFBTVUsTUFBTSxPQUFPQyxLQUFpQkMsV0FBd0IsSUFBTyxDQUFBLENBQUMsQ0FBQSxDQUFFO0lBQzNFLE1BQU0sRUFBQ0MsY0FBYyxFQUFFQyxVQUFVLEtBQUssRUFBRUMsTUFBTSxFQUFFQyxTQUFTLEtBQUssRUFBRUMsT0FBTyxLQUFLLEVBQUUxQixNQUFNMkIsT0FBTyxFQUFFMUIsS0FBSyxFQUFFMkIsTUFBTSxFQUFFQyxlQUFlLEtBQUssRUFBRUMsV0FBVyxFQUFFQyxTQUFTLEVBQUMsR0FBR1g7SUFFNUosTUFBTVksVUFBVTdGLGNBQWM4RDtJQUU5QjFELElBQUksR0FBR2dGLFFBQVEsNEJBQTRCLENBQUMsRUFBRSxRQUFRdEI7SUFFdEQsTUFBTS9ELFVBQVUrRixXQUFXLENBQUNiO0lBRTVCLE1BQU0sRUFBQ0QsS0FBS2UsU0FBUyxFQUFFQyxjQUFjLEVBQUVDLGFBQWEsRUFBQyxHQUFHbEcsVUFBVXNGLE1BQU07SUFDeEUsTUFBTWEsWUFBWXRGLFVBQVU0RSxZQUFZNUUsVUFBVW1GLFdBQVdsQyxTQUFTbEQ7SUFFdEUsSUFBSXdGLGVBQXVCO1FBQUNDLFVBQVU7SUFBYTtJQUVuRCxJQUFHUixXQUFXO1FBQ1osSUFBSTtZQUNGTyxlQUFlekUsS0FBS0MsS0FBSyxDQUFDaUU7UUFDNUIsRUFBRSxPQUFNUyxRQUFRO1lBQ2RqRyxJQUFJLENBQUMsRUFBRSxFQUFFZ0YsUUFBUSxnRUFBZ0UsQ0FBQyxFQUFFLFNBQVN0QjtZQUM3Rm9CLFNBQVM7WUFDVCxPQUFPO1FBQ1Q7SUFDRjtJQUVBekUsUUFBUTZGLEdBQUcsR0FBRztRQUFDLEdBQUc3RixRQUFRNkYsR0FBRztRQUFFLEdBQUdILFlBQVk7SUFBQTtJQUU5QyxJQUFHRixlQUFlO1FBQ2hCbEcsVUFBVXdHLHFCQUFxQjtJQUNqQztJQUVBLElBQUdkLFFBQVE7UUFDVEksUUFBUVcsS0FBSyxDQUFDO1FBRWQsTUFBTXRHLFlBQVk4RixrQkFBa0I7UUFFcENILFFBQVFZLE9BQU8sQ0FBQztJQUNsQjtJQUVBLElBQUdmLGNBQWM7UUFDZkcsUUFBUVcsS0FBSyxDQUFDO1FBRWQsSUFBSTtZQUNGLE1BQU1FLGFBQWEzRyxVQUFVc0YsTUFBTSxDQUFDc0IsY0FBYyxJQUFJbEcsUUFBUUMsR0FBRztZQUNqRSxNQUFNa0csYUFBYTdHLFVBQVVzRixNQUFNLENBQUNXLGNBQWMsSUFBSTtZQUV0RCxNQUFNM0Ysb0JBQW9CcUcsWUFBWUUsWUFBWTlDO1lBQ2xEK0IsUUFBUVksT0FBTyxDQUFDO1FBQ2xCLEVBQUUsT0FBTUksa0JBQWtCO1lBQ3hCekcsSUFBSSxDQUFDLEVBQUUsRUFBRWdGLFFBQVEsd0NBQXdDLEVBQUV5QixpQkFBaUJDLE9BQU8sRUFBRSxFQUFFLFNBQVNoRDtZQUNoRytCLFFBQVFrQixJQUFJLENBQUM7WUFDYjdCLFNBQVM7WUFDVCxPQUFPO1FBQ1Q7SUFDRjtJQUVBLElBQUk4QjtJQUVKLElBQUczQixRQUFRO1FBQ1QsTUFBTTRCLG1CQUE0QjVCLE9BQU82QixNQUFNLENBQUMsR0FBRyxPQUFPO1FBQzFERixnQkFBZ0JDLG1CQUFtQnBILFlBQVlZLFFBQVFDLEdBQUcsSUFBSTJFLFVBQVVBO0lBQzFFLE9BQU87UUFDTCxNQUFNLEVBQUMyQixlQUFlRyxjQUFjLEVBQUMsR0FBR2hILG9CQUFvQkk7UUFDNUR5RyxnQkFBZ0JHO0lBQ2xCO0lBRUEsTUFBTSxFQUFDQyxXQUFXLEVBQUMsR0FBR2pILG9CQUFvQkk7SUFFMUMsTUFBTThHLGlCQUEyQjtRQUMvQjtRQUNBO1FBQ0E7UUFBWUw7S0FDYjtJQUVELElBQUc3QixnQkFBZ0I7UUFDakJrQyxlQUFlQyxJQUFJLENBQUM7SUFDdEI7SUFFQSxJQUFJO1FBQ0YsSUFBSUMsaUJBQWlCSDtRQUNyQixJQUFJSTtRQUVKLElBQUdKLGdCQUFnQixPQUFPO1lBQ3hCSSxzQkFBc0I7Z0JBQUM7bUJBQWNIO2FBQWU7UUFDdEQsT0FBTyxJQUFHRCxZQUFZSyxRQUFRLENBQUMsUUFBUTtZQUNyQ0YsaUJBQWlCO1lBQ2pCQyxzQkFBc0I7Z0JBQUNKO21CQUFnQkM7YUFBZTtRQUN4RCxPQUFPO1lBQ0xHLHNCQUFzQkg7UUFDeEI7UUFFQXhCLFFBQVFXLEtBQUssQ0FBQztRQUVkLE1BQU1rQixlQUFldkksTUFBTW9JLGdCQUFnQkMscUJBQXFCO1lBQzlERyxVQUFVO1lBQ1ZyQixLQUFLO2dCQUNILEdBQUc3RixRQUFRNkYsR0FBRztnQkFDZHNCLFdBQVc5RDtnQkFDWCtELGtCQUFrQnRDO2dCQUNsQnVDLGtCQUFrQjVCLFVBQVU2QixRQUFRO1lBQ3RDO1lBQ0FDLE9BQU87UUFDVDtRQUVBLElBQUlDLGdCQUFnQjtRQUNwQixJQUFJQyxjQUFjO1FBQ2xCLE1BQU1DLGlCQUFpQixDQUFDQztZQUN0QixJQUFHRixhQUFhO2dCQUNkO1lBQ0Y7WUFDQUEsY0FBYztZQUNkLElBQUd2QyxhQUFhO2dCQUNkeEQsY0FBY3dELGFBQWEwQyxJQUFJLENBQUMsQ0FBQ3RFO29CQUMvQkgsb0JBQW9Cd0UsWUFBWXRFLE9BQU9DO2dCQUN6QztZQUNGLE9BQU87Z0JBQ0xILG9CQUFvQndFLFlBQVl0RTtZQUNsQztRQUNGO1FBQ0EsSUFBSXdFLGVBQWVwQztRQUVuQndCLGFBQWFhLE1BQU0sRUFBRTdGLEdBQUcsUUFBUSxDQUFDRDtZQUMvQixNQUFNK0YsU0FBUy9GLEtBQUtzRixRQUFRO1lBRTVCOUgsc0JBQXNCdUksUUFBUTNDLFNBQVMvQixPQUFPLE1BQU07WUFFcEQsSUFBRyxDQUFDbUUsaUJBQWtCTyxDQUFBQSxPQUFPQyxRQUFRLENBQUMsYUFBYUQsT0FBT0MsUUFBUSxDQUFDLHVCQUF1QkQsT0FBT0MsUUFBUSxDQUFDLDJCQUEyQkQsT0FBT0MsUUFBUSxDQUFDLHVCQUF1QkQsT0FBT0MsUUFBUSxDQUFDLG9CQUFtQixHQUFJO2dCQUNqTlIsZ0JBQWdCO2dCQUNoQnBDLFFBQVFZLE9BQU8sQ0FBQztnQkFFaEIsTUFBTWlDLFlBQVlGLE9BQU9HLEtBQUssQ0FBQyxvQ0FDN0JILE9BQU9HLEtBQUssQ0FBQywrQkFDYkgsT0FBT0csS0FBSyxDQUFDLG9CQUNiSCxPQUFPRyxLQUFLLENBQUMsOEJBQ2JILE9BQU9HLEtBQUssQ0FBQztnQkFDZixJQUFHRCxXQUFXO29CQUNaSixlQUFlTSxTQUFTRixTQUFTLENBQUMsRUFBRTtnQkFDdEM7Z0JBRUFQLGVBQWVHO1lBQ2pCO1FBQ0Y7UUFFQVosYUFBYW1CLE1BQU0sRUFBRW5HLEdBQUcsUUFBUSxDQUFDRDtZQUMvQixNQUFNK0YsU0FBUy9GLEtBQUtzRixRQUFRO1lBRTVCOUgsc0JBQXNCdUksUUFBUTNDLFNBQVMvQixPQUFPLE1BQU07WUFFcEQsSUFBRyxDQUFDbUUsaUJBQWtCTyxDQUFBQSxPQUFPQyxRQUFRLENBQUMsYUFBYUQsT0FBT0MsUUFBUSxDQUFDLHVCQUF1QkQsT0FBT0MsUUFBUSxDQUFDLDJCQUEyQkQsT0FBT0MsUUFBUSxDQUFDLHVCQUF1QkQsT0FBT0MsUUFBUSxDQUFDLG9CQUFtQixHQUFJO2dCQUNqTlIsZ0JBQWdCO2dCQUNoQnBDLFFBQVFZLE9BQU8sQ0FBQztnQkFFaEIsTUFBTWlDLFlBQVlGLE9BQU9HLEtBQUssQ0FBQyxvQ0FDN0JILE9BQU9HLEtBQUssQ0FBQywrQkFDYkgsT0FBT0csS0FBSyxDQUFDLG9CQUNiSCxPQUFPRyxLQUFLLENBQUMsOEJBQ2JILE9BQU9HLEtBQUssQ0FBQztnQkFDZixJQUFHRCxXQUFXO29CQUNaSixlQUFlTSxTQUFTRixTQUFTLENBQUMsRUFBRTtnQkFDdEM7Z0JBRUFQLGVBQWVHO1lBQ2pCO1FBQ0Y7UUFFQVEsV0FBVztZQUNULElBQUcsQ0FBQ2IsZUFBZTtnQkFDakJwQyxRQUFRWSxPQUFPLENBQUM7Z0JBQ2hCMEIsZUFBZUc7WUFDakI7UUFDRixHQUFHO1FBRUgsTUFBTVo7UUFFTixJQUFHLENBQUNPLGVBQWU7WUFDakJwQyxRQUFRWSxPQUFPLENBQUM7WUFDaEIwQixlQUFlRztRQUNqQjtRQUVBcEQsU0FBUztRQUNULE9BQU87SUFDVCxFQUFFLE9BQU02RCxPQUFPO1FBQ2IzSSxJQUFJLENBQUMsRUFBRSxFQUFFZ0YsUUFBUSxRQUFRLEVBQUUyRCxNQUFNakMsT0FBTyxFQUFFLEVBQUUsU0FBU2hEO1FBRXJEK0IsUUFBUWtCLElBQUksQ0FBQztRQUViN0IsU0FBUztRQUNULE9BQU87SUFDVDtBQUNGLEVBQUUifQ==