@angular-devkit/build-angular 16.2.0-next.1 → 16.2.0-next.3

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 (45) hide show
  1. package/package.json +22 -21
  2. package/src/builders/app-shell/render-worker.js +6 -2
  3. package/src/builders/application/execute-build.js +40 -8
  4. package/src/builders/application/options.d.ts +14 -1
  5. package/src/builders/application/options.js +33 -3
  6. package/src/builders/application/schema.d.ts +62 -2
  7. package/src/builders/application/schema.js +1 -1
  8. package/src/builders/application/schema.json +62 -0
  9. package/src/builders/browser-esbuild/builder-status-warnings.d.ts +1 -1
  10. package/src/builders/browser-esbuild/builder-status-warnings.js +1 -1
  11. package/src/builders/browser-esbuild/schema.d.ts +17 -1
  12. package/src/builders/browser-esbuild/schema.js +1 -1
  13. package/src/builders/browser-esbuild/schema.json +1 -0
  14. package/src/builders/dev-server/builder.js +3 -2
  15. package/src/builders/dev-server/vite-server.d.ts +1 -1
  16. package/src/builders/dev-server/vite-server.js +82 -37
  17. package/src/builders/jest/index.js +2 -2
  18. package/src/tools/babel/plugins/adjust-typescript-enums.js +21 -31
  19. package/src/tools/babel/presets/application.d.ts +1 -0
  20. package/src/tools/babel/presets/application.js +43 -41
  21. package/src/tools/babel/webpack-loader.d.ts +0 -1
  22. package/src/tools/babel/webpack-loader.js +3 -23
  23. package/src/tools/esbuild/angular/angular-host.js +5 -2
  24. package/src/tools/esbuild/angular/compilation/angular-compilation.js +2 -1
  25. package/src/tools/esbuild/application-code-bundle.js +58 -24
  26. package/src/tools/esbuild/index-html-generator.d.ts +6 -2
  27. package/src/tools/esbuild/index-html-generator.js +41 -13
  28. package/src/tools/esbuild/javascript-transformer-worker.js +25 -6
  29. package/src/tools/esbuild/stylesheets/sass-language.js +58 -28
  30. package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.d.ts +10 -0
  31. package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.js +29 -14
  32. package/src/tools/sass/lexer.d.ts +29 -0
  33. package/src/tools/sass/lexer.js +248 -0
  34. package/src/tools/sass/rebasing-importer.d.ts +5 -2
  35. package/src/tools/sass/rebasing-importer.js +47 -153
  36. package/src/tools/sass/sass-service.d.ts +5 -0
  37. package/src/tools/sass/sass-service.js +1 -1
  38. package/src/utils/server-rendering/esm-in-memory-file-loader.d.ts +11 -0
  39. package/src/utils/server-rendering/esm-in-memory-file-loader.js +53 -0
  40. package/src/utils/server-rendering/prerender.d.ts +22 -0
  41. package/src/utils/server-rendering/prerender.js +127 -0
  42. package/src/utils/server-rendering/render-page.d.ts +38 -0
  43. package/src/utils/server-rendering/render-page.js +63 -0
  44. package/src/utils/server-rendering/render-worker.d.ts +18 -0
  45. package/src/utils/server-rendering/render-worker.js +20 -0
