@angular-devkit/build-angular 17.0.0-next.7 → 17.0.0-next.9

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.
Files changed (97) hide show
  1. package/package.json +11 -11
  2. package/src/builders/application/build-action.d.ts +2 -0
  3. package/src/builders/application/build-action.js +6 -3
  4. package/src/builders/application/execute-build.js +40 -70
  5. package/src/builders/application/execute-post-bundle.d.ts +24 -0
  6. package/src/builders/application/execute-post-bundle.js +88 -0
  7. package/src/builders/application/i18n.js +13 -35
  8. package/src/builders/application/index.d.ts +21 -5
  9. package/src/builders/application/index.js +25 -10
  10. package/src/builders/application/options.d.ts +10 -1
  11. package/src/builders/application/options.js +7 -3
  12. package/src/builders/application/schema.d.ts +0 -1
  13. package/src/builders/application/schema.js +1 -1
  14. package/src/builders/application/schema.json +1 -1
  15. package/src/builders/browser/schema.d.ts +0 -1
  16. package/src/builders/browser/schema.js +1 -1
  17. package/src/builders/browser/schema.json +1 -1
  18. package/src/builders/browser-esbuild/builder-status-warnings.d.ts +1 -1
  19. package/src/builders/browser-esbuild/builder-status-warnings.js +6 -7
  20. package/src/builders/browser-esbuild/index.d.ts +4 -3
  21. package/src/builders/browser-esbuild/index.js +45 -3
  22. package/src/builders/browser-esbuild/schema.d.ts +0 -1
  23. package/src/builders/browser-esbuild/schema.js +1 -1
  24. package/src/builders/browser-esbuild/schema.json +1 -1
  25. package/src/builders/dev-server/builder.d.ts +2 -1
  26. package/src/builders/dev-server/builder.js +10 -4
  27. package/src/builders/dev-server/load-proxy-config.js +3 -2
  28. package/src/builders/dev-server/options.d.ts +1 -1
  29. package/src/builders/dev-server/options.js +4 -3
  30. package/src/builders/dev-server/schema.d.ts +8 -1
  31. package/src/builders/dev-server/schema.js +1 -1
  32. package/src/builders/dev-server/schema.json +7 -1
  33. package/src/builders/dev-server/vite-server.d.ts +4 -2
  34. package/src/builders/dev-server/vite-server.js +30 -8
  35. package/src/builders/dev-server/webpack-server.js +2 -2
  36. package/src/builders/extract-i18n/application-extraction.js +3 -3
  37. package/src/builders/extract-i18n/builder.js +4 -3
  38. package/src/builders/extract-i18n/options.d.ts +1 -1
  39. package/src/builders/extract-i18n/options.js +4 -3
  40. package/src/builders/extract-i18n/schema.d.ts +8 -1
  41. package/src/builders/extract-i18n/schema.js +1 -1
  42. package/src/builders/extract-i18n/schema.json +7 -1
  43. package/src/builders/extract-i18n/webpack-extraction.js +2 -2
  44. package/src/builders/jest/index.js +2 -2
  45. package/src/builders/protractor/index.js +2 -2
  46. package/src/index.d.ts +1 -0
  47. package/src/index.js +4 -2
  48. package/src/tools/esbuild/angular/compilation-state.d.ts +15 -0
  49. package/src/tools/esbuild/angular/compilation-state.js +43 -0
  50. package/src/tools/esbuild/angular/compiler-plugin.d.ts +2 -12
  51. package/src/tools/esbuild/angular/compiler-plugin.js +34 -52
  52. package/src/tools/esbuild/angular/component-stylesheets.d.ts +47 -0
  53. package/src/tools/esbuild/angular/component-stylesheets.js +147 -0
  54. package/src/tools/esbuild/angular/jit-plugin-callbacks.d.ts +2 -5
  55. package/src/tools/esbuild/angular/jit-plugin-callbacks.js +11 -6
  56. package/src/tools/esbuild/angular/source-file-cache.d.ts +19 -0
  57. package/src/tools/esbuild/angular/source-file-cache.js +67 -0
  58. package/src/tools/esbuild/angular/uri.d.ts +1 -1
  59. package/src/tools/esbuild/application-code-bundle.d.ts +1 -1
  60. package/src/tools/esbuild/application-code-bundle.js +67 -6
  61. package/src/tools/esbuild/budget-stats.d.ts +19 -0
  62. package/src/tools/esbuild/budget-stats.js +55 -0
  63. package/src/tools/esbuild/bundler-context.d.ts +12 -1
  64. package/src/tools/esbuild/bundler-context.js +29 -3
  65. package/src/tools/esbuild/bundler-execution-result.d.ts +12 -14
  66. package/src/tools/esbuild/bundler-execution-result.js +6 -3
  67. package/src/tools/esbuild/compiler-plugin-options.d.ts +2 -1
  68. package/src/tools/esbuild/compiler-plugin-options.js +2 -1
  69. package/src/tools/esbuild/global-styles.js +2 -1
  70. package/src/tools/esbuild/i18n-inliner.d.ts +3 -3
  71. package/src/tools/esbuild/i18n-inliner.js +12 -3
  72. package/src/tools/esbuild/index-html-generator.d.ts +2 -3
  73. package/src/tools/esbuild/index-html-generator.js +5 -2
  74. package/src/tools/esbuild/stylesheets/bundle-options.d.ts +2 -24
  75. package/src/tools/esbuild/stylesheets/bundle-options.js +4 -106
  76. package/src/tools/esbuild/stylesheets/less-language.js +37 -10
  77. package/src/tools/esbuild/utils.d.ts +13 -7
  78. package/src/tools/esbuild/utils.js +109 -37
  79. package/src/utils/build-options.d.ts +1 -1
  80. package/src/utils/build-options.js +1 -1
  81. package/src/utils/bundle-calculator.d.ts +16 -3
  82. package/src/utils/bundle-calculator.js +21 -10
  83. package/src/utils/server-rendering/{esm-in-memory-file-loader.d.ts → esm-in-memory-loader/loader-hooks.d.ts} +1 -0
  84. package/src/utils/server-rendering/esm-in-memory-loader/loader-hooks.js +82 -0
  85. package/src/utils/server-rendering/esm-in-memory-loader/node-18-utils.d.ts +10 -0
  86. package/src/utils/server-rendering/esm-in-memory-loader/node-18-utils.js +39 -0
  87. package/src/utils/server-rendering/esm-in-memory-loader/register-hooks.d.ts +8 -0
  88. package/src/utils/server-rendering/esm-in-memory-loader/register-hooks.js +16 -0
  89. package/src/utils/server-rendering/prerender.d.ts +2 -2
  90. package/src/utils/server-rendering/prerender.js +10 -18
  91. package/src/utils/server-rendering/render-worker.d.ts +1 -1
  92. package/src/utils/server-rendering/render-worker.js +1 -1
  93. package/src/utils/server-rendering/routes-extractor-worker.d.ts +1 -1
  94. package/src/utils/server-rendering/routes-extractor-worker.js +1 -1
  95. package/src/utils/service-worker.d.ts +4 -9
  96. package/src/utils/service-worker.js +5 -2
  97. package/src/utils/server-rendering/esm-in-memory-file-loader.js +0 -76
