cdk-cost-analyzer 0.1.41 → 0.1.43

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 (60) hide show
  1. package/.cdk-cost-analyzer-cache/metadata.json +8 -8
  2. package/dist/action/api/index.d.ts +1 -0
  3. package/dist/action/api/single-template-types.d.ts +4 -0
  4. package/dist/action/api/types.d.ts +3 -0
  5. package/dist/action/config/types.d.ts +2 -0
  6. package/dist/action/optimization/OptimizationEngine.d.ts +11 -0
  7. package/dist/action/optimization/analyzers/GravitonMigrationAnalyzer.d.ts +17 -0
  8. package/dist/action/optimization/analyzers/NATGatewayOptimizationAnalyzer.d.ts +13 -0
  9. package/dist/action/optimization/analyzers/ReservedInstanceAnalyzer.d.ts +13 -0
  10. package/dist/action/optimization/analyzers/RightSizingAnalyzer.d.ts +13 -0
  11. package/dist/action/optimization/analyzers/SavingsPlansAnalyzer.d.ts +11 -0
  12. package/dist/action/optimization/analyzers/SpotInstanceAnalyzer.d.ts +12 -0
  13. package/dist/action/optimization/analyzers/StorageOptimizationAnalyzer.d.ts +14 -0
  14. package/dist/action/optimization/defaults.d.ts +2 -0
  15. package/dist/action/optimization/index.d.ts +10 -0
  16. package/dist/action/optimization/types.d.ts +35 -0
  17. package/dist/action/reporter/RecommendationReporter.d.ts +3 -0
  18. package/dist/analysis/SingleTemplateAnalyzer.js +12 -1
  19. package/dist/api/index.d.ts +1 -0
  20. package/dist/api/index.js +2 -1
  21. package/dist/api/single-template-types.d.ts +4 -0
  22. package/dist/api/single-template-types.js +1 -1
  23. package/dist/api/types.d.ts +3 -0
  24. package/dist/api/types.js +1 -1
  25. package/dist/cli/index.js +13 -2
  26. package/dist/config/types.d.ts +2 -0
  27. package/dist/config/types.js +1 -1
  28. package/dist/optimization/OptimizationEngine.d.ts +11 -0
  29. package/dist/optimization/OptimizationEngine.js +51 -0
  30. package/dist/optimization/analyzers/GravitonMigrationAnalyzer.d.ts +17 -0
  31. package/dist/optimization/analyzers/GravitonMigrationAnalyzer.js +209 -0
  32. package/dist/optimization/analyzers/NATGatewayOptimizationAnalyzer.d.ts +13 -0
  33. package/dist/optimization/analyzers/NATGatewayOptimizationAnalyzer.js +142 -0
  34. package/dist/optimization/analyzers/ReservedInstanceAnalyzer.d.ts +13 -0
  35. package/dist/optimization/analyzers/ReservedInstanceAnalyzer.js +102 -0
  36. package/dist/optimization/analyzers/RightSizingAnalyzer.d.ts +13 -0
  37. package/dist/optimization/analyzers/RightSizingAnalyzer.js +109 -0
  38. package/dist/optimization/analyzers/SavingsPlansAnalyzer.d.ts +11 -0
  39. package/dist/optimization/analyzers/SavingsPlansAnalyzer.js +102 -0
  40. package/dist/optimization/analyzers/SpotInstanceAnalyzer.d.ts +12 -0
  41. package/dist/optimization/analyzers/SpotInstanceAnalyzer.js +113 -0
  42. package/dist/optimization/analyzers/StorageOptimizationAnalyzer.d.ts +14 -0
  43. package/dist/optimization/analyzers/StorageOptimizationAnalyzer.js +142 -0
  44. package/dist/optimization/defaults.d.ts +2 -0
  45. package/dist/optimization/defaults.js +22 -0
  46. package/dist/optimization/index.d.ts +10 -0
  47. package/dist/optimization/index.js +22 -0
  48. package/dist/optimization/types.d.ts +35 -0
  49. package/dist/optimization/types.js +3 -0
  50. package/dist/releasetag.txt +1 -1
  51. package/dist/reporter/RecommendationReporter.d.ts +3 -0
  52. package/dist/reporter/RecommendationReporter.js +133 -0
  53. package/dist/reporter/SingleTemplateReporter.js +11 -1
  54. package/docs/CALCULATORS.md +374 -8
  55. package/docs/README.md +3 -2
  56. package/docs/RECOMMENDATIONS.md +466 -0
  57. package/docs/SINGLE-TEMPLATE-ANALYSIS.md +59 -16
  58. package/docs/index.md +38 -8
  59. package/examples/recommendations-demo.json +74 -0
  60. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -59,6 +59,8 @@ program
59
59
  .option('--region <region>', 'AWS region for pricing', 'eu-central-1')
60
60
  .option('--format <format>', 'Output format: text|json|markdown', 'text')
61
61
  .option('--config <path>', 'Path to configuration file')
62
+ .option('--recommendations', 'Include cost optimization recommendations')
63
+ .option('--min-savings <amount>', 'Minimum monthly savings to show (USD)', parseFloat)
62
64
  .option('--debug', 'Enable verbose debug logging for pricing API calls')
63
65
  .action(async (templatePath, options) => {
64
66
  try {
@@ -79,9 +81,18 @@ program
79
81
  template,
80
82
  region: options.region,
81
83
  format: options.format,
84
+ config: {
85
+ recommendations: options.recommendations,
86
+ minimumSavingsThreshold: options.minSavings,
87
+ },
82
88
  });
83
- // Output the results (summary already contains formatted output)
89
+ // Output the results
90
+ // For text/markdown, summary already includes recommendations via SingleTemplateReporter
84
91
  console.log(result.summary);
92
+ // For JSON format, append recommendations as structured data
93
+ if (options.format === 'json' && options.recommendations && result.recommendations) {
94
+ console.log(JSON.stringify({ recommendations: result.recommendations }, null, 2));
95
+ }
85
96
  process.exit(0);
86
97
  }
87
98
  catch (error) {
@@ -327,4 +338,4 @@ program
327
338
  }
328
339
  });
329
340
  program.parse();