@@ -16,12 +16,21 @@ export interface StylesheetPluginOptions {
16
16
  * If true, sourcemap processing is enabled; if false, disabled.
17
17
  */
18
18
  sourcemap: boolean;
19
+ /**
20
+ * An optional array of paths that will be searched for stylesheets if the default
21
+ * resolution process for the stylesheet language does not succeed.
22
+ */
19
23
  includePaths?: string[];
20
24
  /**
21
25
  * Optional component data for any inline styles from Component decorator `styles` fields.
22
26
  * The key is an internal angular resource URI and the value is the stylesheet content.
23
27
  */
24
28
  inlineComponentData?: Record<string, string>;
29
+ /**
30
+ * Optional information used to load and configure Tailwind CSS. If present, the postcss
31
+ * will be added to the stylesheet processing with the Tailwind plugin setup as provided
32
+ * by the configuration file.
33
+ */
25
34
  tailwindConfiguration?: {
26
35
  file: string;
27
36
  package: string;
@@ -36,6 +45,7 @@ export interface StylesheetLanguage {
36
45
  export declare class StylesheetPluginFactory {
37
46
  private readonly options;
38
47
  private readonly cache?;
48
+ private postcssProcessor?;
39
49
  constructor(options: StylesheetPluginOptions, cache?: LoadResultCache | undefined);
40
50
  create(language: Readonly<StylesheetLanguage>): Plugin;
41
51
  }
@@ -44,6 +44,12 @@ const load_result_cache_1 = require("../load-result-cache");
44
44
  * It is only imported and initialized if postcss is needed.
45
45
  */
46
46
  let postcss;
47
+ /**
48
+ * An array of keywords that indicate Tailwind CSS processing is required for a stylesheet.
49
+ *
50
+ * Based on https://tailwindcss.com/docs/functions-and-directives
51
+ */
52
+ const TAILWIND_KEYWORDS = ['@tailwind', '@layer', '@apply', '@config', 'theme(', 'screen('];
47
53
  class StylesheetPluginFactory {
48
54
  constructor(options, cache) {
49
55
  this.options = options;
@@ -58,31 +64,40 @@ class StylesheetPluginFactory {
58
64
  };
59
65
  }
60
66
  const { cache, options } = this;
67
+ const setupPostcss = async () => {
68
+ // Return already created processor if present
69
+ if (this.postcssProcessor) {
70
+ return this.postcssProcessor;
71
+ }
72
+ if (options.tailwindConfiguration) {
73
+ postcss ?? (postcss = (await Promise.resolve().then(() => __importStar(require('postcss')))).default);
74
+ const tailwind = await Promise.resolve(`${options.tailwindConfiguration.package}`).then(s => __importStar(require(s)));
75
+ this.postcssProcessor = postcss().use(tailwind.default({ config: options.tailwindConfiguration.file }));
76
+ }
77
+ return this.postcssProcessor;
78
+ };
61
79
  return {
62
80
  name: 'angular-' + language.name,
63
81
  async setup(build) {
64
- // Setup postcss if needed by tailwind
65
- // TODO: Move this into the plugin factory to avoid repeat setup per created plugin
66
- let postcssProcessor;
67
- if (options.tailwindConfiguration) {
68
- postcss ?? (postcss = (await Promise.resolve().then(() => __importStar(require('postcss')))).default);
69
- postcssProcessor = postcss();
70
- if (options.tailwindConfiguration) {
71
- const tailwind = await Promise.resolve(`${options.tailwindConfiguration.package}`).then(s => __importStar(require(s)));
72
- postcssProcessor.use(tailwind.default({ config: options.tailwindConfiguration.file }));
73
- }
74
- }
82
+ // Setup postcss if needed
83
+ const postcssProcessor = await setupPostcss();
75
84
  // Add a load callback to support inline Component styles
76
85
  build.onLoad({ filter: language.componentFilter, namespace: 'angular:styles/component' }, (0, load_result_cache_1.createCachedLoad)(cache, (args) => {
77
86
  const data = options.inlineComponentData?.[args.path];
78
87
  (0, node_assert_1.default)(typeof data === 'string', `component style name should always be found [${args.path}]`);
79
88
  const [format, , filename] = args.path.split(';', 3);
80
- return processStylesheet(language, data, filename, format, options, build, postcssProcessor);
89
+ // Only use postcss if Tailwind processing is required.
90
+ // NOTE: If postcss is used for more than just Tailwind in the future this check MUST
91
+ // be updated to account for the additional use.
92
+ // TODO: use better search algorithm for keywords
93
+ const needsPostcss = !!postcssProcessor && TAILWIND_KEYWORDS.some((keyword) => data.includes(keyword));
94
+ return processStylesheet(language, data, filename, format, options, build, needsPostcss ? postcssProcessor : undefined);
81
95
  }));
82
96
  // Add a load callback to support files from disk
83
97
  build.onLoad({ filter: language.fileFilter }, (0, load_result_cache_1.createCachedLoad)(cache, async (args) => {
84
98
  const data = await (0, promises_1.readFile)(args.path, 'utf-8');
85
- return processStylesheet(language, data, args.path, (0, node_path_1.extname)(args.path).toLowerCase().slice(1), options, build, postcssProcessor);
99
+ const needsPostcss = !!postcssProcessor && TAILWIND_KEYWORDS.some((keyword) => data.includes(keyword));
100
+ return processStylesheet(language, data, args.path, (0, node_path_1.extname)(args.path).toLowerCase().slice(1), options, build, needsPostcss ? postcssProcessor : undefined);
86
101
  }));
87
102
  },
88
103
  };
@@ -213,4 +228,4 @@ async function compileString(data, filename, postcssProcessor, options) {
213
228
  throw error;
214
229
  }
215
230
  }
216
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzaGVldC1wbHVnaW4tZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L2J1aWxkX2FuZ3VsYXIvc3JjL3Rvb2xzL2VzYnVpbGQvc3R5bGVzaGVldHMvc3R5bGVzaGVldC1wbHVnaW4tZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdILDBEQUE2QjtBQUM3Qiw4REFBaUM7QUFDakMsK0NBQTRDO0FBQzVDLHlDQUFvQztBQUNwQyw0REFBeUU7QUFFekU7OztHQUdHO0FBQ0gsSUFBSSxPQUF3RCxDQUFDO0FBb0M3RCxNQUFhLHVCQUF1QjtJQUNsQyxZQUNtQixPQUFnQyxFQUNoQyxLQUF1QjtRQUR2QixZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUNoQyxVQUFLLEdBQUwsS0FBSyxDQUFrQjtJQUN2QyxDQUFDO0lBRUosTUFBTSxDQUFDLFFBQXNDO1FBQzNDLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUU7WUFDNUQsT0FBTztnQkFDTCxJQUFJLEVBQUUsVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJO2dCQUNoQyxLQUFLLEtBQUksQ0FBQzthQUNYLENBQUM7U0FDSDtRQUVELE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRWhDLE9BQU87WUFDTCxJQUFJLEVBQUUsVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJO1lBQ2hDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSztnQkFDZixzQ0FBc0M7Z0JBQ3RDLG1GQUFtRjtnQkFDbkYsSUFBSSxnQkFBeUQsQ0FBQztnQkFDOUQsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUU7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SyxFQUFFO1FBQ2QsT0FBTyxLQUFQLE9BQU8sR0FBSyxDQUFDLHdEQUFhLFNBQVMsR0FBQyxDQUFDLENBQUMsT0FBTyxFQUFDO1FBQzlDLElBQUksS0FBSyxZQUFZLE9BQU8sQ0FBQyxjQUFjLEVBQUU7WUFDM0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFM0MsT0FBTztnQkFDTCxNQUFNLEVBQUU7b0JBQ047d0JBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNO3dCQUNsQixRQUFRLEVBQUU7NEJBQ1IsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJOzRCQUNoQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7NEJBQ2hCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQzs0QkFDeEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3lCQUN6RTtxQkFDRjtpQkFDRjthQUNGLENBQUM7U0FDSDtRQUVELE1BQU0sS0FBSyxDQUFDO0tBQ2I7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB0eXBlIHsgT25Mb2FkUmVzdWx0LCBQbHVnaW4sIFBsdWdpbkJ1aWxkIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgZ2xvYiBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgZXh0bmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBMb2FkUmVzdWx0Q2FjaGUsIGNyZWF0ZUNhY2hlZExvYWQgfSBmcm9tICcuLi9sb2FkLXJlc3VsdC1jYWNoZSc7XG5cbi8qKlxuICogVGhlIGxhenktbG9hZGVkIGluc3RhbmNlIG9mIHRoZSBwb3N0Y3NzIHN0eWxlc2hlZXQgcG9zdHByb2Nlc3Nvci5cbiAqIEl0IGlzIG9ubHkgaW1wb3J0ZWQgYW5kIGluaXRpYWxpemVkIGlmIHBvc3Rjc3MgaXMgbmVlZGVkLlxuICovXG5sZXQgcG9zdGNzczogdHlwZW9mIGltcG9ydCgncG9zdGNzcycpWydkZWZhdWx0J10gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBsdWdpbiBvcHRpb25zIHRvIHVzZSB3aGVuIHByb2Nlc3Npbmcgc3R5bGVzaGVldHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3R5bGVzaGVldFBsdWdpbk9wdGlvbnMge1xuICAvKipcbiAgICogQ29udHJvbHMgdGhlIHVzZSBhbmQgY3JlYXRpb24gb2Ygc291cmNlbWFwcyB3aGVuIHByb2Nlc3NpbmcgdGhlIHN0eWxlc2hlZXRzLlxuICAgKiBJZiB0cnVlLCBzb3VyY2VtYXAgcHJvY2Vzc2luZyBpcyBlbmFibGVkOyBpZiBmYWxzZSwgZGlzYWJsZWQuXG4gICAqL1xuICBzb3VyY2VtYXA6IGJvb2xlYW47XG5cbiAgaW5jbHVkZVBhdGhzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNvbXBvbmVudCBkYXRhIGZvciBhbnkgaW5saW5lIHN0eWxlcyBmcm9tIENvbXBvbmVudCBkZWNvcmF0b3IgYHN0eWxlc2AgZmllbGRzLlxuICAgKiBUaGUga2V5IGlzIGFuIGludGVybmFsIGFuZ3VsYXIgcmVzb3VyY2UgVVJJIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHN0eWxlc2hlZXQgY29udGVudC5cbiAgICovXG4gIGlubGluZUNvbXBvbmVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIHRhaWx3aW5kQ29uZmlndXJhdGlvbj86IHsgZmlsZTogc3RyaW5nOyBwYWNrYWdlOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHlsZXNoZWV0TGFuZ3VhZ2Uge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbXBvbmVudEZpbHRlcjogUmVnRXhwO1xuICBmaWxlRmlsdGVyOiBSZWdFeHA7XG4gIHByb2Nlc3M/KFxuICAgIGRhdGE6IHN0cmluZyxcbiAgICBmaWxlOiBzdHJpbmcsXG4gICAgZm9ybWF0OiBzdHJpbmcsXG4gICAgb3B0aW9uczogU3R5bGVzaGVldFBsdWdpbk9wdGlvbnMsXG4gICAgYnVpbGQ6IFBsdWdpbkJ1aWxkLFxuICApOiBPbkxvYWRSZXN1bHQgfCBQcm9taXNlPE9uTG9hZFJlc3VsdD47XG59XG5cbmV4cG9ydCBjbGFzcyBTdHlsZXNoZWV0UGx1Z2luRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU3R5bGVzaGVldFBsdWdpbk9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWNoZT86IExvYWRSZXN1bHRDYWNoZSxcbiAgKSB7fVxuXG4gIGNyZWF0ZShsYW5ndWFnZTogUmVhZG9ubHk8U3R5bGVzaGVldExhbmd1YWdlPik6IFBsdWdpbiB7XG4gICAgLy8gUmV0dXJuIGEgbm9vcCBwbHVnaW4gaWYgbm8gbG9hZCBhY3Rpb25zIGFyZSByZXF1aXJlZFxuICAgIGlmICghbGFuZ3VhZ2UucHJvY2VzcyAmJiAhdGhpcy5vcHRpb25zLnRhaWx3aW5kQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2FuZ3VsYXItJyArIGxhbmd1YWdlLm5hbWUsXG4gICAgICAgIHNldHVwKCkge30sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHsgY2FjaGUsIG9wdGlvbnMgfSA9IHRoaXM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ2FuZ3VsYXItJyArIGxhbmd1YWdlLm5hbWUsXG4gICAgICBhc3luYyBzZXR1cChidWlsZCkge1xuICAgICAgICAvLyBTZXR1cCBwb3N0Y3NzIGlmIG5lZWRlZCBieSB0YWlsd2luZFxuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgaW50byB0aGUgcGx1Z2luIGZhY3RvcnkgdG8gYXZvaWQgcmVwZWF0IHNldHVwIHBlciBjcmVhdGVkIHBsdWdpblxuICAgICAgICBsZXQgcG9zdGNzc1Byb2Nlc3NvcjogaW1wb3J0KCdwb3N0Y3NzJykuUHJvY2Vzc29yIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAob3B0aW9ucy50YWlsd2luZENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICBwb3N0Y3NzID8/PSAoYXdhaXQgaW1wb3J0KCdwb3N0Y3NzJykpLmRlZmF1bHQ7XG4gICAgICAgICAgcG9zdGNzc1Byb2Nlc3NvciA9IHBvc3Rjc3MoKTtcbiAgICAgICAgICBpZiAob3B0aW9ucy50YWlsd2luZENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHRhaWx3aW5kID0gYXdhaXQgaW1wb3J0KG9wdGlvbnMudGFpbHdpbmRDb25maWd1cmF0aW9uLnBhY2thZ2UpO1xuICAgICAgICAgICAgcG9zdGNzc1Byb2Nlc3Nvci51c2UodGFpbHdpbmQuZGVmYXVsdCh7IGNvbmZpZzogb3B0aW9ucy50YWlsd2luZENvbmZpZ3VyYXRpb24uZmlsZSB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGEgbG9hZCBjYWxsYmFjayB0byBzdXBwb3J0IGlubGluZSBDb21wb25lbnQgc3R5bGVzXG4gICAgICAgIGJ1aWxkLm9uTG9hZChcbiAgICAgICAgICB7IGZpbHRlcjogbGFuZ3VhZ2UuY29tcG9uZW50RmlsdGVyLCBuYW1lc3BhY2U6ICdhbmd1bGFyOnN0eWxlcy9jb21wb25lbnQnIH0sXG4gICAgICAgICAgY3JlYXRlQ2FjaGVkTG9hZChjYWNoZSwgKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBvcHRpb25zLmlubGluZUNvbXBvbmVudERhdGE/LlthcmdzLnBhdGhdO1xuICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycsXG4gICAgICAgICAgICAgIGBjb21wb25lbnQgc3R5bGUgbmFtZSBzaG91bGQgYWx3YXlzIGJlIGZvdW5kIFske2FyZ3MucGF0aH1dYCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IFtmb3JtYXQsICwgZmlsZW5hbWVdID0gYXJncy5wYXRoLnNwbGl0KCc7JywgMyk7XG5cbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzU3R5bGVzaGVldChcbiAgICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIGJ1aWxkLFxuICAgICAgICAgICAgICBwb3N0Y3NzUHJvY2Vzc29yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBZGQgYSBsb2FkIGNhbGxiYWNrIHRvIHN1cHBvcnQgZmlsZXMgZnJvbSBkaXNrXG4gICAgICAgIGJ1aWxkLm9uTG9hZChcbiAgICAgICAgICB7IGZpbHRlcjogbGFuZ3VhZ2UuZmlsZUZpbHRlciB9LFxuICAgICAgICAgIGNyZWF0ZUNhY2hlZExvYWQoY2FjaGUsIGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGUoYXJncy5wYXRoLCAndXRmLTgnKTtcblxuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NTdHlsZXNoZWV0KFxuICAgICAgICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgYXJncy5wYXRoLFxuICAgICAgICAgICAgICBleHRuYW1lKGFyZ3MucGF0aCkudG9Mb3dlckNhc2UoKS5zbGljZSgxKSxcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgYnVpbGQsXG4gICAgICAgICAgICAgIHBvc3Rjc3NQcm9jZXNzb3IsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NTdHlsZXNoZWV0KFxuICBsYW5ndWFnZTogUmVhZG9ubHk8U3R5bGVzaGVldExhbmd1YWdlPixcbiAgZGF0YTogc3RyaW5nLFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBmb3JtYXQ6IHN0cmluZyxcbiAgb3B0aW9uczogU3R5bGVzaGVldFBsdWdpbk9wdGlvbnMsXG4gIGJ1aWxkOiBQbHVnaW5CdWlsZCxcbiAgcG9zdGNzc1Byb2Nlc3NvcjogaW1wb3J0KCdwb3N0Y3NzJykuUHJvY2Vzc29yIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGxldCByZXN1bHQ6IE9uTG9hZFJlc3VsdDtcblxuICAvLyBQcm9jZXNzIHRoZSBpbnB1dCBkYXRhIGlmIHRoZSBsYW5ndWFnZSByZXF1aXJlcyBwcmVwcm9jZXNzaW5nXG4gIGlmIChsYW5ndWFnZS5wcm9jZXNzKSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgbGFuZ3VhZ2UucHJvY2VzcyhkYXRhLCBmaWxlbmFtZSwgZm9ybWF0LCBvcHRpb25zLCBidWlsZCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0ge1xuICAgICAgY29udGVudHM6IGRhdGEsXG4gICAgICBsb2FkZXI6ICdjc3MnLFxuICAgICAgd2F0Y2hGaWxlczogW2ZpbGVuYW1lXSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVHJhbnNmb3JtIHdpdGggcG9zdGNzcyBpZiBuZWVkZWQgYW5kIHRoZXJlIGFyZSBubyBlcnJvcnNcbiAgaWYgKHBvc3Rjc3NQcm9jZXNzb3IgJiYgcmVzdWx0LmNvbnRlbnRzICYmICFyZXN1bHQuZXJyb3JzPy5sZW5ndGgpIHtcbiAgICBjb25zdCBwb3N0Y3NzUmVzdWx0ID0gYXdhaXQgY29tcGlsZVN0cmluZyhcbiAgICAgIHR5cGVvZiByZXN1bHQuY29udGVudHMgPT09ICdzdHJpbmcnXG4gICAgICAgID8gcmVzdWx0LmNvbnRlbnRzXG4gICAgICAgIDogQnVmZmVyLmZyb20ocmVzdWx0LmNvbnRlbnRzKS50b1N0cmluZygndXRmLTgnKSxcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgcG9zdGNzc1Byb2Nlc3NvcixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcblxuICAgIC8vIE1lcmdlIHJlc3VsdHNcbiAgICBpZiAocG9zdGNzc1Jlc3VsdC5lcnJvcnM/Lmxlbmd0aCkge1xuICAgICAgZGVsZXRlIHJlc3VsdC5jb250ZW50cztcbiAgICB9XG4gICAgaWYgKHJlc3VsdC53YXJuaW5ncyAmJiBwb3N0Y3NzUmVzdWx0Lndhcm5pbmdzKSB7XG4gICAgICBwb3N0Y3NzUmVzdWx0Lndhcm5pbmdzLnVuc2hpZnQoLi4ucmVzdWx0Lndhcm5pbmdzKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC53YXRjaEZpbGVzICYmIHBvc3Rjc3NSZXN1bHQud2F0Y2hGaWxlcykge1xuICAgICAgcG9zdGNzc1Jlc3VsdC53YXRjaEZpbGVzLnVuc2hpZnQoLi4ucmVzdWx0LndhdGNoRmlsZXMpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LndhdGNoRGlycyAmJiBwb3N0Y3NzUmVzdWx0LndhdGNoRGlycykge1xuICAgICAgcG9zdGNzc1Jlc3VsdC53YXRjaERpcnMudW5zaGlmdCguLi5yZXN1bHQud2F0Y2hEaXJzKTtcbiAgICB9XG4gICAgcmVzdWx0ID0ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgLi4ucG9zdGNzc1Jlc3VsdCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb21waWxlcyB0aGUgcHJvdmlkZWQgQ1NTIHN0eWxlc2hlZXQgZGF0YSB1c2luZyBhIHByb3ZpZGVkIHBvc3Rjc3MgcHJvY2Vzc29yIGFuZCBwcm92aWRlcyBhblxuICogZXNidWlsZCBsb2FkIHJlc3VsdCB0aGF0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IGJ5IGFuIGVzYnVpbGQgUGx1Z2luLlxuICogQHBhcmFtIGRhdGEgVGhlIHN0eWxlc2hlZXQgY29udGVudCB0byBwcm9jZXNzLlxuICogQHBhcmFtIGZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGRhdGEuXG4gKiBAcGFyYW0gcG9zdGNzc1Byb2Nlc3NvciBBIHBvc3Rjc3MgcHJvY2Vzc29yIGluc3RhbmNlIHRvIHVzZS5cbiAqIEBwYXJhbSBvcHRpb25zIFRoZSBwbHVnaW4gb3B0aW9ucyB0byBjb250cm9sIHRoZSBwcm9jZXNzaW5nLlxuICogQHJldHVybnMgQW4gZXNidWlsZCBPbkxvYWRlclJlc3VsdCBvYmplY3Qgd2l0aCB0aGUgcHJvY2Vzc2VkIGNvbnRlbnQsIHdhcm5pbmdzLCBhbmQvb3IgZXJyb3JzLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21waWxlU3RyaW5nKFxuICBkYXRhOiBzdHJpbmcsXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIHBvc3Rjc3NQcm9jZXNzb3I6IGltcG9ydCgncG9zdGNzcycpLlByb2Nlc3NvcixcbiAgb3B0aW9uczogU3R5bGVzaGVldFBsdWdpbk9wdGlvbnMsXG4pOiBQcm9taXNlPE9uTG9hZFJlc3VsdD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBvc3Rjc3NSZXN1bHQgPSBhd2FpdCBwb3N0Y3NzUHJvY2Vzc29yLnByb2Nlc3MoZGF0YSwge1xuICAgICAgZnJvbTogZmlsZW5hbWUsXG4gICAgICB0bzogZmlsZW5hbWUsXG4gICAgICBtYXA6IG9wdGlvbnMuc291cmNlbWFwICYmIHtcbiAgICAgICAgaW5saW5lOiB0cnVlLFxuICAgICAgICBzb3VyY2VzQ29udGVudDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBsb2FkUmVzdWx0OiBPbkxvYWRSZXN1bHQgPSB7XG4gICAgICBjb250ZW50czogcG9zdGNzc1Jlc3VsdC5jc3MsXG4gICAgICBsb2FkZXI6ICdjc3MnLFxuICAgIH07XG5cbiAgICBjb25zdCByYXdXYXJuaW5ncyA9IHBvc3Rjc3NSZXN1bHQud2FybmluZ3MoKTtcbiAgICBpZiAocmF3V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGluZU1hcHBpbmdzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdIHwgbnVsbD4oKTtcbiAgICAgIGxvYWRSZXN1bHQud2FybmluZ3MgPSByYXdXYXJuaW5ncy5tYXAoKHdhcm5pbmcpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHdhcm5pbmcubm9kZS5zb3VyY2U/LmlucHV0LmZpbGU7XG4gICAgICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4geyB0ZXh0OiB3YXJuaW5nLnRleHQgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaW5lcyA9IGxpbmVNYXBwaW5ncy5nZXQoZmlsZSk7XG4gICAgICAgIGlmIChsaW5lcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGluZXMgPSB3YXJuaW5nLm5vZGUuc291cmNlPy5pbnB1dC5jc3Muc3BsaXQoL1xccj9cXG4vKTtcbiAgICAgICAgICBsaW5lTWFwcGluZ3Muc2V0KGZpbGUsIGxpbmVzID8/IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0ZXh0OiB3YXJuaW5nLnRleHQsXG4gICAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICBsaW5lOiB3YXJuaW5nLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IHdhcm5pbmcuY29sdW1uIC0gMSxcbiAgICAgICAgICAgIGxpbmVUZXh0OiBsaW5lcz8uW3dhcm5pbmcubGluZSAtIDFdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdE1lc3NhZ2Ugb2YgcG9zdGNzc1Jlc3VsdC5tZXNzYWdlcykge1xuICAgICAgaWYgKHJlc3VsdE1lc3NhZ2UudHlwZSA9PT0gJ2RlcGVuZGVuY3knICYmIHR5cGVvZiByZXN1bHRNZXNzYWdlWydmaWxlJ10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGxvYWRSZXN1bHQud2F0Y2hGaWxlcyA/Pz0gW107XG4gICAgICAgIGxvYWRSZXN1bHQud2F0Y2hGaWxlcy5wdXNoKHJlc3VsdE1lc3NhZ2VbJ2ZpbGUnXSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICByZXN1bHRNZXNzYWdlLnR5cGUgPT09ICdkaXItZGVwZW5kZW5jeScgJiZcbiAgICAgICAgdHlwZW9mIHJlc3VsdE1lc3NhZ2VbJ2RpciddID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2YgcmVzdWx0TWVzc2FnZVsnZ2xvYiddID09PSAnc3RyaW5nJ1xuICAgICAgKSB7XG4gICAgICAgIGxvYWRSZXN1bHQud2F0Y2hGaWxlcyA/Pz0gW107XG4gICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGF3YWl0IGdsb2IocmVzdWx0TWVzc2FnZVsnZ2xvYiddLCB7XG4gICAgICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICAgICAgY3dkOiByZXN1bHRNZXNzYWdlWydkaXInXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxvYWRSZXN1bHQud2F0Y2hGaWxlcy5wdXNoKC4uLmRlcGVuZGVuY2llcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvYWRSZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcG9zdGNzcyA/Pz0gKGF3YWl0IGltcG9ydCgncG9zdGNzcycpKS5kZWZhdWx0O1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIHBvc3Rjc3MuQ3NzU3ludGF4RXJyb3IpIHtcbiAgICAgIGNvbnN0IGxpbmVzID0gZXJyb3Iuc291cmNlPy5zcGxpdCgvXFxyP1xcbi8pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiBlcnJvci5yZWFzb24sXG4gICAgICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgICAgICBmaWxlOiBlcnJvci5maWxlLFxuICAgICAgICAgICAgICBsaW5lOiBlcnJvci5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IGVycm9yLmNvbHVtbiAmJiBlcnJvci5jb2x1bW4gLSAxLFxuICAgICAgICAgICAgICBsaW5lVGV4dDogZXJyb3IubGluZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbGluZXM/LltlcnJvci5saW5lIC0gMV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iXX0=
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzaGVldC1wbHVnaW4tZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L2J1aWxkX2FuZ3VsYXIvc3JjL3Rvb2xzL2VzYnVpbGQvc3R5bGVzaGVldHMvc3R5bGVzaGVldC1wbHVnaW4tZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdILDBEQUE2QjtBQUM3Qiw4REFBaUM7QUFDakMsK0NBQTRDO0FBQzVDLHlDQUFvQztBQUNwQyw0REFBeUU7QUFFekU7OztHQUdHO0FBQ0gsSUFBSSxPQUF3RCxDQUFDO0FBZ0M3RDs7OztHQUlHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFlNUYsTUFBYSx1QkFBdUI7SUFHbEMsWUFDbUIsT0FBZ0MsRUFDaEMsS0FBdUI7UUFEdkIsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7UUFDaEMsVUFBSyxHQUFMLEtBQUssQ0FBa0I7SUFDdkMsQ0FBQztJQUVKLE1BQU0sQ0FBQyxRQUFzQztRQUMzQyx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFO1lBQzVELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSTtnQkFDaEMsS0FBSyxLQUFJLENBQUM7YUFDWCxDQUFDO1NBQ0g7UUFFRCxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztRQUNoQyxNQUFNLFlBQVksR0FBRyxLQUFLLElBQUksRUFBRTtZQUM5Qiw4Q0FBOEM7WUFDOUMsSUFBSSxJ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QUksRUFBRSxLQUFLLENBQUMsSUFBSTs0QkFDaEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJOzRCQUNoQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7NEJBQ3hDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzt5QkFDekU7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDO1NBQ0g7UUFFRCxNQUFNLEtBQUssQ0FBQztLQUNiO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE9uTG9hZFJlc3VsdCwgUGx1Z2luLCBQbHVnaW5CdWlsZCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IGdsb2IgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGV4dG5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgTG9hZFJlc3VsdENhY2hlLCBjcmVhdGVDYWNoZWRMb2FkIH0gZnJvbSAnLi4vbG9hZC1yZXN1bHQtY2FjaGUnO1xuXG4vKipcbiAqIFRoZSBsYXp5LWxvYWRlZCBpbnN0YW5jZSBvZiB0aGUgcG9zdGNzcyBzdHlsZXNoZWV0IHBvc3Rwcm9jZXNzb3IuXG4gKiBJdCBpcyBvbmx5IGltcG9ydGVkIGFuZCBpbml0aWFsaXplZCBpZiBwb3N0Y3NzIGlzIG5lZWRlZC5cbiAqL1xubGV0IHBvc3Rjc3M6IHR5cGVvZiBpbXBvcnQoJ3Bvc3Rjc3MnKVsnZGVmYXVsdCddIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwbHVnaW4gb3B0aW9ucyB0byB1c2Ugd2hlbiBwcm9jZXNzaW5nIHN0eWxlc2hlZXRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0eWxlc2hlZXRQbHVnaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHRoZSB1c2UgYW5kIGNyZWF0aW9uIG9mIHNvdXJjZW1hcHMgd2hlbiBwcm9jZXNzaW5nIHRoZSBzdHlsZXNoZWV0cy5cbiAgICogSWYgdHJ1ZSwgc291cmNlbWFwIHByb2Nlc3NpbmcgaXMgZW5hYmxlZDsgaWYgZmFsc2UsIGRpc2FibGVkLlxuICAgKi9cbiAgc291cmNlbWFwOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBhcnJheSBvZiBwYXRocyB0aGF0IHdpbGwgYmUgc2VhcmNoZWQgZm9yIHN0eWxlc2hlZXRzIGlmIHRoZSBkZWZhdWx0XG4gICAqIHJlc29sdXRpb24gcHJvY2VzcyBmb3IgdGhlIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgZG9lcyBub3Qgc3VjY2VlZC5cbiAgICovXG4gIGluY2x1ZGVQYXRocz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjb21wb25lbnQgZGF0YSBmb3IgYW55IGlubGluZSBzdHlsZXMgZnJvbSBDb21wb25lbnQgZGVjb3JhdG9yIGBzdHlsZXNgIGZpZWxkcy5cbiAgICogVGhlIGtleSBpcyBhbiBpbnRlcm5hbCBhbmd1bGFyIHJlc291cmNlIFVSSSBhbmQgdGhlIHZhbHVlIGlzIHRoZSBzdHlsZXNoZWV0IGNvbnRlbnQuXG4gICAqL1xuICBpbmxpbmVDb21wb25lbnREYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgaW5mb3JtYXRpb24gdXNlZCB0byBsb2FkIGFuZCBjb25maWd1cmUgVGFpbHdpbmQgQ1NTLiBJZiBwcmVzZW50LCB0aGUgcG9zdGNzc1xuICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzdHlsZXNoZWV0IHByb2Nlc3Npbmcgd2l0aCB0aGUgVGFpbHdpbmQgcGx1Z2luIHNldHVwIGFzIHByb3ZpZGVkXG4gICAqIGJ5IHRoZSBjb25maWd1cmF0aW9uIGZpbGUuXG4gICAqL1xuICB0YWlsd2luZENvbmZpZ3VyYXRpb24/OiB7IGZpbGU6IHN0cmluZzsgcGFja2FnZTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQW4gYXJyYXkgb2Yga2V5d29yZHMgdGhhdCBpbmRpY2F0ZSBUYWlsd2luZCBDU1MgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCBmb3IgYSBzdHlsZXNoZWV0LlxuICpcbiAqIEJhc2VkIG9uIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvZnVuY3Rpb25zLWFuZC1kaXJlY3RpdmVzXG4gKi9cbmNvbnN0IFRBSUxXSU5EX0tFWVdPUkRTID0gWydAdGFpbHdpbmQnLCAnQGxheWVyJywgJ0BhcHBseScsICdAY29uZmlnJywgJ3RoZW1lKCcsICdzY3JlZW4oJ107XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3R5bGVzaGVldExhbmd1YWdlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBjb21wb25lbnRGaWx0ZXI6IFJlZ0V4cDtcbiAgZmlsZUZpbHRlcjogUmVnRXhwO1xuICBwcm9jZXNzPyhcbiAgICBkYXRhOiBzdHJpbmcsXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIGZvcm1hdDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFN0eWxlc2hlZXRQbHVnaW5PcHRpb25zLFxuICAgIGJ1aWxkOiBQbHVnaW5CdWlsZCxcbiAgKTogT25Mb2FkUmVzdWx0IHwgUHJvbWlzZTxPbkxvYWRSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgU3R5bGVzaGVldFBsdWdpbkZhY3Rvcnkge1xuICBwcml2YXRlIHBvc3Rjc3NQcm9jZXNzb3I/OiBpbXBvcnQoJ3Bvc3Rjc3MnKS5Qcm9jZXNzb3I7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTdHlsZXNoZWV0UGx1Z2luT3B0aW9ucyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlPzogTG9hZFJlc3VsdENhY2hlLFxuICApIHt9XG5cbiAgY3JlYXRlKGxhbmd1YWdlOiBSZWFkb25seTxTdHlsZXNoZWV0TGFuZ3VhZ2U+KTogUGx1Z2luIHtcbiAgICAvLyBSZXR1cm4gYSBub29wIHBsdWdpbiBpZiBubyBsb2FkIGFjdGlvbnMgYXJlIHJlcXVpcmVkXG4gICAgaWYgKCFsYW5ndWFnZS5wcm9jZXNzICYmICF0aGlzLm9wdGlvbnMudGFpbHdpbmRDb25maWd1cmF0aW9uKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAnYW5ndWxhci0nICsgbGFuZ3VhZ2UubmFtZSxcbiAgICAgICAgc2V0dXAoKSB7fSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgeyBjYWNoZSwgb3B0aW9ucyB9ID0gdGhpcztcbiAgICBjb25zdCBzZXR1cFBvc3Rjc3MgPSBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBSZXR1cm4gYWxyZWFkeSBjcmVhdGVkIHByb2Nlc3NvciBpZiBwcmVzZW50XG4gICAgICBpZiAodGhpcy5wb3N0Y3NzUHJvY2Vzc29yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc3Rjc3NQcm9jZXNzb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnRhaWx3aW5kQ29uZmlndXJhdGlvbikge1xuICAgICAgICBwb3N0Y3NzID8/PSAoYXdhaXQgaW1wb3J0KCdwb3N0Y3NzJykpLmRlZmF1bHQ7XG4gICAgICAgIGNvbnN0IHRhaWx3aW5kID0gYXdhaXQgaW1wb3J0KG9wdGlvbnMudGFpbHdpbmRDb25maWd1cmF0aW9uLnBhY2thZ2UpO1xuICAgICAgICB0aGlzLnBvc3Rjc3NQcm9jZXNzb3IgPSBwb3N0Y3NzKCkudXNlKFxuICAgICAgICAgIHRhaWx3aW5kLmRlZmF1bHQoeyBjb25maWc6IG9wdGlvbnMudGFpbHdpbmRDb25maWd1cmF0aW9uLmZpbGUgfSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnBvc3Rjc3NQcm9jZXNzb3I7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnYW5ndWxhci0nICsgbGFuZ3VhZ2UubmFtZSxcbiAgICAgIGFzeW5jIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgIC8vIFNldHVwIHBvc3Rjc3MgaWYgbmVlZGVkXG4gICAgICAgIGNvbnN0IHBvc3Rjc3NQcm9jZXNzb3IgPSBhd2FpdCBzZXR1cFBvc3Rjc3MoKTtcblxuICAgICAgICAvLyBBZGQgYSBsb2FkIGNhbGxiYWNrIHRvIHN1cHBvcnQgaW5saW5lIENvbXBvbmVudCBzdHlsZXNcbiAgICAgICAgYnVpbGQub25Mb2FkKFxuICAgICAgICAgIHsgZmlsdGVyOiBsYW5ndWFnZS5jb21wb25lbnRGaWx0ZXIsIG5hbWVzcGFjZTogJ2FuZ3VsYXI6c3R5bGVzL2NvbXBvbmVudCcgfSxcbiAgICAgICAgICBjcmVhdGVDYWNoZWRMb2FkKGNhY2hlLCAoYXJncykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IG9wdGlvbnMuaW5saW5lQ29tcG9uZW50RGF0YT8uW2FyZ3MucGF0aF07XG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgYGNvbXBvbmVudCBzdHlsZSBuYW1lIHNob3VsZCBhbHdheXMgYmUgZm91bmQgWyR7YXJncy5wYXRofV1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgW2Zvcm1hdCwgLCBmaWxlbmFtZV0gPSBhcmdzLnBhdGguc3BsaXQoJzsnLCAzKTtcbiAgICAgICAgICAgIC8vIE9ubHkgdXNlIHBvc3Rjc3MgaWYgVGFpbHdpbmQgcHJvY2Vzc2luZyBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgIC8vIE5PVEU6IElmIHBvc3Rjc3MgaXMgdXNlZCBmb3IgbW9yZSB0aGFuIGp1c3QgVGFpbHdpbmQgaW4gdGhlIGZ1dHVyZSB0aGlzIGNoZWNrIE1VU1RcbiAgICAgICAgICAgIC8vIGJlIHVwZGF0ZWQgdG8gYWNjb3VudCBmb3IgdGhlIGFkZGl0aW9uYWwgdXNlLlxuICAgICAgICAgICAgLy8gVE9ETzogdXNlIGJldHRlciBzZWFyY2ggYWxnb3JpdGhtIGZvciBrZXl3b3Jkc1xuICAgICAgICAgICAgY29uc3QgbmVlZHNQb3N0Y3NzID1cbiAgICAgICAgICAgICAgISFwb3N0Y3NzUHJvY2Vzc29yICYmIFRBSUxXSU5EX0tFWVdPUkRTLnNvbWUoKGtleXdvcmQpID0+IGRhdGEuaW5jbHVkZXMoa2V5d29yZCkpO1xuXG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1N0eWxlc2hlZXQoXG4gICAgICAgICAgICAgIGxhbmd1YWdlLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICBidWlsZCxcbiAgICAgICAgICAgICAgbmVlZHNQb3N0Y3NzID8gcG9zdGNzc1Byb2Nlc3NvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQWRkIGEgbG9hZCBjYWxsYmFjayB0byBzdXBwb3J0IGZpbGVzIGZyb20gZGlza1xuICAgICAgICBidWlsZC5vbkxvYWQoXG4gICAgICAgICAgeyBmaWx0ZXI6IGxhbmd1YWdlLmZpbGVGaWx0ZXIgfSxcbiAgICAgICAgICBjcmVhdGVDYWNoZWRMb2FkKGNhY2hlLCBhc3luYyAoYXJncykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRGaWxlKGFyZ3MucGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICBjb25zdCBuZWVkc1Bvc3Rjc3MgPVxuICAgICAgICAgICAgICAhIXBvc3Rjc3NQcm9jZXNzb3IgJiYgVEFJTFdJTkRfS0VZV09SRFMuc29tZSgoa2V5d29yZCkgPT4gZGF0YS5pbmNsdWRlcyhrZXl3b3JkKSk7XG5cbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzU3R5bGVzaGVldChcbiAgICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIGFyZ3MucGF0aCxcbiAgICAgICAgICAgICAgZXh0bmFtZShhcmdzLnBhdGgpLnRvTG93ZXJDYXNlKCkuc2xpY2UoMSksXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIGJ1aWxkLFxuICAgICAgICAgICAgICBuZWVkc1Bvc3Rjc3MgPyBwb3N0Y3NzUHJvY2Vzc29yIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzU3R5bGVzaGVldChcbiAgbGFuZ3VhZ2U6IFJlYWRvbmx5PFN0eWxlc2hlZXRMYW5ndWFnZT4sXG4gIGRhdGE6IHN0cmluZyxcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgZm9ybWF0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFN0eWxlc2hlZXRQbHVnaW5PcHRpb25zLFxuICBidWlsZDogUGx1Z2luQnVpbGQsXG4gIHBvc3Rjc3NQcm9jZXNzb3I6IGltcG9ydCgncG9zdGNzcycpLlByb2Nlc3NvciB8IHVuZGVmaW5lZCxcbikge1xuICBsZXQgcmVzdWx0OiBPbkxvYWRSZXN1bHQ7XG5cbiAgLy8gUHJvY2VzcyB0aGUgaW5wdXQgZGF0YSBpZiB0aGUgbGFuZ3VhZ2UgcmVxdWlyZXMgcHJlcHJvY2Vzc2luZ1xuICBpZiAobGFuZ3VhZ2UucHJvY2Vzcykge1xuICAgIHJlc3VsdCA9IGF3YWl0IGxhbmd1YWdlLnByb2Nlc3MoZGF0YSwgZmlsZW5hbWUsIGZvcm1hdCwgb3B0aW9ucywgYnVpbGQpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHtcbiAgICAgIGNvbnRlbnRzOiBkYXRhLFxuICAgICAgbG9hZGVyOiAnY3NzJyxcbiAgICAgIHdhdGNoRmlsZXM6IFtmaWxlbmFtZV0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRyYW5zZm9ybSB3aXRoIHBvc3Rjc3MgaWYgbmVlZGVkIGFuZCB0aGVyZSBhcmUgbm8gZXJyb3JzXG4gIGlmIChwb3N0Y3NzUHJvY2Vzc29yICYmIHJlc3VsdC5jb250ZW50cyAmJiAhcmVzdWx0LmVycm9ycz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgcG9zdGNzc1Jlc3VsdCA9IGF3YWl0IGNvbXBpbGVTdHJpbmcoXG4gICAgICB0eXBlb2YgcmVzdWx0LmNvbnRlbnRzID09PSAnc3RyaW5nJ1xuICAgICAgICA/IHJlc3VsdC5jb250ZW50c1xuICAgICAgICA6IEJ1ZmZlci5mcm9tKHJlc3VsdC5jb250ZW50cykudG9TdHJpbmcoJ3V0Zi04JyksXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIHBvc3Rjc3NQcm9jZXNzb3IsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG5cbiAgICAvLyBNZXJnZSByZXN1bHRzXG4gICAgaWYgKHBvc3Rjc3NSZXN1bHQuZXJyb3JzPy5sZW5ndGgpIHtcbiAgICAgIGRlbGV0ZSByZXN1bHQuY29udGVudHM7XG4gICAgfVxuICAgIGlmIChyZXN1bHQud2FybmluZ3MgJiYgcG9zdGNzc1Jlc3VsdC53YXJuaW5ncykge1xuICAgICAgcG9zdGNzc1Jlc3VsdC53YXJuaW5ncy51bnNoaWZ0KC4uLnJlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQud2F0Y2hGaWxlcyAmJiBwb3N0Y3NzUmVzdWx0LndhdGNoRmlsZXMpIHtcbiAgICAgIHBvc3Rjc3NSZXN1bHQud2F0Y2hGaWxlcy51bnNoaWZ0KC4uLnJlc3VsdC53YXRjaEZpbGVzKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC53YXRjaERpcnMgJiYgcG9zdGNzc1Jlc3VsdC53YXRjaERpcnMpIHtcbiAgICAgIHBvc3Rjc3NSZXN1bHQud2F0Y2hEaXJzLnVuc2hpZnQoLi4ucmVzdWx0LndhdGNoRGlycyk7XG4gICAgfVxuICAgIHJlc3VsdCA9IHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIC4uLnBvc3Rjc3NSZXN1bHQsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29tcGlsZXMgdGhlIHByb3ZpZGVkIENTUyBzdHlsZXNoZWV0IGRhdGEgdXNpbmcgYSBwcm92aWRlZCBwb3N0Y3NzIHByb2Nlc3NvciBhbmQgcHJvdmlkZXMgYW5cbiAqIGVzYnVpbGQgbG9hZCByZXN1bHQgdGhhdCBjYW4gYmUgdXNlZCBkaXJlY3RseSBieSBhbiBlc2J1aWxkIFBsdWdpbi5cbiAqIEBwYXJhbSBkYXRhIFRoZSBzdHlsZXNoZWV0IGNvbnRlbnQgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhLlxuICogQHBhcmFtIHBvc3Rjc3NQcm9jZXNzb3IgQSBwb3N0Y3NzIHByb2Nlc3NvciBpbnN0YW5jZSB0byB1c2UuXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgcGx1Z2luIG9wdGlvbnMgdG8gY29udHJvbCB0aGUgcHJvY2Vzc2luZy5cbiAqIEByZXR1cm5zIEFuIGVzYnVpbGQgT25Mb2FkZXJSZXN1bHQgb2JqZWN0IHdpdGggdGhlIHByb2Nlc3NlZCBjb250ZW50LCB3YXJuaW5ncywgYW5kL29yIGVycm9ycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29tcGlsZVN0cmluZyhcbiAgZGF0YTogc3RyaW5nLFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICBwb3N0Y3NzUHJvY2Vzc29yOiBpbXBvcnQoJ3Bvc3Rjc3MnKS5Qcm9jZXNzb3IsXG4gIG9wdGlvbnM6IFN0eWxlc2hlZXRQbHVnaW5PcHRpb25zLFxuKTogUHJvbWlzZTxPbkxvYWRSZXN1bHQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwb3N0Y3NzUmVzdWx0ID0gYXdhaXQgcG9zdGNzc1Byb2Nlc3Nvci5wcm9jZXNzKGRhdGEsIHtcbiAgICAgIGZyb206IGZpbGVuYW1lLFxuICAgICAgdG86IGZpbGVuYW1lLFxuICAgICAgbWFwOiBvcHRpb25zLnNvdXJjZW1hcCAmJiB7XG4gICAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgICAgc291cmNlc0NvbnRlbnQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgbG9hZFJlc3VsdDogT25Mb2FkUmVzdWx0ID0ge1xuICAgICAgY29udGVudHM6IHBvc3Rjc3NSZXN1bHQuY3NzLFxuICAgICAgbG9hZGVyOiAnY3NzJyxcbiAgICB9O1xuXG4gICAgY29uc3QgcmF3V2FybmluZ3MgPSBwb3N0Y3NzUmVzdWx0Lndhcm5pbmdzKCk7XG4gICAgaWYgKHJhd1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxpbmVNYXBwaW5ncyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXSB8IG51bGw+KCk7XG4gICAgICBsb2FkUmVzdWx0Lndhcm5pbmdzID0gcmF3V2FybmluZ3MubWFwKCh3YXJuaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSB3YXJuaW5nLm5vZGUuc291cmNlPy5pbnB1dC5maWxlO1xuICAgICAgICBpZiAoZmlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdGV4dDogd2FybmluZy50ZXh0IH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGluZXMgPSBsaW5lTWFwcGluZ3MuZ2V0KGZpbGUpO1xuICAgICAgICBpZiAobGluZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpbmVzID0gd2FybmluZy5ub2RlLnNvdXJjZT8uaW5wdXQuY3NzLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgICAgICAgbGluZU1hcHBpbmdzLnNldChmaWxlLCBsaW5lcyA/PyBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdGV4dDogd2FybmluZy50ZXh0LFxuICAgICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgbGluZTogd2FybmluZy5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiB3YXJuaW5nLmNvbHVtbiAtIDEsXG4gICAgICAgICAgICBsaW5lVGV4dDogbGluZXM/Llt3YXJuaW5nLmxpbmUgLSAxXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZXN1bHRNZXNzYWdlIG9mIHBvc3Rjc3NSZXN1bHQubWVzc2FnZXMpIHtcbiAgICAgIGlmIChyZXN1bHRNZXNzYWdlLnR5cGUgPT09ICdkZXBlbmRlbmN5JyAmJiB0eXBlb2YgcmVzdWx0TWVzc2FnZVsnZmlsZSddID09PSAnc3RyaW5nJykge1xuICAgICAgICBsb2FkUmVzdWx0LndhdGNoRmlsZXMgPz89IFtdO1xuICAgICAgICBsb2FkUmVzdWx0LndhdGNoRmlsZXMucHVzaChyZXN1bHRNZXNzYWdlWydmaWxlJ10pO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcmVzdWx0TWVzc2FnZS50eXBlID09PSAnZGlyLWRlcGVuZGVuY3knICYmXG4gICAgICAgIHR5cGVvZiByZXN1bHRNZXNzYWdlWydkaXInXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIHJlc3VsdE1lc3NhZ2VbJ2dsb2InXSA9PT0gJ3N0cmluZydcbiAgICAgICkge1xuICAgICAgICBsb2FkUmVzdWx0LndhdGNoRmlsZXMgPz89IFtdO1xuICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBhd2FpdCBnbG9iKHJlc3VsdE1lc3NhZ2VbJ2dsb2InXSwge1xuICAgICAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgICAgIGN3ZDogcmVzdWx0TWVzc2FnZVsnZGlyJ10sXG4gICAgICAgIH0pO1xuICAgICAgICBsb2FkUmVzdWx0LndhdGNoRmlsZXMucHVzaCguLi5kZXBlbmRlbmNpZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsb2FkUmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHBvc3Rjc3MgPz89IChhd2FpdCBpbXBvcnQoJ3Bvc3Rjc3MnKSkuZGVmYXVsdDtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBwb3N0Y3NzLkNzc1N5bnRheEVycm9yKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IGVycm9yLnNvdXJjZT8uc3BsaXQoL1xccj9cXG4vKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogZXJyb3IucmVhc29uLFxuICAgICAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICAgICAgZmlsZTogZXJyb3IuZmlsZSxcbiAgICAgICAgICAgICAgbGluZTogZXJyb3IubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jb2x1bW4gJiYgZXJyb3IuY29sdW1uIC0gMSxcbiAgICAgICAgICAgICAgbGluZVRleHQ6IGVycm9yLmxpbmUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGxpbmVzPy5bZXJyb3IubGluZSAtIDFdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl19
@@ -0,0 +1,29 @@
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
+ /**
9
+ * Scans a CSS or Sass file and locates all valid url function values as defined by the
10
+ * syntax specification.
11
+ * @param contents A string containing a CSS or Sass file to scan.
12
+ * @returns An iterable that yields each CSS url function value found.
13
+ */
14
+ export declare function findUrls(contents: string): Iterable<{
15
+ start: number;
16
+ end: number;
17
+ value: string;
18
+ }>;
19
+ /**
20
+ * Scans a CSS or Sass file and locates all valid import/use directive values as defined by the
21
+ * syntax specification.
22
+ * @param contents A string containing a CSS or Sass file to scan.
23
+ * @returns An iterable that yields each CSS directive value found.
24
+ */
25
+ export declare function findImports(contents: string): Iterable<{
26
+ start: number;
27
+ end: number;
28
+ specifier: string;
29
+ }>;
@@ -0,0 +1,248 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.findImports = exports.findUrls = void 0;
11
+ // TODO: Combine everything into a single pass lexer
12
+ /**
13
+ * Determines if a unicode code point is a CSS whitespace character.
14
+ * @param code The unicode code point to test.
15
+ * @returns true, if the code point is CSS whitespace; false, otherwise.
16
+ */
17
+ function isWhitespace(code) {
18
+ // Based on https://www.w3.org/TR/css-syntax-3/#whitespace
19
+ switch (code) {
20
+ case 0x0009: // tab
21
+ case 0x0020: // space
22
+ case 0x000a: // line feed
23
+ case 0x000c: // form feed
24
+ case 0x000d: // carriage return
25
+ return true;
26
+ default:
27
+ return false;
28
+ }
29
+ }
30
+ /**
31
+ * Scans a CSS or Sass file and locates all valid url function values as defined by the
32
+ * syntax specification.
33
+ * @param contents A string containing a CSS or Sass file to scan.
34
+ * @returns An iterable that yields each CSS url function value found.
35
+ */
36
+ function* findUrls(contents) {
37
+ let pos = 0;
38
+ let width = 1;
39
+ let current = -1;
40
+ const next = () => {
41
+ pos += width;
42
+ current = contents.codePointAt(pos) ?? -1;
43
+ width = current > 0xffff ? 2 : 1;
44
+ return current;
45
+ };
46
+ // Based on https://www.w3.org/TR/css-syntax-3/#consume-ident-like-token
47
+ while ((pos = contents.indexOf('url(', pos)) !== -1) {
48
+ // Set to position of the (
49
+ pos += 3;
50
+ width = 1;
51
+ // Consume all leading whitespace
52
+ while (isWhitespace(next())) {
53
+ /* empty */
54
+ }
55
+ // Initialize URL state
56
+ const url = { start: pos, end: -1, value: '' };
57
+ let complete = false;
58
+ // If " or ', then consume the value as a string
59
+ if (current === 0x0022 || current === 0x0027) {
60
+ const ending = current;
61
+ // Based on https://www.w3.org/TR/css-syntax-3/#consume-string-token
62
+ while (!complete) {
63
+ switch (next()) {
64
+ case -1: // EOF
65
+ return;
66
+ case 0x000a: // line feed
67
+ case 0x000c: // form feed
68
+ case 0x000d: // carriage return
69
+ // Invalid
70
+ complete = true;
71
+ break;
72
+ case 0x005c: // \ -- character escape
73
+ // If not EOF or newline, add the character after the escape
74
+ switch (next()) {
75
+ case -1:
76
+ return;
77
+ case 0x000a: // line feed
78
+ case 0x000c: // form feed
79
+ case 0x000d: // carriage return
80
+ // Skip when inside a string
81
+ break;
82
+ default:
83
+ // TODO: Handle hex escape codes
84
+ url.value += String.fromCodePoint(current);
85
+ break;
86
+ }
87
+ break;
88
+ case ending:
89
+ // Full string position should include the quotes for replacement
90
+ url.end = pos + 1;
91
+ complete = true;
92
+ yield url;
93
+ break;
94
+ default:
95
+ url.value += String.fromCodePoint(current);
96
+ break;
97
+ }
98
+ }
99
+ next();
100
+ continue;
101
+ }
102
+ // Based on https://www.w3.org/TR/css-syntax-3/#consume-url-token
103
+ while (!complete) {
104
+ switch (current) {
105
+ case -1: // EOF
106
+ return;
107
+ case 0x0022: // "
108
+ case 0x0027: // '
109
+ case 0x0028: // (
110
+ // Invalid
111
+ complete = true;
112
+ break;
113
+ case 0x0029: // )
114
+ // URL is valid and complete
115
+ url.end = pos;
116
+ complete = true;
117
+ break;
118
+ case 0x005c: // \ -- character escape
119
+ // If not EOF or newline, add the character after the escape
120
+ switch (next()) {
121
+ case -1: // EOF
122
+ return;
123
+ case 0x000a: // line feed
124
+ case 0x000c: // form feed
125
+ case 0x000d: // carriage return
126
+ // Invalid
127
+ complete = true;
128
+ break;
129
+ default:
130
+ // TODO: Handle hex escape codes
131
+ url.value += String.fromCodePoint(current);
132
+ break;
133
+ }
134
+ break;
135
+ default:
136
+ if (isWhitespace(current)) {
137
+ while (isWhitespace(next())) {
138
+ /* empty */
139
+ }
140
+ // Unescaped whitespace is only valid before the closing )
141
+ if (current === 0x0029) {
142
+ // URL is valid
143
+ url.end = pos;
144
+ }
145
+ complete = true;
146
+ }
147
+ else {
148
+ // Add the character to the url value
149
+ url.value += String.fromCodePoint(current);
150
+ }
151
+ break;
152
+ }
153
+ next();
154
+ }
155
+ // An end position indicates a URL was found
156
+ if (url.end !== -1) {
157
+ yield url;
158
+ }
159
+ }
160
+ }
161
+ exports.findUrls = findUrls;
162
+ /**
163
+ * Scans a CSS or Sass file and locates all valid import/use directive values as defined by the
164
+ * syntax specification.
165
+ * @param contents A string containing a CSS or Sass file to scan.
166
+ * @returns An iterable that yields each CSS directive value found.
167
+ */
168
+ function* findImports(contents) {
169
+ yield* find(contents, '@import ');
170
+ yield* find(contents, '@use ');
171
+ }
172
+ exports.findImports = findImports;
173
+ /**
174
+ * Scans a CSS or Sass file and locates all valid function/directive values as defined by the
175
+ * syntax specification.
176
+ * @param contents A string containing a CSS or Sass file to scan.
177
+ * @param prefix The prefix to start a valid segment.
178
+ * @returns An iterable that yields each CSS url function value found.
179
+ */
180
+ function* find(contents, prefix) {
181
+ let pos = 0;
182
+ let width = 1;
183
+ let current = -1;
184
+ const next = () => {
185
+ pos += width;
186
+ current = contents.codePointAt(pos) ?? -1;
187
+ width = current > 0xffff ? 2 : 1;
188
+ return current;
189
+ };
190
+ // Based on https://www.w3.org/TR/css-syntax-3/#consume-ident-like-token
191
+ while ((pos = contents.indexOf(prefix, pos)) !== -1) {
192
+ // Set to position of the last character in prefix
193
+ pos += prefix.length - 1;
194
+ width = 1;
195
+ // Consume all leading whitespace
196
+ while (isWhitespace(next())) {
197
+ /* empty */
198
+ }
199
+ // Initialize URL state
200
+ const url = { start: pos, end: -1, specifier: '' };
201
+ let complete = false;
202
+ // If " or ', then consume the value as a string
203
+ if (current === 0x0022 || current === 0x0027) {
204
+ const ending = current;
205
+ // Based on https://www.w3.org/TR/css-syntax-3/#consume-string-token
206
+ while (!complete) {
207
+ switch (next()) {
208
+ case -1: // EOF
209
+ return;
210
+ case 0x000a: // line feed
211
+ case 0x000c: // form feed
212
+ case 0x000d: // carriage return
213
+ // Invalid
214
+ complete = true;
215
+ break;
216
+ case 0x005c: // \ -- character escape
217
+ // If not EOF or newline, add the character after the escape
218
+ switch (next()) {
219
+ case -1:
220
+ return;
221
+ case 0x000a: // line feed
222
+ case 0x000c: // form feed
223
+ case 0x000d: // carriage return
224
+ // Skip when inside a string
225
+ break;
226
+ default:
227
+ // TODO: Handle hex escape codes
228
+ url.specifier += String.fromCodePoint(current);
229
+ break;
230
+ }
231
+ break;
232
+ case ending:
233
+ // Full string position should include the quotes for replacement
234
+ url.end = pos + 1;
235
+ complete = true;
236
+ yield url;
237
+ break;
238
+ default:
239
+ url.specifier += String.fromCodePoint(current);
240
+ break;
241
+ }
242
+ }
243
+ next();
244
+ continue;
245
+ }
246
+ }
247
+ }
248
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV4ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyX2RldmtpdC9idWlsZF9hbmd1bGFyL3NyYy90b29scy9zYXNzL2xleGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7OztBQUVILG9EQUFvRDtBQUVwRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBWTtJQUNoQywwREFBMEQ7SUFDMUQsUUFBUSxJQUFJLEVBQUU7UUFDWixLQUFLLE1BQU0sQ0FBQyxDQUFDLE1BQU07UUFDbkIsS0FBSyxNQUFNLENBQUMsQ0FBQyxRQUFRO1FBQ3JCLEtBQUssTUFBTSxDQUFDLENBQUMsWUFBWTtRQUN6QixLQUFLLE1BQU0sQ0FBQyxDQUFDLFlBQVk7UUFDekIsS0FBSyxNQUFNLEVBQUUsa0JBQWtCO1lBQzdCLE9BQU8sSUFBSSxDQUFDO1FBQ2Q7WUFDRSxPQUFPLEtBQUssQ0FBQztLQUNoQjtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFFBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FDdkIsUUFBZ0I7SUFFaEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakIsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ2hCLEdBQUcsSUFBSSxLQUFLLENBQUM7UUFDYixPQUFPLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxQyxLQUFLLEdBQUcsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0lBRUYsd0VBQXdFO0lBQ3hFLE9BQU8sQ0FBQyxH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RSxFQUFFO29CQUNkLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTTt3QkFDYixPQUFPO29CQUNULEtBQUssTUFBTSxDQUFDLENBQUMsWUFBWTtvQkFDekIsS0FBSyxNQUFNLENBQUMsQ0FBQyxZQUFZO29CQUN6QixLQUFLLE1BQU0sRUFBRSxrQkFBa0I7d0JBQzdCLFVBQVU7d0JBQ1YsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIsTUFBTTtvQkFDUixLQUFLLE1BQU0sRUFBRSx3QkFBd0I7d0JBQ25DLDREQUE0RDt3QkFDNUQsUUFBUSxJQUFJLEVBQUUsRUFBRTs0QkFDZCxLQUFLLENBQUMsQ0FBQztnQ0FDTCxPQUFPOzRCQUNULEtBQUssTUFBTSxDQUFDLENBQUMsWUFBWTs0QkFDekIsS0FBSyxNQUFNLENBQUMsQ0FBQyxZQUFZOzRCQUN6QixLQUFLLE1BQU0sRUFBRSxrQkFBa0I7Z0NBQzdCLDRCQUE0QjtnQ0FDNUIsTUFBTTs0QkFDUjtnQ0FDRSxnQ0FBZ0M7Z0NBQ2hDLEdBQUcsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQ0FDL0MsTUFBTTt5QkFDVDt3QkFDRCxNQUFNO29CQUNSLEtBQUssTUFBTTt3QkFDVCxpRUFBaUU7d0JBQ2pFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDbEIsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIsTUFBTSxHQUFHLENBQUM7d0JBQ1YsTUFBTTtvQkFDUjt3QkFDRSxHQUFHLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQy9DLE1BQU07aUJBQ1Q7YUFDRjtZQUVELElBQUksRUFBRSxDQUFDO1lBQ1AsU0FBUztTQUNWO0tBQ0Y7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRPRE86IENvbWJpbmUgZXZlcnl0aGluZyBpbnRvIGEgc2luZ2xlIHBhc3MgbGV4ZXJcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGEgdW5pY29kZSBjb2RlIHBvaW50IGlzIGEgQ1NTIHdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICogQHBhcmFtIGNvZGUgVGhlIHVuaWNvZGUgY29kZSBwb2ludCB0byB0ZXN0LlxuICogQHJldHVybnMgdHJ1ZSwgaWYgdGhlIGNvZGUgcG9pbnQgaXMgQ1NTIHdoaXRlc3BhY2U7IGZhbHNlLCBvdGhlcndpc2UuXG4gKi9cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgLy8gQmFzZWQgb24gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1zeW50YXgtMy8jd2hpdGVzcGFjZVxuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlIDB4MDAwOTogLy8gdGFiXG4gICAgY2FzZSAweDAwMjA6IC8vIHNwYWNlXG4gICAgY2FzZSAweDAwMGE6IC8vIGxpbmUgZmVlZFxuICAgIGNhc2UgMHgwMDBjOiAvLyBmb3JtIGZlZWRcbiAgICBjYXNlIDB4MDAwZDogLy8gY2FycmlhZ2UgcmV0dXJuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogU2NhbnMgYSBDU1Mgb3IgU2FzcyBmaWxlIGFuZCBsb2NhdGVzIGFsbCB2YWxpZCB1cmwgZnVuY3Rpb24gdmFsdWVzIGFzIGRlZmluZWQgYnkgdGhlXG4gKiBzeW50YXggc3BlY2lmaWNhdGlvbi5cbiAqIEBwYXJhbSBjb250ZW50cyBBIHN0cmluZyBjb250YWluaW5nIGEgQ1NTIG9yIFNhc3MgZmlsZSB0byBzY2FuLlxuICogQHJldHVybnMgQW4gaXRlcmFibGUgdGhhdCB5aWVsZHMgZWFjaCBDU1MgdXJsIGZ1bmN0aW9uIHZhbHVlIGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGZpbmRVcmxzKFxuICBjb250ZW50czogc3RyaW5nLFxuKTogSXRlcmFibGU8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgdmFsdWU6IHN0cmluZyB9PiB7XG4gIGxldCBwb3MgPSAwO1xuICBsZXQgd2lkdGggPSAxO1xuICBsZXQgY3VycmVudCA9IC0xO1xuICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgIHBvcyArPSB3aWR0aDtcbiAgICBjdXJyZW50ID0gY29udGVudHMuY29kZVBvaW50QXQocG9zKSA/PyAtMTtcbiAgICB3aWR0aCA9IGN1cnJlbnQgPiAweGZmZmYgPyAyIDogMTtcblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9O1xuXG4gIC8vIEJhc2VkIG9uIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2NvbnN1bWUtaWRlbnQtbGlrZS10b2tlblxuICB3aGlsZSAoKHBvcyA9IGNvbnRlbnRzLmluZGV4T2YoJ3VybCgnLCBwb3MpKSAhPT0gLTEpIHtcbiAgICAvLyBTZXQgdG8gcG9zaXRpb24gb2YgdGhlIChcbiAgICBwb3MgKz0gMztcbiAgICB3aWR0aCA9IDE7XG5cbiAgICAvLyBDb25zdW1lIGFsbCBsZWFkaW5nIHdoaXRlc3BhY2VcbiAgICB3aGlsZSAoaXNXaGl0ZXNwYWNlKG5leHQoKSkpIHtcbiAgICAgIC8qIGVtcHR5ICovXG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBVUkwgc3RhdGVcbiAgICBjb25zdCB1cmwgPSB7IHN0YXJ0OiBwb3MsIGVuZDogLTEsIHZhbHVlOiAnJyB9O1xuICAgIGxldCBjb21wbGV0ZSA9IGZhbHNlO1xuXG4gICAgLy8gSWYgXCIgb3IgJywgdGhlbiBjb25zdW1lIHRoZSB2YWx1ZSBhcyBhIHN0cmluZ1xuICAgIGlmIChjdXJyZW50ID09PSAweDAwMjIgfHwgY3VycmVudCA9PT0gMHgwMDI3KSB7XG4gICAgICBjb25zdCBlbmRpbmcgPSBjdXJyZW50O1xuICAgICAgLy8gQmFzZWQgb24gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1zeW50YXgtMy8jY29uc3VtZS1zdHJpbmctdG9rZW5cbiAgICAgIHdoaWxlICghY29tcGxldGUpIHtcbiAgICAgICAgc3dpdGNoIChuZXh0KCkpIHtcbiAgICAgICAgICBjYXNlIC0xOiAvLyBFT0ZcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICBjYXNlIDB4MDAwYTogLy8gbGluZSBmZWVkXG4gICAgICAgICAgY2FzZSAweDAwMGM6IC8vIGZvcm0gZmVlZFxuICAgICAgICAgIGNhc2UgMHgwMDBkOiAvLyBjYXJyaWFnZSByZXR1cm5cbiAgICAgICAgICAgIC8vIEludmFsaWRcbiAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgwMDVjOiAvLyBcXCAtLSBjaGFyYWN0ZXIgZXNjYXBlXG4gICAgICAgICAgICAvLyBJZiBub3QgRU9GIG9yIG5ld2xpbmUsIGFkZCB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBlc2NhcGVcbiAgICAgICAgICAgIHN3aXRjaCAobmV4dCgpKSB7XG4gICAgICAgICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICBjYXNlIDB4MDAwYTogLy8gbGluZSBmZWVkXG4gICAgICAgICAgICAgIGNhc2UgMHgwMDBjOiAvLyBmb3JtIGZlZWRcbiAgICAgICAgICAgICAgY2FzZSAweDAwMGQ6IC8vIGNhcnJpYWdlIHJldHVyblxuICAgICAgICAgICAgICAgIC8vIFNraXAgd2hlbiBpbnNpZGUgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgaGV4IGVzY2FwZSBjb2Rlc1xuICAgICAgICAgICAgICAgIHVybC52YWx1ZSArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgZW5kaW5nOlxuICAgICAgICAgICAgLy8gRnVsbCBzdHJpbmcgcG9zaXRpb24gc2hvdWxkIGluY2x1ZGUgdGhlIHF1b3RlcyBmb3IgcmVwbGFjZW1lbnRcbiAgICAgICAgICAgIHVybC5lbmQgPSBwb3MgKyAxO1xuICAgICAgICAgICAgY29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgeWllbGQgdXJsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHVybC52YWx1ZSArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjdXJyZW50KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEJhc2VkIG9uIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2NvbnN1bWUtdXJsLXRva2VuXG4gICAgd2hpbGUgKCFjb21wbGV0ZSkge1xuICAgICAgc3dpdGNoIChjdXJyZW50KSB7XG4gICAgICAgIGNhc2UgLTE6IC8vIEVPRlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSAweDAwMjI6IC8vIFwiXG4gICAgICAgIGNhc2UgMHgwMDI3OiAvLyAnXG4gICAgICAgIGNhc2UgMHgwMDI4OiAvLyAoXG4gICAgICAgICAgLy8gSW52YWxpZFxuICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAweDAwMjk6IC8vIClcbiAgICAgICAgICAvLyBVUkwgaXMgdmFsaWQgYW5kIGNvbXBsZXRlXG4gICAgICAgICAgdXJsLmVuZCA9IHBvcztcbiAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgwMDVjOiAvLyBcXCAtLSBjaGFyYWN0ZXIgZXNjYXBlXG4gICAgICAgICAgLy8gSWYgbm90IEVPRiBvciBuZXdsaW5lLCBhZGQgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgZXNjYXBlXG4gICAgICAgICAgc3dpdGNoIChuZXh0KCkpIHtcbiAgICAgICAgICAgIGNhc2UgLTE6IC8vIEVPRlxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIDB4MDAwYTogLy8gbGluZSBmZWVkXG4gICAgICAgICAgICBjYXNlIDB4MDAwYzogLy8gZm9ybSBmZWVkXG4gICAgICAgICAgICBjYXNlIDB4MDAwZDogLy8gY2FycmlhZ2UgcmV0dXJuXG4gICAgICAgICAgICAgIC8vIEludmFsaWRcbiAgICAgICAgICAgICAgY29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBoZXggZXNjYXBlIGNvZGVzXG4gICAgICAgICAgICAgIHVybC52YWx1ZSArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjdXJyZW50KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoY3VycmVudCkpIHtcbiAgICAgICAgICAgIHdoaWxlIChpc1doaXRlc3BhY2UobmV4dCgpKSkge1xuICAgICAgICAgICAgICAvKiBlbXB0eSAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVW5lc2NhcGVkIHdoaXRlc3BhY2UgaXMgb25seSB2YWxpZCBiZWZvcmUgdGhlIGNsb3NpbmcgKVxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IDB4MDAyOSkge1xuICAgICAgICAgICAgICAvLyBVUkwgaXMgdmFsaWRcbiAgICAgICAgICAgICAgdXJsLmVuZCA9IHBvcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSBjaGFyYWN0ZXIgdG8gdGhlIHVybCB2YWx1ZVxuICAgICAgICAgICAgdXJsLnZhbHVlICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9XG5cbiAgICAvLyBBbiBlbmQgcG9zaXRpb24gaW5kaWNhdGVzIGEgVVJMIHdhcyBmb3VuZFxuICAgIGlmICh1cmwuZW5kICE9PSAtMSkge1xuICAgICAgeWllbGQgdXJsO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNjYW5zIGEgQ1NTIG9yIFNhc3MgZmlsZSBhbmQgbG9jYXRlcyBhbGwgdmFsaWQgaW1wb3J0L3VzZSBkaXJlY3RpdmUgdmFsdWVzIGFzIGRlZmluZWQgYnkgdGhlXG4gKiBzeW50YXggc3BlY2lmaWNhdGlvbi5cbiAqIEBwYXJhbSBjb250ZW50cyBBIHN0cmluZyBjb250YWluaW5nIGEgQ1NTIG9yIFNhc3MgZmlsZSB0byBzY2FuLlxuICogQHJldHVybnMgQW4gaXRlcmFibGUgdGhhdCB5aWVsZHMgZWFjaCBDU1MgZGlyZWN0aXZlIHZhbHVlIGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24qIGZpbmRJbXBvcnRzKFxuICBjb250ZW50czogc3RyaW5nLFxuKTogSXRlcmFibGU8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgc3BlY2lmaWVyOiBzdHJpbmcgfT4ge1xuICB5aWVsZCogZmluZChjb250ZW50cywgJ0BpbXBvcnQgJyk7XG4gIHlpZWxkKiBmaW5kKGNvbnRlbnRzLCAnQHVzZSAnKTtcbn1cblxuLyoqXG4gKiBTY2FucyBhIENTUyBvciBTYXNzIGZpbGUgYW5kIGxvY2F0ZXMgYWxsIHZhbGlkIGZ1bmN0aW9uL2RpcmVjdGl2ZSB2YWx1ZXMgYXMgZGVmaW5lZCBieSB0aGVcbiAqIHN5bnRheCBzcGVjaWZpY2F0aW9uLlxuICogQHBhcmFtIGNvbnRlbnRzIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBDU1Mgb3IgU2FzcyBmaWxlIHRvIHNjYW4uXG4gKiBAcGFyYW0gcHJlZml4IFRoZSBwcmVmaXggdG8gc3RhcnQgYSB2YWxpZCBzZWdtZW50LlxuICogQHJldHVybnMgQW4gaXRlcmFibGUgdGhhdCB5aWVsZHMgZWFjaCBDU1MgdXJsIGZ1bmN0aW9uIHZhbHVlIGZvdW5kLlxuICovXG5mdW5jdGlvbiogZmluZChcbiAgY29udGVudHM6IHN0cmluZyxcbiAgcHJlZml4OiBzdHJpbmcsXG4pOiBJdGVyYWJsZTx7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyOyBzcGVjaWZpZXI6IHN0cmluZyB9PiB7XG4gIGxldCBwb3MgPSAwO1xuICBsZXQgd2lkdGggPSAxO1xuICBsZXQgY3VycmVudCA9IC0xO1xuICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgIHBvcyArPSB3aWR0aDtcbiAgICBjdXJyZW50ID0gY29udGVudHMuY29kZVBvaW50QXQocG9zKSA/PyAtMTtcbiAgICB3aWR0aCA9IGN1cnJlbnQgPiAweGZmZmYgPyAyIDogMTtcblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9O1xuXG4gIC8vIEJhc2VkIG9uIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2NvbnN1bWUtaWRlbnQtbGlrZS10b2tlblxuICB3aGlsZSAoKHBvcyA9IGNvbnRlbnRzLmluZGV4T2YocHJlZml4LCBwb3MpKSAhPT0gLTEpIHtcbiAgICAvLyBTZXQgdG8gcG9zaXRpb24gb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHByZWZpeFxuICAgIHBvcyArPSBwcmVmaXgubGVuZ3RoIC0gMTtcbiAgICB3aWR0aCA9IDE7XG5cbiAgICAvLyBDb25zdW1lIGFsbCBsZWFkaW5nIHdoaXRlc3BhY2VcbiAgICB3aGlsZSAoaXNXaGl0ZXNwYWNlKG5leHQoKSkpIHtcbiAgICAgIC8qIGVtcHR5ICovXG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBVUkwgc3RhdGVcbiAgICBjb25zdCB1cmwgPSB7IHN0YXJ0OiBwb3MsIGVuZDogLTEsIHNwZWNpZmllcjogJycgfTtcbiAgICBsZXQgY29tcGxldGUgPSBmYWxzZTtcblxuICAgIC8vIElmIFwiIG9yICcsIHRoZW4gY29uc3VtZSB0aGUgdmFsdWUgYXMgYSBzdHJpbmdcbiAgICBpZiAoY3VycmVudCA9PT0gMHgwMDIyIHx8IGN1cnJlbnQgPT09IDB4MDAyNykge1xuICAgICAgY29uc3QgZW5kaW5nID0gY3VycmVudDtcbiAgICAgIC8vIEJhc2VkIG9uIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3Mtc3ludGF4LTMvI2NvbnN1bWUtc3RyaW5nLXRva2VuXG4gICAgICB3aGlsZSAoIWNvbXBsZXRlKSB7XG4gICAgICAgIHN3aXRjaCAobmV4dCgpKSB7XG4gICAgICAgICAgY2FzZSAtMTogLy8gRU9GXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSAweDAwMGE6IC8vIGxpbmUgZmVlZFxuICAgICAgICAgIGNhc2UgMHgwMDBjOiAvLyBmb3JtIGZlZWRcbiAgICAgICAgICBjYXNlIDB4MDAwZDogLy8gY2FycmlhZ2UgcmV0dXJuXG4gICAgICAgICAgICAvLyBJbnZhbGlkXG4gICAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MDA1YzogLy8gXFwgLS0gY2hhcmFjdGVyIGVzY2FwZVxuICAgICAgICAgICAgLy8gSWYgbm90IEVPRiBvciBuZXdsaW5lLCBhZGQgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgZXNjYXBlXG4gICAgICAgICAgICBzd2l0Y2ggKG5leHQoKSkge1xuICAgICAgICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgY2FzZSAweDAwMGE6IC8vIGxpbmUgZmVlZFxuICAgICAgICAgICAgICBjYXNlIDB4MDAwYzogLy8gZm9ybSBmZWVkXG4gICAgICAgICAgICAgIGNhc2UgMHgwMDBkOiAvLyBjYXJyaWFnZSByZXR1cm5cbiAgICAgICAgICAgICAgICAvLyBTa2lwIHdoZW4gaW5zaWRlIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGhleCBlc2NhcGUgY29kZXNcbiAgICAgICAgICAgICAgICB1cmwuc3BlY2lmaWVyICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBlbmRpbmc6XG4gICAgICAgICAgICAvLyBGdWxsIHN0cmluZyBwb3NpdGlvbiBzaG91bGQgaW5jbHVkZSB0aGUgcXVvdGVzIGZvciByZXBsYWNlbWVudFxuICAgICAgICAgICAgdXJsLmVuZCA9IHBvcyArIDE7XG4gICAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICB5aWVsZCB1cmw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdXJsLnNwZWNpZmllciArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjdXJyZW50KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -6,7 +6,7 @@
6
6
  * found in the LICENSE file at https://angular.io/license
7
7
  */
8
8
  import { RawSourceMap } from '@ampproject/remapping';
9
- import type { FileImporter, Importer, ImporterResult } from 'sass';
9
+ import type { Importer, ImporterResult } from 'sass';
10
10
  /**
11
11
  * A preprocessed cache entry for the files and directories within a previously searched
12
12
  * directory when performing Sass import resolution.
@@ -76,7 +76,10 @@ export declare class RelativeUrlRebasingImporter extends UrlRebasingImporter {
76
76
  */
77
77
  export declare class ModuleUrlRebasingImporter extends RelativeUrlRebasingImporter {
78
78
  private finder;
79
- constructor(entryDirectory: string, directoryCache: Map<string, DirectoryEntry>, rebaseSourceMaps: Map<string, RawSourceMap> | undefined, finder: FileImporter<'sync'>['findFileUrl']);
79
+ constructor(entryDirectory: string, directoryCache: Map<string, DirectoryEntry>, rebaseSourceMaps: Map<string, RawSourceMap> | undefined, finder: (specifier: string, options: {
80
+ fromImport: boolean;
81
+ resolveDir?: string;
82
+ }) => URL | null);
80
83
  canonicalize(url: string, options: {
81
84
  fromImport: boolean;
82
85
  }): URL | null;