package/package.json CHANGED
@@ -1,26 +1,26 @@
1
1
  {
2
2
  "name": "@angular-devkit/build-angular",
3
- "version": "17.0.0-next.7",
3
+ "version": "17.0.0-next.9",
4
4
  "description": "Angular Webpack Build Facade",
5
5
  "main": "src/index.js",
6
6
  "typings": "src/index.d.ts",
7
7
  "builders": "builders.json",
8
8
  "dependencies": {
9
9
  "@ampproject/remapping": "2.2.1",
10
- "@angular-devkit/architect": "0.1700.0-next.7",
11
- "@angular-devkit/build-webpack": "0.1700.0-next.7",
12
- "@angular-devkit/core": "17.0.0-next.7",
13
- "@babel/core": "7.23.0",
10
+ "@angular-devkit/architect": "0.1700.0-next.9",
11
+ "@angular-devkit/build-webpack": "0.1700.0-next.9",
12
+ "@angular-devkit/core": "17.0.0-next.9",
13
+ "@babel/core": "7.23.2",
14
14
  "@babel/generator": "7.23.0",
15
15
  "@babel/helper-annotate-as-pure": "7.22.5",
16
16
  "@babel/helper-split-export-declaration": "7.22.6",
17
- "@babel/plugin-transform-async-generator-functions": "7.22.15",
17
+ "@babel/plugin-transform-async-generator-functions": "7.23.2",
18
18
  "@babel/plugin-transform-async-to-generator": "7.22.5",
19
- "@babel/plugin-transform-runtime": "7.22.15",
20
- "@babel/preset-env": "7.22.20",
21
- "@babel/runtime": "7.23.1",
19
+ "@babel/plugin-transform-runtime": "7.23.2",
20
+ "@babel/preset-env": "7.23.2",
21
+ "@babel/runtime": "7.23.2",
22
22
  "@discoveryjs/json-ext": "0.5.7",
23
- "@ngtools/webpack": "17.0.0-next.7",
23
+ "@ngtools/webpack": "17.0.0-next.9",
24
24
  "@vitejs/plugin-basic-ssl": "1.0.1",
25
25
  "ansi-colors": "4.1.3",
26
26
  "autoprefixer": "10.4.16",
@@ -64,7 +64,7 @@
64
64
  "text-table": "0.2.0",
65
65
  "tree-kill": "1.2.2",
66
66
  "tslib": "2.6.2",
67
- "vite": "4.4.10",
67
+ "vite": "4.4.11",
68
68
  "webpack": "5.88.2",
69
69
  "webpack-dev-middleware": "6.1.1",
70
70
  "webpack-dev-server": "4.15.1",
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import { BuilderOutput } from '@angular-devkit/architect';
9
9
  import type { logging } from '@angular-devkit/core';
10
+ import { BuildOutputFile } from '../../tools/esbuild/bundler-context';
10
11
  import { ExecutionResult, RebuildState } from '../../tools/esbuild/bundler-execution-result';
11
12
  import { NormalizedCachedOptions } from '../../utils/normalize-cache';
12
13
  export declare function runEsBuildBuildAction(action: (rebuildState?: RebuildState) => ExecutionResult | Promise<ExecutionResult>, options: {
@@ -16,6 +17,7 @@ export declare function runEsBuildBuildAction(action: (rebuildState?: RebuildSta
16
17
  logger: logging.LoggerApi;
17
18
  cacheOptions: NormalizedCachedOptions;
18
19
  writeToFileSystem?: boolean;
20
+ writeToFileSystemFilter?: (file: BuildOutputFile) => boolean;
19
21
  watch?: boolean;
20
22
  verbose?: boolean;
21
23
  progress?: boolean;
@@ -40,7 +40,7 @@ const sass_language_1 = require("../../tools/esbuild/stylesheets/sass-language")
40
40
  const utils_1 = require("../../tools/esbuild/utils");
41
41
  const error_1 = require("../../utils/error");
42
42
  async function* runEsBuildBuildAction(action, options) {
43
- const { writeToFileSystem = true, watch, poll, logger, deleteOutputPath, cacheOptions, outputPath, verbose, projectRoot, workspaceRoot, progress, } = options;
43
+ const { writeToFileSystemFilter, writeToFileSystem = true, watch, poll, logger, deleteOutputPath, cacheOptions, outputPath, verbose, projectRoot, workspaceRoot, progress, } = options;
44
44
  if (writeToFileSystem) {
45
45
  // Clean output path if enabled
46
46
  if (deleteOutputPath) {
@@ -151,7 +151,10 @@ async function* runEsBuildBuildAction(action, options) {
151
151
  previousWatchFiles = newWatchFiles;
152
152
  if (writeToFileSystem) {
153
153
  // Write output files
154
- await (0, utils_1.writeResultFiles)(result.outputFiles, result.assetFiles, outputPath);
154
+ const filesToWrite = writeToFileSystemFilter
155
+ ? result.outputFiles.filter(writeToFileSystemFilter)
156
+ : result.outputFiles;
157
+ await (0, utils_1.writeResultFiles)(filesToWrite, result.assetFiles, outputPath);
155
158
  yield result.output;
156
159
  }
157
160
  else {
@@ -168,4 +171,4 @@ async function* runEsBuildBuildAction(action, options) {
168
171
  }
169
172
  }
170
173
  exports.runEsBuildBuildAction = runEsBuildBuildAction;
171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhcl9kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvYnVpbGRlcnMvYXBwbGljYXRpb24vYnVpbGQtYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUgsZ0VBQWtDO0FBQ2xDLDBEQUE2QjtBQUU3QixpRkFBdUY7QUFDdkYscURBQTBGO0FBQzFGLDZDQUFrRDtBQUczQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLHFCQUFxQixDQUMxQyxNQUFtRixFQUNuRixPQWFDO0lBRUQsTUFBTSxFQUNKLGlCQUFpQixHQUFHLElBQUksRUFDeEIsS0FBSyxFQUNMLElBQUksRUFDSixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixVQUFVLEVBQ1YsT0FBTyxFQUNQLFdBQVcsRUFDWCxhQUFhLEVBQ2IsUUFBUSxHQUNULEdBQUcsT0FBTyxDQUFDO0lBRVosSUFBSSxpQkFBaUIsRUFBRTtRQUNyQiwrQkFBK0I7UUFDL0IsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixJQUFJLFVBQVUsS0FBSyxhQUFhLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztnQkFFbEUsT0FBTzthQUNSO1lBRUQsTUFBTSxrQkFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDMUU7UUFFRCxvQ0FBb0M7UUFDcEMsSUFBSTtZQUNGLE1BQU0sa0JBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7U0FDakQ7UUFBQyxP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Q1IseURBQXlEO1FBQ3pELE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTlELElBQUEsc0NBQXNCLEdBQUUsQ0FBQztLQUMxQjtBQUNILENBQUM7QUFoTEQsc0RBZ0xDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7IEJ1aWxkZXJPdXRwdXQgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvYXJjaGl0ZWN0JztcbmltcG9ydCB0eXBlIHsgbG9nZ2luZyB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9jb3JlJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBFeGVjdXRpb25SZXN1bHQsIFJlYnVpbGRTdGF0ZSB9IGZyb20gJy4uLy4uL3Rvb2xzL2VzYnVpbGQvYnVuZGxlci1leGVjdXRpb24tcmVzdWx0JztcbmltcG9ydCB7IHNodXRkb3duU2Fzc1dvcmtlclBvb2wgfSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL3N0eWxlc2hlZXRzL3Nhc3MtbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgd2l0aE5vUHJvZ3Jlc3MsIHdpdGhTcGlubmVyLCB3cml0ZVJlc3VsdEZpbGVzIH0gZnJvbSAnLi4vLi4vdG9vbHMvZXNidWlsZC91dGlscyc7XG5pbXBvcnQgeyBhc3NlcnRJc0Vycm9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXJyb3InO1xuaW1wb3J0IHsgTm9ybWFsaXplZENhY2hlZE9wdGlvbnMgfSBmcm9tICcuLi8uLi91dGlscy9ub3JtYWxpemUtY2FjaGUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24qIHJ1bkVzQnVpbGRCdWlsZEFjdGlvbihcbiAgYWN0aW9uOiAocmVidWlsZFN0YXRlPzogUmVidWlsZFN0YXRlKSA9PiBFeGVjdXRpb25SZXN1bHQgfCBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdD4sXG4gIG9wdGlvbnM6IHtcbiAgICB3b3Jrc3BhY2VSb290OiBzdHJpbmc7XG4gICAgcHJvamVjdFJvb3Q6IHN0cmluZztcbiAgICBvdXRwdXRQYXRoOiBzdHJpbmc7XG4gICAgbG9nZ2VyOiBsb2dnaW5nLkxvZ2dlckFwaTtcbiAgICBjYWNoZU9wdGlvbnM6IE5vcm1hbGl6ZWRDYWNoZWRPcHRpb25zO1xuICAgIHdyaXRlVG9GaWxlU3lzdGVtPzogYm9vbGVhbjtcbiAgICB3YXRjaD86IGJvb2xlYW47XG4gICAgdmVyYm9zZT86IGJvb2xlYW47XG4gICAgcHJvZ3Jlc3M/OiBib29sZWFuO1xuICAgIGRlbGV0ZU91dHB1dFBhdGg/OiBib29sZWFuO1xuICAgIHBvbGw/OiBudW1iZXI7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0sXG4pOiBBc3luY0l0ZXJhYmxlPChFeGVjdXRpb25SZXN1bHRbJ291dHB1dFdpdGhGaWxlcyddIHwgRXhlY3V0aW9uUmVzdWx0WydvdXRwdXQnXSkgJiBCdWlsZGVyT3V0cHV0PiB7XG4gIGNvbnN0IHtcbiAgICB3cml0ZVRvRmlsZVN5c3RlbSA9IHRydWUsXG4gICAgd2F0Y2gsXG4gICAgcG9sbCxcbiAgICBsb2dnZXIsXG4gICAgZGVsZXRlT3V0cHV0UGF0aCxcbiAgICBjYWNoZU9wdGlvbnMsXG4gICAgb3V0cHV0UGF0aCxcbiAgICB2ZXJib3NlLFxuICAgIHByb2plY3RSb290LFxuICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgcHJvZ3Jlc3MsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmICh3cml0ZVRvRmlsZVN5c3RlbSkge1xuICAgIC8vIENsZWFuIG91dHB1dCBwYXRoIGlmIGVuYWJsZWRcbiAgICBpZiAoZGVsZXRlT3V0cHV0UGF0aCkge1xuICAgICAgaWYgKG91dHB1dFBhdGggPT09IHdvcmtzcGFjZVJvb3QpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdPdXRwdXQgcGF0aCBNVVNUIG5vdCBiZSB3b3Jrc3BhY2Ugcm9vdCBkaXJlY3RvcnkhJyk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5ybShvdXRwdXRQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUsIG1heFJldHJpZXM6IDMgfSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgaWYgbmVlZGVkXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKG91dHB1dFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGFzc2VydElzRXJyb3IoZSk7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeTogJyArIGUubWVzc2FnZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCB3aXRoUHJvZ3Jlc3M6IHR5cGVvZiB3aXRoU3Bpbm5lciA9IHByb2dyZXNzID8gd2l0aFNwaW5uZXIgOiB3aXRoTm9Qcm9ncmVzcztcblxuICAvLyBJbml0aWFsIGJ1aWxkXG4gIGxldCByZXN1bHQ6IEV4ZWN1dGlvblJlc3VsdDtcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBhd2FpdCB3aXRoUHJvZ3Jlc3MoJ0J1aWxkaW5nLi4uJywgKCkgPT4gYWN0aW9uKCkpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIEVuc3VyZSBTYXNzIHdvcmtlcnMgYXJlIHNodXRkb3duIGlmIG5vdCB3YXRjaGluZ1xuICAgIGlmICghd2F0Y2gpIHtcbiAgICAgIHNodXRkb3duU2Fzc1dvcmtlclBvb2woKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXR1cCB3YXRjaGVyIGlmIHdhdGNoIG1vZGUgZW5hYmxlZFxuICBsZXQgd2F0Y2hlcjogaW1wb3J0KCcuLi8uLi90b29scy9lc2J1aWxkL3dhdGNoZXInKS5CdWlsZFdhdGNoZXIgfCB1bmRlZmluZWQ7XG4gIGlmICh3YXRjaCkge1xuICAgIGlmIChwcm9ncmVzcykge1xuICAgICAgbG9nZ2VyLmluZm8oJ1dhdGNoIG1vZGUgZW5hYmxlZC4gV2F0Y2hpbmcgZm9yIGZpbGUgY2hhbmdlcy4uLicpO1xuICAgIH1cblxuICAgIC8vIFNldHVwIGEgd2F0Y2hlclxuICAgIGNvbnN0IHsgY3JlYXRlV2F0Y2hlciB9ID0gYXdhaXQgaW1wb3J0KCcuLi8uLi90b29scy9lc2J1aWxkL3dhdGNoZXInKTtcbiAgICB3YXRjaGVyID0gY3JlYXRlV2F0Y2hlcih7XG4gICAgICBwb2xsaW5nOiB0eXBlb2YgcG9sbCA9PT0gJ251bWJlcicsXG4gICAgICBpbnRlcnZhbDogcG9sbCxcbiAgICAgIGlnbm9yZWQ6IFtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBvdXRwdXQgYW5kIGNhY2hlIHBhdGhzIHRvIGF2b2lkIGluZmluaXRlIHJlYnVpbGQgY3ljbGVzXG4gICAgICAgIG91dHB1dFBhdGgsXG4gICAgICAgIGNhY2hlT3B0aW9ucy5iYXNlUGF0aCxcbiAgICAgICAgLy8gSWdub3JlIGFsbCBub2RlIG1vZHVsZXMgZGlyZWN0b3JpZXMgdG8gYXZvaWQgZXhjZXNzaXZlIGZpbGUgd2F0Y2hlcnMuXG4gICAgICAgIC8vIFBhY2thZ2UgY2hhbmdlcyBhcmUgaGFuZGxlZCBiZWxvdyBieSB3YXRjaGluZyBtYW5pZmVzdCBhbmQgbG9jayBmaWxlcy5cbiAgICAgICAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICAgICAgICcqKi8uKi8qKicsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gU2V0dXAgYWJvcnQgc3VwcG9ydFxuICAgIG9wdGlvbnMuc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHZvaWQgd2F0Y2hlcj8uY2xvc2UoKSk7XG5cbiAgICAvLyBUZW1wb3JhcmlseSB3YXRjaCB0aGUgZW50aXJlIHByb2plY3RcbiAgICB3YXRjaGVyLmFkZChwcm9qZWN0Um9vdCk7XG5cbiAgICAvLyBXYXRjaCB3b3Jrc3BhY2UgZm9yIHBhY2thZ2UgbWFuYWdlciBjaGFuZ2VzXG4gICAgY29uc3QgcGFja2FnZVdhdGNoRmlsZXMgPSBbXG4gICAgICAvLyBtYW5pZmVzdCBjYW4gYWZmZWN0IG1vZHVsZSByZXNvbHV0aW9uXG4gICAgICAncGFja2FnZS5qc29uJyxcbiAgICAgIC8vIG5wbSBsb2NrIGZpbGVcbiAgICAgICdwYWNrYWdlLWxvY2suanNvbicsXG4gICAgICAvLyBwbnBtIGxvY2sgZmlsZVxuICAgICAgJ3BucG0tbG9jay55YW1sJyxcbiAgICAgIC8vIHlhcm4gbG9jayBmaWxlIGluY2x1ZGluZyBZYXJuIFBuUCBtYW5pZmVzdCBmaWxlcyAoaHR0cHM6Ly95YXJucGtnLmNvbS9hZHZhbmNlZC9wbnAtc3BlYy8pXG4gICAgICAneWFybi5sb2NrJyxcbiAgICAgICcucG5wLmNqcycsXG4gICAgICAnLnBucC5kYXRhLmpzb24nLFxuICAgIF07XG5cbiAgICB3YXRjaGVyLmFkZChwYWNrYWdlV2F0Y2hGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBmaWxlKSkpO1xuXG4gICAgLy8gV2F0Y2ggbG9jYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBpbml0aWFsIGJ1aWxkIHJlc3VsdFxuICAgIHdhdGNoZXIuYWRkKHJlc3VsdC53YXRjaEZpbGVzKTtcbiAgfVxuXG4gIC8vIE91dHB1dCB0aGUgZmlyc3QgYnVpbGQgcmVzdWx0cyBhZnRlciBzZXR0aW5nIHVwIHRoZSB3YXRjaGVyIHRvIGVuc3VyZSB0aGF0IGFueSBjb2RlIGV4ZWN1dGVkXG4gIC8vIGhpZ2hlciBpbiB0aGUgaXRlcmF0b3IgY2FsbCBzdGFjayB3aWxsIHRyaWdnZXIgdGhlIHdhdGNoZXIuIFRoaXMgaXMgcGFydGljdWxhcmx5IHJlbGV2YW50IGZvclxuICAvLyB1bml0IHRlc3RzIHdoaWNoIGV4ZWN1dGUgdGhlIGJ1aWxkZXIgYW5kIG1vZGlmeSB0aGUgZmlsZSBzeXN0ZW0gcHJvZ3JhbW1hdGljYWxseS5cbiAgaWYgKHdyaXRlVG9GaWxlU3lzdGVtKSB7XG4gICAgLy8gV3JpdGUgb3V0cHV0IGZpbGVzXG4gICAgYXdhaXQgd3JpdGVSZXN1bHRGaWxlcyhyZXN1bHQub3V0cHV0RmlsZXMsIHJlc3VsdC5hc3NldEZpbGVzLCBvdXRwdXRQYXRoKTtcblxuICAgIHlpZWxkIHJlc3VsdC5vdXRwdXQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVxdWlyZXMgY2FzdGluZyBkdWUgdG8gdW5uZWVkZWQgYEpzb25PYmplY3RgIHJlcXVpcmVtZW50LiBSZW1vdmUgb25jZSBmaXhlZC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHlpZWxkIHJlc3VsdC5vdXRwdXRXaXRoRmlsZXMgYXMgYW55O1xuICB9XG5cbiAgLy8gRmluaXNoIGlmIHdhdGNoIG1vZGUgaXMgbm90IGVuYWJsZWRcbiAgaWYgKCF3YXRjaGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gV2FpdCBmb3IgY2hhbmdlcyBhbmQgcmVidWlsZCBhcyBuZWVkZWRcbiAgbGV0IHByZXZpb3VzV2F0Y2hGaWxlcyA9IG5ldyBTZXQocmVzdWx0LndhdGNoRmlsZXMpO1xuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2hhbmdlcyBvZiB3YXRjaGVyKSB7XG4gICAgICBpZiAob3B0aW9ucy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGNoYW5nZXMudG9EZWJ1Z1N0cmluZygpKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID0gYXdhaXQgd2l0aFByb2dyZXNzKCdDaGFuZ2VzIGRldGVjdGVkLiBSZWJ1aWxkaW5nLi4uJywgKCkgPT5cbiAgICAgICAgYWN0aW9uKHJlc3VsdC5jcmVhdGVSZWJ1aWxkU3RhdGUoY2hhbmdlcykpLFxuICAgICAgKTtcblxuICAgICAgLy8gVXBkYXRlIHdhdGNoZWQgbG9jYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBuZXcgYnVpbGQgcmVzdWx0LlxuICAgICAgLy8gQWRkIGFueSBuZXcgbG9jYXRpb25zXG4gICAgICB3YXRjaGVyLmFkZChyZXN1bHQud2F0Y2hGaWxlcy5maWx0ZXIoKHdhdGNoRmlsZSkgPT4gIXByZXZpb3VzV2F0Y2hGaWxlcy5oYXMod2F0Y2hGaWxlKSkpO1xuICAgICAgY29uc3QgbmV3V2F0Y2hGaWxlcyA9IG5ldyBTZXQocmVzdWx0LndhdGNoRmlsZXMpO1xuICAgICAgLy8gUmVtb3ZlIGFueSBvbGQgbG9jYXRpb25zXG4gICAgICB3YXRjaGVyLnJlbW92ZShbLi4ucHJldmlvdXNXYXRjaEZpbGVzXS5maWx0ZXIoKHdhdGNoRmlsZSkgPT4gIW5ld1dhdGNoRmlsZXMuaGFzKHdhdGNoRmlsZSkpKTtcbiAgICAgIHByZXZpb3VzV2F0Y2hGaWxlcyA9IG5ld1dhdGNoRmlsZXM7XG5cbiAgICAgIGlmICh3cml0ZVRvRmlsZVN5c3RlbSkge1xuICAgICAgICAvLyBXcml0ZSBvdXRwdXQgZmlsZXNcbiAgICAgICAgYXdhaXQgd3JpdGVSZXN1bHRGaWxlcyhyZXN1bHQub3V0cHV0RmlsZXMsIHJlc3VsdC5hc3NldEZpbGVzLCBvdXRwdXRQYXRoKTtcblxuICAgICAgICB5aWVsZCByZXN1bHQub3V0cHV0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVxdWlyZXMgY2FzdGluZyBkdWUgdG8gdW5uZWVkZWQgYEpzb25PYmplY3RgIHJlcXVpcmVtZW50LiBSZW1vdmUgb25jZSBmaXhlZC5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgeWllbGQgcmVzdWx0Lm91dHB1dFdpdGhGaWxlcyBhcyBhbnk7XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIC8vIFN0b3AgdGhlIHdhdGNoZXIgYW5kIGNsZWFudXAgaW5jcmVtZW50YWwgcmVidWlsZCBzdGF0ZVxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbd2F0Y2hlci5jbG9zZSgpLCByZXN1bHQuZGlzcG9zZSgpXSk7XG5cbiAgICBzaHV0ZG93blNhc3NXb3JrZXJQb29sKCk7XG4gIH1cbn1cbiJdfQ==
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhcl9kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvYnVpbGRlcnMvYXBwbGljYXRpb24vYnVpbGQtYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUgsZ0VBQWtDO0FBQ2xDLDBEQUE2QjtBQUc3QixpRkFBdUY7QUFDdkYscURBQTBGO0FBQzFGLDZDQUFrRDtBQUczQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLHFCQUFxQixDQUMxQyxNQUFtRixFQUNuRixPQWNDO0lBRUQsTUFBTSxFQUNKLHVCQUF1QixFQUN2QixpQkFBaUIsR0FBRyxJQUFJLEVBQ3hCLEtBQUssRUFDTCxJQUFJLEVBQ0osTUFBTSxFQUNOLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osVUFBVSxFQUNWLE9BQU8sRUFDUCxXQUFXLEVBQ1gsYUFBYSxFQUNiLFFBQVEsR0FDVCxHQUFHLE9BQU8sQ0FBQztJQUVaLElBQUksaUJBQWlCLEVBQUU7UUFDckIsK0JBQStCO1FBQy9CLElBQUksZ0JBQWdCLEVBQUU7WUFDcEIsSUFBSSxVQUFVLEtBQUssYUFBYSxFQUFFO2dCQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7Z0JBRWxFLE9BQU87YUFDUjtZQUVELE1BQU0sa0JBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFFO1FBRUQsb0NBQW9DO1FBQ3BDLElBQUk7WUFDRixNQUFNLGtCQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFD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O2dCQUVwRSxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDckI7aUJBQU07Z0JBQ0wsZ0ZBQWdGO2dCQUNoRiw4REFBOEQ7Z0JBQzlELE1BQU0sTUFBTSxDQUFDLGVBQXNCLENBQUM7YUFDckM7U0FDRjtLQUNGO1lBQVM7UUFDUix5REFBeUQ7UUFDekQsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFOUQsSUFBQSxzQ0FBc0IsR0FBRSxDQUFDO0tBQzFCO0FBQ0gsQ0FBQztBQXJMRCxzREFxTEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgQnVpbGRlck91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9hcmNoaXRlY3QnO1xuaW1wb3J0IHR5cGUgeyBsb2dnaW5nIH0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEJ1aWxkT3V0cHV0RmlsZSB9IGZyb20gJy4uLy4uL3Rvb2xzL2VzYnVpbGQvYnVuZGxlci1jb250ZXh0JztcbmltcG9ydCB7IEV4ZWN1dGlvblJlc3VsdCwgUmVidWlsZFN0YXRlIH0gZnJvbSAnLi4vLi4vdG9vbHMvZXNidWlsZC9idW5kbGVyLWV4ZWN1dGlvbi1yZXN1bHQnO1xuaW1wb3J0IHsgc2h1dGRvd25TYXNzV29ya2VyUG9vbCB9IGZyb20gJy4uLy4uL3Rvb2xzL2VzYnVpbGQvc3R5bGVzaGVldHMvc2Fzcy1sYW5ndWFnZSc7XG5pbXBvcnQgeyB3aXRoTm9Qcm9ncmVzcywgd2l0aFNwaW5uZXIsIHdyaXRlUmVzdWx0RmlsZXMgfSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL3V0aWxzJztcbmltcG9ydCB7IGFzc2VydElzRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9lcnJvcic7XG5pbXBvcnQgeyBOb3JtYWxpemVkQ2FjaGVkT3B0aW9ucyB9IGZyb20gJy4uLy4uL3V0aWxzL25vcm1hbGl6ZS1jYWNoZSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogcnVuRXNCdWlsZEJ1aWxkQWN0aW9uKFxuICBhY3Rpb246IChyZWJ1aWxkU3RhdGU/OiBSZWJ1aWxkU3RhdGUpID0+IEV4ZWN1dGlvblJlc3VsdCB8IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PixcbiAgb3B0aW9uczoge1xuICAgIHdvcmtzcGFjZVJvb3Q6IHN0cmluZztcbiAgICBwcm9qZWN0Um9vdDogc3RyaW5nO1xuICAgIG91dHB1dFBhdGg6IHN0cmluZztcbiAgICBsb2dnZXI6IGxvZ2dpbmcuTG9nZ2VyQXBpO1xuICAgIGNhY2hlT3B0aW9uczogTm9ybWFsaXplZENhY2hlZE9wdGlvbnM7XG4gICAgd3JpdGVUb0ZpbGVTeXN0ZW0/OiBib29sZWFuO1xuICAgIHdyaXRlVG9GaWxlU3lzdGVtRmlsdGVyPzogKGZpbGU6IEJ1aWxkT3V0cHV0RmlsZSkgPT4gYm9vbGVhbjtcbiAgICB3YXRjaD86IGJvb2xlYW47XG4gICAgdmVyYm9zZT86IGJvb2xlYW47XG4gICAgcHJvZ3Jlc3M/OiBib29sZWFuO1xuICAgIGRlbGV0ZU91dHB1dFBhdGg/OiBib29sZWFuO1xuICAgIHBvbGw/OiBudW1iZXI7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0sXG4pOiBBc3luY0l0ZXJhYmxlPChFeGVjdXRpb25SZXN1bHRbJ291dHB1dFdpdGhGaWxlcyddIHwgRXhlY3V0aW9uUmVzdWx0WydvdXRwdXQnXSkgJiBCdWlsZGVyT3V0cHV0PiB7XG4gIGNvbnN0IHtcbiAgICB3cml0ZVRvRmlsZVN5c3RlbUZpbHRlcixcbiAgICB3cml0ZVRvRmlsZVN5c3RlbSA9IHRydWUsXG4gICAgd2F0Y2gsXG4gICAgcG9sbCxcbiAgICBsb2dnZXIsXG4gICAgZGVsZXRlT3V0cHV0UGF0aCxcbiAgICBjYWNoZU9wdGlvbnMsXG4gICAgb3V0cHV0UGF0aCxcbiAgICB2ZXJib3NlLFxuICAgIHByb2plY3RSb290LFxuICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgcHJvZ3Jlc3MsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmICh3cml0ZVRvRmlsZVN5c3RlbSkge1xuICAgIC8vIENsZWFuIG91dHB1dCBwYXRoIGlmIGVuYWJsZWRcbiAgICBpZiAoZGVsZXRlT3V0cHV0UGF0aCkge1xuICAgICAgaWYgKG91dHB1dFBhdGggPT09IHdvcmtzcGFjZVJvb3QpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdPdXRwdXQgcGF0aCBNVVNUIG5vdCBiZSB3b3Jrc3BhY2Ugcm9vdCBkaXJlY3RvcnkhJyk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5ybShvdXRwdXRQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUsIG1heFJldHJpZXM6IDMgfSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgaWYgbmVlZGVkXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKG91dHB1dFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGFzc2VydElzRXJyb3IoZSk7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBjcmVhdGUgb3V0cHV0IGRpcmVjdG9yeTogJyArIGUubWVzc2FnZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCB3aXRoUHJvZ3Jlc3M6IHR5cGVvZiB3aXRoU3Bpbm5lciA9IHByb2dyZXNzID8gd2l0aFNwaW5uZXIgOiB3aXRoTm9Qcm9ncmVzcztcblxuICAvLyBJbml0aWFsIGJ1aWxkXG4gIGxldCByZXN1bHQ6IEV4ZWN1dGlvblJlc3VsdDtcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBhd2FpdCB3aXRoUHJvZ3Jlc3MoJ0J1aWxkaW5nLi4uJywgKCkgPT4gYWN0aW9uKCkpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIEVuc3VyZSBTYXNzIHdvcmtlcnMgYXJlIHNodXRkb3duIGlmIG5vdCB3YXRjaGluZ1xuICAgIGlmICghd2F0Y2gpIHtcbiAgICAgIHNodXRkb3duU2Fzc1dvcmtlclBvb2woKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXR1cCB3YXRjaGVyIGlmIHdhdGNoIG1vZGUgZW5hYmxlZFxuICBsZXQgd2F0Y2hlcjogaW1wb3J0KCcuLi8uLi90b29scy9lc2J1aWxkL3dhdGNoZXInKS5CdWlsZFdhdGNoZXIgfCB1bmRlZmluZWQ7XG4gIGlmICh3YXRjaCkge1xuICAgIGlmIChwcm9ncmVzcykge1xuICAgICAgbG9nZ2VyLmluZm8oJ1dhdGNoIG1vZGUgZW5hYmxlZC4gV2F0Y2hpbmcgZm9yIGZpbGUgY2hhbmdlcy4uLicpO1xuICAgIH1cblxuICAgIC8vIFNldHVwIGEgd2F0Y2hlclxuICAgIGNvbnN0IHsgY3JlYXRlV2F0Y2hlciB9ID0gYXdhaXQgaW1wb3J0KCcuLi8uLi90b29scy9lc2J1aWxkL3dhdGNoZXInKTtcbiAgICB3YXRjaGVyID0gY3JlYXRlV2F0Y2hlcih7XG4gICAgICBwb2xsaW5nOiB0eXBlb2YgcG9sbCA9PT0gJ251bWJlcicsXG4gICAgICBpbnRlcnZhbDogcG9sbCxcbiAgICAgIGlnbm9yZWQ6IFtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBvdXRwdXQgYW5kIGNhY2hlIHBhdGhzIHRvIGF2b2lkIGluZmluaXRlIHJlYnVpbGQgY3ljbGVzXG4gICAgICAgIG91dHB1dFBhdGgsXG4gICAgICAgIGNhY2hlT3B0aW9ucy5iYXNlUGF0aCxcbiAgICAgICAgLy8gSWdub3JlIGFsbCBub2RlIG1vZHVsZXMgZGlyZWN0b3JpZXMgdG8gYXZvaWQgZXhjZXNzaXZlIGZpbGUgd2F0Y2hlcnMuXG4gICAgICAgIC8vIFBhY2thZ2UgY2hhbmdlcyBhcmUgaGFuZGxlZCBiZWxvdyBieSB3YXRjaGluZyBtYW5pZmVzdCBhbmQgbG9jayBmaWxlcy5cbiAgICAgICAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICAgICAgICcqKi8uKi8qKicsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gU2V0dXAgYWJvcnQgc3VwcG9ydFxuICAgIG9wdGlvbnMuc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHZvaWQgd2F0Y2hlcj8uY2xvc2UoKSk7XG5cbiAgICAvLyBUZW1wb3JhcmlseSB3YXRjaCB0aGUgZW50aXJlIHByb2plY3RcbiAgICB3YXRjaGVyLmFkZChwcm9qZWN0Um9vdCk7XG5cbiAgICAvLyBXYXRjaCB3b3Jrc3BhY2UgZm9yIHBhY2thZ2UgbWFuYWdlciBjaGFuZ2VzXG4gICAgY29uc3QgcGFja2FnZVdhdGNoRmlsZXMgPSBbXG4gICAgICAvLyBtYW5pZmVzdCBjYW4gYWZmZWN0IG1vZHVsZSByZXNvbHV0aW9uXG4gICAgICAncGFja2FnZS5qc29uJyxcbiAgICAgIC8vIG5wbSBsb2NrIGZpbGVcbiAgICAgICdwYWNrYWdlLWxvY2suanNvbicsXG4gICAgICAvLyBwbnBtIGxvY2sgZmlsZVxuICAgICAgJ3BucG0tbG9jay55YW1sJyxcbiAgICAgIC8vIHlhcm4gbG9jayBmaWxlIGluY2x1ZGluZyBZYXJuIFBuUCBtYW5pZmVzdCBmaWxlcyAoaHR0cHM6Ly95YXJucGtnLmNvbS9hZHZhbmNlZC9wbnAtc3BlYy8pXG4gICAgICAneWFybi5sb2NrJyxcbiAgICAgICcucG5wLmNqcycsXG4gICAgICAnLnBucC5kYXRhLmpzb24nLFxuICAgIF07XG5cbiAgICB3YXRjaGVyLmFkZChwYWNrYWdlV2F0Y2hGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBmaWxlKSkpO1xuXG4gICAgLy8gV2F0Y2ggbG9jYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBpbml0aWFsIGJ1aWxkIHJlc3VsdFxuICAgIHdhdGNoZXIuYWRkKHJlc3VsdC53YXRjaEZpbGVzKTtcbiAgfVxuXG4gIC8vIE91dHB1dCB0aGUgZmlyc3QgYnVpbGQgcmVzdWx0cyBhZnRlciBzZXR0aW5nIHVwIHRoZSB3YXRjaGVyIHRvIGVuc3VyZSB0aGF0IGFueSBjb2RlIGV4ZWN1dGVkXG4gIC8vIGhpZ2hlciBpbiB0aGUgaXRlcmF0b3IgY2FsbCBzdGFjayB3aWxsIHRyaWdnZXIgdGhlIHdhdGNoZXIuIFRoaXMgaXMgcGFydGljdWxhcmx5IHJlbGV2YW50IGZvclxuICAvLyB1bml0IHRlc3RzIHdoaWNoIGV4ZWN1dGUgdGhlIGJ1aWxkZXIgYW5kIG1vZGlmeSB0aGUgZmlsZSBzeXN0ZW0gcHJvZ3JhbW1hdGljYWxseS5cbiAgaWYgKHdyaXRlVG9GaWxlU3lzdGVtKSB7XG4gICAgLy8gV3JpdGUgb3V0cHV0IGZpbGVzXG4gICAgYXdhaXQgd3JpdGVSZXN1bHRGaWxlcyhyZXN1bHQub3V0cHV0RmlsZXMsIHJlc3VsdC5hc3NldEZpbGVzLCBvdXRwdXRQYXRoKTtcblxuICAgIHlpZWxkIHJlc3VsdC5vdXRwdXQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVxdWlyZXMgY2FzdGluZyBkdWUgdG8gdW5uZWVkZWQgYEpzb25PYmplY3RgIHJlcXVpcmVtZW50LiBSZW1vdmUgb25jZSBmaXhlZC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHlpZWxkIHJlc3VsdC5vdXRwdXRXaXRoRmlsZXMgYXMgYW55O1xuICB9XG5cbiAgLy8gRmluaXNoIGlmIHdhdGNoIG1vZGUgaXMgbm90IGVuYWJsZWRcbiAgaWYgKCF3YXRjaGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gV2FpdCBmb3IgY2hhbmdlcyBhbmQgcmVidWlsZCBhcyBuZWVkZWRcbiAgbGV0IHByZXZpb3VzV2F0Y2hGaWxlcyA9IG5ldyBTZXQocmVzdWx0LndhdGNoRmlsZXMpO1xuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2hhbmdlcyBvZiB3YXRjaGVyKSB7XG4gICAgICBpZiAob3B0aW9ucy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGNoYW5nZXMudG9EZWJ1Z1N0cmluZygpKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0ID0gYXdhaXQgd2l0aFByb2dyZXNzKCdDaGFuZ2VzIGRldGVjdGVkLiBSZWJ1aWxkaW5nLi4uJywgKCkgPT5cbiAgICAgICAgYWN0aW9uKHJlc3VsdC5jcmVhdGVSZWJ1aWxkU3RhdGUoY2hhbmdlcykpLFxuICAgICAgKTtcblxuICAgICAgLy8gVXBkYXRlIHdhdGNoZWQgbG9jYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBuZXcgYnVpbGQgcmVzdWx0LlxuICAgICAgLy8gQWRkIGFueSBuZXcgbG9jYXRpb25zXG4gICAgICB3YXRjaGVyLmFkZChyZXN1bHQud2F0Y2hGaWxlcy5maWx0ZXIoKHdhdGNoRmlsZSkgPT4gIXByZXZpb3VzV2F0Y2hGaWxlcy5oYXMod2F0Y2hGaWxlKSkpO1xuICAgICAgY29uc3QgbmV3V2F0Y2hGaWxlcyA9IG5ldyBTZXQocmVzdWx0LndhdGNoRmlsZXMpO1xuICAgICAgLy8gUmVtb3ZlIGFueSBvbGQgbG9jYXRpb25zXG4gICAgICB3YXRjaGVyLnJlbW92ZShbLi4ucHJldmlvdXNXYXRjaEZpbGVzXS5maWx0ZXIoKHdhdGNoRmlsZSkgPT4gIW5ld1dhdGNoRmlsZXMuaGFzKHdhdGNoRmlsZSkpKTtcbiAgICAgIHByZXZpb3VzV2F0Y2hGaWxlcyA9IG5ld1dhdGNoRmlsZXM7XG5cbiAgICAgIGlmICh3cml0ZVRvRmlsZVN5c3RlbSkge1xuICAgICAgICAvLyBXcml0ZSBvdXRwdXQgZmlsZXNcbiAgICAgICAgY29uc3QgZmlsZXNUb1dyaXRlID0gd3JpdGVUb0ZpbGVTeXN0ZW1GaWx0ZXJcbiAgICAgICAgICA/IHJlc3VsdC5vdXRwdXRGaWxlcy5maWx0ZXIod3JpdGVUb0ZpbGVTeXN0ZW1GaWx0ZXIpXG4gICAgICAgICAgOiByZXN1bHQub3V0cHV0RmlsZXM7XG4gICAgICAgIGF3YWl0IHdyaXRlUmVzdWx0RmlsZXMoZmlsZXNUb1dyaXRlLCByZXN1bHQuYXNzZXRGaWxlcywgb3V0cHV0UGF0aCk7XG5cbiAgICAgICAgeWllbGQgcmVzdWx0Lm91dHB1dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlcXVpcmVzIGNhc3RpbmcgZHVlIHRvIHVubmVlZGVkIGBKc29uT2JqZWN0YCByZXF1aXJlbWVudC4gUmVtb3ZlIG9uY2UgZml4ZWQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHlpZWxkIHJlc3VsdC5vdXRwdXRXaXRoRmlsZXMgYXMgYW55O1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBTdG9wIHRoZSB3YXRjaGVyIGFuZCBjbGVhbnVwIGluY3JlbWVudGFsIHJlYnVpbGQgc3RhdGVcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3dhdGNoZXIuY2xvc2UoKSwgcmVzdWx0LmRpc3Bvc2UoKV0pO1xuXG4gICAgc2h1dGRvd25TYXNzV29ya2VyUG9vbCgpO1xuICB9XG59XG4iXX0=
@@ -6,43 +6,38 @@
6
6
  * Use of this source code is governed by an MIT-style license that can be
7
7
  * found in the LICENSE file at https://angular.io/license
8
8
  */
9
- var __importDefault = (this && this.__importDefault) || function (mod) {
10
- return (mod && mod.__esModule) ? mod : { "default": mod };
11
- };
12
9
  Object.defineProperty(exports, "__esModule", { value: true });
13
10
  exports.executeBuild = void 0;
14
- const node_assert_1 = __importDefault(require("node:assert"));
15
- const compiler_plugin_1 = require("../../tools/esbuild/angular/compiler-plugin");
11
+ const source_file_cache_1 = require("../../tools/esbuild/angular/source-file-cache");
16
12
  const application_code_bundle_1 = require("../../tools/esbuild/application-code-bundle");
13
+ const budget_stats_1 = require("../../tools/esbuild/budget-stats");
17
14
  const bundler_context_1 = require("../../tools/esbuild/bundler-context");
18
15
  const bundler_execution_result_1 = require("../../tools/esbuild/bundler-execution-result");
19
16
  const commonjs_checker_1 = require("../../tools/esbuild/commonjs-checker");
20
17
  const global_scripts_1 = require("../../tools/esbuild/global-scripts");
21
18
  const global_styles_1 = require("../../tools/esbuild/global-styles");
22
- const index_html_generator_1 = require("../../tools/esbuild/index-html-generator");
23
19
  const license_extractor_1 = require("../../tools/esbuild/license-extractor");
24
20
  const utils_1 = require("../../tools/esbuild/utils");
21
+ const bundle_calculator_1 = require("../../utils/bundle-calculator");
25
22
  const copy_assets_1 = require("../../utils/copy-assets");
26
- const environment_options_1 = require("../../utils/environment-options");
27
- const prerender_1 = require("../../utils/server-rendering/prerender");
28
- const service_worker_1 = require("../../utils/service-worker");
29
23
  const supported_browsers_1 = require("../../utils/supported-browsers");
24
+ const execute_post_bundle_1 = require("./execute-post-bundle");
30
25
  const i18n_1 = require("./i18n");
31
26
  // eslint-disable-next-line max-lines-per-function
32
27
  async function executeBuild(options, context, rebuildState) {
33
28
  const startTime = process.hrtime.bigint();
34
- const { projectRoot, workspaceRoot, serviceWorker, optimizationOptions, serverEntryPoint, assets, indexHtmlOptions, cacheOptions, prerenderOptions, appShellOptions, ssrOptions, verbose, } = options;
29
+ const { projectRoot, workspaceRoot, i18nOptions, optimizationOptions, serverEntryPoint, assets, cacheOptions, prerenderOptions, appShellOptions, ssrOptions, } = options;
35
30
  const browsers = (0, supported_browsers_1.getSupportedBrowsers)(projectRoot, context.logger);
36
31
  const target = (0, utils_1.transformSupportedBrowsersToTargets)(browsers);
37
32
  // Load active translations if inlining
38
33
  // TODO: Integrate into watch mode and only load changed translations
39
- if (options.i18nOptions.shouldInline) {
40
- await (0, i18n_1.loadActiveTranslations)(context, options.i18nOptions);
34
+ if (i18nOptions.shouldInline) {
35
+ await (0, i18n_1.loadActiveTranslations)(context, i18nOptions);
41
36
  }
42
37
  // Reuse rebuild state or create new bundle contexts for code and global stylesheets
43
38
  let bundlerContexts = rebuildState?.rebuildContexts;
44
39
  const codeBundleCache = rebuildState?.codeBundleCache ??
45
- new compiler_plugin_1.SourceFileCache(cacheOptions.enabled ? cacheOptions.path : undefined);
40
+ new source_file_cache_1.SourceFileCache(cacheOptions.enabled ? cacheOptions.path : undefined);
46
41
  if (bundlerContexts === undefined) {
47
42
  bundlerContexts = [];
48
43
  // Browser application code
@@ -66,11 +61,10 @@ async function executeBuild(options, context, rebuildState) {
66
61
  }
67
62
  }
68
63
  // Server application code
69
- if (serverEntryPoint) {
70
- bundlerContexts.push(new bundler_context_1.BundlerContext(workspaceRoot, !!options.watch, (0, application_code_bundle_1.createServerCodeBundleOptions)(options,
71
- // NOTE: earlier versions of Node.js are not supported due to unsafe promise patching.
72
- // See: https://github.com/angular/angular/pull/50552#issue-1737967592
73
- [...target, 'node18.13'], codeBundleCache), () => false));
64
+ // Skip server build when non of the features are enabled.
65
+ if (serverEntryPoint && (prerenderOptions || appShellOptions || ssrOptions)) {
66
+ const nodeTargets = (0, utils_1.getSupportedNodeTargets)();
67
+ bundlerContexts.push(new bundler_context_1.BundlerContext(workspaceRoot, !!options.watch, (0, application_code_bundle_1.createServerCodeBundleOptions)(options, [...target, ...nodeTargets], codeBundleCache), () => false));
74
68
  }
75
69
  }
76
70
  const bundlingResult = await bundler_context_1.BundlerContext.bundleAll(bundlerContexts);
@@ -88,60 +82,28 @@ async function executeBuild(options, context, rebuildState) {
88
82
  const messages = (0, commonjs_checker_1.checkCommonJSModules)(metafile, options.allowedCommonJsDependencies);
89
83
  await (0, utils_1.logMessages)(context, { warnings: messages });
90
84
  }
91
- /**
92
- * Index HTML content without CSS inlining to be used for server rendering (AppShell, SSG and SSR).
93
- *
94
- * NOTE: we don't perform critical CSS inlining as this will be done during server rendering.
95
- */
96
- let indexContentOutputNoCssInlining;
97
- // Generate index HTML file
98
- // If localization is enabled, index generation is handled in the inlining process.
99
- // NOTE: Localization with SSR is not currently supported.
100
- if (indexHtmlOptions && !options.i18nOptions.shouldInline) {
101
- const { content, contentWithoutCriticalCssInlined, errors, warnings } = await (0, index_html_generator_1.generateIndexHtml)(initialFiles, executionResult.outputFiles, {
102
- ...options,
103
- optimizationOptions,
104
- },
105
- // Set lang attribute to the defined source locale if present
106
- options.i18nOptions.hasDefinedSourceLocale ? options.i18nOptions.sourceLocale : undefined);
107
- indexContentOutputNoCssInlining = contentWithoutCriticalCssInlined;
108
- printWarningsAndErrorsToConsole(context, warnings, errors);
109
- executionResult.addOutputFile(indexHtmlOptions.output, content);
110
- if (ssrOptions) {
111
- executionResult.addOutputFile('index.server.html', contentWithoutCriticalCssInlined);
112
- }
113
- }
114
- // Pre-render (SSG) and App-shell
115
- // If localization is enabled, prerendering is handled in the inlining process.
116
- if ((prerenderOptions || appShellOptions) && !options.i18nOptions.shouldInline) {
117
- (0, node_assert_1.default)(indexContentOutputNoCssInlining, 'The "index" option is required when using the "ssg" or "appShell" options.');
118
- const { output, warnings, errors } = await (0, prerender_1.prerenderPages)(workspaceRoot, appShellOptions, prerenderOptions, executionResult.outputFiles, indexContentOutputNoCssInlining, optimizationOptions.styles.inlineCritical, environment_options_1.maxWorkers, verbose);
119
- printWarningsAndErrorsToConsole(context, warnings, errors);
120
- for (const [path, content] of Object.entries(output)) {
121
- executionResult.addOutputFile(path, content);
122
- }
123
- }
124
85
  // Copy assets
125
86
  if (assets) {
126
87
  // The webpack copy assets helper is used with no base paths defined. This prevents the helper
127
88
  // from directly writing to disk. This should eventually be replaced with a more optimized helper.
128
- executionResult.assetFiles.push(...(await (0, copy_assets_1.copyAssets)(assets, [], workspaceRoot)));
89
+ executionResult.addAssets(await (0, copy_assets_1.copyAssets)(assets, [], workspaceRoot));
129
90
  }
130
91
  // Extract and write licenses for used packages
131
92
  if (options.extractLicenses) {
132
- executionResult.addOutputFile('3rdpartylicenses.txt', await (0, license_extractor_1.extractLicenses)(metafile, workspaceRoot));
93
+ executionResult.addOutputFile('3rdpartylicenses.txt', await (0, license_extractor_1.extractLicenses)(metafile, workspaceRoot), bundler_context_1.BuildOutputFileType.Root);
133
94
  }
134
- // Augment the application with service worker support
135
- // If localization is enabled, service worker is handled in the inlining process.
136
- if (serviceWorker && !options.i18nOptions.shouldInline) {
137
- try {
138
- const serviceWorkerResult = await (0, service_worker_1.augmentAppWithServiceWorkerEsbuild)(workspaceRoot, serviceWorker, options.baseHref || '/', executionResult.outputFiles, executionResult.assetFiles);
139
- executionResult.addOutputFile('ngsw.json', serviceWorkerResult.manifest);
140
- executionResult.assetFiles.push(...serviceWorkerResult.assetFiles);
141
- }
142
- catch (error) {
143
- context.logger.error(error instanceof Error ? error.message : `${error}`);
144
- return executionResult;
95
+ // Analyze files for bundle budget failures if present
96
+ let budgetFailures;
97
+ if (options.budgets) {
98
+ const compatStats = (0, budget_stats_1.generateBudgetStats)(metafile, initialFiles);
99
+ budgetFailures = [...(0, bundle_calculator_1.checkBudgets)(options.budgets, compatStats, true)];
100
+ for (const { severity, message } of budgetFailures) {
101
+ if (severity === 'error') {
102
+ context.logger.error(message);
103
+ }
104
+ else {
105
+ context.logger.warn(message);
106
+ }
145
107
  }
146
108
  }
147
109
  // Calculate estimated transfer size if scripts are optimized
@@ -149,17 +111,25 @@ async function executeBuild(options, context, rebuildState) {
149
111
  if (optimizationOptions.scripts || optimizationOptions.styles.minify) {
150
112
  estimatedTransferSizes = await (0, utils_1.calculateEstimatedTransferSizes)(executionResult.outputFiles);
151
113
  }
152
- (0, utils_1.logBuildStats)(context, metafile, initialFiles, estimatedTransferSizes);
153
- const buildTime = Number(process.hrtime.bigint() - startTime) / 10 ** 9;
154
- context.logger.info(`Application bundle generation complete. [${buildTime.toFixed(3)} seconds]`);
155
114
  // Perform i18n translation inlining if enabled
156
- if (options.i18nOptions.shouldInline) {
115
+ if (i18nOptions.shouldInline) {
157
116
  const { errors, warnings } = await (0, i18n_1.inlineI18n)(options, executionResult, initialFiles);
158
117
  printWarningsAndErrorsToConsole(context, warnings, errors);
159
118
  }
119
+ else {
120
+ const { errors, warnings, additionalAssets, additionalOutputFiles } = await (0, execute_post_bundle_1.executePostBundleSteps)(options, executionResult.outputFiles, executionResult.assetFiles, initialFiles,
121
+ // Set lang attribute to the defined source locale if present
122
+ i18nOptions.hasDefinedSourceLocale ? i18nOptions.sourceLocale : undefined);
123
+ executionResult.outputFiles.push(...additionalOutputFiles);
124
+ executionResult.assetFiles.push(...additionalAssets);
125
+ printWarningsAndErrorsToConsole(context, warnings, errors);
126
+ }
127
+ (0, utils_1.logBuildStats)(context, metafile, initialFiles, budgetFailures, estimatedTransferSizes);
128
+ const buildTime = Number(process.hrtime.bigint() - startTime) / 10 ** 9;
129
+ context.logger.info(`Application bundle generation complete. [${buildTime.toFixed(3)} seconds]`);
160
130
  // Write metafile if stats option is enabled
161
131
  if (options.stats) {
162
- executionResult.addOutputFile('stats.json', JSON.stringify(metafile, null, 2));
132
+ executionResult.addOutputFile('stats.json', JSON.stringify(metafile, null, 2), bundler_context_1.BuildOutputFileType.Root);
163
133
  }
164
134
  return executionResult;
165
135
  }
@@ -172,4 +142,4 @@ function printWarningsAndErrorsToConsole(context, warnings, errors) {
172
142
  context.logger.warn(warning);
173
143
  }
174
144
  }
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS1idWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L2J1aWxkX2FuZ3VsYXIvc3JjL2J1aWxkZXJzL2FwcGxpY2F0aW9uL2V4ZWN1dGUtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7Ozs7O0FBR0gsOERBQWlDO0FBQ2pDLGlGQUE4RTtBQUM5RSx5RkFHcUQ7QUFDckQseUVBQXFFO0FBQ3JFLDJGQUE2RjtBQUM3RiwyRUFBNEU7QUFDNUUsdUVBQXNGO0FBQ3RGLHFFQUFvRjtBQUNwRixtRkFBNkU7QUFDN0UsNkVBQXdFO0FBQ3hFLHFEQUttQztBQUNuQyx5REFBcUQ7QUFDckQseUVBQTZEO0FBQzdELHNFQUF3RTtBQUN4RSwrREFBZ0Y7QUFDaEYsdUVBQXNFO0FBQ3RFLGlDQUE0RDtBQUc1RCxrREFBa0Q7QUFDM0MsS0FBSyxVQUFVLFlBQVksQ0FDaEMsT0FBMEMsRUFDMUMsT0FBdUIsRUFDdkIsWUFBMkI7SUFFM0IsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUUxQyxNQUFNLEVBQ0osV0FBVyxFQUNYLGFBQWEsRUFDYixhQUFhLEVBQ2IsbUJBQW1CLEVBQ25CLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLFVBQVUsRUFDVixPQUFPLEdBQ1IsR0FBRyxPQUFPLENBQUM7SUFFWixNQUFNLFFBQVEsR0FBRyxJQUFBLHlDQUFvQixFQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkUsTUFBTSxNQUFNLEdBQUcsSUFBQSwyQ0FBbUMsRUFBQyxRQUFRLENBQUMsQ0FBQztJQUU3RCx1Q0FBdUM7SUFDdkMscUVBQXFFO0lBQ3JFLElBQUksT0FBTyxDQUFD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QU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFakcsK0NBQStDO0lBQy9DLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUU7UUFDcEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLElBQUEsaUJBQVUsRUFBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RGLCtCQUErQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDNUQ7SUFFRCw0Q0FBNEM7SUFDNUMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFO1FBQ2pCLGVBQWUsQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2hGO0lBRUQsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQTFPRCxvQ0EwT0M7QUFFRCxTQUFTLCtCQUErQixDQUN0QyxPQUF1QixFQUN2QixRQUFrQixFQUNsQixNQUFnQjtJQUVoQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtRQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3QjtJQUNELEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO1FBQzlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzlCO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBCdWlsZGVyQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9hcmNoaXRlY3QnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgeyBTb3VyY2VGaWxlQ2FjaGUgfSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL2FuZ3VsYXIvY29tcGlsZXItcGx1Z2luJztcbmltcG9ydCB7XG4gIGNyZWF0ZUJyb3dzZXJDb2RlQnVuZGxlT3B0aW9ucyxcbiAgY3JlYXRlU2VydmVyQ29kZUJ1bmRsZU9wdGlvbnMsXG59IGZyb20gJy4uLy4uL3Rvb2xzL2VzYnVpbGQvYXBwbGljYXRpb24tY29kZS1idW5kbGUnO1xuaW1wb3J0IHsgQnVuZGxlckNvbnRleHQgfSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL2J1bmRsZXItY29udGV4dCc7XG5pbXBvcnQgeyBFeGVjdXRpb25SZXN1bHQsIFJlYnVpbGRTdGF0ZSB9IGZyb20gJy4uLy4uL3Rvb2xzL2VzYnVpbGQvYnVuZGxlci1leGVjdXRpb24tcmVzdWx0JztcbmltcG9ydCB7IGNoZWNrQ29tbW9uSlNNb2R1bGVzIH0gZnJvbSAnLi4vLi4vdG9vbHMvZXNidWlsZC9jb21tb25qcy1jaGVja2VyJztcbmltcG9ydCB7IGNyZWF0ZUdsb2JhbFNjcmlwdHNCdW5kbGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbHMvZXNidWlsZC9nbG9iYWwtc2NyaXB0cyc7XG5pbXBvcnQgeyBjcmVhdGVHbG9iYWxTdHlsZXNCdW5kbGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbHMvZXNidWlsZC9nbG9iYWwtc3R5bGVzJztcbmltcG9ydCB7IGdlbmVyYXRlSW5kZXhIdG1sIH0gZnJvbSAnLi4vLi4vdG9vbHMvZXNidWlsZC9pbmRleC1odG1sLWdlbmVyYXRvcic7XG5pbXBvcnQgeyBleHRyYWN0TGljZW5zZXMgfSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL2xpY2Vuc2UtZXh0cmFjdG9yJztcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUVzdGltYXRlZFRyYW5zZmVyU2l6ZXMsXG4gIGxvZ0J1aWxkU3RhdHMsXG4gIGxvZ01lc3NhZ2VzLFxuICB0cmFuc2Zvcm1TdXBwb3J0ZWRCcm93c2Vyc1RvVGFyZ2V0cyxcbn0gZnJvbSAnLi4vLi4vdG9vbHMvZXNidWlsZC91dGlscyc7XG5pbXBvcnQgeyBjb3B5QXNzZXRzIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29weS1hc3NldHMnO1xuaW1wb3J0IHsgbWF4V29ya2VycyB9IGZyb20gJy4uLy4uL3V0aWxzL2Vudmlyb25tZW50LW9wdGlvbnMnO1xuaW1wb3J0IHsgcHJlcmVuZGVyUGFnZXMgfSBmcm9tICcuLi8uLi91dGlscy9zZXJ2ZXItcmVuZGVyaW5nL3ByZXJlbmRlcic7XG5pbXBvcnQgeyBhdWdtZW50QXBwV2l0aFNlcnZpY2VXb3JrZXJFc2J1aWxkIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2VydmljZS13b3JrZXInO1xuaW1wb3J0IHsgZ2V0U3VwcG9ydGVkQnJvd3NlcnMgfSBmcm9tICcuLi8uLi91dGlscy9zdXBwb3J0ZWQtYnJvd3NlcnMnO1xuaW1wb3J0IHsgaW5saW5lSTE4biwgbG9hZEFjdGl2ZVRyYW5zbGF0aW9ucyB9IGZyb20gJy4vaTE4bic7XG5pbXBvcnQgeyBOb3JtYWxpemVkQXBwbGljYXRpb25CdWlsZE9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxpbmVzLXBlci1mdW5jdGlvblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVCdWlsZChcbiAgb3B0aW9uczogTm9ybWFsaXplZEFwcGxpY2F0aW9uQnVpbGRPcHRpb25zLFxuICBjb250ZXh0OiBCdWlsZGVyQ29udGV4dCxcbiAgcmVidWlsZFN0YXRlPzogUmVidWlsZFN0YXRlLFxuKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ+IHtcbiAgY29uc3Qgc3RhcnRUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCk7XG5cbiAgY29uc3Qge1xuICAgIHByb2plY3RSb290LFxuICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgc2VydmljZVdvcmtlcixcbiAgICBvcHRpbWl6YXRpb25PcHRpb25zLFxuICAgIHNlcnZlckVudHJ5UG9pbnQsXG4gICAgYXNzZXRzLFxuICAgIGluZGV4SHRtbE9wdGlvbnMsXG4gICAgY2FjaGVPcHRpb25zLFxuICAgIHByZXJlbmRlck9wdGlvbnMsXG4gICAgYXBwU2hlbGxPcHRpb25zLFxuICAgIHNzck9wdGlvbnMsXG4gICAgdmVyYm9zZSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgYnJvd3NlcnMgPSBnZXRTdXBwb3J0ZWRCcm93c2Vycyhwcm9qZWN0Um9vdCwgY29udGV4dC5sb2dnZXIpO1xuICBjb25zdCB0YXJnZXQgPSB0cmFuc2Zvcm1TdXBwb3J0ZWRCcm93c2Vyc1RvVGFyZ2V0cyhicm93c2Vycyk7XG5cbiAgLy8gTG9hZCBhY3RpdmUgdHJhbnNsYXRpb25zIGlmIGlubGluaW5nXG4gIC8vIFRPRE86IEludGVncmF0ZSBpbnRvIHdhdGNoIG1vZGUgYW5kIG9ubHkgbG9hZCBjaGFuZ2VkIHRyYW5zbGF0aW9uc1xuICBpZiAob3B0aW9ucy5pMThuT3B0aW9ucy5zaG91bGRJbmxpbmUpIHtcbiAgICBhd2FpdCBsb2FkQWN0aXZlVHJhbnNsYXRpb25zKGNvbnRleHQsIG9wdGlvbnMuaTE4bk9wdGlvbnMpO1xuICB9XG5cbiAgLy8gUmV1c2UgcmVidWlsZCBzdGF0ZSBvciBjcmVhdGUgbmV3IGJ1bmRsZSBjb250ZXh0cyBmb3IgY29kZSBhbmQgZ2xvYmFsIHN0eWxlc2hlZXRzXG4gIGxldCBidW5kbGVyQ29udGV4dHMgPSByZWJ1aWxkU3RhdGU/LnJlYnVpbGRDb250ZXh0cztcbiAgY29uc3QgY29kZUJ1bmRsZUNhY2hlID1cbiAgICByZWJ1aWxkU3RhdGU/LmNvZGVCdW5kbGVDYWNoZSA/P1xuICAgIG5ldyBTb3VyY2VGaWxlQ2FjaGUoY2FjaGVPcHRpb25zLmVuYWJsZWQgPyBjYWNoZU9wdGlvbnMucGF0aCA6IHVuZGVmaW5lZCk7XG4gIGlmIChidW5kbGVyQ29udGV4dHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1bmRsZXJDb250ZXh0cyA9IFtdO1xuXG4gICAgLy8gQnJvd3NlciBhcHBsaWNhdGlvbiBjb2RlXG4gICAgYnVuZGxlckNvbnRleHRzLnB1c2goXG4gICAgICBuZXcgQnVuZGxlckNvbnRleHQoXG4gICAgICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgICAgICEhb3B0aW9ucy53YXRjaCxcbiAgICAgICAgY3JlYXRlQnJvd3NlckNvZGVCdW5kbGVPcHRpb25zKG9wdGlvbnMsIHRhcmdldCwgY29kZUJ1bmRsZUNhY2hlKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIC8vIEdsb2JhbCBTdHlsZXNoZWV0c1xuICAgIGlmIChvcHRpb25zLmdsb2JhbFN0eWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGluaXRpYWwgb2YgW3RydWUsIGZhbHNlXSkge1xuICAgICAgICBjb25zdCBidW5kbGVPcHRpb25zID0gY3JlYXRlR2xvYmFsU3R5bGVzQnVuZGxlT3B0aW9ucyhcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBpbml0aWFsLFxuICAgICAgICAgIGNvZGVCdW5kbGVDYWNoZT8ubG9hZFJlc3VsdENhY2hlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoYnVuZGxlT3B0aW9ucykge1xuICAgICAgICAgIGJ1bmRsZXJDb250ZXh0cy5wdXNoKFxuICAgICAgICAgICAgbmV3IEJ1bmRsZXJDb250ZXh0KHdvcmtzcGFjZVJvb3QsICEhb3B0aW9ucy53YXRjaCwgYnVuZGxlT3B0aW9ucywgKCkgPT4gaW5pdGlhbCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdsb2JhbCBTY3JpcHRzXG4gICAgaWYgKG9wdGlvbnMuZ2xvYmFsU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGluaXRpYWwgb2YgW3RydWUsIGZhbHNlXSkge1xuICAgICAgICBjb25zdCBidW5kbGVPcHRpb25zID0gY3JlYXRlR2xvYmFsU2NyaXB0c0J1bmRsZU9wdGlvbnMob3B0aW9ucywgaW5pdGlhbCk7XG4gICAgICAgIGlmIChidW5kbGVPcHRpb25zKSB7XG4gICAgICAgICAgYnVuZGxlckNvbnRleHRzLnB1c2goXG4gICAgICAgICAgICBuZXcgQnVuZGxlckNvbnRleHQod29ya3NwYWNlUm9vdCwgISFvcHRpb25zLndhdGNoLCBidW5kbGVPcHRpb25zLCAoKSA9PiBpbml0aWFsKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2VydmVyIGFwcGxpY2F0aW9uIGNvZGVcbiAgICBpZiAoc2VydmVyRW50cnlQb2ludCkge1xuICAgICAgYnVuZGxlckNvbnRleHRzLnB1c2goXG4gICAgICAgIG5ldyBCdW5kbGVyQ29udGV4dChcbiAgICAgICAgICB3b3Jrc3BhY2VSb290LFxuICAgICAgICAgICEhb3B0aW9ucy53YXRjaCxcbiAgICAgICAgICBjcmVhdGVTZXJ2ZXJDb2RlQnVuZGxlT3B0aW9ucyhcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAvLyBOT1RFOiBlYXJsaWVyIHZlcnNpb25zIG9mIE5vZGUuanMgYXJlIG5vdCBzdXBwb3J0ZWQgZHVlIHRvIHVuc2FmZSBwcm9taXNlIHBhdGNoaW5nLlxuICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3B1bGwvNTA1NTIjaXNzdWUtMTczNzk2NzU5MlxuICAgICAgICAgICAgWy4uLnRhcmdldCwgJ25vZGUxOC4xMyddLFxuICAgICAgICAgICAgY29kZUJ1bmRsZUNhY2hlLFxuICAgICAgICAgICksXG4gICAgICAgICAgKCkgPT4gZmFsc2UsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJ1bmRsaW5nUmVzdWx0ID0gYXdhaXQgQnVuZGxlckNvbnRleHQuYnVuZGxlQWxsKGJ1bmRsZXJDb250ZXh0cyk7XG5cbiAgLy8gTG9nIGFsbCB3YXJuaW5ncyBhbmQgZXJyb3JzIGdlbmVyYXRlZCBkdXJpbmcgYnVuZGxpbmdcbiAgYXdhaXQgbG9nTWVzc2FnZXMoY29udGV4dCwgYnVuZGxpbmdSZXN1bHQpO1xuXG4gIGNvbnN0IGV4ZWN1dGlvblJlc3VsdCA9IG5ldyBFeGVjdXRpb25SZXN1bHQoYnVuZGxlckNvbnRleHRzLCBjb2RlQnVuZGxlQ2FjaGUpO1xuXG4gIC8vIFJldHVybiBpZiB0aGUgYnVuZGxpbmcgaGFzIGVycm9yc1xuICBpZiAoYnVuZGxpbmdSZXN1bHQuZXJyb3JzKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGlvblJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IHsgbWV0YWZpbGUsIGluaXRpYWxGaWxlcywgb3V0cHV0RmlsZXMgfSA9IGJ1bmRsaW5nUmVzdWx0O1xuXG4gIGV4ZWN1dGlvblJlc3VsdC5vdXRwdXRGaWxlcy5wdXNoKC4uLm91dHB1dEZpbGVzKTtcblxuICAvLyBDaGVjayBtZXRhZmlsZSBmb3IgQ29tbW9uSlMgbW9kdWxlIHVzYWdlIGlmIG9wdGltaXppbmcgc2NyaXB0c1xuICBpZiAob3B0aW1pemF0aW9uT3B0aW9ucy5zY3JpcHRzKSB7XG4gICAgY29uc3QgbWVzc2FnZXMgPSBjaGVja0NvbW1vbkpTTW9kdWxlcyhtZXRhZmlsZSwgb3B0aW9ucy5hbGxvd2VkQ29tbW9uSnNEZXBlbmRlbmNpZXMpO1xuICAgIGF3YWl0IGxvZ01lc3NhZ2VzKGNvbnRleHQsIHsgd2FybmluZ3M6IG1lc3NhZ2VzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGV4IEhUTUwgY29udGVudCB3aXRob3V0IENTUyBpbmxpbmluZyB0byBiZSB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nIChBcHBTaGVsbCwgU1NHIGFuZCBTU1IpLlxuICAgKlxuICAgKiBOT1RFOiB3ZSBkb24ndCBwZXJmb3JtIGNyaXRpY2FsIENTUyBpbmxpbmluZyBhcyB0aGlzIHdpbGwgYmUgZG9uZSBkdXJpbmcgc2VydmVyIHJlbmRlcmluZy5cbiAgICovXG4gIGxldCBpbmRleENvbnRlbnRPdXRwdXROb0Nzc0lubGluaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gR2VuZXJhdGUgaW5kZXggSFRNTCBmaWxlXG4gIC8vIElmIGxvY2FsaXphdGlvbiBpcyBlbmFibGVkLCBpbmRleCBnZW5lcmF0aW9uIGlzIGhhbmRsZWQgaW4gdGhlIGlubGluaW5nIHByb2Nlc3MuXG4gIC8vIE5PVEU6IExvY2FsaXphdGlvbiB3aXRoIFNTUiBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAgaWYgKGluZGV4SHRtbE9wdGlvbnMgJiYgIW9wdGlvbnMuaTE4bk9wdGlvbnMuc2hvdWxkSW5saW5lKSB7XG4gICAgY29uc3QgeyBjb250ZW50LCBjb250ZW50V2l0aG91dENyaXRpY2FsQ3NzSW5saW5lZCwgZXJyb3JzLCB3YXJuaW5ncyB9ID0gYXdhaXQgZ2VuZXJhdGVJbmRleEh0bWwoXG4gICAgICBpbml0aWFsRmlsZXMsXG4gICAgICBleGVjdXRpb25SZXN1bHQub3V0cHV0RmlsZXMsXG4gICAgICB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIG9wdGltaXphdGlvbk9wdGlvbnMsXG4gICAgICB9LFxuICAgICAgLy8gU2V0IGxhbmcgYXR0cmlidXRlIHRvIHRoZSBkZWZpbmVkIHNvdXJjZSBsb2NhbGUgaWYgcHJlc2VudFxuICAgICAgb3B0aW9ucy5pMThuT3B0aW9ucy5oYXNEZWZpbmVkU291cmNlTG9jYWxlID8gb3B0aW9ucy5pMThuT3B0aW9ucy5zb3VyY2VMb2NhbGUgOiB1bmRlZmluZWQsXG4gICAgKTtcblxuICAgIGluZGV4Q29udGVudE91dHB1dE5vQ3NzSW5saW5pbmcgPSBjb250ZW50V2l0aG91dENyaXRpY2FsQ3NzSW5saW5lZDtcbiAgICBwcmludFdhcm5pbmdzQW5kRXJyb3JzVG9Db25zb2xlKGNvbnRleHQsIHdhcm5pbmdzLCBlcnJvcnMpO1xuXG4gICAgZXhlY3V0aW9uUmVzdWx0LmFkZE91dHB1dEZpbGUoaW5kZXhIdG1sT3B0aW9ucy5vdXRwdXQsIGNvbnRlbnQpO1xuXG4gICAgaWYgKHNzck9wdGlvbnMpIHtcbiAgICAgIGV4ZWN1dGlvblJlc3VsdC5hZGRPdXRwdXRGaWxlKCdpbmRleC5zZXJ2ZXIuaHRtbCcsIGNvbnRlbnRXaXRob3V0Q3JpdGljYWxDc3NJbmxpbmVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBQcmUtcmVuZGVyIChTU0cpIGFuZCBBcHAtc2hlbGxcbiAgLy8gSWYgbG9jYWxpemF0aW9uIGlzIGVuYWJsZWQsIHByZXJlbmRlcmluZyBpcyBoYW5kbGVkIGluIHRoZSBpbmxpbmluZyBwcm9jZXNzLlxuICBpZiAoKHByZXJlbmRlck9wdGlvbnMgfHwgYXBwU2hlbGxPcHRpb25zKSAmJiAhb3B0aW9ucy5pMThuT3B0aW9ucy5zaG91bGRJbmxpbmUpIHtcbiAgICBhc3NlcnQoXG4gICAgICBpbmRleENvbnRlbnRPdXRwdXROb0Nzc0lubGluaW5nLFxuICAgICAgJ1RoZSBcImluZGV4XCIgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlIFwic3NnXCIgb3IgXCJhcHBTaGVsbFwiIG9wdGlvbnMuJyxcbiAgICApO1xuXG4gICAgY29uc3QgeyBvdXRwdXQsIHdhcm5pbmdzLCBlcnJvcnMgfSA9IGF3YWl0IHByZXJlbmRlclBhZ2VzKFxuICAgICAgd29ya3NwYWNlUm9vdCxcbiAgICAgIGFwcFNoZWxsT3B0aW9ucyxcbiAgICAgIHByZXJlbmRlck9wdGlvbnMsXG4gICAgICBleGVjdXRpb25SZXN1bHQub3V0cHV0RmlsZXMsXG4gICAgICBpbmRleENvbnRlbnRPdXRwdXROb0Nzc0lubGluaW5nLFxuICAgICAgb3B0aW1pemF0aW9uT3B0aW9ucy5zdHlsZXMuaW5saW5lQ3JpdGljYWwsXG4gICAgICBtYXhXb3JrZXJzLFxuICAgICAgdmVyYm9zZSxcbiAgICApO1xuXG4gICAgcHJpbnRXYXJuaW5nc0FuZEVycm9yc1RvQ29uc29sZShjb250ZXh0LCB3YXJuaW5ncywgZXJyb3JzKTtcblxuICAgIGZvciAoY29uc3QgW3BhdGgsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dCkpIHtcbiAgICAgIGV4ZWN1dGlvblJlc3VsdC5hZGRPdXRwdXRGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvcHkgYXNzZXRzXG4gIGlmIChhc3NldHMpIHtcbiAgICAvLyBUaGUgd2VicGFjayBjb3B5IGFzc2V0cyBoZWxwZXIgaXMgdXNlZCB3aXRoIG5vIGJhc2UgcGF0aHMgZGVmaW5lZC4gVGhpcyBwcmV2ZW50cyB0aGUgaGVscGVyXG4gICAgLy8gZnJvbSBkaXJlY3RseSB3cml0aW5nIHRvIGRpc2suIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmVwbGFjZWQgd2l0aCBhIG1vcmUgb3B0aW1pemVkIGhlbHBlci5cbiAgICBleGVjdXRpb25SZXN1bHQuYXNzZXRGaWxlcy5wdXNoKC4uLihhd2FpdCBjb3B5QXNzZXRzKGFzc2V0cywgW10sIHdvcmtzcGFjZVJvb3QpKSk7XG4gIH1cblxuICAvLyBFeHRyYWN0IGFuZCB3cml0ZSBsaWNlbnNlcyBmb3IgdXNlZCBwYWNrYWdlc1xuICBpZiAob3B0aW9ucy5leHRyYWN0TGljZW5zZXMpIHtcbiAgICBleGVjdXRpb25SZXN1bHQuYWRkT3V0cHV0RmlsZShcbiAgICAgICczcmRwYXJ0eWxpY2Vuc2VzLnR4dCcsXG4gICAgICBhd2FpdCBleHRyYWN0TGljZW5zZXMobWV0YWZpbGUsIHdvcmtzcGFjZVJvb3QpLFxuICAgICk7XG4gIH1cblxuICAvLyBBdWdtZW50IHRoZSBhcHBsaWNhdGlvbiB3aXRoIHNlcnZpY2Ugd29ya2VyIHN1cHBvcnRcbiAgLy8gSWYgbG9jYWxpemF0aW9uIGlzIGVuYWJsZWQsIHNlcnZpY2Ugd29ya2VyIGlzIGhhbmRsZWQgaW4gdGhlIGlubGluaW5nIHByb2Nlc3MuXG4gIGlmIChzZXJ2aWNlV29ya2VyICYmICFvcHRpb25zLmkxOG5PcHRpb25zLnNob3VsZElubGluZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXJ2aWNlV29ya2VyUmVzdWx0ID0gYXdhaXQgYXVnbWVudEFwcFdpdGhTZXJ2aWNlV29ya2VyRXNidWlsZChcbiAgICAgICAgd29ya3NwYWNlUm9vdCxcbiAgICAgICAgc2VydmljZVdvcmtlcixcbiAgICAgICAgb3B0aW9ucy5iYXNlSHJlZiB8fCAnLycsXG4gICAgICAgIGV4ZWN1dGlvblJlc3VsdC5vdXRwdXRGaWxlcyxcbiAgICAgICAgZXhlY3V0aW9uUmVzdWx0LmFzc2V0RmlsZXMsXG4gICAgICApO1xuICAgICAgZXhlY3V0aW9uUmVzdWx0LmFkZE91dHB1dEZpbGUoJ25nc3cuanNvbicsIHNlcnZpY2VXb3JrZXJSZXN1bHQubWFuaWZlc3QpO1xuICAgICAgZXhlY3V0aW9uUmVzdWx0LmFzc2V0RmlsZXMucHVzaCguLi5zZXJ2aWNlV29ya2VyUmVzdWx0LmFzc2V0RmlsZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb250ZXh0LmxvZ2dlci5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGAke2Vycm9yfWApO1xuXG4gICAgICByZXR1cm4gZXhlY3V0aW9uUmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSBlc3RpbWF0ZWQgdHJhbnNmZXIgc2l6ZSBpZiBzY3JpcHRzIGFyZSBvcHRpbWl6ZWRcbiAgbGV0IGVzdGltYXRlZFRyYW5zZmVyU2l6ZXM7XG4gIGlmIChvcHRpbWl6YXRpb25PcHRpb25zLnNjcmlwdHMgfHwgb3B0aW1pemF0aW9uT3B0aW9ucy5zdHlsZXMubWluaWZ5KSB7XG4gICAgZXN0aW1hdGVkVHJhbnNmZXJTaXplcyA9IGF3YWl0IGNhbGN1bGF0ZUVzdGltYXRlZFRyYW5zZmVyU2l6ZXMoZXhlY3V0aW9uUmVzdWx0Lm91dHB1dEZpbGVzKTtcbiAgfVxuXG4gIGxvZ0J1aWxkU3RhdHMoY29udGV4dCwgbWV0YWZpbGUsIGluaXRpYWxGaWxlcywgZXN0aW1hdGVkVHJhbnNmZXJTaXplcyk7XG5cbiAgY29uc3QgYnVpbGRUaW1lID0gTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RhcnRUaW1lKSAvIDEwICoqIDk7XG4gIGNvbnRleHQubG9nZ2VyLmluZm8oYEFwcGxpY2F0aW9uIGJ1bmRsZSBnZW5lcmF0aW9uIGNvbXBsZXRlLiBbJHtidWlsZFRpbWUudG9GaXhlZCgzKX0gc2Vjb25kc11gKTtcblxuICAvLyBQZXJmb3JtIGkxOG4gdHJhbnNsYXRpb24gaW5saW5pbmcgaWYgZW5hYmxlZFxuICBpZiAob3B0aW9ucy5pMThuT3B0aW9ucy5zaG91bGRJbmxpbmUpIHtcbiAgICBjb25zdCB7IGVycm9ycywgd2FybmluZ3MgfSA9IGF3YWl0IGlubGluZUkxOG4ob3B0aW9ucywgZXhlY3V0aW9uUmVzdWx0LCBpbml0aWFsRmlsZXMpO1xuICAgIHByaW50V2FybmluZ3NBbmRFcnJvcnNUb0NvbnNvbGUoY29udGV4dCwgd2FybmluZ3MsIGVycm9ycyk7XG4gIH1cblxuICAvLyBXcml0ZSBtZXRhZmlsZSBpZiBzdGF0cyBvcHRpb24gaXMgZW5hYmxlZFxuICBpZiAob3B0aW9ucy5zdGF0cykge1xuICAgIGV4ZWN1dGlvblJlc3VsdC5hZGRPdXRwdXRGaWxlKCdzdGF0cy5qc29uJywgSlNPTi5zdHJpbmdpZnkobWV0YWZpbGUsIG51bGwsIDIpKTtcbiAgfVxuXG4gIHJldHVybiBleGVjdXRpb25SZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZ3NBbmRFcnJvcnNUb0NvbnNvbGUoXG4gIGNvbnRleHQ6IEJ1aWxkZXJDb250ZXh0LFxuICB3YXJuaW5nczogc3RyaW5nW10sXG4gIGVycm9yczogc3RyaW5nW10sXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcbiAgICBjb250ZXh0LmxvZ2dlci5lcnJvcihlcnJvcik7XG4gIH1cbiAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG4gICAgY29udGV4dC5sb2dnZXIud2Fybih3YXJuaW5nKTtcbiAgfVxufVxuIl19
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS1idWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L2J1aWxkX2FuZ3VsYXIvc3JjL2J1aWxkZXJzL2FwcGxpY2F0aW9uL2V4ZWN1dGUtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBR0gscUZBQWdGO0FBQ2hGLHlGQUdxRDtBQUNyRCxtRUFBdUU7QUFDdkUseUVBQTBGO0FBQzFGLDJGQUE2RjtBQUM3RiwyRUFBNEU7QUFDNUUsdUVBQXNGO0FBQ3RGLHFFQUFvRjtBQUNwRiw2RUFBd0U7QUFDeEUscURBTW1DO0FBQ25DLHFFQUE2RDtBQUM3RCx5REFBcUQ7QUFDckQsdUVBQXNFO0FBQ3RFLCtEQUErRDtBQUMvRCxpQ0FBNEQ7QUFHNUQsa0RBQWtEO0FBQzNDLEtBQUssVUFBVSxZQUFZLENBQ2hDLE9BQTBDLEVBQzFDLE9BQXVCLEVBQ3ZCLFlBQTJCO0lBRTNCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7SUFFMUMsTUFBTSxFQUNKLFdBQVcsRUFDWCxhQUFhLEVBQ2IsV0FBVyxFQUNYLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLFVBQVUsR0FDWCxHQUFHLE9BQU8sQ0FBQztJQUVaLE1BQU0sUUFBUSxHQUFHLElBQUEseUNBQW9CLEVBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuRSxNQUFNLE1BQU0sR0FBRyxJQUFBLDJDQUFtQyxFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTdELHVDQUF1QztJQUN2QyxxRUFBcUU7SUFDckUsSUFBSSxXQUFXLENBQUMsWUFBWSxFQUFFO1FBQzVCLE1BQU0sSUFBQSw2QkFBc0IsRUFBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDcEQ7SUFFRCxvRkFBb0Y7SUFDcEYsSUFBSSxlQUFlLEdBQUcsWUFBWSxFQUFFLGVBQWUsQ0FBQztJQUNwRCxNQUFNLGVBQWUsR0FDbkIsWUFBWSxFQUFFLGVBQWU7UUFDN0IsSUFBSSxtQ0FBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVFLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRTtRQUNqQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBRXJCLDJCQUEyQjtRQUMzQixlQUFlLENBQUMsSUFBSSxDQUNsQixJQUFJLGdDQUFjLENBQ2hCLGFBQWEsRUFDYixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFDZixJQUFBLHdEQUE4QixFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQ2pFLENBQ0YsQ0FBQztRQUVGLHFCQUFxQjtRQUNyQixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNuQyxLQUFLLE1BQU0sT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNuQyxNQUFNLGFBQWEsR0FBRyxJQUFBLCtDQUErQixFQUNuRCxPQUFPLEVBQ1AsTUFBTSxFQUNOLE9BQU8sRUFDUCxlQUFlLEVBQUUsZUFBZSxDQUNqQyxDQUFDO2dCQUNGLElBQUksYUFBYSxFQUFFO29CQUNqQixlQUFlLENBQUMsSUFBSSxDQUNsQixJQUFJLGdDQUFjLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FDakYsQ0FBQztpQkFDSDthQUNGO1NBQ0Y7UUFFRCxpQkFBaUI7UUFDakIsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcEMsS0FBSyxNQUFNLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDbkMsTUFBTSxhQUFhLEdBQUcsSUFBQSxpREFBZ0MsRUFBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3pFLElBQUksYUFBYSxFQUFFO29CQUNqQixlQUFlLENBQUMsSUFBSSxDQUNsQixJQUFJLGdDQUFjLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FDakYsQ0FBQztpQkFDSDthQUNGO1NBQ0Y7UUFFRCwwQkFBMEI7UUFDMUIsMERBQTBEO1FBQzFELElBQUksZ0JBQWdCLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxlQUFlLElBQUksVUFBVSxDQUFDLEVBQUU7WUFDM0UsTUFBTSxXQUFXLEdBQUcsSUFBQSwrQkFBdUIsR0FBRSxDQUFDO1lBQzlDLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLElBQUksZ0NBQWMsQ0FDaEIsYUFBYSxFQUNiLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUNmLElBQUEsdURBQTZCLEVBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsRUFBRSxlQUFlLENBQUMsRUFDcEYsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUNaLENBQ0YsQ0FBQztTQUNIO0tBQ0Y7SUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLGdDQUFjLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXZFLHdEQUF3RDtJQUN4RCxNQUFNLElBQUEsbUJBQVcsRUFBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFM0MsTUFBTSxlQUFlLEdBQUcsSUFBSSwwQ0FBZSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUU5RSxvQ0FBb0M7SUFDcEMsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFO1FBQ3pCLE9BQU8sZUFBZSxDQUFDO0tBQ3hCO0lBRUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEdBQUcsY0FBYyxDQUFDO0lBRS9ELGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7SUFFakQsaUVBQWlFO0lBQ2pFLElBQUksbUJBQW1CLENBQUMsT0FBTyxFQUFFO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUEsdUNBQW9CLEVBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sSUFBQSxtQkFBVyxFQUFDLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQ3BEO0lBRUQsY0FBYztJQUNkLElBQUksTUFBTSxFQUFFO1FBQ1YsOEZBQThGO1FBQzlGLGtHQUFrRztRQUNsRyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBQSx3QkFBVSxFQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztLQUN4RTtJQUVELCtDQUErQztJQUMvQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUU7UUFDM0IsZUFBZSxDQUFDLGFBQWEsQ0FDM0Isc0JBQXNCLEVBQ3RCLE1BQU0sSUFBQSxtQ0FBZSxFQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsRUFDOUMscUNBQW1CLENBQUMsSUFBSSxDQUN6QixDQUFDO0tBQ0g7SUFFRCxzREFBc0Q7SUFDdEQsSUFBSSxjQUFjLENBQUM7SUFDbkIsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUEsa0NBQW1CLEVBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2hFLGNBQWMsR0FBRyxDQUFDLEdBQUcsSUFBQSxnQ0FBWSxFQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdkUsS0FBSyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLGNBQWMsRUFBRTtZQUNsRCxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7Z0JBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzlCO1NBQ0Y7S0FDRjtJQUVELDZEQUE2RDtJQUM3RCxJQUFJLHNCQUFzQixDQUFDO0lBQzNCLElBQUksbUJBQW1CLENBQUMsT0FBTyxJQUFJLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDcEUsc0JBQXNCLEdBQUcsTUFBTSxJQUFBLHVDQUErQixFQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztLQUM3RjtJQUVELCtDQUErQztJQUMvQyxJQUFJLFdBQVcsQ0FBQyxZQUFZLEVBQUU7UUFDNUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLElBQUEsaUJBQVUsRUFBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RGLCtCQUErQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDNUQ7U0FBTTtRQUNMLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLEdBQ2pFLE1BQU0sSUFBQSw0Q0FBc0IsRUFDMUIsT0FBTyxFQUNQLGVBQWUsQ0FBQyxXQUFXLEVBQzNCLGVBQWUsQ0FBQyxVQUFVLEVBQzFCLFlBQVk7UUFDWiw2REFBNkQ7UUFDN0QsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQzFFLENBQUM7UUFFSixlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLHFCQUFxQixDQUFDLENBQUM7UUFDM0QsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3JELCtCQUErQixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDNUQ7SUFFRCxJQUFBLHFCQUFhLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFFdkYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakcsNENBQTRDO0lBQzVDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRTtRQUNqQixlQUFlLENBQUMsYUFBYSxDQUMzQixZQUFZLEVBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUNqQyxxQ0FBbUIsQ0FBQyxJQUFJLENBQ3pCLENBQUM7S0FDSDtJQUVELE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUF0TEQsb0NBc0xDO0FBRUQsU0FBUywrQkFBK0IsQ0FDdEMsT0FBdUIsRUFDdkIsUUFBa0IsRUFDbEIsTUFBZ0I7SUFFaEIsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7UUFDMUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDN0I7SUFDRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRTtRQUM5QixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUM5QjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgQnVpbGRlckNvbnRleHQgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvYXJjaGl0ZWN0JztcbmltcG9ydCB7IFNvdXJjZUZpbGVDYWNoZSB9IGZyb20gJy4uLy4uL3Rvb2xzL2VzYnVpbGQvYW5ndWxhci9zb3VyY2UtZmlsZS1jYWNoZSc7XG5pbXBvcnQge1xuICBjcmVhdGVCcm93c2VyQ29kZUJ1bmRsZU9wdGlvbnMsXG4gIGNyZWF0ZVNlcnZlckNvZGVCdW5kbGVPcHRpb25zLFxufSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL2FwcGxpY2F0aW9uLWNvZGUtYnVuZGxlJztcbmltcG9ydCB7IGdlbmVyYXRlQnVkZ2V0U3RhdHMgfSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL2J1ZGdldC1zdGF0cyc7XG5pbXBvcnQgeyBCdWlsZE91dHB1dEZpbGVUeXBlLCBCdW5kbGVyQ29udGV4dCB9IGZyb20gJy4uLy4uL3Rvb2xzL2VzYnVpbGQvYnVuZGxlci1jb250ZXh0JztcbmltcG9ydCB7IEV4ZWN1dGlvblJlc3VsdCwgUmVidWlsZFN0YXRlIH0gZnJvbSAnLi4vLi4vdG9vbHMvZXNidWlsZC9idW5kbGVyLWV4ZWN1dGlvbi1yZXN1bHQnO1xuaW1wb3J0IHsgY2hlY2tDb21tb25KU01vZHVsZXMgfSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL2NvbW1vbmpzLWNoZWNrZXInO1xuaW1wb3J0IHsgY3JlYXRlR2xvYmFsU2NyaXB0c0J1bmRsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL2dsb2JhbC1zY3JpcHRzJztcbmltcG9ydCB7IGNyZWF0ZUdsb2JhbFN0eWxlc0J1bmRsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL2dsb2JhbC1zdHlsZXMnO1xuaW1wb3J0IHsgZXh0cmFjdExpY2Vuc2VzIH0gZnJvbSAnLi4vLi4vdG9vbHMvZXNidWlsZC9saWNlbnNlLWV4dHJhY3Rvcic7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVFc3RpbWF0ZWRUcmFuc2ZlclNpemVzLFxuICBnZXRTdXBwb3J0ZWROb2RlVGFyZ2V0cyxcbiAgbG9nQnVpbGRTdGF0cyxcbiAgbG9nTWVzc2FnZXMsXG4gIHRyYW5zZm9ybVN1cHBvcnRlZEJyb3dzZXJzVG9UYXJnZXRzLFxufSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL3V0aWxzJztcbmltcG9ydCB7IGNoZWNrQnVkZ2V0cyB9IGZyb20gJy4uLy4uL3V0aWxzL2J1bmRsZS1jYWxjdWxhdG9yJztcbmltcG9ydCB7IGNvcHlBc3NldHMgfSBmcm9tICcuLi8uLi91dGlscy9jb3B5LWFzc2V0cyc7XG5pbXBvcnQgeyBnZXRTdXBwb3J0ZWRCcm93c2VycyB9IGZyb20gJy4uLy4uL3V0aWxzL3N1cHBvcnRlZC1icm93c2Vycyc7XG5pbXBvcnQgeyBleGVjdXRlUG9zdEJ1bmRsZVN0ZXBzIH0gZnJvbSAnLi9leGVjdXRlLXBvc3QtYnVuZGxlJztcbmltcG9ydCB7IGlubGluZUkxOG4sIGxvYWRBY3RpdmVUcmFuc2xhdGlvbnMgfSBmcm9tICcuL2kxOG4nO1xuaW1wb3J0IHsgTm9ybWFsaXplZEFwcGxpY2F0aW9uQnVpbGRPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1saW5lcy1wZXItZnVuY3Rpb25cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQnVpbGQoXG4gIG9wdGlvbnM6IE5vcm1hbGl6ZWRBcHBsaWNhdGlvbkJ1aWxkT3B0aW9ucyxcbiAgY29udGV4dDogQnVpbGRlckNvbnRleHQsXG4gIHJlYnVpbGRTdGF0ZT86IFJlYnVpbGRTdGF0ZSxcbik6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PiB7XG4gIGNvbnN0IHN0YXJ0VGltZSA9IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpO1xuXG4gIGNvbnN0IHtcbiAgICBwcm9qZWN0Um9vdCxcbiAgICB3b3Jrc3BhY2VSb290LFxuICAgIGkxOG5PcHRpb25zLFxuICAgIG9wdGltaXphdGlvbk9wdGlvbnMsXG4gICAgc2VydmVyRW50cnlQb2ludCxcbiAgICBhc3NldHMsXG4gICAgY2FjaGVPcHRpb25zLFxuICAgIHByZXJlbmRlck9wdGlvbnMsXG4gICAgYXBwU2hlbGxPcHRpb25zLFxuICAgIHNzck9wdGlvbnMsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IGJyb3dzZXJzID0gZ2V0U3VwcG9ydGVkQnJvd3NlcnMocHJvamVjdFJvb3QsIGNvbnRleHQubG9nZ2VyKTtcbiAgY29uc3QgdGFyZ2V0ID0gdHJhbnNmb3JtU3VwcG9ydGVkQnJvd3NlcnNUb1RhcmdldHMoYnJvd3NlcnMpO1xuXG4gIC8vIExvYWQgYWN0aXZlIHRyYW5zbGF0aW9ucyBpZiBpbmxpbmluZ1xuICAvLyBUT0RPOiBJbnRlZ3JhdGUgaW50byB3YXRjaCBtb2RlIGFuZCBvbmx5IGxvYWQgY2hhbmdlZCB0cmFuc2xhdGlvbnNcbiAgaWYgKGkxOG5PcHRpb25zLnNob3VsZElubGluZSkge1xuICAgIGF3YWl0IGxvYWRBY3RpdmVUcmFuc2xhdGlvbnMoY29udGV4dCwgaTE4bk9wdGlvbnMpO1xuICB9XG5cbiAgLy8gUmV1c2UgcmVidWlsZCBzdGF0ZSBvciBjcmVhdGUgbmV3IGJ1bmRsZSBjb250ZXh0cyBmb3IgY29kZSBhbmQgZ2xvYmFsIHN0eWxlc2hlZXRzXG4gIGxldCBidW5kbGVyQ29udGV4dHMgPSByZWJ1aWxkU3RhdGU/LnJlYnVpbGRDb250ZXh0cztcbiAgY29uc3QgY29kZUJ1bmRsZUNhY2hlID1cbiAgICByZWJ1aWxkU3RhdGU/LmNvZGVCdW5kbGVDYWNoZSA/P1xuICAgIG5ldyBTb3VyY2VGaWxlQ2FjaGUoY2FjaGVPcHRpb25zLmVuYWJsZWQgPyBjYWNoZU9wdGlvbnMucGF0aCA6IHVuZGVmaW5lZCk7XG4gIGlmIChidW5kbGVyQ29udGV4dHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1bmRsZXJDb250ZXh0cyA9IFtdO1xuXG4gICAgLy8gQnJvd3NlciBhcHBsaWNhdGlvbiBjb2RlXG4gICAgYnVuZGxlckNvbnRleHRzLnB1c2goXG4gICAgICBuZXcgQnVuZGxlckNvbnRleHQoXG4gICAgICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgICAgICEhb3B0aW9ucy53YXRjaCxcbiAgICAgICAgY3JlYXRlQnJvd3NlckNvZGVCdW5kbGVPcHRpb25zKG9wdGlvbnMsIHRhcmdldCwgY29kZUJ1bmRsZUNhY2hlKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIC8vIEdsb2JhbCBTdHlsZXNoZWV0c1xuICAgIGlmIChvcHRpb25zLmdsb2JhbFN0eWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGluaXRpYWwgb2YgW3RydWUsIGZhbHNlXSkge1xuICAgICAgICBjb25zdCBidW5kbGVPcHRpb25zID0gY3JlYXRlR2xvYmFsU3R5bGVzQnVuZGxlT3B0aW9ucyhcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBpbml0aWFsLFxuICAgICAgICAgIGNvZGVCdW5kbGVDYWNoZT8ubG9hZFJlc3VsdENhY2hlLFxuICAgICAgICApO1xuICAgICAgICBpZiAoYnVuZGxlT3B0aW9ucykge1xuICAgICAgICAgIGJ1bmRsZXJDb250ZXh0cy5wdXNoKFxuICAgICAgICAgICAgbmV3IEJ1bmRsZXJDb250ZXh0KHdvcmtzcGFjZVJvb3QsICEhb3B0aW9ucy53YXRjaCwgYnVuZGxlT3B0aW9ucywgKCkgPT4gaW5pdGlhbCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdsb2JhbCBTY3JpcHRzXG4gICAgaWYgKG9wdGlvbnMuZ2xvYmFsU2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGluaXRpYWwgb2YgW3RydWUsIGZhbHNlXSkge1xuICAgICAgICBjb25zdCBidW5kbGVPcHRpb25zID0gY3JlYXRlR2xvYmFsU2NyaXB0c0J1bmRsZU9wdGlvbnMob3B0aW9ucywgaW5pdGlhbCk7XG4gICAgICAgIGlmIChidW5kbGVPcHRpb25zKSB7XG4gICAgICAgICAgYnVuZGxlckNvbnRleHRzLnB1c2goXG4gICAgICAgICAgICBuZXcgQnVuZGxlckNvbnRleHQod29ya3NwYWNlUm9vdCwgISFvcHRpb25zLndhdGNoLCBidW5kbGVPcHRpb25zLCAoKSA9PiBpbml0aWFsKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2VydmVyIGFwcGxpY2F0aW9uIGNvZGVcbiAgICAvLyBTa2lwIHNlcnZlciBidWlsZCB3aGVuIG5vbiBvZiB0aGUgZmVhdHVyZXMgYXJlIGVuYWJsZWQuXG4gICAgaWYgKHNlcnZlckVudHJ5UG9pbnQgJiYgKHByZXJlbmRlck9wdGlvbnMgfHwgYXBwU2hlbGxPcHRpb25zIHx8IHNzck9wdGlvbnMpKSB7XG4gICAgICBjb25zdCBub2RlVGFyZ2V0cyA9IGdldFN1cHBvcnRlZE5vZGVUYXJnZXRzKCk7XG4gICAgICBidW5kbGVyQ29udGV4dHMucHVzaChcbiAgICAgICAgbmV3IEJ1bmRsZXJDb250ZXh0KFxuICAgICAgICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgICAgICAgISFvcHRpb25zLndhdGNoLFxuICAgICAgICAgIGNyZWF0ZVNlcnZlckNvZGVCdW5kbGVPcHRpb25zKG9wdGlvbnMsIFsuLi50YXJnZXQsIC4uLm5vZGVUYXJnZXRzXSwgY29kZUJ1bmRsZUNhY2hlKSxcbiAgICAgICAgICAoKSA9PiBmYWxzZSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVuZGxpbmdSZXN1bHQgPSBhd2FpdCBCdW5kbGVyQ29udGV4dC5idW5kbGVBbGwoYnVuZGxlckNvbnRleHRzKTtcblxuICAvLyBMb2cgYWxsIHdhcm5pbmdzIGFuZCBlcnJvcnMgZ2VuZXJhdGVkIGR1cmluZyBidW5kbGluZ1xuICBhd2FpdCBsb2dNZXNzYWdlcyhjb250ZXh0LCBidW5kbGluZ1Jlc3VsdCk7XG5cbiAgY29uc3QgZXhlY3V0aW9uUmVzdWx0ID0gbmV3IEV4ZWN1dGlvblJlc3VsdChidW5kbGVyQ29udGV4dHMsIGNvZGVCdW5kbGVDYWNoZSk7XG5cbiAgLy8gUmV0dXJuIGlmIHRoZSBidW5kbGluZyBoYXMgZXJyb3JzXG4gIGlmIChidW5kbGluZ1Jlc3VsdC5lcnJvcnMpIHtcbiAgICByZXR1cm4gZXhlY3V0aW9uUmVzdWx0O1xuICB9XG5cbiAgY29uc3QgeyBtZXRhZmlsZSwgaW5pdGlhbEZpbGVzLCBvdXRwdXRGaWxlcyB9ID0gYnVuZGxpbmdSZXN1bHQ7XG5cbiAgZXhlY3V0aW9uUmVzdWx0Lm91dHB1dEZpbGVzLnB1c2goLi4ub3V0cHV0RmlsZXMpO1xuXG4gIC8vIENoZWNrIG1ldGFmaWxlIGZvciBDb21tb25KUyBtb2R1bGUgdXNhZ2UgaWYgb3B0aW1pemluZyBzY3JpcHRzXG4gIGlmIChvcHRpbWl6YXRpb25PcHRpb25zLnNjcmlwdHMpIHtcbiAgICBjb25zdCBtZXNzYWdlcyA9IGNoZWNrQ29tbW9uSlNNb2R1bGVzKG1ldGFmaWxlLCBvcHRpb25zLmFsbG93ZWRDb21tb25Kc0RlcGVuZGVuY2llcyk7XG4gICAgYXdhaXQgbG9nTWVzc2FnZXMoY29udGV4dCwgeyB3YXJuaW5nczogbWVzc2FnZXMgfSk7XG4gIH1cblxuICAvLyBDb3B5IGFzc2V0c1xuICBpZiAoYXNzZXRzKSB7XG4gICAgLy8gVGhlIHdlYnBhY2sgY29weSBhc3NldHMgaGVscGVyIGlzIHVzZWQgd2l0aCBubyBiYXNlIHBhdGhzIGRlZmluZWQuIFRoaXMgcHJldmVudHMgdGhlIGhlbHBlclxuICAgIC8vIGZyb20gZGlyZWN0bHkgd3JpdGluZyB0byBkaXNrLiBUaGlzIHNob3VsZCBldmVudHVhbGx5IGJlIHJlcGxhY2VkIHdpdGggYSBtb3JlIG9wdGltaXplZCBoZWxwZXIuXG4gICAgZXhlY3V0aW9uUmVzdWx0LmFkZEFzc2V0cyhhd2FpdCBjb3B5QXNzZXRzKGFzc2V0cywgW10sIHdvcmtzcGFjZVJvb3QpKTtcbiAgfVxuXG4gIC8vIEV4dHJhY3QgYW5kIHdyaXRlIGxpY2Vuc2VzIGZvciB1c2VkIHBhY2thZ2VzXG4gIGlmIChvcHRpb25zLmV4dHJhY3RMaWNlbnNlcykge1xuICAgIGV4ZWN1dGlvblJlc3VsdC5hZGRPdXRwdXRGaWxlKFxuICAgICAgJzNyZHBhcnR5bGljZW5zZXMudHh0JyxcbiAgICAgIGF3YWl0IGV4dHJhY3RMaWNlbnNlcyhtZXRhZmlsZSwgd29ya3NwYWNlUm9vdCksXG4gICAgICBCdWlsZE91dHB1dEZpbGVUeXBlLlJvb3QsXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFuYWx5emUgZmlsZXMgZm9yIGJ1bmRsZSBidWRnZXQgZmFpbHVyZXMgaWYgcHJlc2VudFxuICBsZXQgYnVkZ2V0RmFpbHVyZXM7XG4gIGlmIChvcHRpb25zLmJ1ZGdldHMpIHtcbiAgICBjb25zdCBjb21wYXRTdGF0cyA9IGdlbmVyYXRlQnVkZ2V0U3RhdHMobWV0YWZpbGUsIGluaXRpYWxGaWxlcyk7XG4gICAgYnVkZ2V0RmFpbHVyZXMgPSBbLi4uY2hlY2tCdWRnZXRzKG9wdGlvbnMuYnVkZ2V0cywgY29tcGF0U3RhdHMsIHRydWUpXTtcbiAgICBmb3IgKGNvbnN0IHsgc2V2ZXJpdHksIG1lc3NhZ2UgfSBvZiBidWRnZXRGYWlsdXJlcykge1xuICAgICAgaWYgKHNldmVyaXR5ID09PSAnZXJyb3InKSB7XG4gICAgICAgIGNvbnRleHQubG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5sb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDYWxjdWxhdGUgZXN0aW1hdGVkIHRyYW5zZmVyIHNpemUgaWYgc2NyaXB0cyBhcmUgb3B0aW1pemVkXG4gIGxldCBlc3RpbWF0ZWRUcmFuc2ZlclNpemVzO1xuICBpZiAob3B0aW1pemF0aW9uT3B0aW9ucy5zY3JpcHRzIHx8IG9wdGltaXphdGlvbk9wdGlvbnMuc3R5bGVzLm1pbmlmeSkge1xuICAgIGVzdGltYXRlZFRyYW5zZmVyU2l6ZXMgPSBhd2FpdCBjYWxjdWxhdGVFc3RpbWF0ZWRUcmFuc2ZlclNpemVzKGV4ZWN1dGlvblJlc3VsdC5vdXRwdXRGaWxlcyk7XG4gIH1cblxuICAvLyBQZXJmb3JtIGkxOG4gdHJhbnNsYXRpb24gaW5saW5pbmcgaWYgZW5hYmxlZFxuICBpZiAoaTE4bk9wdGlvbnMuc2hvdWxkSW5saW5lKSB7XG4gICAgY29uc3QgeyBlcnJvcnMsIHdhcm5pbmdzIH0gPSBhd2FpdCBpbmxpbmVJMThuKG9wdGlvbnMsIGV4ZWN1dGlvblJlc3VsdCwgaW5pdGlhbEZpbGVzKTtcbiAgICBwcmludFdhcm5pbmdzQW5kRXJyb3JzVG9Db25zb2xlKGNvbnRleHQsIHdhcm5pbmdzLCBlcnJvcnMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHsgZXJyb3JzLCB3YXJuaW5ncywgYWRkaXRpb25hbEFzc2V0cywgYWRkaXRpb25hbE91dHB1dEZpbGVzIH0gPVxuICAgICAgYXdhaXQgZXhlY3V0ZVBvc3RCdW5kbGVTdGVwcyhcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgZXhlY3V0aW9uUmVzdWx0Lm91dHB1dEZpbGVzLFxuICAgICAgICBleGVjdXRpb25SZXN1bHQuYXNzZXRGaWxlcyxcbiAgICAgICAgaW5pdGlhbEZpbGVzLFxuICAgICAgICAvLyBTZXQgbGFuZyBhdHRyaWJ1dGUgdG8gdGhlIGRlZmluZWQgc291cmNlIGxvY2FsZSBpZiBwcmVzZW50XG4gICAgICAgIGkxOG5PcHRpb25zLmhhc0RlZmluZWRTb3VyY2VMb2NhbGUgPyBpMThuT3B0aW9ucy5zb3VyY2VMb2NhbGUgOiB1bmRlZmluZWQsXG4gICAgICApO1xuXG4gICAgZXhlY3V0aW9uUmVzdWx0Lm91dHB1dEZpbGVzLnB1c2goLi4uYWRkaXRpb25hbE91dHB1dEZpbGVzKTtcbiAgICBleGVjdXRpb25SZXN1bHQuYXNzZXRGaWxlcy5wdXNoKC4uLmFkZGl0aW9uYWxBc3NldHMpO1xuICAgIHByaW50V2FybmluZ3NBbmRFcnJvcnNUb0NvbnNvbGUoY29udGV4dCwgd2FybmluZ3MsIGVycm9ycyk7XG4gIH1cblxuICBsb2dCdWlsZFN0YXRzKGNvbnRleHQsIG1ldGFmaWxlLCBpbml0aWFsRmlsZXMsIGJ1ZGdldEZhaWx1cmVzLCBlc3RpbWF0ZWRUcmFuc2ZlclNpemVzKTtcblxuICBjb25zdCBidWlsZFRpbWUgPSBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdGFydFRpbWUpIC8gMTAgKiogOTtcbiAgY29udGV4dC5sb2dnZXIuaW5mbyhgQXBwbGljYXRpb24gYnVuZGxlIGdlbmVyYXRpb24gY29tcGxldGUuIFske2J1aWxkVGltZS50b0ZpeGVkKDMpfSBzZWNvbmRzXWApO1xuICAvLyBXcml0ZSBtZXRhZmlsZSBpZiBzdGF0cyBvcHRpb24gaXMgZW5hYmxlZFxuICBpZiAob3B0aW9ucy5zdGF0cykge1xuICAgIGV4ZWN1dGlvblJlc3VsdC5hZGRPdXRwdXRGaWxlKFxuICAgICAgJ3N0YXRzLmpzb24nLFxuICAgICAgSlNPTi5zdHJpbmdpZnkobWV0YWZpbGUsIG51bGwsIDIpLFxuICAgICAgQnVpbGRPdXRwdXRGaWxlVHlwZS5Sb290LFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0aW9uUmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmdzQW5kRXJyb3JzVG9Db25zb2xlKFxuICBjb250ZXh0OiBCdWlsZGVyQ29udGV4dCxcbiAgd2FybmluZ3M6IHN0cmluZ1tdLFxuICBlcnJvcnM6IHN0cmluZ1tdLFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZXJyb3Igb2YgZXJyb3JzKSB7XG4gICAgY29udGV4dC5sb2dnZXIuZXJyb3IoZXJyb3IpO1xuICB9XG4gIGZvciAoY29uc3Qgd2FybmluZyBvZiB3YXJuaW5ncykge1xuICAgIGNvbnRleHQubG9nZ2VyLndhcm4od2FybmluZyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { BuildOutputFile, InitialFileRecord } from '../../tools/esbuild/bundler-context';
9
+ import { BuildOutputAsset } from '../../tools/esbuild/bundler-execution-result';
10
+ import { NormalizedApplicationBuildOptions } from './options';
11
+ /**
12
+ * Run additional builds steps including SSG, AppShell, Index HTML file and Service worker generation.
13
+ * @param options The normalized application builder options used to create the build.
14
+ * @param outputFiles The output files of an executed build.
15
+ * @param assetFiles The assets of an executed build.
16
+ * @param initialFiles A map containing initial file information for the executed build.
17
+ * @param locale A language locale to insert in the index.html.
18
+ */
19
+ export declare function executePostBundleSteps(options: NormalizedApplicationBuildOptions, outputFiles: BuildOutputFile[], assetFiles: BuildOutputAsset[], initialFiles: Map<string, InitialFileRecord>, locale: string | undefined): Promise<{
20
+ errors: string[];
21
+ warnings: string[];
22
+ additionalOutputFiles: BuildOutputFile[];
23
+ additionalAssets: BuildOutputAsset[];
24
+ }>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.executePostBundleSteps = void 0;
14
+ const node_assert_1 = __importDefault(require("node:assert"));
15
+ const bundler_context_1 = require("../../tools/esbuild/bundler-context");
16
+ const index_html_generator_1 = require("../../tools/esbuild/index-html-generator");
17
+ const utils_1 = require("../../tools/esbuild/utils");
18
+ const environment_options_1 = require("../../utils/environment-options");
19
+ const prerender_1 = require("../../utils/server-rendering/prerender");
20
+ const service_worker_1 = require("../../utils/service-worker");
21
+ /**
22
+ * Run additional builds steps including SSG, AppShell, Index HTML file and Service worker generation.
23
+ * @param options The normalized application builder options used to create the build.
24
+ * @param outputFiles The output files of an executed build.
25
+ * @param assetFiles The assets of an executed build.
26
+ * @param initialFiles A map containing initial file information for the executed build.
27
+ * @param locale A language locale to insert in the index.html.
28
+ */
29
+ async function executePostBundleSteps(options, outputFiles, assetFiles, initialFiles, locale) {
30
+ const additionalAssets = [];
31
+ const additionalOutputFiles = [];
32
+ const allErrors = [];
33
+ const allWarnings = [];
34
+ const { serviceWorker, indexHtmlOptions, optimizationOptions, ssrOptions, prerenderOptions, appShellOptions, workspaceRoot, verbose, } = options;
35
+ /**
36
+ * Index HTML content without CSS inlining to be used for server rendering (AppShell, SSG and SSR).
37
+ *
38
+ * NOTE: we don't perform critical CSS inlining as this will be done during server rendering.
39
+ */
40
+ let indexContentOutputNoCssInlining;
41
+ // Generate index HTML file
42
+ // If localization is enabled, index generation is handled in the inlining process.
43
+ // NOTE: Localization with SSR is not currently supported.
44
+ if (indexHtmlOptions) {
45
+ const { content, contentWithoutCriticalCssInlined, errors, warnings } = await (0, index_html_generator_1.generateIndexHtml)(initialFiles, outputFiles, {
46
+ ...options,
47
+ optimizationOptions,
48
+ }, locale);
49
+ indexContentOutputNoCssInlining = contentWithoutCriticalCssInlined;
50
+ allErrors.push(...errors);
51
+ allWarnings.push(...warnings);
52
+ additionalOutputFiles.push((0, utils_1.createOutputFileFromText)(indexHtmlOptions.output, content, bundler_context_1.BuildOutputFileType.Browser));
53
+ if (ssrOptions) {
54
+ additionalOutputFiles.push((0, utils_1.createOutputFileFromText)('index.server.html', contentWithoutCriticalCssInlined, bundler_context_1.BuildOutputFileType.Server));
55
+ }
56
+ }
57
+ // Pre-render (SSG) and App-shell
58
+ // If localization is enabled, prerendering is handled in the inlining process.
59
+ if (prerenderOptions || appShellOptions) {
60
+ (0, node_assert_1.default)(indexContentOutputNoCssInlining, 'The "index" option is required when using the "ssg" or "appShell" options.');
61
+ const { output, warnings, errors } = await (0, prerender_1.prerenderPages)(workspaceRoot, appShellOptions, prerenderOptions, outputFiles, indexContentOutputNoCssInlining, optimizationOptions.styles.inlineCritical, environment_options_1.maxWorkers, verbose);
62
+ allErrors.push(...errors);
63
+ allWarnings.push(...warnings);
64
+ for (const [path, content] of Object.entries(output)) {
65
+ additionalOutputFiles.push((0, utils_1.createOutputFileFromText)(path, content, bundler_context_1.BuildOutputFileType.Browser));
66
+ }
67
+ }
68
+ // Augment the application with service worker support
69
+ // If localization is enabled, service worker is handled in the inlining process.
70
+ if (serviceWorker) {
71
+ try {
72
+ const serviceWorkerResult = await (0, service_worker_1.augmentAppWithServiceWorkerEsbuild)(workspaceRoot, serviceWorker, options.baseHref || '/', outputFiles, assetFiles);
73
+ additionalOutputFiles.push((0, utils_1.createOutputFileFromText)('ngsw.json', serviceWorkerResult.manifest, bundler_context_1.BuildOutputFileType.Browser));
74
+ additionalAssets.push(...serviceWorkerResult.assetFiles);
75
+ }
76
+ catch (error) {
77
+ allErrors.push(error instanceof Error ? error.message : `${error}`);
78
+ }
79
+ }
80
+ return {
81
+ errors: allErrors,
82
+ warnings: allWarnings,
83
+ additionalAssets,
84
+ additionalOutputFiles,
85
+ };
86
+ }
87
+ exports.executePostBundleSteps = executePostBundleSteps;
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZS1wb3N0LWJ1bmRsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L2J1aWxkX2FuZ3VsYXIvc3JjL2J1aWxkZXJzL2FwcGxpY2F0aW9uL2V4ZWN1dGUtcG9zdC1idW5kbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7Ozs7O0FBRUgsOERBQWlDO0FBQ2pDLHlFQUk2QztBQUU3QyxtRkFBNkU7QUFDN0UscURBQXFFO0FBQ3JFLHlFQUE2RDtBQUM3RCxzRUFBd0U7QUFDeEUsK0RBQWdGO0FBR2hGOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLE9BQTBDLEVBQzFDLFdBQThCLEVBQzlCLFVBQThCLEVBQzlCLFlBQTRDLEVBQzVDLE1BQTBCO0lBTzFCLE1BQU0sZ0JBQWdCLEdBQXVCLEVBQUUsQ0FBQztJQUNoRCxNQUFNLHFCQUFxQixHQUFzQixFQUFFLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQy9CLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUVqQyxNQUFNLEVBQ0osYUFBYSxFQUNiLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsYUFBYSxFQUNiLE9BQU8sR0FDUixHQUFHLE9BQU8sQ0FBQztJQUVaOzs7O09BSUc7SUFDSCxJQUFJLCtCQUFtRCxDQUFDO0lBRXhELDJCQUEyQjtJQUMzQixtRkFBbUY7SUFDbkYsMERBQTBEO0lBQzFELElBQUksZ0JBQWdCLEVBQUU7UUFDcEIsTUFBTSxFQUFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxJQUFBLHdDQUFpQixFQUM3RixZQUFZLEVBQ1osV0FBVyxFQUNYO1lBQ0UsR0FBRyxPQUFPO1lBQ1YsbUJBQW1CO1NBQ3BCLEVBQ0QsTUFBTSxDQUNQLENBQUM7UUFFRiwrQkFBK0IsR0FBRyxnQ0FBZ0MsQ0FBQztRQUNuRSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDMUIsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBRTlCLHFCQUFxQixDQUFDLElBQUksQ0FDeEIsSUFBQSxnQ0FBd0IsRUFBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLHFDQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUN4RixDQUFDO1FBRUYsSUFBSSxVQUFVLEVBQUU7WUFDZCxxQkFBcUIsQ0FBQyxJQUFJLENBQ3hCLElBQUEsZ0NBQXdCLEVBQ3RCLG1CQUFtQixFQUNuQixnQ0FBZ0MsRUFDaEMscUNBQW1CLENBQUMsTUFBTSxDQUMzQixDQUNGLENBQUM7U0FDSDtLQUNGO0lBRUQsaUNBQWlDO0lBQ2pDLCtFQUErRTtJQUMvRSxJQUFJLGdCQUFnQixJQUFJLGVBQWUsRUFBRTtRQUN2QyxJQUFBLHFCQUFNLEVBQ0osK0JBQStCLEVBQy9CLDRFQUE0RSxDQUM3RSxDQUFDO1FBRUYsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLDBCQUFjLEVBQ3ZELGFBQWEsRUFDYixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCwrQkFBK0IsRUFDL0IsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFDekMsZ0NBQVUsRUFDVixPQUFPLENBQ1IsQ0FBQztRQUVGLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUMxQixXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFFOUIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDcEQscUJBQXFCLENBQUMsSUFBSSxDQUN4QixJQUFBLGdDQUF3QixFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUscUNBQW1CLENBQUMsT0FBTyxDQUFDLENBQ3JFLENBQUM7U0FDSDtLQUNGO0lBRUQsc0RBQXNEO0lBQ3RELGlGQUFpRjtJQUNqRixJQUFJLGFBQWEsRUFBRTtRQUNqQixJQUFJO1lBQ0YsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLElBQUEsbURBQWtDLEVBQ2xFLGFBQWEsRUFDYixhQUFhLEVBQ2IsT0FBTyxDQUFDLFFBQVEsSUFBSSxHQUFHLEVBQ3ZCLFdBQVcsRUFDWCxVQUFVLENBQ1gsQ0FBQztZQUNGLHFCQUFxQixDQUFDLElBQUksQ0FDeEIsSUFBQSxnQ0FBd0IsRUFDdEIsV0FBVyxFQUNYLG1CQUFtQixDQUFDLFFBQVEsRUFDNUIscUNBQW1CLENBQUMsT0FBTyxDQUM1QixDQUNGLENBQUM7WUFDRixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMxRDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDckU7S0FDRjtJQUVELE9BQU87UUFDTCxNQUFNLEVBQUUsU0FBUztRQUNqQixRQUFRLEVBQUUsV0FBVztRQUNyQixnQkFBZ0I7UUFDaEIscUJBQXFCO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBL0hELHdEQStIQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCB7XG4gIEJ1aWxkT3V0cHV0RmlsZSxcbiAgQnVpbGRPdXRwdXRGaWxlVHlwZSxcbiAgSW5pdGlhbEZpbGVSZWNvcmQsXG59IGZyb20gJy4uLy4uL3Rvb2xzL2VzYnVpbGQvYnVuZGxlci1jb250ZXh0JztcbmltcG9ydCB7IEJ1aWxkT3V0cHV0QXNzZXQgfSBmcm9tICcuLi8uLi90b29scy9lc2J1aWxkL2J1bmRsZXItZXhlY3V0aW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBnZW5lcmF0ZUluZGV4SHRtbCB9IGZyb20gJy4uLy4uL3Rvb2xzL2VzYnVpbGQvaW5kZXgtaHRtbC1nZW5lcmF0b3InO1xuaW1wb3J0IHsgY3JlYXRlT3V0cHV0RmlsZUZyb21UZXh0IH0gZnJvbSAnLi4vLi4vdG9vbHMvZXNidWlsZC91dGlscyc7XG5pbXBvcnQgeyBtYXhXb3JrZXJzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZW52aXJvbm1lbnQtb3B0aW9ucyc7XG5pbXBvcnQgeyBwcmVyZW5kZXJQYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL3NlcnZlci1yZW5kZXJpbmcvcHJlcmVuZGVyJztcbmltcG9ydCB7IGF1Z21lbnRBcHBXaXRoU2VydmljZVdvcmtlckVzYnVpbGQgfSBmcm9tICcuLi8uLi91dGlscy9zZXJ2aWNlLXdvcmtlcic7XG5pbXBvcnQgeyBOb3JtYWxpemVkQXBwbGljYXRpb25CdWlsZE9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuXG4vKipcbiAqIFJ1biBhZGRpdGlvbmFsIGJ1aWxkcyBzdGVwcyBpbmNsdWRpbmcgU1NHLCBBcHBTaGVsbCwgSW5kZXggSFRNTCBmaWxlIGFuZCBTZXJ2aWNlIHdvcmtlciBnZW5lcmF0aW9uLlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIG5vcm1hbGl6ZWQgYXBwbGljYXRpb24gYnVpbGRlciBvcHRpb25zIHVzZWQgdG8gY3JlYXRlIHRoZSBidWlsZC5cbiAqIEBwYXJhbSBvdXRwdXRGaWxlcyBUaGUgb3V0cHV0IGZpbGVzIG9mIGFuIGV4ZWN1dGVkIGJ1aWxkLlxuICogQHBhcmFtIGFzc2V0RmlsZXMgVGhlIGFzc2V0cyBvZiBhbiBleGVjdXRlZCBidWlsZC5cbiAqIEBwYXJhbSBpbml0aWFsRmlsZXMgQSBtYXAgY29udGFpbmluZyBpbml0aWFsIGZpbGUgaW5mb3JtYXRpb24gZm9yIHRoZSBleGVjdXRlZCBidWlsZC5cbiAqIEBwYXJhbSBsb2NhbGUgQSBsYW5ndWFnZSBsb2NhbGUgdG8gaW5zZXJ0IGluIHRoZSBpbmRleC5odG1sLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVBvc3RCdW5kbGVTdGVwcyhcbiAgb3B0aW9uczogTm9ybWFsaXplZEFwcGxpY2F0aW9uQnVpbGRPcHRpb25zLFxuICBvdXRwdXRGaWxlczogQnVpbGRPdXRwdXRGaWxlW10sXG4gIGFzc2V0RmlsZXM6IEJ1aWxkT3V0cHV0QXNzZXRbXSxcbiAgaW5pdGlhbEZpbGVzOiBNYXA8c3RyaW5nLCBJbml0aWFsRmlsZVJlY29yZD4sXG4gIGxvY2FsZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTx7XG4gIGVycm9yczogc3RyaW5nW107XG4gIHdhcm5pbmdzOiBzdHJpbmdbXTtcbiAgYWRkaXRpb25hbE91dHB1dEZpbGVzOiBCdWlsZE91dHB1dEZpbGVbXTtcbiAgYWRkaXRpb25hbEFzc2V0czogQnVpbGRPdXRwdXRBc3NldFtdO1xufT4ge1xuICBjb25zdCBhZGRpdGlvbmFsQXNzZXRzOiBCdWlsZE91dHB1dEFzc2V0W10gPSBbXTtcbiAgY29uc3QgYWRkaXRpb25hbE91dHB1dEZpbGVzOiBCdWlsZE91dHB1dEZpbGVbXSA9IFtdO1xuICBjb25zdCBhbGxFcnJvcnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFsbFdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0IHtcbiAgICBzZXJ2aWNlV29ya2VyLFxuICAgIGluZGV4SHRtbE9wdGlvbnMsXG4gICAgb3B0aW1pemF0aW9uT3B0aW9ucyxcbiAgICBzc3JPcHRpb25zLFxuICAgIHByZXJlbmRlck9wdGlvbnMsXG4gICAgYXBwU2hlbGxPcHRpb25zLFxuICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgdmVyYm9zZSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEluZGV4IEhUTUwgY29udGVudCB3aXRob3V0IENTUyBpbmxpbmluZyB0byBiZSB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nIChBcHBTaGVsbCwgU1NHIGFuZCBTU1IpLlxuICAgKlxuICAgKiBOT1RFOiB3ZSBkb24ndCBwZXJmb3JtIGNyaXRpY2FsIENTUyBpbmxpbmluZyBhcyB0aGlzIHdpbGwgYmUgZG9uZSBkdXJpbmcgc2VydmVyIHJlbmRlcmluZy5cbiAgICovXG4gIGxldCBpbmRleENvbnRlbnRPdXRwdXROb0Nzc0lubGluaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gR2VuZXJhdGUgaW5kZXggSFRNTCBmaWxlXG4gIC8vIElmIGxvY2FsaXphdGlvbiBpcyBlbmFibGVkLCBpbmRleCBnZW5lcmF0aW9uIGlzIGhhbmRsZWQgaW4gdGhlIGlubGluaW5nIHByb2Nlc3MuXG4gIC8vIE5PVEU6IExvY2FsaXphdGlvbiB3aXRoIFNTUiBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAgaWYgKGluZGV4SHRtbE9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGNvbnRlbnQsIGNvbnRlbnRXaXRob3V0Q3JpdGljYWxDc3NJbmxpbmVkLCBlcnJvcnMsIHdhcm5pbmdzIH0gPSBhd2FpdCBnZW5lcmF0ZUluZGV4SHRtbChcbiAgICAgIGluaXRpYWxGaWxlcyxcbiAgICAgIG91dHB1dEZpbGVzLFxuICAgICAge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBvcHRpbWl6YXRpb25PcHRpb25zLFxuICAgICAgfSxcbiAgICAgIGxvY2FsZSxcbiAgICApO1xuXG4gICAgaW5kZXhDb250ZW50T3V0cHV0Tm9Dc3NJbmxpbmluZyA9IGNvbnRlbnRXaXRob3V0Q3JpdGljYWxDc3NJbmxpbmVkO1xuICAgIGFsbEVycm9ycy5wdXNoKC4uLmVycm9ycyk7XG4gICAgYWxsV2FybmluZ3MucHVzaCguLi53YXJuaW5ncyk7XG5cbiAgICBhZGRpdGlvbmFsT3V0cHV0RmlsZXMucHVzaChcbiAgICAgIGNyZWF0ZU91dHB1dEZpbGVGcm9tVGV4dChpbmRleEh0bWxPcHRpb25zLm91dHB1dCwgY29udGVudCwgQnVpbGRPdXRwdXRGaWxlVHlwZS5Ccm93c2VyKSxcbiAgICApO1xuXG4gICAgaWYgKHNzck9wdGlvbnMpIHtcbiAgICAgIGFkZGl0aW9uYWxPdXRwdXRGaWxlcy5wdXNoKFxuICAgICAgICBjcmVhdGVPdXRwdXRGaWxlRnJvbVRleHQoXG4gICAgICAgICAgJ2luZGV4LnNlcnZlci5odG1sJyxcbiAgICAgICAgICBjb250ZW50V2l0aG91dENyaXRpY2FsQ3NzSW5saW5lZCxcbiAgICAgICAgICBCdWlsZE91dHB1dEZpbGVUeXBlLlNlcnZlcixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJlLXJlbmRlciAoU1NHKSBhbmQgQXBwLXNoZWxsXG4gIC8vIElmIGxvY2FsaXphdGlvbiBpcyBlbmFibGVkLCBwcmVyZW5kZXJpbmcgaXMgaGFuZGxlZCBpbiB0aGUgaW5saW5pbmcgcHJvY2Vzcy5cbiAgaWYgKHByZXJlbmRlck9wdGlvbnMgfHwgYXBwU2hlbGxPcHRpb25zKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgaW5kZXhDb250ZW50T3V0cHV0Tm9Dc3NJbmxpbmluZyxcbiAgICAgICdUaGUgXCJpbmRleFwiIG9wdGlvbiBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBcInNzZ1wiIG9yIFwiYXBwU2hlbGxcIiBvcHRpb25zLicsXG4gICAgKTtcblxuICAgIGNvbnN0IHsgb3V0cHV0LCB3YXJuaW5ncywgZXJyb3JzIH0gPSBhd2FpdCBwcmVyZW5kZXJQYWdlcyhcbiAgICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgICBhcHBTaGVsbE9wdGlvbnMsXG4gICAgICBwcmVyZW5kZXJPcHRpb25zLFxuICAgICAgb3V0cHV0RmlsZXMsXG4gICAgICBpbmRleENvbnRlbnRPdXRwdXROb0Nzc0lubGluaW5nLFxuICAgICAgb3B0aW1pemF0aW9uT3B0aW9ucy5zdHlsZXMuaW5saW5lQ3JpdGljYWwsXG4gICAgICBtYXhXb3JrZXJzLFxuICAgICAgdmVyYm9zZSxcbiAgICApO1xuXG4gICAgYWxsRXJyb3JzLnB1c2goLi4uZXJyb3JzKTtcbiAgICBhbGxXYXJuaW5ncy5wdXNoKC4uLndhcm5pbmdzKTtcblxuICAgIGZvciAoY29uc3QgW3BhdGgsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dCkpIHtcbiAgICAgIGFkZGl0aW9uYWxPdXRwdXRGaWxlcy5wdXNoKFxuICAgICAgICBjcmVhdGVPdXRwdXRGaWxlRnJvbVRleHQocGF0aCwgY29udGVudCwgQnVpbGRPdXRwdXRGaWxlVHlwZS5Ccm93c2VyKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXVnbWVudCB0aGUgYXBwbGljYXRpb24gd2l0aCBzZXJ2aWNlIHdvcmtlciBzdXBwb3J0XG4gIC8vIElmIGxvY2FsaXphdGlvbiBpcyBlbmFibGVkLCBzZXJ2aWNlIHdvcmtlciBpcyBoYW5kbGVkIGluIHRoZSBpbmxpbmluZyBwcm9jZXNzLlxuICBpZiAoc2VydmljZVdvcmtlcikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXJ2aWNlV29ya2VyUmVzdWx0ID0gYXdhaXQgYXVnbWVudEFwcFdpdGhTZXJ2aWNlV29ya2VyRXNidWlsZChcbiAgICAgICAgd29ya3NwYWNlUm9vdCxcbiAgICAgICAgc2VydmljZVdvcmtlcixcbiAgICAgICAgb3B0aW9ucy5iYXNlSHJlZiB8fCAnLycsXG4gICAgICAgIG91dHB1dEZpbGVzLFxuICAgICAgICBhc3NldEZpbGVzLFxuICAgICAgKTtcbiAgICAgIGFkZGl0aW9uYWxPdXRwdXRGaWxlcy5wdXNoKFxuICAgICAgICBjcmVhdGVPdXRwdXRGaWxlRnJvbVRleHQoXG4gICAgICAgICAgJ25nc3cuanNvbicsXG4gICAgICAgICAgc2VydmljZVdvcmtlclJlc3VsdC5tYW5pZmVzdCxcbiAgICAgICAgICBCdWlsZE91dHB1dEZpbGVUeXBlLkJyb3dzZXIsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgYWRkaXRpb25hbEFzc2V0cy5wdXNoKC4uLnNlcnZpY2VXb3JrZXJSZXN1bHQuYXNzZXRGaWxlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGFsbEVycm9ycy5wdXNoKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogYCR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlcnJvcnM6IGFsbEVycm9ycyxcbiAgICB3YXJuaW5nczogYWxsV2FybmluZ3MsXG4gICAgYWRkaXRpb25hbEFzc2V0cyxcbiAgICBhZGRpdGlvbmFsT3V0cHV0RmlsZXMsXG4gIH07XG59XG4iXX0=