330
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IseUNBQW9DO0FBQ3BDLGdDQUE2RDtBQUM3RCx5RUFBc0U7QUFDdEUseUVBQXNFO0FBRXRFLDJFQUF3RTtBQUN4RSwyRUFBd0U7QUFDeEUsNENBQXlDO0FBRXpDLGlDQUFpQztBQUNqQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMxRSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztBQUUvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztBQUU5QixPQUFPO0tBQ0osSUFBSSxDQUFDLG1CQUFtQixDQUFDO0tBQ3pCLFdBQVcsQ0FBQywwRUFBMEUsQ0FBQztLQUN2RixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFcEIsbURBQW1EO0FBQ25ELE9BQU87S0FDSixPQUFPLENBQUMsb0JBQW9CLENBQUM7S0FDN0IsV0FBVyxDQUFDLDhEQUE4RCxDQUFDO0tBQzNFLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLENBQUM7S0FDckUsTUFBTSxDQUFDLG1CQUFtQixFQUFFLG1DQUFtQyxFQUFFLE1BQU0sQ0FBQztLQUN4RSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsNEJBQTRCLENBQUM7S0FDdkQsTUFBTSxDQUFDLFNBQVMsRUFBRSxvREFBb0QsQ0FBQztLQUN2RSxNQUFNLENBQUMsS0FBSyxF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QyxLQUFLLENBQUMsc0NBQXNDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELGdEQUFnRDtRQUNoRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0UsT0FBTyxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGFuYWx5emVDb3N0cywgYW5hbHl6ZVNpbmdsZVRlbXBsYXRlIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IEdpdExhYkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdExhYkludGVncmF0aW9uJztcbmltcG9ydCB7IEdpdEh1YkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdEh1YkludGVncmF0aW9uJztcbmltcG9ydCB7IENvbW1lbnRTdHJhdGVneSB9IGZyb20gJy4uL2ludGVncmF0aW9ucy90eXBlcyc7XG5pbXBvcnQgeyBQaXBlbGluZU9yY2hlc3RyYXRvciB9IGZyb20gJy4uL3BpcGVsaW5lL1BpcGVsaW5lT3JjaGVzdHJhdG9yJztcbmltcG9ydCB7IEdpdEh1YkFjdGlvblJlcG9ydGVyIH0gZnJvbSAnLi4vcmVwb3J0ZXIvR2l0SHViQWN0aW9uUmVwb3J0ZXInO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvTG9nZ2VyJztcblxuLy8gUmVhZCB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uXG5jb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vcGFja2FnZS5qc29uJyk7XG5jb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JykpO1xuY29uc3QgdmVyc2lvbiA9IHBhY2thZ2VKc29uLnZlcnNpb24gfHwgJzAuMC4wJztcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2Nkay1jb3N0LWFuYWx5emVyJylcbiAgLmRlc2NyaXB0aW9uKCdBbmFseXplIEFXUyBDREsgaW5mcmFzdHJ1Y3R1cmUgY2hhbmdlcyBhbmQgcHJvdmlkZSBjb3N0IGltcGFjdCBzdW1tYXJpZXMnKVxuICAudmVyc2lvbih2ZXJzaW9uKTtcblxuLy8gTmV3IGFuYWx5emUgY29tbWFuZCBmb3Igc2luZ2xlIHRlbXBsYXRlIGFuYWx5c2lzXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdhbmFseXplIDx0ZW1wbGF0ZT4nKVxuICAuZGVzY3JpcHRpb24oJ0FuYWx5emUgYSBzaW5nbGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgZm9yIGVzdGltYXRlZCBjb3N0cycpXG4gIC5vcHRpb24oJy0tcmVnaW9uIDxyZWdpb24+JywgJ0FXUyByZWdpb24gZm9yIHByaWNpbmcnLCAnZXUtY2VudHJhbC0xJylcbiAgLm9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdDogdGV4dHxqc29ufG1hcmtkb3duJywgJ3RleHQnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSB2ZXJib3NlIGRlYnVnIGxvZ2dpbmcgZm9yIHByaWNpbmcgQVBJIGNhbGxzJylcbiAgLmFjdGlvbihhc3luYyAodGVtcGxhdGVQYXRoOiBzdHJpbmcsIG9wdGlvbnM6IHsgcmVnaW9uOiBzdHJpbmc7IGZvcm1hdDogc3RyaW5nOyBjb25maWc/OiBzdHJpbmc7IGRlYnVnPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nIGlmIGZsYWcgaXMgc2V0XG4gICAgICBpZiAob3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICBMb2dnZXIuc2V0RGVidWdFbmFibGVkKHRydWUpO1xuICAgICAgICBMb2dnZXIuZGVidWcoJ0RlYnVnIGxvZ2dpbmcgZW5hYmxlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0ZW1wbGF0ZSBmaWxlIGV4aXN0c1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IFRlbXBsYXRlIGZpbGUgbm90IGZvdW5kOiAke3RlbXBsYXRlUGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWFkIHRoZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmLTgnKTtcblxuICAgICAgLy8gQW5hbHl6ZSB0aGUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVTaW5nbGVUZW1wbGF0ZSh7XG4gICAgICAgIHRlbXBsYXRlLFxuICAgICAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgICAgICBmb3JtYXQ6IG9wdGlvbnMuZm9ybWF0IGFzICd0ZXh0JyB8ICdqc29uJyB8ICdtYXJrZG93bicsXG4gICAgICB9KTtcblxuICAgICAgLy8gT3V0cHV0IHRoZSByZXN1bHRzIChzdW1tYXJ5IGFscmVhZHkgY29udGFpbnMgZm9ybWF0dGVkIG91dHB1dClcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBPcmlnaW5hbCBjb21tYW5kIGZvciBkaXJlY3QgdGVtcGxhdGUgY29tcGFyaXNvblxucHJvZ3JhbVxuICAuY29tbWFuZCgnY29tcGFyZScpXG4gIC5kZXNjcmlwdGlvbignQ29tcGFyZSB0d28gQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVzJylcbiAgLmFyZ3VtZW50KCc8YmFzZT4nLCAnUGF0aCB0byBiYXNlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlJylcbiAgLmFyZ3VtZW50KCc8dGFyZ2V0PicsICdQYXRoIHRvIHRhcmdldCBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZScpXG4gIC5vcHRpb24oJy0tcmVnaW9uIDxyZWdpb24+JywgJ0FXUyByZWdpb24nLCAnZXUtY2VudHJhbC0xJylcbiAgLm9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdDogdGV4dHxqc29ufG1hcmtkb3duJywgJ3RleHQnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSB2ZXJib3NlIGRlYnVnIGxvZ2dpbmcgZm9yIHByaWNpbmcgQVBJIGNhbGxzJylcbiAgLmFjdGlvbihhc3luYyAoYmFzZVBhdGg6IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nLCBvcHRpb25zOiB7IHJlZ2lvbjogc3RyaW5nOyBmb3JtYXQ6IHN0cmluZzsgY29uZmlnPzogc3RyaW5nOyBkZWJ1Zz86IGJvb2xlYW4gfSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmFibGUgZGVidWcgbG9nZ2luZyBpZiBmbGFnIGlzIHNldFxuICAgICAgaWYgKG9wdGlvbnMuZGVidWcpIHtcbiAgICAgICAgTG9nZ2VyLnNldERlYnVnRW5hYmxlZCh0cnVlKTtcbiAgICAgICAgTG9nZ2VyLmRlYnVnKCdEZWJ1ZyBsb2dnaW5nIGVuYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGJhc2VQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogQmFzZSB0ZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IFRhcmdldCB0ZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHt0YXJnZXRQYXRofWApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VUZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhiYXNlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCB0YXJnZXRUZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyh0YXJnZXRQYXRoLCAndXRmLTgnKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYW5hbHl6ZUNvc3RzKHtcbiAgICAgICAgYmFzZVRlbXBsYXRlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgZm9ybWF0OiBvcHRpb25zLmZvcm1hdCBhcyAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zLmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnN1bW1hcnkpO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbi8vIE5ldyBwaXBlbGluZSBjb21tYW5kIGZvciBDSS9DRCBpbnRlZ3JhdGlvbiB3aXRoIHN5bnRoZXNpc1xucHJvZ3JhbVxuICAuY29tbWFuZCgncGlwZWxpbmUnKVxuICAuZGVzY3JpcHRpb24oJ1J1biBjb3N0IGFuYWx5c2lzIGluIENJL0NEIHBpcGVsaW5lIHdpdGggYXV0b21hdGljIHN5bnRoZXNpcycpXG4gIC5vcHRpb24oJy0tYmFzZSA8cGF0aD4nLCAnUGF0aCB0byBiYXNlIHRlbXBsYXRlIChpZiBub3QgdXNpbmcgc3ludGhlc2lzKScpXG4gIC5vcHRpb24oJy0tdGFyZ2V0IDxwYXRoPicsICdQYXRoIHRvIHRhcmdldCB0ZW1wbGF0ZSAoaWYgbm90IHVzaW5nIHN5bnRoZXNpcyknKVxuICAub3B0aW9uKCctLXN5bnRoJywgJ0VuYWJsZSBhdXRvbWF0aWMgQ0RLIHN5bnRoZXNpcycpXG4gIC5vcHRpb24oJy0tY2RrLWFwcC1wYXRoIDxwYXRoPicsICdQYXRoIHRvIENESyBhcHBsaWNhdGlvbiBkaXJlY3RvcnknKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZScpXG4gIC5vcHRpb24oJy0tZW52aXJvbm1lbnQgPGVudj4nLCAnRW52aXJvbm1lbnQgbmFtZSBmb3IgdGhyZXNob2xkIHNlbGVjdGlvbicpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1wb3N0LXRvLWdpdGxhYicsICdQb3N0IHJlc3VsdHMgdG8gR2l0TGFiIG1lcmdlIHJlcXVlc3QnKVxuICAub3B0aW9uKCctLXBvc3QtdG8tZ2l0aHViJywgJ1Bvc3QgcmVzdWx0cyB0byBHaXRIdWIgcHVsbCByZXF1ZXN0JylcbiAgLm9wdGlvbignLS1jb21tZW50LXN0cmF0ZWd5IDxzdHJhdGVneT4nLCAnQ29tbWVudCB1cGRhdGUgc3RyYXRlZ3k6IG5ld3x1cGRhdGV8ZGVsZXRlLWFuZC1uZXcnLCAndXBkYXRlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHtcbiAgICBiYXNlPzogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbiAgICBzeW50aD86IGJvb2xlYW47XG4gICAgY2RrQXBwUGF0aD86IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgZm9ybWF0OiBzdHJpbmc7XG4gICAgcG9zdFRvR2l0bGFiPzogYm9vbGVhbjtcbiAgICBwb3N0VG9HaXRodWI/OiBib29sZWFuO1xuICAgIGNvbW1lbnRTdHJhdGVneT86IHN0cmluZztcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIEFXUyBjcmVkZW50aWFsc1xuICAgICAgaWYgKCFwcm9jZXNzLmVudi5BV1NfQUNDRVNTX0tFWV9JRCAmJiAhcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IEFXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIC0gQVdTX0FDQ0VTU19LRVlfSUQgYW5kIEFXU19TRUNSRVRfQUNDRVNTX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICAtIEFXU19QUk9GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKScpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9yIEdpdExhYiBDSSwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiBDSS9DRCB2YXJpYWJsZXM6Jyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgU2V0dGluZ3MgPiBDSS9DRCA+IFZhcmlhYmxlcycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIEFkZDogQVdTX0FDQ0VTU19LRVlfSUQsIEFXU19TRUNSRVRfQUNDRVNTX0tFWSwgQVdTX1JFR0lPTicpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yY2hlc3RyYXRvciA9IG5ldyBQaXBlbGluZU9yY2hlc3RyYXRvcigpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmNoZXN0cmF0b3IucnVuUGlwZWxpbmVBbmFseXNpcyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZTogb3B0aW9ucy5iYXNlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZTogb3B0aW9ucy50YXJnZXQsXG4gICAgICAgIHN5bnRoZXNpemU6IG9wdGlvbnMuc3ludGgsXG4gICAgICAgIGNka0FwcFBhdGg6IG9wdGlvbnMuY2RrQXBwUGF0aCxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgY29uZmlnUGF0aDogb3B0aW9ucy5jb25maWcsXG4gICAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIERpc3BsYXkgcmVzdWx0c1xuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuY29zdEFuYWx5c2lzLnN1bW1hcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSB0aHJlc2hvbGQgc3RhdHVzXG4gICAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsICE9PSAnbm9uZScpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUkVTSE9MRCBTVEFUVVMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5tZXNzYWdlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5yZWNvbW1lbmRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY29tbWVuZGF0aW9uczonKTtcbiAgICAgICAgICAgIHJlc3VsdC50aHJlc2hvbGRTdGF0dXMucmVjb21tZW5kYXRpb25zLmZvckVhY2goKHJlYywgaSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpICsgMX0uICR7cmVjfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzcGxheSBjb25maWcgc3VtbWFyeVxuICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aCB8fCByZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdDT05GSUdVUkFUSU9OJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC5jb25maWdQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGZpbGU6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaHJlc2hvbGRzOiB3YXJuaW5nPSQke3Jlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMud2FybmluZyB8fCAnbm9uZSd9LCBlcnJvcj0kJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVycm9yIHx8ICdub25lJ31gKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFbnZpcm9ubWVudDogJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFeGNsdWRlZCByZXNvdXJjZXM6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQb3N0IHRvIEdpdExhYiBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChvcHRpb25zLnBvc3RUb0dpdGxhYikge1xuICAgICAgICBjb25zdCBnaXRsYWJUb2tlbiA9IHByb2Nlc3MuZW52LkdJVExBQl9UT0tFTiB8fCBwcm9jZXNzLmVudi5DSV9KT0JfVE9LRU47XG4gICAgICAgIGNvbnN0IHByb2plY3RJZCA9IHByb2Nlc3MuZW52LkNJX1BST0pFQ1RfSUQ7XG4gICAgICAgIGNvbnN0IG1lcmdlUmVxdWVzdElpZCA9IHByb2Nlc3MuZW52LkNJX01FUkdFX1JFUVVFU1RfSUlEO1xuICAgICAgICBjb25zdCBnaXRsYWJVcmwgPSBwcm9jZXNzLmVudi5DSV9TRVJWRVJfVVJMO1xuXG4gICAgICAgIGlmICghZ2l0bGFiVG9rZW4gfHwgIXByb2plY3RJZCB8fCAhbWVyZ2VSZXF1ZXN0SWlkIHx8ICFnaXRsYWJVcmwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBHaXRMYWIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBmb3VuZC4gU2tpcHBpbmcgR2l0TGFiIHBvc3QuJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUmVxdWlyZWQ6IENJX0pPQl9UT0tFTiwgQ0lfUFJPSkVDVF9JRCwgQ0lfTUVSR0VfUkVRVUVTVF9JSUQsIENJX1NFUlZFUl9VUkwnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZ2l0bGFiID0gbmV3IEdpdExhYkludGVncmF0aW9uKHtcbiAgICAgICAgICAgICAgdG9rZW46IGdpdGxhYlRva2VuLFxuICAgICAgICAgICAgICBhcGlVcmw6IGdpdGxhYlVybCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgZ2l0bGFiLnBvc3RNZXJnZVJlcXVlc3RDb21tZW50KFxuICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgIG1lcmdlUmVxdWVzdElpZCxcbiAgICAgICAgICAgICAgcmVzdWx0LmNvc3RBbmFseXNpcy5zdW1tYXJ5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHRzIHBvc3RlZCB0byBHaXRMYWIgbWVyZ2UgcmVxdWVzdCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiBGYWlsZWQgdG8gcG9zdCB0byBHaXRMYWI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQb3N0IHRvIEdpdEh1YiBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChvcHRpb25zLnBvc3RUb0dpdGh1Yikge1xuICAgICAgICBjb25zdCBnaXRodWJUb2tlbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjtcbiAgICAgICAgY29uc3QgZ2l0aHViUmVwb3NpdG9yeSA9IHByb2Nlc3MuZW52LkdJVEhVQl9SRVBPU0lUT1JZO1xuICAgICAgICBjb25zdCBnaXRodWJFdmVudFBhdGggPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSDtcblxuICAgICAgICBpZiAoIWdpdGh1YlRva2VuIHx8ICFnaXRodWJSZXBvc2l0b3J5KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignV2FybmluZzogR2l0SHViIGVudmlyb25tZW50IHZhcmlhYmxlcyBub3QgZm91bmQuIFNraXBwaW5nIEdpdEh1YiBwb3N0LicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlcXVpcmVkOiBHSVRIVUJfVE9LRU4sIEdJVEhVQl9SRVBPU0lUT1JZJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFBhcnNlIHJlcG9zaXRvcnkgb3duZXIgYW5kIG5hbWVcbiAgICAgICAgICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRodWJSZXBvc2l0b3J5LnNwbGl0KCcvJyk7XG5cbiAgICAgICAgICAgIC8vIEdldCBQUiBudW1iZXIgZnJvbSBldmVudCBwYXlsb2FkXG4gICAgICAgICAgICBsZXQgcHJOdW1iZXI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChnaXRodWJFdmVudFBhdGggJiYgZnMuZXhpc3RzU3luYyhnaXRodWJFdmVudFBhdGgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF5bG9hZCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGdpdGh1YkV2ZW50UGF0aCwgJ3V0Zi04JykpO1xuICAgICAgICAgICAgICBwck51bWJlciA9IGV2ZW50UGF5bG9hZC5wdWxsX3JlcXVlc3Q/Lm51bWJlciB8fCBldmVudFBheWxvYWQuaXNzdWU/Lm51bWJlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWxzbyBjaGVjayBHSVRIVUJfUFJfTlVNQkVSIGZvciBkaXJlY3Qgc2V0dGluZ1xuICAgICAgICAgICAgaWYgKCFwck51bWJlciAmJiBwcm9jZXNzLmVudi5HSVRIVUJfUFJfTlVNQkVSKSB7XG4gICAgICAgICAgICAgIHByTnVtYmVyID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuR0lUSFVCX1BSX05VTUJFUiwgMTApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXByTnVtYmVyKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dhcm5pbmc6IENvdWxkIG5vdCBkZXRlcm1pbmUgUFIgbnVtYmVyLiBTa2lwcGluZyBHaXRIdWIgcG9zdC4nKTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignU2V0IEdJVEhVQl9QUl9OVU1CRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgZW5zdXJlIHJ1bm5pbmcgaW4gYSBQUiBjb250ZXh0LicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgZ2l0aHViID0gbmV3IEdpdEh1YkludGVncmF0aW9uKHtcbiAgICAgICAgICAgICAgICB0b2tlbjogZ2l0aHViVG9rZW4sXG4gICAgICAgICAgICAgICAgYXBpVXJsOiBwcm9jZXNzLmVudi5HSVRIVUJfQVBJX1VSTCB8fCAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbScsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIEdlbmVyYXRlIEdpdEh1Yi1zcGVjaWZpYyByZXBvcnQgd2l0aCB0cmVuZCBpbmRpY2F0b3JzXG4gICAgICAgICAgICAgIGNvbnN0IGdpdGh1YlJlcG9ydGVyID0gbmV3IEdpdEh1YkFjdGlvblJlcG9ydGVyKCk7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBnaXRodWJSZXBvcnRlci5nZW5lcmF0ZVJlcG9ydCh7XG4gICAgICAgICAgICAgICAgdG90YWxEZWx0YTogcmVzdWx0LmNvc3RBbmFseXNpcy50b3RhbERlbHRhLFxuICAgICAgICAgICAgICAgIGN1cnJlbmN5OiByZXN1bHQuY29zdEFuYWx5c2lzLmN1cnJlbmN5LFxuICAgICAgICAgICAgICAgIGFkZGVkQ29zdHM6IHJlc3VsdC5jb3N0QW5hbHlzaXMuYWRkZWRSZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgcmVtb3ZlZENvc3RzOiByZXN1bHQuY29zdEFuYWx5c2lzLnJlbW92ZWRSZXNvdXJjZXMsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRDb3N0czogcmVzdWx0LmNvc3RBbmFseXNpcy5tb2RpZmllZFJlc291cmNlcyxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSAob3B0aW9ucy5jb21tZW50U3RyYXRlZ3kgfHwgJ3VwZGF0ZScpIGFzIENvbW1lbnRTdHJhdGVneTtcbiAgICAgICAgICAgICAgYXdhaXQgZ2l0aHViLnBvc3RQUkNvbW1lbnQob3duZXIsIHJlcG8sIHByTnVtYmVyLCBjb21tZW50LCBzdHJhdGVneSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHRzIHBvc3RlZCB0byBHaXRIdWIgcHVsbCByZXF1ZXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFdhcm5pbmc6IEZhaWxlZCB0byBwb3N0IHRvIEdpdEh1YjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlIGJhc2VkIG9uIHRocmVzaG9sZFxuICAgICAgaWYgKHJlc3VsdC50aHJlc2hvbGRTdGF0dXMubGV2ZWwgPT09ICdlcnJvcicgJiYgIXJlc3VsdC50aHJlc2hvbGRTdGF0dXMucGFzc2VkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1BpcGVsaW5lIGZhaWxlZDogQ29zdCB0aHJlc2hvbGQgZXhjZWVkZWQnKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDIpO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiJdfQ==
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IseUNBQW9DO0FBQ3BDLGdDQUE2RDtBQUM3RCx5RUFBc0U7QUFDdEUseUVBQXNFO0FBRXRFLDJFQUF3RTtBQUN4RSwyRUFBd0U7QUFDeEUsNENBQXlDO0FBRXpDLGlDQUFpQztBQUNqQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMxRSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztBQUUvQyxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFPLEVBQUUsQ0FBQztBQUU5QixPQUFPO0tBQ0osSUFBSSxDQUFDLG1CQUFtQixDQUFDO0tBQ3pCLFdBQVcsQ0FBQywwRUFBMEUsQ0FBQztLQUN2RixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFcEIsbURBQW1EO0FBQ25ELE9BQU87S0FDSixPQUFPLENBQUMsb0JBQW9CLENBQUM7S0FDN0IsV0FBVyxDQUFDLDhEQUE4RCxDQUFDO0tBQzNFLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLENBQUM7S0FDckUsTUFBTSxDQUFDLG1CQUFtQixFQUFFLG1DQUFtQyxFQUFFLE1BQU0sQ0FBQztLQUN4RSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsNEJBQTRCLENBQUM7S0FDdkQsTUFBTSxDQUFDLG1CQUFtQixFQUFFLDJDQUEyQyxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyx3QkFB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S0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGFuYWx5emVDb3N0cywgYW5hbHl6ZVNpbmdsZVRlbXBsYXRlIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IEdpdExhYkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdExhYkludGVncmF0aW9uJztcbmltcG9ydCB7IEdpdEh1YkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdEh1YkludGVncmF0aW9uJztcbmltcG9ydCB7IENvbW1lbnRTdHJhdGVneSB9IGZyb20gJy4uL2ludGVncmF0aW9ucy90eXBlcyc7XG5pbXBvcnQgeyBQaXBlbGluZU9yY2hlc3RyYXRvciB9IGZyb20gJy4uL3BpcGVsaW5lL1BpcGVsaW5lT3JjaGVzdHJhdG9yJztcbmltcG9ydCB7IEdpdEh1YkFjdGlvblJlcG9ydGVyIH0gZnJvbSAnLi4vcmVwb3J0ZXIvR2l0SHViQWN0aW9uUmVwb3J0ZXInO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvTG9nZ2VyJztcblxuLy8gUmVhZCB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uXG5jb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vcGFja2FnZS5qc29uJyk7XG5jb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JykpO1xuY29uc3QgdmVyc2lvbiA9IHBhY2thZ2VKc29uLnZlcnNpb24gfHwgJzAuMC4wJztcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2Nkay1jb3N0LWFuYWx5emVyJylcbiAgLmRlc2NyaXB0aW9uKCdBbmFseXplIEFXUyBDREsgaW5mcmFzdHJ1Y3R1cmUgY2hhbmdlcyBhbmQgcHJvdmlkZSBjb3N0IGltcGFjdCBzdW1tYXJpZXMnKVxuICAudmVyc2lvbih2ZXJzaW9uKTtcblxuLy8gTmV3IGFuYWx5emUgY29tbWFuZCBmb3Igc2luZ2xlIHRlbXBsYXRlIGFuYWx5c2lzXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdhbmFseXplIDx0ZW1wbGF0ZT4nKVxuICAuZGVzY3JpcHRpb24oJ0FuYWx5emUgYSBzaW5nbGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgZm9yIGVzdGltYXRlZCBjb3N0cycpXG4gIC5vcHRpb24oJy0tcmVnaW9uIDxyZWdpb24+JywgJ0FXUyByZWdpb24gZm9yIHByaWNpbmcnLCAnZXUtY2VudHJhbC0xJylcbiAgLm9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdDogdGV4dHxqc29ufG1hcmtkb3duJywgJ3RleHQnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLXJlY29tbWVuZGF0aW9ucycsICdJbmNsdWRlIGNvc3Qgb3B0aW1pemF0aW9uIHJlY29tbWVuZGF0aW9ucycpXG4gIC5vcHRpb24oJy0tbWluLXNhdmluZ3MgPGFtb3VudD4nLCAnTWluaW11bSBtb250aGx5IHNhdmluZ3MgdG8gc2hvdyAoVVNEKScsIHBhcnNlRmxvYXQpXG4gIC5vcHRpb24oJy0tZGVidWcnLCAnRW5hYmxlIHZlcmJvc2UgZGVidWcgbG9nZ2luZyBmb3IgcHJpY2luZyBBUEkgY2FsbHMnKVxuICAuYWN0aW9uKGFzeW5jICh0ZW1wbGF0ZVBhdGg6IHN0cmluZywgb3B0aW9uczogeyByZWdpb246IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGNvbmZpZz86IHN0cmluZzsgcmVjb21tZW5kYXRpb25zPzogYm9vbGVhbjsgbWluU2F2aW5ncz86IG51bWJlcjsgZGVidWc/OiBib29sZWFuIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRlbXBsYXRlIGZpbGUgZXhpc3RzXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogVGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7dGVtcGxhdGVQYXRofWApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgdGhlIHRlbXBsYXRlXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgsICd1dGYtOCcpO1xuXG4gICAgICAvLyBBbmFseXplIHRoZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYW5hbHl6ZVNpbmdsZVRlbXBsYXRlKHtcbiAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQgYXMgJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgcmVjb21tZW5kYXRpb25zOiBvcHRpb25zLnJlY29tbWVuZGF0aW9ucyxcbiAgICAgICAgICBtaW5pbXVtU2F2aW5nc1RocmVzaG9sZDogb3B0aW9ucy5taW5TYXZpbmdzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE91dHB1dCB0aGUgcmVzdWx0c1xuICAgICAgLy8gRm9yIHRleHQvbWFya2Rvd24sIHN1bW1hcnkgYWxyZWFkeSBpbmNsdWRlcyByZWNvbW1lbmRhdGlvbnMgdmlhIFNpbmdsZVRlbXBsYXRlUmVwb3J0ZXJcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcblxuICAgICAgLy8gRm9yIEpTT04gZm9ybWF0LCBhcHBlbmQgcmVjb21tZW5kYXRpb25zIGFzIHN0cnVjdHVyZWQgZGF0YVxuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnanNvbicgJiYgb3B0aW9ucy5yZWNvbW1lbmRhdGlvbnMgJiYgcmVzdWx0LnJlY29tbWVuZGF0aW9ucykge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IHJlY29tbWVuZGF0aW9uczogcmVzdWx0LnJlY29tbWVuZGF0aW9ucyB9LCBudWxsLCAyKSk7XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxuLy8gT3JpZ2luYWwgY29tbWFuZCBmb3IgZGlyZWN0IHRlbXBsYXRlIGNvbXBhcmlzb25cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2NvbXBhcmUnKVxuICAuZGVzY3JpcHRpb24oJ0NvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcycpXG4gIC5hcmd1bWVudCgnPGJhc2U+JywgJ1BhdGggdG8gYmFzZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZScpXG4gIC5hcmd1bWVudCgnPHRhcmdldD4nLCAnUGF0aCB0byB0YXJnZXQgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKGJhc2VQYXRoOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgb3B0aW9uczogeyByZWdpb246IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGNvbmZpZz86IHN0cmluZzsgZGVidWc/OiBib29sZWFuIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiYXNlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IEJhc2UgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7YmFzZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUYXJnZXQgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlVGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoYmFzZVBhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgdGFyZ2V0VGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGFyZ2V0UGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVDb3N0cyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZSxcbiAgICAgICAgdGFyZ2V0VGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQgYXMgJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBOZXcgcGlwZWxpbmUgY29tbWFuZCBmb3IgQ0kvQ0QgaW50ZWdyYXRpb24gd2l0aCBzeW50aGVzaXNcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3BpcGVsaW5lJylcbiAgLmRlc2NyaXB0aW9uKCdSdW4gY29zdCBhbmFseXNpcyBpbiBDSS9DRCBwaXBlbGluZSB3aXRoIGF1dG9tYXRpYyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWJhc2UgPHBhdGg+JywgJ1BhdGggdG8gYmFzZSB0ZW1wbGF0ZSAoaWYgbm90IHVzaW5nIHN5bnRoZXNpcyknKVxuICAub3B0aW9uKCctLXRhcmdldCA8cGF0aD4nLCAnUGF0aCB0byB0YXJnZXQgdGVtcGxhdGUgKGlmIG5vdCB1c2luZyBzeW50aGVzaXMpJylcbiAgLm9wdGlvbignLS1zeW50aCcsICdFbmFibGUgYXV0b21hdGljIENESyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWNkay1hcHAtcGF0aCA8cGF0aD4nLCAnUGF0aCB0byBDREsgYXBwbGljYXRpb24gZGlyZWN0b3J5JylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWVudmlyb25tZW50IDxlbnY+JywgJ0Vudmlyb25tZW50IG5hbWUgZm9yIHRocmVzaG9sZCBzZWxlY3Rpb24nKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tcG9zdC10by1naXRsYWInLCAnUG9zdCByZXN1bHRzIHRvIEdpdExhYiBtZXJnZSByZXF1ZXN0JylcbiAgLm9wdGlvbignLS1wb3N0LXRvLWdpdGh1YicsICdQb3N0IHJlc3VsdHMgdG8gR2l0SHViIHB1bGwgcmVxdWVzdCcpXG4gIC5vcHRpb24oJy0tY29tbWVudC1zdHJhdGVneSA8c3RyYXRlZ3k+JywgJ0NvbW1lbnQgdXBkYXRlIHN0cmF0ZWd5OiBuZXd8dXBkYXRlfGRlbGV0ZS1hbmQtbmV3JywgJ3VwZGF0ZScpXG4gIC5vcHRpb24oJy0tZGVidWcnLCAnRW5hYmxlIHZlcmJvc2UgZGVidWcgbG9nZ2luZyBmb3IgcHJpY2luZyBBUEkgY2FsbHMnKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiB7XG4gICAgYmFzZT86IHN0cmluZztcbiAgICB0YXJnZXQ/OiBzdHJpbmc7XG4gICAgc3ludGg/OiBib29sZWFuO1xuICAgIGNka0FwcFBhdGg/OiBzdHJpbmc7XG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgY29uZmlnPzogc3RyaW5nO1xuICAgIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAgIGZvcm1hdDogc3RyaW5nO1xuICAgIHBvc3RUb0dpdGxhYj86IGJvb2xlYW47XG4gICAgcG9zdFRvR2l0aHViPzogYm9vbGVhbjtcbiAgICBjb21tZW50U3RyYXRlZ3k/OiBzdHJpbmc7XG4gICAgZGVidWc/OiBib29sZWFuO1xuICB9KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nIGlmIGZsYWcgaXMgc2V0XG4gICAgICBpZiAob3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICBMb2dnZXIuc2V0RGVidWdFbmFibGVkKHRydWUpO1xuICAgICAgICBMb2dnZXIuZGVidWcoJ0RlYnVnIGxvZ2dpbmcgZW5hYmxlZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBBV1MgY3JlZGVudGlhbHNcbiAgICAgIGlmICghcHJvY2Vzcy5lbnYuQVdTX0FDQ0VTU19LRVlfSUQgJiYgIXByb2Nlc3MuZW52LkFXU19QUk9GSUxFKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBBV1MgY3JlZGVudGlhbHMgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1BsZWFzZSBzZXQgQVdTIGNyZWRlbnRpYWxzIHVzaW5nIG9uZSBvZjonKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICAtIEFXU19BQ0NFU1NfS0VZX0lEIGFuZCBBV1NfU0VDUkVUX0FDQ0VTU19LRVkgZW52aXJvbm1lbnQgdmFyaWFibGVzJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgLSBBV1NfUFJPRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZScpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIC0gQVdTIGNyZWRlbnRpYWxzIGZpbGUgKH4vLmF3cy9jcmVkZW50aWFscyknKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZvciBHaXRMYWIgQ0ksIGNvbmZpZ3VyZSBBV1MgY3JlZGVudGlhbHMgaW4gQ0kvQ0QgdmFyaWFibGVzOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIFNldHRpbmdzID4gQ0kvQ0QgPiBWYXJpYWJsZXMnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICBBZGQ6IEFXU19BQ0NFU1NfS0VZX0lELCBBV1NfU0VDUkVUX0FDQ0VTU19LRVksIEFXU19SRUdJT04nKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcmNoZXN0cmF0b3IgPSBuZXcgUGlwZWxpbmVPcmNoZXN0cmF0b3IoKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3JjaGVzdHJhdG9yLnJ1blBpcGVsaW5lQW5hbHlzaXMoe1xuICAgICAgICBiYXNlVGVtcGxhdGU6IG9wdGlvbnMuYmFzZSxcbiAgICAgICAgdGFyZ2V0VGVtcGxhdGU6IG9wdGlvbnMudGFyZ2V0LFxuICAgICAgICBzeW50aGVzaXplOiBvcHRpb25zLnN5bnRoLFxuICAgICAgICBjZGtBcHBQYXRoOiBvcHRpb25zLmNka0FwcFBhdGgsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGNvbmZpZ1BhdGg6IG9wdGlvbnMuY29uZmlnLFxuICAgICAgICBlbnZpcm9ubWVudDogb3B0aW9ucy5lbnZpcm9ubWVudCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEaXNwbGF5IHJlc3VsdHNcbiAgICAgIGlmIChvcHRpb25zLmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LmNvc3RBbmFseXNpcy5zdW1tYXJ5KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuXG4gICAgICAgIC8vIERpc3BsYXkgdGhyZXNob2xkIHN0YXR1c1xuICAgICAgICBpZiAocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5sZXZlbCAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdUSFJFU0hPTEQgU1RBVFVTJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC50aHJlc2hvbGRTdGF0dXMubWVzc2FnZSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJycpO1xuXG4gICAgICAgICAgaWYgKHJlc3VsdC50aHJlc2hvbGRTdGF0dXMucmVjb21tZW5kYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZWNvbW1lbmRhdGlvbnM6Jyk7XG4gICAgICAgICAgICByZXN1bHQudGhyZXNob2xkU3RhdHVzLnJlY29tbWVuZGF0aW9ucy5mb3JFYWNoKChyZWMsIGkpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYCR7aSArIDF9LiAke3JlY31gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc3BsYXkgY29uZmlnIHN1bW1hcnlcbiAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLmNvbmZpZ1BhdGggfHwgcmVzdWx0LmNvbmZpZ1VzZWQudGhyZXNob2xkcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCc9Jy5yZXBlYXQoODApKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQ09ORklHVVJBVElPTicpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCc9Jy5yZXBlYXQoODApKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYENvbmZpZyBmaWxlOiAke3Jlc3VsdC5jb25maWdVc2VkLmNvbmZpZ1BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVGhyZXNob2xkczogd2FybmluZz0kJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLndhcm5pbmcgfHwgJ25vbmUnfSwgZXJyb3I9JCR7cmVzdWx0LmNvbmZpZ1VzZWQudGhyZXNob2xkcy5lcnJvciB8fCAnbm9uZSd9YCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQudGhyZXNob2xkcy5lbnZpcm9ubWVudCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRW52aXJvbm1lbnQ6ICR7cmVzdWx0LmNvbmZpZ1VzZWQudGhyZXNob2xkcy5lbnZpcm9ubWVudH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRXhjbHVkZWQgcmVzb3VyY2VzOiAke3Jlc3VsdC5jb25maWdVc2VkLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5qb2luKCcsICcpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUG9zdCB0byBHaXRMYWIgaWYgcmVxdWVzdGVkXG4gICAgICBpZiAob3B0aW9ucy5wb3N0VG9HaXRsYWIpIHtcbiAgICAgICAgY29uc3QgZ2l0bGFiVG9rZW4gPSBwcm9jZXNzLmVudi5HSVRMQUJfVE9LRU4gfHwgcHJvY2Vzcy5lbnYuQ0lfSk9CX1RPS0VOO1xuICAgICAgICBjb25zdCBwcm9qZWN0SWQgPSBwcm9jZXNzLmVudi5DSV9QUk9KRUNUX0lEO1xuICAgICAgICBjb25zdCBtZXJnZVJlcXVlc3RJaWQgPSBwcm9jZXNzLmVudi5DSV9NRVJHRV9SRVFVRVNUX0lJRDtcbiAgICAgICAgY29uc3QgZ2l0bGFiVXJsID0gcHJvY2Vzcy5lbnYuQ0lfU0VSVkVSX1VSTDtcblxuICAgICAgICBpZiAoIWdpdGxhYlRva2VuIHx8ICFwcm9qZWN0SWQgfHwgIW1lcmdlUmVxdWVzdElpZCB8fCAhZ2l0bGFiVXJsKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignV2FybmluZzogR2l0TGFiIGVudmlyb25tZW50IHZhcmlhYmxlcyBub3QgZm91bmQuIFNraXBwaW5nIEdpdExhYiBwb3N0LicpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlcXVpcmVkOiBDSV9KT0JfVE9LRU4sIENJX1BST0pFQ1RfSUQsIENJX01FUkdFX1JFUVVFU1RfSUlELCBDSV9TRVJWRVJfVVJMJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGdpdGxhYiA9IG5ldyBHaXRMYWJJbnRlZ3JhdGlvbih7XG4gICAgICAgICAgICAgIHRva2VuOiBnaXRsYWJUb2tlbixcbiAgICAgICAgICAgICAgYXBpVXJsOiBnaXRsYWJVcmwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IGdpdGxhYi5wb3N0TWVyZ2VSZXF1ZXN0Q29tbWVudChcbiAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICBtZXJnZVJlcXVlc3RJaWQsXG4gICAgICAgICAgICAgIHJlc3VsdC5jb3N0QW5hbHlzaXMuc3VtbWFyeSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUmVzdWx0cyBwb3N0ZWQgdG8gR2l0TGFiIG1lcmdlIHJlcXVlc3QnKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgV2FybmluZzogRmFpbGVkIHRvIHBvc3QgdG8gR2l0TGFiOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUG9zdCB0byBHaXRIdWIgaWYgcmVxdWVzdGVkXG4gICAgICBpZiAob3B0aW9ucy5wb3N0VG9HaXRodWIpIHtcbiAgICAgICAgY29uc3QgZ2l0aHViVG9rZW4gPSBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG4gICAgICAgIGNvbnN0IGdpdGh1YlJlcG9zaXRvcnkgPSBwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWTtcbiAgICAgICAgY29uc3QgZ2l0aHViRXZlbnRQYXRoID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEg7XG5cbiAgICAgICAgaWYgKCFnaXRodWJUb2tlbiB8fCAhZ2l0aHViUmVwb3NpdG9yeSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dhcm5pbmc6IEdpdEh1YiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbm90IGZvdW5kLiBTa2lwcGluZyBHaXRIdWIgcG9zdC4nKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZXF1aXJlZDogR0lUSFVCX1RPS0VOLCBHSVRIVUJfUkVQT1NJVE9SWScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBQYXJzZSByZXBvc2l0b3J5IG93bmVyIGFuZCBuYW1lXG4gICAgICAgICAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0aHViUmVwb3NpdG9yeS5zcGxpdCgnLycpO1xuXG4gICAgICAgICAgICAvLyBHZXQgUFIgbnVtYmVyIGZyb20gZXZlbnQgcGF5bG9hZFxuICAgICAgICAgICAgbGV0IHByTnVtYmVyOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoZ2l0aHViRXZlbnRQYXRoICYmIGZzLmV4aXN0c1N5bmMoZ2l0aHViRXZlbnRQYXRoKSkge1xuICAgICAgICAgICAgICBjb25zdCBldmVudFBheWxvYWQgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhnaXRodWJFdmVudFBhdGgsICd1dGYtOCcpKTtcbiAgICAgICAgICAgICAgcHJOdW1iZXIgPSBldmVudFBheWxvYWQucHVsbF9yZXF1ZXN0Py5udW1iZXIgfHwgZXZlbnRQYXlsb2FkLmlzc3VlPy5udW1iZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFsc28gY2hlY2sgR0lUSFVCX1BSX05VTUJFUiBmb3IgZGlyZWN0IHNldHRpbmdcbiAgICAgICAgICAgIGlmICghcHJOdW1iZXIgJiYgcHJvY2Vzcy5lbnYuR0lUSFVCX1BSX05VTUJFUikge1xuICAgICAgICAgICAgICBwck51bWJlciA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdJVEhVQl9QUl9OVU1CRVIsIDEwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFwck51bWJlcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBDb3VsZCBub3QgZGV0ZXJtaW5lIFBSIG51bWJlci4gU2tpcHBpbmcgR2l0SHViIHBvc3QuJyk7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NldCBHSVRIVUJfUFJfTlVNQkVSIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGVuc3VyZSBydW5uaW5nIGluIGEgUFIgY29udGV4dC4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGdpdGh1YiA9IG5ldyBHaXRIdWJJbnRlZ3JhdGlvbih7XG4gICAgICAgICAgICAgICAgdG9rZW46IGdpdGh1YlRva2VuLFxuICAgICAgICAgICAgICAgIGFwaVVybDogcHJvY2Vzcy5lbnYuR0lUSFVCX0FQSV9VUkwgfHwgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBHaXRIdWItc3BlY2lmaWMgcmVwb3J0IHdpdGggdHJlbmQgaW5kaWNhdG9yc1xuICAgICAgICAgICAgICBjb25zdCBnaXRodWJSZXBvcnRlciA9IG5ldyBHaXRIdWJBY3Rpb25SZXBvcnRlcigpO1xuICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gZ2l0aHViUmVwb3J0ZXIuZ2VuZXJhdGVSZXBvcnQoe1xuICAgICAgICAgICAgICAgIHRvdGFsRGVsdGE6IHJlc3VsdC5jb3N0QW5hbHlzaXMudG90YWxEZWx0YSxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeTogcmVzdWx0LmNvc3RBbmFseXNpcy5jdXJyZW5jeSxcbiAgICAgICAgICAgICAgICBhZGRlZENvc3RzOiByZXN1bHQuY29zdEFuYWx5c2lzLmFkZGVkUmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgIHJlbW92ZWRDb3N0czogcmVzdWx0LmNvc3RBbmFseXNpcy5yZW1vdmVkUmVzb3VyY2VzLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQ29zdHM6IHJlc3VsdC5jb3N0QW5hbHlzaXMubW9kaWZpZWRSZXNvdXJjZXMsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gKG9wdGlvbnMuY29tbWVudFN0cmF0ZWd5IHx8ICd1cGRhdGUnKSBhcyBDb21tZW50U3RyYXRlZ3k7XG4gICAgICAgICAgICAgIGF3YWl0IGdpdGh1Yi5wb3N0UFJDb21tZW50KG93bmVyLCByZXBvLCBwck51bWJlciwgY29tbWVudCwgc3RyYXRlZ3kpO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVzdWx0cyBwb3N0ZWQgdG8gR2l0SHViIHB1bGwgcmVxdWVzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiBGYWlsZWQgdG8gcG9zdCB0byBHaXRIdWI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFeGl0IHdpdGggYXBwcm9wcmlhdGUgY29kZSBiYXNlZCBvbiB0aHJlc2hvbGRcbiAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsID09PSAnZXJyb3InICYmICFyZXN1bHQudGhyZXNob2xkU3RhdHVzLnBhc3NlZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQaXBlbGluZSBmYWlsZWQ6IENvc3QgdGhyZXNob2xkIGV4Y2VlZGVkJyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
@@ -1,9 +1,11 @@
1
+ import { OptimizationConfig } from '../optimization/types';
1
2
  export interface CostAnalyzerConfig {
2
3
  thresholds?: ThresholdConfig;
3
4
  usageAssumptions?: UsageAssumptionsConfig;
4
5
  synthesis?: SynthesisConfig;
5
6
  exclusions?: ExclusionsConfig;
6
7
  cache?: CacheConfig;
8
+ optimization?: OptimizationConfig;
7
9
  }
8
10
  export interface ThresholdConfig {
9
11
  default?: ThresholdLevels;
@@ -12,4 +12,4 @@ class ConfigurationError extends Error {
12
12
  }
13
13
  }
14
14
  exports.ConfigurationError = ConfigurationError;
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQThNQSxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUhULFlBQ0UsT0FBZSxFQUNSLFVBQWtCLEVBQ2xCLGdCQUEwQjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVTtRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQVRELGdEQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDb3N0QW5hbHl6ZXJDb25maWcge1xuICB0aHJlc2hvbGRzPzogVGhyZXNob2xkQ29uZmlnO1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgc3ludGhlc2lzPzogU3ludGhlc2lzQ29uZmlnO1xuICBleGNsdXNpb25zPzogRXhjbHVzaW9uc0NvbmZpZztcbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlc2hvbGRDb25maWcge1xuICBkZWZhdWx0PzogVGhyZXNob2xkTGV2ZWxzO1xuICBlbnZpcm9ubWVudHM/OiBSZWNvcmQ8c3RyaW5nLCBUaHJlc2hvbGRMZXZlbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVzaG9sZExldmVscyB7XG4gIHdhcm5pbmc/OiBudW1iZXI7XG4gIGVycm9yPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlQXNzdW1wdGlvbnNDb25maWcge1xuICBzMz86IHtcbiAgICBzdG9yYWdlR0I/OiBudW1iZXI7XG4gICAgZ2V0UmVxdWVzdHM/OiBudW1iZXI7XG4gICAgcHV0UmVxdWVzdHM/OiBudW1iZXI7XG4gIH07XG4gIGxhbWJkYT86IHtcbiAgICBpbnZvY2F0aW9uc1Blck1vbnRoPzogbnVtYmVyO1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogRHluYW1vREIgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIG9uLWRlbWFuZCAocGF5LXBlci1yZXF1ZXN0KSBiaWxsaW5nIG1vZGUuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBEeW5hbW9EQiB0YWJsZXNcbiAgICogY29uZmlndXJlZCB3aXRoIEJpbGxpbmdNb2RlOiBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEZvciBwcm92aXNpb25lZCBiaWxsaW5nIG1vZGUsIGNvc3RzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZVxuICAgKiBSZWFkQ2FwYWNpdHlVbml0cyBhbmQgV3JpdGVDYXBhY2l0eVVuaXRzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9keW5hbW9kYi9wcmljaW5nL1xuICAgKi9cbiAgZHluYW1vZGI/OiB7XG4gICAgLyoqIE51bWJlciBvZiByZWFkIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMTAsMDAwLDAwMCkgKi9cbiAgICByZWFkUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHdyaXRlIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIHdyaXRlUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgfTtcbiAgbmF0R2F0ZXdheT86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIGFsYj86IHtcbiAgICBuZXdDb25uZWN0aW9uc1BlclNlY29uZD86IG51bWJlcjtcbiAgICBhY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZT86IG51bWJlcjtcbiAgICBwcm9jZXNzZWRCeXRlc0dCPzogbnVtYmVyO1xuICB9O1xuICBubGI/OiB7XG4gICAgbmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQ/OiBudW1iZXI7XG4gICAgYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGU/OiBudW1iZXI7XG4gICAgcHJvY2Vzc2VkQnl0ZXNHQj86IG51bWJlcjtcbiAgfTtcbiAgY2xvdWRmcm9udD86IHtcbiAgICBkYXRhVHJhbnNmZXJHQj86IG51bWJlcjtcbiAgICByZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgYXBpR2F0ZXdheT86IHtcbiAgICByZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICB9O1xuICB2cGNFbmRwb2ludD86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBFRlMgKEVsYXN0aWMgRmlsZSBTeXN0ZW0pIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBFRlMgZmlsZSBzeXN0ZW1zLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vZWZzL3ByaWNpbmcvXG4gICAqL1xuICBlZnM/OiB7XG4gICAgLyoqIFRvdGFsIHN0b3JhZ2Ugc2l6ZSBpbiBHQiAoZGVmYXVsdDogMTAwKSAqL1xuICAgIHN0b3JhZ2VTaXplR2I/OiBudW1iZXI7XG4gICAgLyoqIFBlcmNlbnRhZ2Ugb2Ygc3RvcmFnZSBpbiBJbmZyZXF1ZW50IEFjY2VzcyBjbGFzcyAoZGVmYXVsdDogMCwgcmFuZ2U6IDAtMTAwKSAqL1xuICAgIGluZnJlcXVlbnRBY2Nlc3NQZXJjZW50YWdlPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogU05TIChTaW1wbGUgTm90aWZpY2F0aW9uIFNlcnZpY2UpIHVzYWdlIGFzc3VtcHRpb25zLlxuICAgKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgdG8gZXN0aW1hdGUgbW9udGhseSBjb3N0cyBmb3IgU05TIHRvcGljcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3Nucy9wcmljaW5nL1xuICAgKi9cbiAgc25zPzoge1xuICAgIC8qKiBOdW1iZXIgb2YgcHVibGlzaCByZXF1ZXN0cyBwZXIgbW9udGggKGRlZmF1bHQ6IDEsMDAwLDAwMCkgKi9cbiAgICBtb250aGx5UHVibGlzaGVzPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgSFRUUC9TIGRlbGl2ZXJpZXMgcGVyIG1vbnRoIChkZWZhdWx0OiAxLDAwMCwwMDApICovXG4gICAgaHR0cERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBlbWFpbCBkZWxpdmVyaWVzIHBlciBtb250aCAoZGVmYXVsdDogMCkgKi9cbiAgICBlbWFpbERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBTTVMgZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDApICovXG4gICAgc21zRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIG1vYmlsZSBwdXNoIGRlbGl2ZXJpZXMgcGVyIG1vbnRoIChkZWZhdWx0OiAwKSAqL1xuICAgIG1vYmlsZVB1c2hEZWxpdmVyaWVzPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogU1FTIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqIEFwcGxpZXMgdG8gYm90aCBTdGFuZGFyZCBhbmQgRklGTyBxdWV1ZXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9zcXMvcHJpY2luZy9cbiAgICovXG4gIHNxcz86IHtcbiAgICAvKiogTnVtYmVyIG9mIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIG1vbnRobHlSZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIFN0ZXAgRnVuY3Rpb25zIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqXG4gICAqIFN0YW5kYXJkIHdvcmtmbG93cyBhcmUgY2hhcmdlZCBwZXIgc3RhdGUgdHJhbnNpdGlvbi5cbiAgICogRXhwcmVzcyB3b3JrZmxvd3MgYXJlIGNoYXJnZWQgcGVyIHJlcXVlc3QgYW5kIHBlciBHQi1zZWNvbmQgb2YgZHVyYXRpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9zdGVwLWZ1bmN0aW9ucy9wcmljaW5nL1xuICAgKi9cbiAgc3RlcEZ1bmN0aW9ucz86IHtcbiAgICAvKiogTnVtYmVyIG9mIHdvcmtmbG93IGV4ZWN1dGlvbnMgcGVyIG1vbnRoIChkZWZhdWx0OiAxMCwwMDApICovXG4gICAgbW9udGhseUV4ZWN1dGlvbnM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBzdGF0ZSB0cmFuc2l0aW9ucyBwZXIgZXhlY3V0aW9uIChkZWZhdWx0OiAxMCwgZm9yIFN0YW5kYXJkIHdvcmtmbG93cykgKi9cbiAgICBzdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uPzogbnVtYmVyO1xuICAgIC8qKiBBdmVyYWdlIGV4ZWN1dGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDEwMDAsIGZvciBFeHByZXNzIHdvcmtmbG93cykgKi9cbiAgICBhdmVyYWdlRHVyYXRpb25Ncz86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIFNlY3JldHMgTWFuYWdlciB1c2FnZSBhc3N1bXB0aW9ucyBmb3IgY29zdCBlc3RpbWF0aW9uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vc2VjcmV0cy1tYW5hZ2VyL3ByaWNpbmcvXG4gICAqL1xuICBzZWNyZXRzTWFuYWdlcj86IHtcbiAgICAvKiogTnVtYmVyIG9mIEFQSSBjYWxscyBwZXIgbW9udGggKGRlZmF1bHQ6IDEwLDAwMCkgKi9cbiAgICBtb250aGx5QXBpQ2FsbHM/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBBdXJvcmEgU2VydmVybGVzcyB1c2FnZSBhc3N1bXB0aW9ucyBmb3IgY29zdCBlc3RpbWF0aW9uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vcmRzL2F1cm9yYS9wcmljaW5nL1xuICAgKi9cbiAgYXVyb3JhU2VydmVybGVzcz86IHtcbiAgICAvKiogTWluaW11bSBBQ1UgY2FwYWNpdHkgKGRlZmF1bHQ6IDAuNSkgKi9cbiAgICBtaW5BQ1U/OiBudW1iZXI7XG4gICAgLyoqIE1heGltdW0gQUNVIGNhcGFjaXR5IChkZWZhdWx0OiAxNikgKi9cbiAgICBtYXhBQ1U/OiBudW1iZXI7XG4gICAgLyoqIFN0b3JhZ2Ugc2l6ZSBpbiBHQiAoZGVmYXVsdDogMTAwKSAqL1xuICAgIHN0b3JhZ2VHQj86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIFRyYW5zaXQgR2F0ZXdheSB1c2FnZSBhc3N1bXB0aW9ucyBmb3IgY29zdCBlc3RpbWF0aW9uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vdHJhbnNpdC1nYXRld2F5L3ByaWNpbmcvXG4gICAqL1xuICB0cmFuc2l0R2F0ZXdheT86IHtcbiAgICAvKiogTnVtYmVyIG9mIFZQQy9WUE4gYXR0YWNobWVudHMgKGRlZmF1bHQ6IDMpICovXG4gICAgYXR0YWNobWVudHM/OiBudW1iZXI7XG4gICAgLyoqIE1vbnRobHkgZGF0YSBwcm9jZXNzZWQgaW4gR0IgKGRlZmF1bHQ6IDEwMDApICovXG4gICAgbW9udGhseURhdGFHQj86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIFJvdXRlIDUzIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9yb3V0ZTUzL3ByaWNpbmcvXG4gICAqL1xuICByb3V0ZTUzPzoge1xuICAgIC8qKiBNb250aGx5IEROUyBxdWVyaWVzIChkZWZhdWx0OiAxLDAwMCwwMDApICovXG4gICAgbW9udGhseVF1ZXJpZXM/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBLaW5lc2lzIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9raW5lc2lzL3ByaWNpbmcvXG4gICAqL1xuICBraW5lc2lzPzoge1xuICAgIC8qKiBOdW1iZXIgb2Ygc2hhcmRzIGZvciBwcm92aXNpb25lZCBzdHJlYW1zIChkZWZhdWx0OiAyKSAqL1xuICAgIHNoYXJkQ291bnQ/OiBudW1iZXI7XG4gICAgLyoqIE1vbnRobHkgZGF0YSBpbmdlc3Rpb24gaW4gR0IgZm9yIG9uLWRlbWFuZCBzdHJlYW1zIChkZWZhdWx0OiAxMDAwKSAqL1xuICAgIGluZ2VzdGlvbkdCPzogbnVtYmVyO1xuICAgIC8qKiBNb250aGx5IGRhdGEgcmV0cmlldmFsIGluIEdCIGZvciBvbi1kZW1hbmQgc3RyZWFtcyAoZGVmYXVsdDogMjAwMCkgKi9cbiAgICByZXRyaWV2YWxHQj86IG51bWJlcjtcbiAgICAvKiogTW9udGhseSBkYXRhIGluZ2VzdGlvbiBpbiBHQiBmb3IgRmlyZWhvc2UgKGRlZmF1bHQ6IDEwMDApICovXG4gICAgZmlyZWhvc2VHQj86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIEtpbmVzaXMgUHJvY2Vzc2luZyBVbml0cyBmb3IgQW5hbHl0aWNzIChkZWZhdWx0OiAyKSAqL1xuICAgIGtwdXM/OiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhlc2lzQ29uZmlnIHtcbiAgYXBwUGF0aD86IHN0cmluZztcbiAgb3V0cHV0UGF0aD86IHN0cmluZztcbiAgY3VzdG9tQ29tbWFuZD86IHN0cmluZztcbiAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjbHVzaW9uc0NvbmZpZyB7XG4gIHJlc291cmNlVHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBkdXJhdGlvbkhvdXJzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICB2YWxpZDogYm9vbGVhbjtcbiAgZXJyb3JzOiBzdHJpbmdbXTtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIGNvbmZpZ1BhdGg6IHN0cmluZyxcbiAgICBwdWJsaWMgdmFsaWRhdGlvbkVycm9yczogc3RyaW5nW10sXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdDb25maWd1cmF0aW9uRXJyb3InO1xuICB9XG59XG4iXX0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlOQSxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUhULFlBQ0UsT0FBZSxFQUNSLFVBQWtCLEVBQ2xCLGdCQUEwQjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVTtRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQVRELGdEQVNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW1pemF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vb3B0aW1pemF0aW9uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBDb3N0QW5hbHl6ZXJDb25maWcge1xuICB0aHJlc2hvbGRzPzogVGhyZXNob2xkQ29uZmlnO1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgc3ludGhlc2lzPzogU3ludGhlc2lzQ29uZmlnO1xuICBleGNsdXNpb25zPzogRXhjbHVzaW9uc0NvbmZpZztcbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbiAgb3B0aW1pemF0aW9uPzogT3B0aW1pemF0aW9uQ29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVzaG9sZENvbmZpZyB7XG4gIGRlZmF1bHQ/OiBUaHJlc2hvbGRMZXZlbHM7XG4gIGVudmlyb25tZW50cz86IFJlY29yZDxzdHJpbmcsIFRocmVzaG9sZExldmVscz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZXNob2xkTGV2ZWxzIHtcbiAgd2FybmluZz86IG51bWJlcjtcbiAgZXJyb3I/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZyB7XG4gIHMzPzoge1xuICAgIHN0b3JhZ2VHQj86IG51bWJlcjtcbiAgICBnZXRSZXF1ZXN0cz86IG51bWJlcjtcbiAgICBwdXRSZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgbGFtYmRhPzoge1xuICAgIGludm9jYXRpb25zUGVyTW9udGg/OiBudW1iZXI7XG4gICAgYXZlcmFnZUR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBEeW5hbW9EQiB1c2FnZSBhc3N1bXB0aW9ucyBmb3Igb24tZGVtYW5kIChwYXktcGVyLXJlcXVlc3QpIGJpbGxpbmcgbW9kZS5cbiAgICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGVzdGltYXRlIG1vbnRobHkgY29zdHMgZm9yIER5bmFtb0RCIHRhYmxlc1xuICAgKiBjb25maWd1cmVkIHdpdGggQmlsbGluZ01vZGU6IFBBWV9QRVJfUkVRVUVTVC5cbiAgICpcbiAgICogRm9yIHByb3Zpc2lvbmVkIGJpbGxpbmcgbW9kZSwgY29zdHMgYXJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlXG4gICAqIFJlYWRDYXBhY2l0eVVuaXRzIGFuZCBXcml0ZUNhcGFjaXR5VW5pdHMgc3BlY2lmaWVkIGluIHRoZSB0ZW1wbGF0ZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL2R5bmFtb2RiL3ByaWNpbmcvXG4gICAqL1xuICBkeW5hbW9kYj86IHtcbiAgICAvKiogTnVtYmVyIG9mIHJlYWQgcmVxdWVzdHMgcGVyIG1vbnRoIChkZWZhdWx0OiAxMCwwMDAsMDAwKSAqL1xuICAgIHJlYWRSZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2Ygd3JpdGUgcmVxdWVzdHMgcGVyIG1vbnRoIChkZWZhdWx0OiAxLDAwMCwwMDApICovXG4gICAgd3JpdGVSZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICB9O1xuICBuYXRHYXRld2F5Pzoge1xuICAgIGRhdGFQcm9jZXNzZWRHQj86IG51bWJlcjtcbiAgfTtcbiAgYWxiPzoge1xuICAgIG5ld0Nvbm5lY3Rpb25zUGVyU2Vjb25kPzogbnVtYmVyO1xuICAgIGFjdGl2ZUNvbm5lY3Rpb25zUGVyTWludXRlPzogbnVtYmVyO1xuICAgIHByb2Nlc3NlZEJ5dGVzR0I/OiBudW1iZXI7XG4gIH07XG4gIG5sYj86IHtcbiAgICBuZXdDb25uZWN0aW9uc1BlclNlY29uZD86IG51bWJlcjtcbiAgICBhY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZT86IG51bWJlcjtcbiAgICBwcm9jZXNzZWRCeXRlc0dCPzogbnVtYmVyO1xuICB9O1xuICBjbG91ZGZyb250Pzoge1xuICAgIGRhdGFUcmFuc2ZlckdCPzogbnVtYmVyO1xuICAgIHJlcXVlc3RzPzogbnVtYmVyO1xuICB9O1xuICBhcGlHYXRld2F5Pzoge1xuICAgIHJlcXVlc3RzUGVyTW9udGg/OiBudW1iZXI7XG4gIH07XG4gIHZwY0VuZHBvaW50Pzoge1xuICAgIGRhdGFQcm9jZXNzZWRHQj86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEVGUyAoRWxhc3RpYyBGaWxlIFN5c3RlbSkgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGVzdGltYXRlIG1vbnRobHkgY29zdHMgZm9yIEVGUyBmaWxlIHN5c3RlbXMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9lZnMvcHJpY2luZy9cbiAgICovXG4gIGVmcz86IHtcbiAgICAvKiogVG90YWwgc3RvcmFnZSBzaXplIGluIEdCIChkZWZhdWx0OiAxMDApICovXG4gICAgc3RvcmFnZVNpemVHYj86IG51bWJlcjtcbiAgICAvKiogUGVyY2VudGFnZSBvZiBzdG9yYWdlIGluIEluZnJlcXVlbnQgQWNjZXNzIGNsYXNzIChkZWZhdWx0OiAwLCByYW5nZTogMC0xMDApICovXG4gICAgaW5mcmVxdWVudEFjY2Vzc1BlcmNlbnRhZ2U/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTTlMgKFNpbXBsZSBOb3RpZmljYXRpb24gU2VydmljZSkgdXNhZ2UgYXNzdW1wdGlvbnMuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBTTlMgdG9waWNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vc25zL3ByaWNpbmcvXG4gICAqL1xuICBzbnM/OiB7XG4gICAgLyoqIE51bWJlciBvZiBwdWJsaXNoIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIG1vbnRobHlQdWJsaXNoZXM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBIVFRQL1MgZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDEsMDAwLDAwMCkgKi9cbiAgICBodHRwRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIGVtYWlsIGRlbGl2ZXJpZXMgcGVyIG1vbnRoIChkZWZhdWx0OiAwKSAqL1xuICAgIGVtYWlsRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIFNNUyBkZWxpdmVyaWVzIHBlciBtb250aCAoZGVmYXVsdDogMCkgKi9cbiAgICBzbXNEZWxpdmVyaWVzPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgbW9iaWxlIHB1c2ggZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDApICovXG4gICAgbW9iaWxlUHVzaERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTUVMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICogQXBwbGllcyB0byBib3RoIFN0YW5kYXJkIGFuZCBGSUZPIHF1ZXVlcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3Nxcy9wcmljaW5nL1xuICAgKi9cbiAgc3FzPzoge1xuICAgIC8qKiBOdW1iZXIgb2YgcmVxdWVzdHMgcGVyIG1vbnRoIChkZWZhdWx0OiAxLDAwMCwwMDApICovXG4gICAgbW9udGhseVJlcXVlc3RzPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogU3RlcCBGdW5jdGlvbnMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICpcbiAgICogU3RhbmRhcmQgd29ya2Zsb3dzIGFyZSBjaGFyZ2VkIHBlciBzdGF0ZSB0cmFuc2l0aW9uLlxuICAgKiBFeHByZXNzIHdvcmtmbG93cyBhcmUgY2hhcmdlZCBwZXIgcmVxdWVzdCBhbmQgcGVyIEdCLXNlY29uZCBvZiBkdXJhdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3N0ZXAtZnVuY3Rpb25zL3ByaWNpbmcvXG4gICAqL1xuICBzdGVwRnVuY3Rpb25zPzoge1xuICAgIC8qKiBOdW1iZXIgb2Ygd29ya2Zsb3cgZXhlY3V0aW9ucyBwZXIgbW9udGggKGRlZmF1bHQ6IDEwLDAwMCkgKi9cbiAgICBtb250aGx5RXhlY3V0aW9ucz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHN0YXRlIHRyYW5zaXRpb25zIHBlciBleGVjdXRpb24gKGRlZmF1bHQ6IDEwLCBmb3IgU3RhbmRhcmQgd29ya2Zsb3dzKSAqL1xuICAgIHN0YXRlVHJhbnNpdGlvbnNQZXJFeGVjdXRpb24/OiBudW1iZXI7XG4gICAgLyoqIEF2ZXJhZ2UgZXhlY3V0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMTAwMCwgZm9yIEV4cHJlc3Mgd29ya2Zsb3dzKSAqL1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogU2VjcmV0cyBNYW5hZ2VyIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9zZWNyZXRzLW1hbmFnZXIvcHJpY2luZy9cbiAgICovXG4gIHNlY3JldHNNYW5hZ2VyPzoge1xuICAgIC8qKiBOdW1iZXIgb2YgQVBJIGNhbGxzIHBlciBtb250aCAoZGVmYXVsdDogMTAsMDAwKSAqL1xuICAgIG1vbnRobHlBcGlDYWxscz86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEF1cm9yYSBTZXJ2ZXJsZXNzIHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9yZHMvYXVyb3JhL3ByaWNpbmcvXG4gICAqL1xuICBhdXJvcmFTZXJ2ZXJsZXNzPzoge1xuICAgIC8qKiBNaW5pbXVtIEFDVSBjYXBhY2l0eSAoZGVmYXVsdDogMC41KSAqL1xuICAgIG1pbkFDVT86IG51bWJlcjtcbiAgICAvKiogTWF4aW11bSBBQ1UgY2FwYWNpdHkgKGRlZmF1bHQ6IDE2KSAqL1xuICAgIG1heEFDVT86IG51bWJlcjtcbiAgICAvKiogU3RvcmFnZSBzaXplIGluIEdCIChkZWZhdWx0OiAxMDApICovXG4gICAgc3RvcmFnZUdCPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogVHJhbnNpdCBHYXRld2F5IHVzYWdlIGFzc3VtcHRpb25zIGZvciBjb3N0IGVzdGltYXRpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS90cmFuc2l0LWdhdGV3YXkvcHJpY2luZy9cbiAgICovXG4gIHRyYW5zaXRHYXRld2F5Pzoge1xuICAgIC8qKiBOdW1iZXIgb2YgVlBDL1ZQTiBhdHRhY2htZW50cyAoZGVmYXVsdDogMykgKi9cbiAgICBhdHRhY2htZW50cz86IG51bWJlcjtcbiAgICAvKiogTW9udGhseSBkYXRhIHByb2Nlc3NlZCBpbiBHQiAoZGVmYXVsdDogMTAwMCkgKi9cbiAgICBtb250aGx5RGF0YUdCPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogUm91dGUgNTMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3JvdXRlNTMvcHJpY2luZy9cbiAgICovXG4gIHJvdXRlNTM/OiB7XG4gICAgLyoqIE1vbnRobHkgRE5TIHF1ZXJpZXMgKGRlZmF1bHQ6IDEsMDAwLDAwMCkgKi9cbiAgICBtb250aGx5UXVlcmllcz86IG51bWJlcjtcbiAgfTtcbiAgLyoqXG4gICAqIEtpbmVzaXMgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIGNvc3QgZXN0aW1hdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL2tpbmVzaXMvcHJpY2luZy9cbiAgICovXG4gIGtpbmVzaXM/OiB7XG4gICAgLyoqIE51bWJlciBvZiBzaGFyZHMgZm9yIHByb3Zpc2lvbmVkIHN0cmVhbXMgKGRlZmF1bHQ6IDIpICovXG4gICAgc2hhcmRDb3VudD86IG51bWJlcjtcbiAgICAvKiogTW9udGhseSBkYXRhIGluZ2VzdGlvbiBpbiBHQiBmb3Igb24tZGVtYW5kIHN0cmVhbXMgKGRlZmF1bHQ6IDEwMDApICovXG4gICAgaW5nZXN0aW9uR0I/OiBudW1iZXI7XG4gICAgLyoqIE1vbnRobHkgZGF0YSByZXRyaWV2YWwgaW4gR0IgZm9yIG9uLWRlbWFuZCBzdHJlYW1zIChkZWZhdWx0OiAyMDAwKSAqL1xuICAgIHJldHJpZXZhbEdCPzogbnVtYmVyO1xuICAgIC8qKiBNb250aGx5IGRhdGEgaW5nZXN0aW9uIGluIEdCIGZvciBGaXJlaG9zZSAoZGVmYXVsdDogMTAwMCkgKi9cbiAgICBmaXJlaG9zZUdCPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgS2luZXNpcyBQcm9jZXNzaW5nIFVuaXRzIGZvciBBbmFseXRpY3MgKGRlZmF1bHQ6IDIpICovXG4gICAga3B1cz86IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW50aGVzaXNDb25maWcge1xuICBhcHBQYXRoPzogc3RyaW5nO1xuICBvdXRwdXRQYXRoPzogc3RyaW5nO1xuICBjdXN0b21Db21tYW5kPzogc3RyaW5nO1xuICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGNsdXNpb25zQ29uZmlnIHtcbiAgcmVzb3VyY2VUeXBlcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGR1cmF0aW9uSG91cnM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gIHZhbGlkOiBib29sZWFuO1xuICBlcnJvcnM6IHN0cmluZ1tdO1xuICB3YXJuaW5nczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgY29uZmlnUGF0aDogc3RyaW5nLFxuICAgIHB1YmxpYyB2YWxpZGF0aW9uRXJyb3JzOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ3VyYXRpb25FcnJvcic7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import { ResourceWithId } from '../diff/types';
2
+ import { ResourceCost } from '../pricing/types';
3
+ import { OptimizationAnalyzer, OptimizationConfig, OptimizationResult } from './types';
4
+ export declare class OptimizationEngine {
5
+ private readonly config;
6
+ private readonly analyzers;
7
+ constructor(analyzers: OptimizationAnalyzer[], config?: OptimizationConfig);
8
+ analyze(resources: ResourceWithId[], resourceCosts: ResourceCost[], region: string): Promise<OptimizationResult>;
9
+ private filterAnalyzers;
10
+ private applyThreshold;
11
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OptimizationEngine = void 0;
4
+ class OptimizationEngine {
5
+ config;
6
+ analyzers = [];
7
+ constructor(analyzers, config = {}) {
8
+ this.config = config;
9
+ this.analyzers = this.filterAnalyzers(analyzers);
10
+ }
11
+ async analyze(resources, resourceCosts, region) {
12
+ const allRecommendations = [];
13
+ for (const analyzer of this.analyzers) {
14
+ if (!analyzer.isApplicable(resources)) {
15
+ continue;
16
+ }
17
+ const recommendations = await analyzer.analyze(resources, resourceCosts, region);
18
+ allRecommendations.push(...recommendations);
19
+ }
20
+ const filtered = this.applyThreshold(allRecommendations);
21
+ const sorted = filtered.sort((a, b) => b.estimatedMonthlySavings - a.estimatedMonthlySavings);
22
+ return {
23
+ recommendations: sorted,
24
+ totalEstimatedMonthlySavings: sorted.reduce((sum, r) => sum + r.estimatedMonthlySavings, 0),
25
+ currency: 'USD',
26
+ analyzedResourceCount: resources.length,
27
+ analyzedAt: new Date().toISOString(),
28
+ };
29
+ }
30
+ filterAnalyzers(analyzers) {
31
+ const { enabledCategories, disabledCategories } = this.config;
32
+ return analyzers.filter((a) => {
33
+ if (enabledCategories && !enabledCategories.includes(a.category)) {
34
+ return false;
35
+ }
36
+ if (disabledCategories && disabledCategories.includes(a.category)) {
37
+ return false;
38
+ }
39
+ return true;
40
+ });
41
+ }
42
+ applyThreshold(recommendations) {
43
+ const threshold = this.config.minimumSavingsThreshold;
44
+ if (!threshold) {
45
+ return recommendations;
46
+ }
47
+ return recommendations.filter((r) => r.estimatedMonthlySavings >= threshold);
48
+ }
49
+ }
50
+ exports.OptimizationEngine = OptimizationEngine;
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW1pemF0aW9uRW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29wdGltaXphdGlvbi9PcHRpbWl6YXRpb25FbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBU0EsTUFBYSxrQkFBa0I7SUFLVjtJQUpGLFNBQVMsR0FBMkIsRUFBRSxDQUFDO0lBRXhELFlBQ0UsU0FBaUMsRUFDaEIsU0FBNkIsRUFBRTtRQUEvQixXQUFNLEdBQU4sTUFBTSxDQUF5QjtRQUVoRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsU0FBMkIsRUFDM0IsYUFBNkIsRUFDN0IsTUFBYztRQUVkLE1BQU0sa0JBQWtCLEdBQXFCLEVBQUUsQ0FBQztRQUVoRCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sZUFBZSxHQUFHLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FDNUMsU0FBUyxFQUNULGFBQWEsRUFDYixNQUFNLENBQ1AsQ0FBQztZQUNGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDekQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FDMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLHVCQUF1QixDQUNoRSxDQUFDO1FBRUYsT0FBTztZQUNMLGVBQWUsRUFBRSxNQUFNO1lBQ3ZCLDRCQUE0QixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQ3pDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyx1QkFBdUIsRUFDM0MsQ0FBQyxDQUNGO1lBQ0QsUUFBUSxFQUFFLEtBQUs7WUFDZixxQkFBcUIsRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN2QyxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7U0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlLENBQ3JCLFNBQWlDO1FBRWpDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFOUQsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDakUsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sY0FBYyxDQUNwQixlQUFpQztRQUVqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDO1FBQ3RELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sZUFBZSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQzNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLElBQUksU0FBUyxDQUM5QyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBMUVELGdEQTBFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlV2l0aElkIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUNvc3QgfSBmcm9tICcuLi9wcmljaW5nL3R5cGVzJztcbmltcG9ydCB7XG4gIE9wdGltaXphdGlvbkFuYWx5emVyLFxuICBPcHRpbWl6YXRpb25Db25maWcsXG4gIE9wdGltaXphdGlvblJlc3VsdCxcbiAgUmVjb21tZW5kYXRpb24sXG59IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgT3B0aW1pemF0aW9uRW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbmFseXplcnM6IE9wdGltaXphdGlvbkFuYWx5emVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhbmFseXplcnM6IE9wdGltaXphdGlvbkFuYWx5emVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE9wdGltaXphdGlvbkNvbmZpZyA9IHt9LFxuICApIHtcbiAgICB0aGlzLmFuYWx5emVycyA9IHRoaXMuZmlsdGVyQW5hbHl6ZXJzKGFuYWx5emVycyk7XG4gIH1cblxuICBhc3luYyBhbmFseXplKFxuICAgIHJlc291cmNlczogUmVzb3VyY2VXaXRoSWRbXSxcbiAgICByZXNvdXJjZUNvc3RzOiBSZXNvdXJjZUNvc3RbXSxcbiAgICByZWdpb246IHN0cmluZyxcbiAgKTogUHJvbWlzZTxPcHRpbWl6YXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBhbGxSZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9uW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgYW5hbHl6ZXIgb2YgdGhpcy5hbmFseXplcnMpIHtcbiAgICAgIGlmICghYW5hbHl6ZXIuaXNBcHBsaWNhYmxlKHJlc291cmNlcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlY29tbWVuZGF0aW9ucyA9IGF3YWl0IGFuYWx5emVyLmFuYWx5emUoXG4gICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgcmVzb3VyY2VDb3N0cyxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgKTtcbiAgICAgIGFsbFJlY29tbWVuZGF0aW9ucy5wdXNoKC4uLnJlY29tbWVuZGF0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmFwcGx5VGhyZXNob2xkKGFsbFJlY29tbWVuZGF0aW9ucyk7XG4gICAgY29uc3Qgc29ydGVkID0gZmlsdGVyZWQuc29ydChcbiAgICAgIChhLCBiKSA9PiBiLmVzdGltYXRlZE1vbnRobHlTYXZpbmdzIC0gYS5lc3RpbWF0ZWRNb250aGx5U2F2aW5ncyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29tbWVuZGF0aW9uczogc29ydGVkLFxuICAgICAgdG90YWxFc3RpbWF0ZWRNb250aGx5U2F2aW5nczogc29ydGVkLnJlZHVjZShcbiAgICAgICAgKHN1bSwgcikgPT4gc3VtICsgci5lc3RpbWF0ZWRNb250aGx5U2F2aW5ncyxcbiAgICAgICAgMCxcbiAgICAgICksXG4gICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICBhbmFseXplZFJlc291cmNlQ291bnQ6IHJlc291cmNlcy5sZW5ndGgsXG4gICAgICBhbmFseXplZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyQW5hbHl6ZXJzKFxuICAgIGFuYWx5emVyczogT3B0aW1pemF0aW9uQW5hbHl6ZXJbXSxcbiAgKTogT3B0aW1pemF0aW9uQW5hbHl6ZXJbXSB7XG4gICAgY29uc3QgeyBlbmFibGVkQ2F0ZWdvcmllcywgZGlzYWJsZWRDYXRlZ29yaWVzIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiBhbmFseXplcnMuZmlsdGVyKChhKSA9PiB7XG4gICAgICBpZiAoZW5hYmxlZENhdGVnb3JpZXMgJiYgIWVuYWJsZWRDYXRlZ29yaWVzLmluY2x1ZGVzKGEuY2F0ZWdvcnkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXNhYmxlZENhdGVnb3JpZXMgJiYgZGlzYWJsZWRDYXRlZ29yaWVzLmluY2x1ZGVzKGEuY2F0ZWdvcnkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRocmVzaG9sZChcbiAgICByZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9uW10sXG4gICk6IFJlY29tbWVuZGF0aW9uW10ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuY29uZmlnLm1pbmltdW1TYXZpbmdzVGhyZXNob2xkO1xuICAgIGlmICghdGhyZXNob2xkKSB7XG4gICAgICByZXR1cm4gcmVjb21tZW5kYXRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gcmVjb21tZW5kYXRpb25zLmZpbHRlcihcbiAgICAgIChyKSA9PiByLmVzdGltYXRlZE1vbnRobHlTYXZpbmdzID49IHRocmVzaG9sZCxcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,17 @@
1
+ import { ResourceWithId } from '../../diff/types';
2
+ import { ResourceCost } from '../../pricing/types';
3
+ import { OptimizationAnalyzer, OptimizationCategory, Recommendation } from '../types';
4
+ export declare class GravitonMigrationAnalyzer implements OptimizationAnalyzer {
5
+ readonly category: OptimizationCategory;
6
+ readonly name = "Graviton Migration";
7
+ isApplicable(resources: ResourceWithId[]): boolean;
8
+ analyze(resources: ResourceWithId[], resourceCosts: ResourceCost[], _region: string): Promise<Recommendation[]>;
9
+ private analyzeResource;
10
+ private analyzeEC2;
11
+ private analyzeRDS;
12
+ private analyzeElastiCache;
13
+ private extractFamily;
14
+ private extractRDSFamily;
15
+ private extractElastiCacheFamily;
16
+ private findCost;
17
+ }
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GravitonMigrationAnalyzer = void 0;
4
+ /**
5
+ * Mapping of x86 instance families to their Graviton equivalents.
6
+ * Graviton instances typically offer 20-40% better price-performance.
7
+ */
8
+ const GRAVITON_ALTERNATIVES = {
9
+ m5: 'm7g',
10
+ m5a: 'm7g',
11
+ m5n: 'm7g',
12
+ m6i: 'm7g',
13
+ c5: 'c7g',
14
+ c5a: 'c7g',
15
+ c5n: 'c7g',
16
+ c6i: 'c7g',
17
+ r5: 'r7g',
18
+ r5a: 'r7g',
19
+ r5n: 'r7g',
20
+ r6i: 'r7g',
21
+ t3: 't4g',
22
+ t3a: 't4g',
23
+ };
24
+ const RDS_GRAVITON_ALTERNATIVES = {
25
+ 'db.m5': 'db.m7g',
26
+ 'db.m6i': 'db.m7g',
27
+ 'db.r5': 'db.r7g',
28
+ 'db.r6i': 'db.r7g',
29
+ 'db.t3': 'db.t4g',
30
+ };
31
+ const ELASTICACHE_GRAVITON_ALTERNATIVES = {
32
+ 'cache.m5': 'cache.m7g',
33
+ 'cache.m6i': 'cache.m7g',
34
+ 'cache.r5': 'cache.r7g',
35
+ 'cache.r6i': 'cache.r7g',
36
+ 'cache.t3': 'cache.t4g',
37
+ };
38
+ const GRAVITON_SAVINGS_PERCENT = 20;
39
+ const EC2_TYPES = ['AWS::EC2::Instance', 'AWS::EC2::LaunchTemplate'];
40
+ const RDS_TYPES = ['AWS::RDS::DBInstance', 'AWS::RDS::DBCluster'];
41
+ const ELASTICACHE_TYPES = [
42
+ 'AWS::ElastiCache::CacheCluster',
43
+ 'AWS::ElastiCache::ReplicationGroup',
44
+ ];
45
+ class GravitonMigrationAnalyzer {
46
+ category = 'graviton-migration';
47
+ name = 'Graviton Migration';
48
+ isApplicable(resources) {
49
+ return resources.some((r) => EC2_TYPES.includes(r.type) ||
50
+ RDS_TYPES.includes(r.type) ||
51
+ ELASTICACHE_TYPES.includes(r.type));
52
+ }
53
+ async analyze(resources, resourceCosts, _region) {
54
+ const recommendations = [];
55
+ for (const resource of resources) {
56
+ const recommendation = this.analyzeResource(resource, resourceCosts);
57
+ if (recommendation) {
58
+ recommendations.push(recommendation);
59
+ }
60
+ }
61
+ return recommendations;
62
+ }
63
+ analyzeResource(resource, resourceCosts) {
64
+ if (EC2_TYPES.includes(resource.type)) {
65
+ return this.analyzeEC2(resource, resourceCosts);
66
+ }
67
+ if (RDS_TYPES.includes(resource.type)) {
68
+ return this.analyzeRDS(resource, resourceCosts);
69
+ }
70
+ if (ELASTICACHE_TYPES.includes(resource.type)) {
71
+ return this.analyzeElastiCache(resource, resourceCosts);
72
+ }
73
+ return null;
74
+ }
75
+ analyzeEC2(resource, resourceCosts) {
76
+ const props = resource.properties;
77
+ let instanceType;
78
+ if (resource.type === 'AWS::EC2::LaunchTemplate') {
79
+ const launchData = props.LaunchTemplateData;
80
+ instanceType = launchData?.InstanceType;
81
+ }
82
+ else {
83
+ instanceType = props.InstanceType;
84
+ }
85
+ if (!instanceType)
86
+ return null;
87
+ const family = this.extractFamily(instanceType);
88
+ const gravitonFamily = GRAVITON_ALTERNATIVES[family];
89
+ if (!gravitonFamily)
90
+ return null;
91
+ const gravitonType = instanceType.replace(family, gravitonFamily);
92
+ const cost = this.findCost(resource.logicalId, resourceCosts);
93
+ const savings = cost * (GRAVITON_SAVINGS_PERCENT / 100);
94
+ return {
95
+ id: `graviton-${resource.logicalId}`,
96
+ title: `Migrate ${resource.logicalId} to Graviton (${gravitonType})`,
97
+ description: `${instanceType} can be replaced with ${gravitonType} for ~${GRAVITON_SAVINGS_PERCENT}% cost reduction. AWS Graviton processors deliver better price-performance for most workloads.`,
98
+ category: this.category,
99
+ priority: savings >= 50 ? 'high' : savings >= 20 ? 'medium' : 'low',
100
+ estimatedMonthlySavings: Math.round(savings * 100) / 100,
101
+ estimatedSavingsPercent: GRAVITON_SAVINGS_PERCENT,
102
+ affectedResources: [resource.logicalId],
103
+ actionItems: [
104
+ `Change instance type from ${instanceType} to ${gravitonType}`,
105
+ 'Test application compatibility with ARM64 architecture',
106
+ 'Verify all dependencies support ARM64',
107
+ 'Deploy to staging first and monitor for 24 hours',
108
+ ],
109
+ caveats: [
110
+ 'Requires ARM64-compatible AMI and software',
111
+ 'Some x86-specific workloads may not be compatible',
112
+ `Savings estimate of ${GRAVITON_SAVINGS_PERCENT}% is approximate`,
113
+ ],
114
+ };
115
+ }
116
+ analyzeRDS(resource, resourceCosts) {
117
+ const props = resource.properties;
118
+ const instanceClass = props.DBInstanceClass;
119
+ if (!instanceClass)
120
+ return null;
121
+ const family = this.extractRDSFamily(instanceClass);
122
+ const gravitonFamily = RDS_GRAVITON_ALTERNATIVES[family];
123
+ if (!gravitonFamily)
124
+ return null;
125
+ const gravitonClass = instanceClass.replace(family, gravitonFamily);
126
+ const cost = this.findCost(resource.logicalId, resourceCosts);
127
+ const savings = cost * (GRAVITON_SAVINGS_PERCENT / 100);
128
+ return {
129
+ id: `graviton-${resource.logicalId}`,
130
+ title: `Migrate ${resource.logicalId} to Graviton (${gravitonClass})`,
131
+ description: `${instanceClass} can be replaced with ${gravitonClass} for ~${GRAVITON_SAVINGS_PERCENT}% cost reduction. RDS on Graviton offers the same functionality at lower cost.`,
132
+ category: this.category,
133
+ priority: savings >= 50 ? 'high' : savings >= 20 ? 'medium' : 'low',
134
+ estimatedMonthlySavings: Math.round(savings * 100) / 100,
135
+ estimatedSavingsPercent: GRAVITON_SAVINGS_PERCENT,
136
+ affectedResources: [resource.logicalId],
137
+ actionItems: [
138
+ `Change DB instance class from ${instanceClass} to ${gravitonClass}`,
139
+ 'Schedule a maintenance window for the instance class change',
140
+ 'Test database performance after migration',
141
+ ],
142
+ caveats: [
143
+ 'Requires a short downtime during instance class modification',
144
+ 'Verify database engine version supports Graviton',
145
+ `Savings estimate of ${GRAVITON_SAVINGS_PERCENT}% is approximate`,
146
+ ],
147
+ };
148
+ }
149
+ analyzeElastiCache(resource, resourceCosts) {
150
+ const props = resource.properties;
151
+ const nodeType = props.CacheNodeType ||
152
+ props.CacheNodeType;
153
+ if (!nodeType)
154
+ return null;
155
+ const family = this.extractElastiCacheFamily(nodeType);
156
+ const gravitonFamily = ELASTICACHE_GRAVITON_ALTERNATIVES[family];
157
+ if (!gravitonFamily)
158
+ return null;
159
+ const gravitonNodeType = nodeType.replace(family, gravitonFamily);
160
+ const cost = this.findCost(resource.logicalId, resourceCosts);
161
+ const savings = cost * (GRAVITON_SAVINGS_PERCENT / 100);
162
+ return {
163
+ id: `graviton-${resource.logicalId}`,
164
+ title: `Migrate ${resource.logicalId} to Graviton (${gravitonNodeType})`,
165
+ description: `${nodeType} can be replaced with ${gravitonNodeType} for ~${GRAVITON_SAVINGS_PERCENT}% cost reduction.`,
166
+ category: this.category,
167
+ priority: savings >= 50 ? 'high' : savings >= 20 ? 'medium' : 'low',
168
+ estimatedMonthlySavings: Math.round(savings * 100) / 100,
169
+ estimatedSavingsPercent: GRAVITON_SAVINGS_PERCENT,
170
+ affectedResources: [resource.logicalId],
171
+ actionItems: [
172
+ `Change node type from ${nodeType} to ${gravitonNodeType}`,
173
+ 'Schedule maintenance window for node type change',
174
+ 'Monitor cache performance after migration',
175
+ ],
176
+ caveats: [
177
+ 'Requires a brief failover during node type modification',
178
+ `Savings estimate of ${GRAVITON_SAVINGS_PERCENT}% is approximate`,
179
+ ],
180
+ };
181
+ }
182
+ extractFamily(instanceType) {
183
+ // e.g., "m5.xlarge" -> "m5", "c5a.2xlarge" -> "c5a"
184
+ const parts = instanceType.split('.');
185
+ return parts[0] || '';
186
+ }
187
+ extractRDSFamily(instanceClass) {
188
+ // e.g., "db.m5.large" -> "db.m5"
189
+ const parts = instanceClass.split('.');
190
+ if (parts.length >= 3) {
191
+ return `${parts[0]}.${parts[1]}`;
192
+ }
193
+ return '';
194
+ }
195
+ extractElastiCacheFamily(nodeType) {
196
+ // e.g., "cache.m5.large" -> "cache.m5"
197
+ const parts = nodeType.split('.');
198
+ if (parts.length >= 3) {
199
+ return `${parts[0]}.${parts[1]}`;
200
+ }
201
+ return '';
202
+ }
203
+ findCost(logicalId, resourceCosts) {
204
+ const cost = resourceCosts.find((c) => c.logicalId === logicalId);
205
+ return cost?.monthlyCost.amount ?? 0;
206
+ }
207
+ }
208
+ exports.GravitonMigrationAnalyzer = GravitonMigrationAnalyzer;
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3Jhdml0b25NaWdyYXRpb25BbmFseXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcHRpbWl6YXRpb24vYW5hbHl6ZXJzL0dyYXZpdG9uTWlncmF0aW9uQW5hbHl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBUUE7OztHQUdHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBMkI7SUFDcEQsRUFBRSxFQUFFLEtBQUs7SUFDVCxHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7SUFDVixFQUFFLEVBQUUsS0FBSztJQUNULEdBQUcsRUFBRSxLQUFLO0lBQ1YsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztJQUNWLEVBQUUsRUFBRSxLQUFLO0lBQ1QsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0lBQ1YsRUFBRSxFQUFFLEtBQUs7SUFDVCxHQUFHLEVBQUUsS0FBSztDQUNYLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUEyQjtJQUN4RCxPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFRLEVBQUUsUUFBUTtJQUNsQixPQUFPLEVBQUUsUUFBUTtJQUNqQixRQUFRLEVBQUUsUUFBUTtJQUNsQixPQUFPLEVBQUUsUUFBUTtDQUNsQixDQUFDO0FBRUYsTUFBTSxpQ0FBaUMsR0FBMkI7SUFDaEUsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLFdBQVc7SUFDeEIsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLFdBQVc7SUFDeEIsVUFBVSxFQUFFLFdBQVc7Q0FDeEIsQ0FBQztBQUVGLE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0FBRXBDLE1BQU0sU0FBUyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztBQUNyRSxNQUFNLFNBQVMsR0FBRyxDQUFDLHNCQUFzQixFQUFF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QztJQUNaLENBQUM7SUFFTyxRQUFRLENBQUMsU0FBaUIsRUFBRSxhQUE2QjtRQUMvRCxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQXZNRCw4REF1TUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCB9IGZyb20gJy4uLy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VDb3N0IH0gZnJvbSAnLi4vLi4vcHJpY2luZy90eXBlcyc7XG5pbXBvcnQge1xuICBPcHRpbWl6YXRpb25BbmFseXplcixcbiAgT3B0aW1pemF0aW9uQ2F0ZWdvcnksXG4gIFJlY29tbWVuZGF0aW9uLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogTWFwcGluZyBvZiB4ODYgaW5zdGFuY2UgZmFtaWxpZXMgdG8gdGhlaXIgR3Jhdml0b24gZXF1aXZhbGVudHMuXG4gKiBHcmF2aXRvbiBpbnN0YW5jZXMgdHlwaWNhbGx5IG9mZmVyIDIwLTQwJSBiZXR0ZXIgcHJpY2UtcGVyZm9ybWFuY2UuXG4gKi9cbmNvbnN0IEdSQVZJVE9OX0FMVEVSTkFUSVZFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgbTU6ICdtN2cnLFxuICBtNWE6ICdtN2cnLFxuICBtNW46ICdtN2cnLFxuICBtNmk6ICdtN2cnLFxuICBjNTogJ2M3ZycsXG4gIGM1YTogJ2M3ZycsXG4gIGM1bjogJ2M3ZycsXG4gIGM2aTogJ2M3ZycsXG4gIHI1OiAncjdnJyxcbiAgcjVhOiAncjdnJyxcbiAgcjVuOiAncjdnJyxcbiAgcjZpOiAncjdnJyxcbiAgdDM6ICd0NGcnLFxuICB0M2E6ICd0NGcnLFxufTtcblxuY29uc3QgUkRTX0dSQVZJVE9OX0FMVEVSTkFUSVZFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2RiLm01JzogJ2RiLm03ZycsXG4gICdkYi5tNmknOiAnZGIubTdnJyxcbiAgJ2RiLnI1JzogJ2RiLnI3ZycsXG4gICdkYi5yNmknOiAnZGIucjdnJyxcbiAgJ2RiLnQzJzogJ2RiLnQ0ZycsXG59O1xuXG5jb25zdCBFTEFTVElDQUNIRV9HUkFWSVRPTl9BTFRFUk5BVElWRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdjYWNoZS5tNSc6ICdjYWNoZS5tN2cnLFxuICAnY2FjaGUubTZpJzogJ2NhY2hlLm03ZycsXG4gICdjYWNoZS5yNSc6ICdjYWNoZS5yN2cnLFxuICAnY2FjaGUucjZpJzogJ2NhY2hlLnI3ZycsXG4gICdjYWNoZS50Myc6ICdjYWNoZS50NGcnLFxufTtcblxuY29uc3QgR1JBVklUT05fU0FWSU5HU19QRVJDRU5UID0gMjA7XG5cbmNvbnN0IEVDMl9UWVBFUyA9IFsnQVdTOjpFQzI6Okluc3RhbmNlJywgJ0FXUzo6RUMyOjpMYXVuY2hUZW1wbGF0ZSddO1xuY29uc3QgUkRTX1RZUEVTID0gWydBV1M6OlJEUzo6REJJbnN0YW5jZScsICdBV1M6OlJEUzo6REJDbHVzdGVyJ107XG5jb25zdCBFTEFTVElDQUNIRV9UWVBFUyA9IFtcbiAgJ0FXUzo6RWxhc3RpQ2FjaGU6OkNhY2hlQ2x1c3RlcicsXG4gICdBV1M6OkVsYXN0aUNhY2hlOjpSZXBsaWNhdGlvbkdyb3VwJyxcbl07XG5cbmV4cG9ydCBjbGFzcyBHcmF2aXRvbk1pZ3JhdGlvbkFuYWx5emVyIGltcGxlbWVudHMgT3B0aW1pemF0aW9uQW5hbHl6ZXIge1xuICByZWFkb25seSBjYXRlZ29yeTogT3B0aW1pemF0aW9uQ2F0ZWdvcnkgPSAnZ3Jhdml0b24tbWlncmF0aW9uJztcbiAgcmVhZG9ubHkgbmFtZSA9ICdHcmF2aXRvbiBNaWdyYXRpb24nO1xuXG4gIGlzQXBwbGljYWJsZShyZXNvdXJjZXM6IFJlc291cmNlV2l0aElkW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzb3VyY2VzLnNvbWUoXG4gICAgICAocikgPT5cbiAgICAgICAgRUMyX1RZUEVTLmluY2x1ZGVzKHIudHlwZSkgfHxcbiAgICAgICAgUkRTX1RZUEVTLmluY2x1ZGVzKHIudHlwZSkgfHxcbiAgICAgICAgRUxBU1RJQ0FDSEVfVFlQRVMuaW5jbHVkZXMoci50eXBlKSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYW5hbHl6ZShcbiAgICByZXNvdXJjZXM6IFJlc291cmNlV2l0aElkW10sXG4gICAgcmVzb3VyY2VDb3N0czogUmVzb3VyY2VDb3N0W10sXG4gICAgX3JlZ2lvbjogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlY29tbWVuZGF0aW9uW10+IHtcbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbnM6IFJlY29tbWVuZGF0aW9uW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG4gICAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IHRoaXMuYW5hbHl6ZVJlc291cmNlKHJlc291cmNlLCByZXNvdXJjZUNvc3RzKTtcbiAgICAgIGlmIChyZWNvbW1lbmRhdGlvbikge1xuICAgICAgICByZWNvbW1lbmRhdGlvbnMucHVzaChyZWNvbW1lbmRhdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29tbWVuZGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgYW5hbHl6ZVJlc291cmNlKFxuICAgIHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCxcbiAgICByZXNvdXJjZUNvc3RzOiBSZXNvdXJjZUNvc3RbXSxcbiAgKTogUmVjb21tZW5kYXRpb24gfCBudWxsIHtcbiAgICBpZiAoRUMyX1RZUEVTLmluY2x1ZGVzKHJlc291cmNlLnR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hbmFseXplRUMyKHJlc291cmNlLCByZXNvdXJjZUNvc3RzKTtcbiAgICB9XG4gICAgaWYgKFJEU19UWVBFUy5pbmNsdWRlcyhyZXNvdXJjZS50eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYW5hbHl6ZVJEUyhyZXNvdXJjZSwgcmVzb3VyY2VDb3N0cyk7XG4gICAgfVxuICAgIGlmIChFTEFTVElDQUNIRV9UWVBFUy5pbmNsdWRlcyhyZXNvdXJjZS50eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYW5hbHl6ZUVsYXN0aUNhY2hlKHJlc291cmNlLCByZXNvdXJjZUNvc3RzKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFuYWx5emVFQzIoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlc291cmNlQ29zdHM6IFJlc291cmNlQ29zdFtdLFxuICApOiBSZWNvbW1lbmRhdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHByb3BzID0gcmVzb3VyY2UucHJvcGVydGllcztcbiAgICBsZXQgaW5zdGFuY2VUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocmVzb3VyY2UudHlwZSA9PT0gJ0FXUzo6RUMyOjpMYXVuY2hUZW1wbGF0ZScpIHtcbiAgICAgIGNvbnN0IGxhdW5jaERhdGEgPSBwcm9wcy5MYXVuY2hUZW1wbGF0ZURhdGEgYXNcbiAgICAgICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGluc3RhbmNlVHlwZSA9IGxhdW5jaERhdGE/Lkluc3RhbmNlVHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlVHlwZSA9IHByb3BzLkluc3RhbmNlVHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFpbnN0YW5jZVR5cGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZmFtaWx5ID0gdGhpcy5leHRyYWN0RmFtaWx5KGluc3RhbmNlVHlwZSk7XG4gICAgY29uc3QgZ3Jhdml0b25GYW1pbHkgPSBHUkFWSVRPTl9BTFRFUk5BVElWRVNbZmFtaWx5XTtcbiAgICBpZiAoIWdyYXZpdG9uRmFtaWx5KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGdyYXZpdG9uVHlwZSA9IGluc3RhbmNlVHlwZS5yZXBsYWNlKGZhbWlseSwgZ3Jhdml0b25GYW1pbHkpO1xuICAgIGNvbnN0IGNvc3QgPSB0aGlzLmZpbmRDb3N0KHJlc291cmNlLmxvZ2ljYWxJZCwgcmVzb3VyY2VDb3N0cyk7XG4gICAgY29uc3Qgc2F2aW5ncyA9IGNvc3QgKiAoR1JBVklUT05fU0FWSU5HU19QRVJDRU5UIC8gMTAwKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogYGdyYXZpdG9uLSR7cmVzb3VyY2UubG9naWNhbElkfWAsXG4gICAgICB0aXRsZTogYE1pZ3JhdGUgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHRvIEdyYXZpdG9uICgke2dyYXZpdG9uVHlwZX0pYCxcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHtpbnN0YW5jZVR5cGV9IGNhbiBiZSByZXBsYWNlZCB3aXRoICR7Z3Jhdml0b25UeXBlfSBmb3IgfiR7R1JBVklUT05fU0FWSU5HU19QRVJDRU5UfSUgY29zdCByZWR1Y3Rpb24uIEFXUyBHcmF2aXRvbiBwcm9jZXNzb3JzIGRlbGl2ZXIgYmV0dGVyIHByaWNlLXBlcmZvcm1hbmNlIGZvciBtb3N0IHdvcmtsb2Fkcy5gLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMuY2F0ZWdvcnksXG4gICAgICBwcmlvcml0eTogc2F2aW5ncyA+PSA1MCA/ICdoaWdoJyA6IHNhdmluZ3MgPj0gMjAgPyAnbWVkaXVtJyA6ICdsb3cnLFxuICAgICAgZXN0aW1hdGVkTW9udGhseVNhdmluZ3M6IE1hdGgucm91bmQoc2F2aW5ncyAqIDEwMCkgLyAxMDAsXG4gICAgICBlc3RpbWF0ZWRTYXZpbmdzUGVyY2VudDogR1JBVklUT05fU0FWSU5HU19QRVJDRU5ULFxuICAgICAgYWZmZWN0ZWRSZXNvdXJjZXM6IFtyZXNvdXJjZS5sb2dpY2FsSWRdLFxuICAgICAgYWN0aW9uSXRlbXM6IFtcbiAgICAgICAgYENoYW5nZSBpbnN0YW5jZSB0eXBlIGZyb20gJHtpbnN0YW5jZVR5cGV9IHRvICR7Z3Jhdml0b25UeXBlfWAsXG4gICAgICAgICdUZXN0IGFwcGxpY2F0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBBUk02NCBhcmNoaXRlY3R1cmUnLFxuICAgICAgICAnVmVyaWZ5IGFsbCBkZXBlbmRlbmNpZXMgc3VwcG9ydCBBUk02NCcsXG4gICAgICAgICdEZXBsb3kgdG8gc3RhZ2luZyBmaXJzdCBhbmQgbW9uaXRvciBmb3IgMjQgaG91cnMnLFxuICAgICAgXSxcbiAgICAgIGNhdmVhdHM6IFtcbiAgICAgICAgJ1JlcXVpcmVzIEFSTTY0LWNvbXBhdGlibGUgQU1JIGFuZCBzb2Z0d2FyZScsXG4gICAgICAgICdTb21lIHg4Ni1zcGVjaWZpYyB3b3JrbG9hZHMgbWF5IG5vdCBiZSBjb21wYXRpYmxlJyxcbiAgICAgICAgYFNhdmluZ3MgZXN0aW1hdGUgb2YgJHtHUkFWSVRPTl9TQVZJTkdTX1BFUkNFTlR9JSBpcyBhcHByb3hpbWF0ZWAsXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFuYWx5emVSRFMoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlc291cmNlQ29zdHM6IFJlc291cmNlQ29zdFtdLFxuICApOiBSZWNvbW1lbmRhdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHByb3BzID0gcmVzb3VyY2UucHJvcGVydGllcztcbiAgICBjb25zdCBpbnN0YW5jZUNsYXNzID0gcHJvcHMuREJJbnN0YW5jZUNsYXNzIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWluc3RhbmNlQ2xhc3MpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZmFtaWx5ID0gdGhpcy5leHRyYWN0UkRTRmFtaWx5KGluc3RhbmNlQ2xhc3MpO1xuICAgIGNvbnN0IGdyYXZpdG9uRmFtaWx5ID0gUkRTX0dSQVZJVE9OX0FMVEVSTkFUSVZFU1tmYW1pbHldO1xuICAgIGlmICghZ3Jhdml0b25GYW1pbHkpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgZ3Jhdml0b25DbGFzcyA9IGluc3RhbmNlQ2xhc3MucmVwbGFjZShmYW1pbHksIGdyYXZpdG9uRmFtaWx5KTtcbiAgICBjb25zdCBjb3N0ID0gdGhpcy5maW5kQ29zdChyZXNvdXJjZS5sb2dpY2FsSWQsIHJlc291cmNlQ29zdHMpO1xuICAgIGNvbnN0IHNhdmluZ3MgPSBjb3N0ICogKEdSQVZJVE9OX1NBVklOR1NfUEVSQ0VOVCAvIDEwMCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGBncmF2aXRvbi0ke3Jlc291cmNlLmxvZ2ljYWxJZH1gLFxuICAgICAgdGl0bGU6IGBNaWdyYXRlICR7cmVzb3VyY2UubG9naWNhbElkfSB0byBHcmF2aXRvbiAoJHtncmF2aXRvbkNsYXNzfSlgLFxuICAgICAgZGVzY3JpcHRpb246IGAke2luc3RhbmNlQ2xhc3N9IGNhbiBiZSByZXBsYWNlZCB3aXRoICR7Z3Jhdml0b25DbGFzc30gZm9yIH4ke0dSQVZJVE9OX1NBVklOR1NfUEVSQ0VOVH0lIGNvc3QgcmVkdWN0aW9uLiBSRFMgb24gR3Jhdml0b24gb2ZmZXJzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXQgbG93ZXIgY29zdC5gLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMuY2F0ZWdvcnksXG4gICAgICBwcmlvcml0eTogc2F2aW5ncyA+PSA1MCA/ICdoaWdoJyA6IHNhdmluZ3MgPj0gMjAgPyAnbWVkaXVtJyA6ICdsb3cnLFxuICAgICAgZXN0aW1hdGVkTW9udGhseVNhdmluZ3M6IE1hdGgucm91bmQoc2F2aW5ncyAqIDEwMCkgLyAxMDAsXG4gICAgICBlc3RpbWF0ZWRTYXZpbmdzUGVyY2VudDogR1JBVklUT05fU0FWSU5HU19QRVJDRU5ULFxuICAgICAgYWZmZWN0ZWRSZXNvdXJjZXM6IFtyZXNvdXJjZS5sb2dpY2FsSWRdLFxuICAgICAgYWN0aW9uSXRlbXM6IFtcbiAgICAgICAgYENoYW5nZSBEQiBpbnN0YW5jZSBjbGFzcyBmcm9tICR7aW5zdGFuY2VDbGFzc30gdG8gJHtncmF2aXRvbkNsYXNzfWAsXG4gICAgICAgICdTY2hlZHVsZSBhIG1haW50ZW5hbmNlIHdpbmRvdyBmb3IgdGhlIGluc3RhbmNlIGNsYXNzIGNoYW5nZScsXG4gICAgICAgICdUZXN0IGRhdGFiYXNlIHBlcmZvcm1hbmNlIGFmdGVyIG1pZ3JhdGlvbicsXG4gICAgICBdLFxuICAgICAgY2F2ZWF0czogW1xuICAgICAgICAnUmVxdWlyZXMgYSBzaG9ydCBkb3dudGltZSBkdXJpbmcgaW5zdGFuY2UgY2xhc3MgbW9kaWZpY2F0aW9uJyxcbiAgICAgICAgJ1ZlcmlmeSBkYXRhYmFzZSBlbmdpbmUgdmVyc2lvbiBzdXBwb3J0cyBHcmF2aXRvbicsXG4gICAgICAgIGBTYXZpbmdzIGVzdGltYXRlIG9mICR7R1JBVklUT05fU0FWSU5HU19QRVJDRU5UfSUgaXMgYXBwcm94aW1hdGVgLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhbmFseXplRWxhc3RpQ2FjaGUoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlc291cmNlQ29zdHM6IFJlc291cmNlQ29zdFtdLFxuICApOiBSZWNvbW1lbmRhdGlvbiB8IG51bGwge1xuICAgIGNvbnN0IHByb3BzID0gcmVzb3VyY2UucHJvcGVydGllcztcbiAgICBjb25zdCBub2RlVHlwZSA9IChwcm9wcy5DYWNoZU5vZGVUeXBlIGFzIHN0cmluZykgfHxcbiAgICAgIChwcm9wcy5DYWNoZU5vZGVUeXBlIGFzIHN0cmluZyk7XG4gICAgaWYgKCFub2RlVHlwZSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBmYW1pbHkgPSB0aGlzLmV4dHJhY3RFbGFzdGlDYWNoZUZhbWlseShub2RlVHlwZSk7XG4gICAgY29uc3QgZ3Jhdml0b25GYW1pbHkgPSBFTEFTVElDQUNIRV9HUkFWSVRPTl9BTFRFUk5BVElWRVNbZmFtaWx5XTtcbiAgICBpZiAoIWdyYXZpdG9uRmFtaWx5KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGdyYXZpdG9uTm9kZVR5cGUgPSBub2RlVHlwZS5yZXBsYWNlKGZhbWlseSwgZ3Jhdml0b25GYW1pbHkpO1xuICAgIGNvbnN0IGNvc3QgPSB0aGlzLmZpbmRDb3N0KHJlc291cmNlLmxvZ2ljYWxJZCwgcmVzb3VyY2VDb3N0cyk7XG4gICAgY29uc3Qgc2F2aW5ncyA9IGNvc3QgKiAoR1JBVklUT05fU0FWSU5HU19QRVJDRU5UIC8gMTAwKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogYGdyYXZpdG9uLSR7cmVzb3VyY2UubG9naWNhbElkfWAsXG4gICAgICB0aXRsZTogYE1pZ3JhdGUgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHRvIEdyYXZpdG9uICgke2dyYXZpdG9uTm9kZVR5cGV9KWAsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7bm9kZVR5cGV9IGNhbiBiZSByZXBsYWNlZCB3aXRoICR7Z3Jhdml0b25Ob2RlVHlwZX0gZm9yIH4ke0dSQVZJVE9OX1NBVklOR1NfUEVSQ0VOVH0lIGNvc3QgcmVkdWN0aW9uLmAsXG4gICAgICBjYXRlZ29yeTogdGhpcy5jYXRlZ29yeSxcbiAgICAgIHByaW9yaXR5OiBzYXZpbmdzID49IDUwID8gJ2hpZ2gnIDogc2F2aW5ncyA+PSAyMCA/ICdtZWRpdW0nIDogJ2xvdycsXG4gICAgICBlc3RpbWF0ZWRNb250aGx5U2F2aW5nczogTWF0aC5yb3VuZChzYXZpbmdzICogMTAwKSAvIDEwMCxcbiAgICAgIGVzdGltYXRlZFNhdmluZ3NQZXJjZW50OiBHUkFWSVRPTl9TQVZJTkdTX1BFUkNFTlQsXG4gICAgICBhZmZlY3RlZFJlc291cmNlczogW3Jlc291cmNlLmxvZ2ljYWxJZF0sXG4gICAgICBhY3Rpb25JdGVtczogW1xuICAgICAgICBgQ2hhbmdlIG5vZGUgdHlwZSBmcm9tICR7bm9kZVR5cGV9IHRvICR7Z3Jhdml0b25Ob2RlVHlwZX1gLFxuICAgICAgICAnU2NoZWR1bGUgbWFpbnRlbmFuY2Ugd2luZG93IGZvciBub2RlIHR5cGUgY2hhbmdlJyxcbiAgICAgICAgJ01vbml0b3IgY2FjaGUgcGVyZm9ybWFuY2UgYWZ0ZXIgbWlncmF0aW9uJyxcbiAgICAgIF0sXG4gICAgICBjYXZlYXRzOiBbXG4gICAgICAgICdSZXF1aXJlcyBhIGJyaWVmIGZhaWxvdmVyIGR1cmluZyBub2RlIHR5cGUgbW9kaWZpY2F0aW9uJyxcbiAgICAgICAgYFNhdmluZ3MgZXN0aW1hdGUgb2YgJHtHUkFWSVRPTl9TQVZJTkdTX1BFUkNFTlR9JSBpcyBhcHByb3hpbWF0ZWAsXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RGYW1pbHkoaW5zdGFuY2VUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4sIFwibTUueGxhcmdlXCIgLT4gXCJtNVwiLCBcImM1YS4yeGxhcmdlXCIgLT4gXCJjNWFcIlxuICAgIGNvbnN0IHBhcnRzID0gaW5zdGFuY2VUeXBlLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRzWzBdIHx8ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0UkRTRmFtaWx5KGluc3RhbmNlQ2xhc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZS5nLiwgXCJkYi5tNS5sYXJnZVwiIC0+IFwiZGIubTVcIlxuICAgIGNvbnN0IHBhcnRzID0gaW5zdGFuY2VDbGFzcy5zcGxpdCgnLicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMykge1xuICAgICAgcmV0dXJuIGAke3BhcnRzWzBdfS4ke3BhcnRzWzFdfWA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEVsYXN0aUNhY2hlRmFtaWx5KG5vZGVUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4sIFwiY2FjaGUubTUubGFyZ2VcIiAtPiBcImNhY2hlLm01XCJcbiAgICBjb25zdCBwYXJ0cyA9IG5vZGVUeXBlLnNwbGl0KCcuJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAzKSB7XG4gICAgICByZXR1cm4gYCR7cGFydHNbMF19LiR7cGFydHNbMV19YDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQ29zdChsb2dpY2FsSWQ6IHN0cmluZywgcmVzb3VyY2VDb3N0czogUmVzb3VyY2VDb3N0W10pOiBudW1iZXIge1xuICAgIGNvbnN0IGNvc3QgPSByZXNvdXJjZUNvc3RzLmZpbmQoKGMpID0+IGMubG9naWNhbElkID09PSBsb2dpY2FsSWQpO1xuICAgIHJldHVybiBjb3N0Py5tb250aGx5Q29zdC5hbW91bnQgPz8gMDtcbiAgfVxufVxuIl19
@@ -0,0 +1,13 @@
1
+ import { ResourceWithId } from '../../diff/types';
2
+ import { ResourceCost } from '../../pricing/types';
3
+ import { OptimizationAnalyzer, OptimizationCategory, Recommendation } from '../types';
4
+ export declare class NATGatewayOptimizationAnalyzer implements OptimizationAnalyzer {
5
+ readonly category: OptimizationCategory;
6
+ readonly name = "NAT Gateway Optimization";
7
+ isApplicable(resources: ResourceWithId[]): boolean;
8
+ analyze(resources: ResourceWithId[], resourceCosts: ResourceCost[], _region: string): Promise<Recommendation[]>;
9
+ private suggestNATInstanceForDev;
10
+ private suggestVPCEndpoints;
11
+ private suggestConsolidation;
12
+ private findCost;
13
+ }