cdk-cost-analyzer 0.1.29 → 0.1.31

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.
@@ -2,35 +2,35 @@
2
2
  "entries": {
3
3
  "AmazonS3:US East (N. Virginia):storageClass:General Purpose|volumeType:Standard": {
4
4
  "price": 0.023,
5
- "timestamp": 1770930014058
5
+ "timestamp": 1770971189885
6
6
  },
7
7
  "AmazonDynamoDB:US East (N. Virginia):group:DDB-ReadUnits|productFamily:Amazon DynamoDB PayPerRequest Throughput": {
8
8
  "price": 0.023,
9
- "timestamp": 1770930014064
9
+ "timestamp": 1770971189892
10
10
  },
11
11
  "AmazonDynamoDB:US East (N. Virginia):group:DDB-WriteUnits|productFamily:Amazon DynamoDB PayPerRequest Throughput": {
12
12
  "price": 0.023,
13
- "timestamp": 1770930014064
13
+ "timestamp": 1770971189892
14
14
  },
15
15
  "AmazonEC2:US East (N. Virginia):capacitystatus:Used|instanceType:t3.micro|operatingSystem:Linux|preInstalledSw:NA|tenancy:Shared": {
16
16
  "price": 0.023,
17
- "timestamp": 1770930014073
17
+ "timestamp": 1770971189901
18
18
  },
19
19
  "AWSLambda:US East (N. Virginia):group:AWS-Lambda-Requests": {
20
20
  "price": 0.023,
21
- "timestamp": 1770930014082
21
+ "timestamp": 1770971189906
22
22
  },
23
23
  "AWSLambda:US East (N. Virginia):group:AWS-Lambda-Duration": {
24
24
  "price": 0.023,
25
- "timestamp": 1770930014082
25
+ "timestamp": 1770971189906
26
26
  },
27
27
  "AmazonS3:EU (Frankfurt):storageClass:General Purpose|volumeType:Standard": {
28
28
  "price": 0.023,
29
- "timestamp": 1770930021336
29
+ "timestamp": 1770971197326
30
30
  },
31
31
  "AmazonS3:invalid-region-123:storageClass:General Purpose|volumeType:Standard": {
32
32
  "price": 0.023,
33
- "timestamp": 1770930021376
33
+ "timestamp": 1770971197371
34
34
  }
35
35
  }
36
36
  }
@@ -62,6 +62,40 @@ export interface UsageAssumptionsConfig {
62
62
  vpcEndpoint?: {
63
63
  dataProcessedGB?: number;
64
64
  };
65
+ /**
66
+ * SNS (Simple Notification Service) usage assumptions.
67
+ * These values are used to estimate monthly costs for SNS topics.
68
+ *
69
+ * @see https://aws.amazon.com/sns/pricing/
70
+ */
71
+ sns?: {
72
+ /** Number of publish requests per month (default: 1,000,000) */
73
+ monthlyPublishes?: number;
74
+ /** Number of HTTP/S deliveries per month (default: 1,000,000) */
75
+ httpDeliveries?: number;
76
+ /** Number of email deliveries per month (default: 0) */
77
+ emailDeliveries?: number;
78
+ /** Number of SMS deliveries per month (default: 0) */
79
+ smsDeliveries?: number;
80
+ /** Number of mobile push deliveries per month (default: 0) */
81
+ mobilePushDeliveries?: number;
82
+ };
83
+ /**
84
+ * Step Functions usage assumptions for cost estimation.
85
+ *
86
+ * Standard workflows are charged per state transition.
87
+ * Express workflows are charged per request and per GB-second of duration.
88
+ *
89
+ * @see https://aws.amazon.com/step-functions/pricing/
90
+ */
91
+ stepFunctions?: {
92
+ /** Number of workflow executions per month (default: 10,000) */
93
+ monthlyExecutions?: number;
94
+ /** Number of state transitions per execution (default: 10, for Standard workflows) */
95
+ stateTransitionsPerExecution?: number;
96
+ /** Average execution duration in milliseconds (default: 1000, for Express workflows) */
97
+ averageDurationMs?: number;
98
+ };
65
99
  }
66
100
  export interface SynthesisConfig {
67
101
  appPath?: string;
@@ -12,4 +12,4 @@ class ConfigurationError extends Error {
12
12
  }
13
13
  }
14
14
  exports.ConfigurationError = ConfigurationError;
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJGQSxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUhULFlBQ0UsT0FBZSxFQUNSLFVBQWtCLEVBQ2xCLGdCQUEwQjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVTtRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQVRELGdEQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDb3N0QW5hbHl6ZXJDb25maWcge1xuICB0aHJlc2hvbGRzPzogVGhyZXNob2xkQ29uZmlnO1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgc3ludGhlc2lzPzogU3ludGhlc2lzQ29uZmlnO1xuICBleGNsdXNpb25zPzogRXhjbHVzaW9uc0NvbmZpZztcbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlc2hvbGRDb25maWcge1xuICBkZWZhdWx0PzogVGhyZXNob2xkTGV2ZWxzO1xuICBlbnZpcm9ubWVudHM/OiBSZWNvcmQ8c3RyaW5nLCBUaHJlc2hvbGRMZXZlbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVzaG9sZExldmVscyB7XG4gIHdhcm5pbmc/OiBudW1iZXI7XG4gIGVycm9yPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlQXNzdW1wdGlvbnNDb25maWcge1xuICBzMz86IHtcbiAgICBzdG9yYWdlR0I/OiBudW1iZXI7XG4gICAgZ2V0UmVxdWVzdHM/OiBudW1iZXI7XG4gICAgcHV0UmVxdWVzdHM/OiBudW1iZXI7XG4gIH07XG4gIGxhbWJkYT86IHtcbiAgICBpbnZvY2F0aW9uc1Blck1vbnRoPzogbnVtYmVyO1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogRHluYW1vREIgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIG9uLWRlbWFuZCAocGF5LXBlci1yZXF1ZXN0KSBiaWxsaW5nIG1vZGUuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBEeW5hbW9EQiB0YWJsZXNcbiAgICogY29uZmlndXJlZCB3aXRoIEJpbGxpbmdNb2RlOiBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEZvciBwcm92aXNpb25lZCBiaWxsaW5nIG1vZGUsIGNvc3RzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZVxuICAgKiBSZWFkQ2FwYWNpdHlVbml0cyBhbmQgV3JpdGVDYXBhY2l0eVVuaXRzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9keW5hbW9kYi9wcmljaW5nL1xuICAgKi9cbiAgZHluYW1vZGI/OiB7XG4gICAgLyoqIE51bWJlciBvZiByZWFkIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMTAsMDAwLDAwMCkgKi9cbiAgICByZWFkUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHdyaXRlIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIHdyaXRlUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgfTtcbiAgbmF0R2F0ZXdheT86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIGFsYj86IHtcbiAgICBuZXdDb25uZWN0aW9uc1BlclNlY29uZD86IG51bWJlcjtcbiAgICBhY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZT86IG51bWJlcjtcbiAgICBwcm9jZXNzZWRCeXRlc0dCPzogbnVtYmVyO1xuICB9O1xuICBubGI/OiB7XG4gICAgbmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQ/OiBudW1iZXI7XG4gICAgYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGU/OiBudW1iZXI7XG4gICAgcHJvY2Vzc2VkQnl0ZXNHQj86IG51bWJlcjtcbiAgfTtcbiAgY2xvdWRmcm9udD86IHtcbiAgICBkYXRhVHJhbnNmZXJHQj86IG51bWJlcjtcbiAgICByZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgYXBpR2F0ZXdheT86IHtcbiAgICByZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICB9O1xuICB2cGNFbmRwb2ludD86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhlc2lzQ29uZmlnIHtcbiAgYXBwUGF0aD86IHN0cmluZztcbiAgb3V0cHV0UGF0aD86IHN0cmluZztcbiAgY3VzdG9tQ29tbWFuZD86IHN0cmluZztcbiAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjbHVzaW9uc0NvbmZpZyB7XG4gIHJlc291cmNlVHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBkdXJhdGlvbkhvdXJzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICB2YWxpZDogYm9vbGVhbjtcbiAgZXJyb3JzOiBzdHJpbmdbXTtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIGNvbmZpZ1BhdGg6IHN0cmluZyxcbiAgICBwdWJsaWMgdmFsaWRhdGlvbkVycm9yczogc3RyaW5nW10sXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdDb25maWd1cmF0aW9uRXJyb3InO1xuICB9XG59XG4iXX0=
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZIQSxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUhULFlBQ0UsT0FBZSxFQUNSLFVBQWtCLEVBQ2xCLGdCQUEwQjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVTtRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQVRELGdEQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDb3N0QW5hbHl6ZXJDb25maWcge1xuICB0aHJlc2hvbGRzPzogVGhyZXNob2xkQ29uZmlnO1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgc3ludGhlc2lzPzogU3ludGhlc2lzQ29uZmlnO1xuICBleGNsdXNpb25zPzogRXhjbHVzaW9uc0NvbmZpZztcbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlc2hvbGRDb25maWcge1xuICBkZWZhdWx0PzogVGhyZXNob2xkTGV2ZWxzO1xuICBlbnZpcm9ubWVudHM/OiBSZWNvcmQ8c3RyaW5nLCBUaHJlc2hvbGRMZXZlbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVzaG9sZExldmVscyB7XG4gIHdhcm5pbmc/OiBudW1iZXI7XG4gIGVycm9yPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlQXNzdW1wdGlvbnNDb25maWcge1xuICBzMz86IHtcbiAgICBzdG9yYWdlR0I/OiBudW1iZXI7XG4gICAgZ2V0UmVxdWVzdHM/OiBudW1iZXI7XG4gICAgcHV0UmVxdWVzdHM/OiBudW1iZXI7XG4gIH07XG4gIGxhbWJkYT86IHtcbiAgICBpbnZvY2F0aW9uc1Blck1vbnRoPzogbnVtYmVyO1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogRHluYW1vREIgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIG9uLWRlbWFuZCAocGF5LXBlci1yZXF1ZXN0KSBiaWxsaW5nIG1vZGUuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBEeW5hbW9EQiB0YWJsZXNcbiAgICogY29uZmlndXJlZCB3aXRoIEJpbGxpbmdNb2RlOiBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEZvciBwcm92aXNpb25lZCBiaWxsaW5nIG1vZGUsIGNvc3RzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZVxuICAgKiBSZWFkQ2FwYWNpdHlVbml0cyBhbmQgV3JpdGVDYXBhY2l0eVVuaXRzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9keW5hbW9kYi9wcmljaW5nL1xuICAgKi9cbiAgZHluYW1vZGI/OiB7XG4gICAgLyoqIE51bWJlciBvZiByZWFkIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMTAsMDAwLDAwMCkgKi9cbiAgICByZWFkUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHdyaXRlIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIHdyaXRlUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgfTtcbiAgbmF0R2F0ZXdheT86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIGFsYj86IHtcbiAgICBuZXdDb25uZWN0aW9uc1BlclNlY29uZD86IG51bWJlcjtcbiAgICBhY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZT86IG51bWJlcjtcbiAgICBwcm9jZXNzZWRCeXRlc0dCPzogbnVtYmVyO1xuICB9O1xuICBubGI/OiB7XG4gICAgbmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQ/OiBudW1iZXI7XG4gICAgYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGU/OiBudW1iZXI7XG4gICAgcHJvY2Vzc2VkQnl0ZXNHQj86IG51bWJlcjtcbiAgfTtcbiAgY2xvdWRmcm9udD86IHtcbiAgICBkYXRhVHJhbnNmZXJHQj86IG51bWJlcjtcbiAgICByZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgYXBpR2F0ZXdheT86IHtcbiAgICByZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICB9O1xuICB2cGNFbmRwb2ludD86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTTlMgKFNpbXBsZSBOb3RpZmljYXRpb24gU2VydmljZSkgdXNhZ2UgYXNzdW1wdGlvbnMuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBTTlMgdG9waWNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vc25zL3ByaWNpbmcvXG4gICAqL1xuICBzbnM/OiB7XG4gICAgLyoqIE51bWJlciBvZiBwdWJsaXNoIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIG1vbnRobHlQdWJsaXNoZXM/OiBudW1iZXI7XG4gICAgLyoqIE51bWJlciBvZiBIVFRQL1MgZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDEsMDAwLDAwMCkgKi9cbiAgICBodHRwRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIGVtYWlsIGRlbGl2ZXJpZXMgcGVyIG1vbnRoIChkZWZhdWx0OiAwKSAqL1xuICAgIGVtYWlsRGVsaXZlcmllcz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIFNNUyBkZWxpdmVyaWVzIHBlciBtb250aCAoZGVmYXVsdDogMCkgKi9cbiAgICBzbXNEZWxpdmVyaWVzPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2YgbW9iaWxlIHB1c2ggZGVsaXZlcmllcyBwZXIgbW9udGggKGRlZmF1bHQ6IDApICovXG4gICAgbW9iaWxlUHVzaERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTdGVwIEZ1bmN0aW9ucyB1c2FnZSBhc3N1bXB0aW9ucyBmb3IgY29zdCBlc3RpbWF0aW9uLlxuICAgKlxuICAgKiBTdGFuZGFyZCB3b3JrZmxvd3MgYXJlIGNoYXJnZWQgcGVyIHN0YXRlIHRyYW5zaXRpb24uXG4gICAqIEV4cHJlc3Mgd29ya2Zsb3dzIGFyZSBjaGFyZ2VkIHBlciByZXF1ZXN0IGFuZCBwZXIgR0Itc2Vjb25kIG9mIGR1cmF0aW9uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vc3RlcC1mdW5jdGlvbnMvcHJpY2luZy9cbiAgICovXG4gIHN0ZXBGdW5jdGlvbnM/OiB7XG4gICAgLyoqIE51bWJlciBvZiB3b3JrZmxvdyBleGVjdXRpb25zIHBlciBtb250aCAoZGVmYXVsdDogMTAsMDAwKSAqL1xuICAgIG1vbnRobHlFeGVjdXRpb25zPzogbnVtYmVyO1xuICAgIC8qKiBOdW1iZXIgb2Ygc3RhdGUgdHJhbnNpdGlvbnMgcGVyIGV4ZWN1dGlvbiAoZGVmYXVsdDogMTAsIGZvciBTdGFuZGFyZCB3b3JrZmxvd3MpICovXG4gICAgc3RhdGVUcmFuc2l0aW9uc1BlckV4ZWN1dGlvbj86IG51bWJlcjtcbiAgICAvKiogQXZlcmFnZSBleGVjdXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiAxMDAwLCBmb3IgRXhwcmVzcyB3b3JrZmxvd3MpICovXG4gICAgYXZlcmFnZUR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhlc2lzQ29uZmlnIHtcbiAgYXBwUGF0aD86IHN0cmluZztcbiAgb3V0cHV0UGF0aD86IHN0cmluZztcbiAgY3VzdG9tQ29tbWFuZD86IHN0cmluZztcbiAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjbHVzaW9uc0NvbmZpZyB7XG4gIHJlc291cmNlVHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBkdXJhdGlvbkhvdXJzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICB2YWxpZDogYm9vbGVhbjtcbiAgZXJyb3JzOiBzdHJpbmdbXTtcbiAgd2FybmluZ3M6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIGNvbmZpZ1BhdGg6IHN0cmluZyxcbiAgICBwdWJsaWMgdmFsaWRhdGlvbkVycm9yczogc3RyaW5nW10sXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdDb25maWd1cmF0aW9uRXJyb3InO1xuICB9XG59XG4iXX0=
@@ -16,6 +16,8 @@ const NatGatewayCalculator_1 = require("./calculators/NatGatewayCalculator");
16
16
  const NLBCalculator_1 = require("./calculators/NLBCalculator");
17
17
  const RDSCalculator_1 = require("./calculators/RDSCalculator");
18
18
  const S3Calculator_1 = require("./calculators/S3Calculator");
19
+ const SNSCalculator_1 = require("./calculators/SNSCalculator");
20
+ const StepFunctionsCalculator_1 = require("./calculators/StepFunctionsCalculator");
19
21
  const VPCEndpointCalculator_1 = require("./calculators/VPCEndpointCalculator");
20
22
  const PricingClient_1 = require("./PricingClient");
21
23
  class PricingService {
@@ -55,6 +57,8 @@ class PricingService {
55
57
  new ElastiCacheCalculator_1.ElastiCacheCalculator(),
56
58
  new AutoScalingGroupCalculator_1.AutoScalingGroupCalculator(),
57
59
  new LaunchTemplateCalculator_1.LaunchTemplateCalculator(),
60
+ new SNSCalculator_1.SNSCalculator(usageAssumptions?.sns?.monthlyPublishes, usageAssumptions?.sns?.httpDeliveries, usageAssumptions?.sns?.emailDeliveries, usageAssumptions?.sns?.smsDeliveries, usageAssumptions?.sns?.mobilePushDeliveries),
61
+ new StepFunctionsCalculator_1.StepFunctionsCalculator(usageAssumptions?.stepFunctions?.monthlyExecutions, usageAssumptions?.stepFunctions?.stateTransitionsPerExecution, usageAssumptions?.stepFunctions?.averageDurationMs),
58
62
  ];
59
63
  }
60
64
  async getResourceCost(resource, region, templateResources) {
@@ -168,4 +172,4 @@ class PricingService {
168
172
  }
169
173
  }
170
174
  exports.PricingService = PricingService;
171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpY2luZ1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9QcmljaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBOEM7QUFDOUMsK0RBQTREO0FBQzVELDZFQUEwRTtBQUMxRSx5RkFBc0Y7QUFDdEYsNkVBQTBFO0FBQzFFLHlFQUFzRTtBQUN0RSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELCtFQUE0RTtBQUM1RSxxRUFBa0U7QUFDbEUscUZBQWtGO0FBQ2xGLDZFQUEwRTtBQUMxRSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELDZEQUEwRDtBQUMxRCwrRUFBNEU7QUFDNUUsbURBQWdEO0FBVWhELE1BQWEsY0FBYztJQUNqQixXQUFXLENBQTJCO0lBQ3RDLGFBQWEsQ0FBZ0I7SUFDN0IscUJBQXFCLENBQWM7SUFFM0MsWUFDRSxTQUFpQixXQUFXLEVBQzVCLGdCQUF5QyxFQUN6QyxxQkFBZ0MsRUFDaEMsV0FBeUIsRUFDekIsYUFBNkI7UUFFN0Isa0RBQWtEO1FBQ2xELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDTixpREFBaUQ7WUFDakQsSUFBSSxZQUFzQyxDQUFDO1lBQzNDLElBQUksV0FBVyxFQUFFLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxhQUFhLEdBQUcsV0FBVyxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELFlBQVksR0FBRyxJQUFJLDJCQUFZLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw2QkFBYSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUks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YyxHQUFHLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO1FBRTFFLE9BQU87WUFDTCxVQUFVO1lBQ1YsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVO1lBQ1YsWUFBWTtZQUNaLGFBQWE7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBL0xELHdDQStMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gJy4vQ2FjaGVNYW5hZ2VyJztcbmltcG9ydCB7IEFMQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0FMQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgQVBJR2F0ZXdheUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0FQSUdhdGV3YXlDYWxjdWxhdG9yJztcbmltcG9ydCB7IEF1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9BdXRvU2NhbGluZ0dyb3VwQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBDbG91ZEZyb250Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQ2xvdWRGcm9udENhbGN1bGF0b3InO1xuaW1wb3J0IHsgRHluYW1vREJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9EeW5hbW9EQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgRUMyQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRUMyQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBFQ1NDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQ1NDYWxjdWxhdG9yJztcbmltcG9ydCB7IEVsYXN0aUNhY2hlQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRWxhc3RpQ2FjaGVDYWxjdWxhdG9yJztcbmltcG9ydCB7IExhbWJkYUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9MYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTmF0R2F0ZXdheUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL05hdEdhdGV3YXlDYWxjdWxhdG9yJztcbmltcG9ydCB7IE5MQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL05MQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgUkRTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUkRTQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBTM0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1MzQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBWUENFbmRwb2ludENhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1ZQQ0VuZHBvaW50Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBQcmljaW5nQ2xpZW50IH0gZnJvbSAnLi9QcmljaW5nQ2xpZW50JztcbmltcG9ydCB7XG4gIFByaWNpbmdTZXJ2aWNlIGFzIElQcmljaW5nU2VydmljZSxcbiAgTW9udGhseUNvc3QsXG4gIENvc3REZWx0YSxcbiAgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvcixcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBVc2FnZUFzc3VtcHRpb25zQ29uZmlnLCBDYWNoZUNvbmZpZywgQ29zdEFuYWx5emVyQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcbmltcG9ydCB7IFJlc291cmNlV2l0aElkLCBSZXNvdXJjZURpZmYgfSBmcm9tICcuLi9kaWZmL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFByaWNpbmdTZXJ2aWNlIGltcGxlbWVudHMgSVByaWNpbmdTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYWxjdWxhdG9yczogUmVzb3VyY2VDb3N0Q2FsY3VsYXRvcltdO1xuICBwcml2YXRlIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQ7XG4gIHByaXZhdGUgZXhjbHVkZWRSZXNvdXJjZVR5cGVzOiBTZXQ8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWdpb246IHN0cmluZyA9ICd1cy1lYXN0LTEnLFxuICAgIHVzYWdlQXNzdW1wdGlvbnM/OiBVc2FnZUFzc3VtcHRpb25zQ29uZmlnLFxuICAgIGV4Y2x1ZGVkUmVzb3VyY2VUeXBlcz86IHN0cmluZ1tdLFxuICAgIGNhY2hlQ29uZmlnPzogQ2FjaGVDb25maWcsXG4gICAgcHJpY2luZ0NsaWVudD86IFByaWNpbmdDbGllbnQsXG4gICkge1xuICAgIC8vIFVzZSBwcm92aWRlZCBwcmljaW5nIGNsaWVudCBvciBjcmVhdGUgYSBuZXcgb25lXG4gICAgaWYgKHByaWNpbmdDbGllbnQpIHtcbiAgICAgIHRoaXMucHJpY2luZ0NsaWVudCA9IHByaWNpbmdDbGllbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluaXRpYWxpemUgY2FjaGUgbWFuYWdlciBpZiBjYWNoaW5nIGlzIGVuYWJsZWRcbiAgICAgIGxldCBjYWNoZU1hbmFnZXI6IENhY2hlTWFuYWdlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWNoZUNvbmZpZz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgY2FjaGVEdXJhdGlvbiA9IGNhY2hlQ29uZmlnPy5kdXJhdGlvbkhvdXJzID8/IDI0O1xuICAgICAgICBjYWNoZU1hbmFnZXIgPSBuZXcgQ2FjaGVNYW5hZ2VyKCcuY2RrLWNvc3QtYW5hbHl6ZXItY2FjaGUnLCBjYWNoZUR1cmF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmljaW5nQ2xpZW50ID0gbmV3IFByaWNpbmdDbGllbnQocmVnaW9uLCBjYWNoZU1hbmFnZXIpO1xuICAgIH1cbiAgICB0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcyA9IG5ldyBTZXQoZXhjbHVkZWRSZXNvdXJjZVR5cGVzIHx8IFtdKTtcbiAgICBcbiAgICAvLyBCdWlsZCBjb25maWcgb2JqZWN0IGZvciBjYWxjdWxhdG9ycyB0aGF0IG5lZWQgaXRcbiAgICBjb25zdCBjb25maWc6IENvc3RBbmFseXplckNvbmZpZyB8IHVuZGVmaW5lZCA9IHVzYWdlQXNzdW1wdGlvbnMgPyB7IHVzYWdlQXNzdW1wdGlvbnMgfSA6IHVuZGVmaW5lZDtcbiAgICBcbiAgICB0aGlzLmNhbGN1bGF0b3JzID0gW1xuICAgICAgbmV3IEVDMkNhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBTM0NhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBMYW1iZGFDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5sYW1iZGE/Lmludm9jYXRpb25zUGVyTW9udGgsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmxhbWJkYT8uYXZlcmFnZUR1cmF0aW9uTXMsXG4gICAgICApLFxuICAgICAgbmV3IFJEU0NhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBEeW5hbW9EQkNhbGN1bGF0b3IoY29uZmlnKSxcbiAgICAgIG5ldyBFQ1NDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgQVBJR2F0ZXdheUNhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBOYXRHYXRld2F5Q2FsY3VsYXRvcih1c2FnZUFzc3VtcHRpb25zPy5uYXRHYXRld2F5Py5kYXRhUHJvY2Vzc2VkR0IpLFxuICAgICAgbmV3IEFMQkNhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8ubmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8uYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGUsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmFsYj8ucHJvY2Vzc2VkQnl0ZXNHQixcbiAgICAgICksXG4gICAgICBuZXcgTkxCQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5uZXdDb25uZWN0aW9uc1BlclNlY29uZCxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5hY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZSxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubmxiPy5wcm9jZXNzZWRCeXRlc0dCLFxuICAgICAgKSxcbiAgICAgIG5ldyBWUENFbmRwb2ludENhbGN1bGF0b3IodXNhZ2VBc3N1bXB0aW9ucz8udnBjRW5kcG9pbnQ/LmRhdGFQcm9jZXNzZWRHQiksXG4gICAgICBuZXcgQ2xvdWRGcm9udENhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmNsb3VkZnJvbnQ/LmRhdGFUcmFuc2ZlckdCLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5jbG91ZGZyb250Py5yZXF1ZXN0cyxcbiAgICAgICksXG4gICAgICBuZXcgRWxhc3RpQ2FjaGVDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgQXV0b1NjYWxpbmdHcm91cENhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBMYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3IoKSxcbiAgICBdO1xuICB9XG5cbiAgYXN5bmMgZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCwgcmVnaW9uOiBzdHJpbmcsIHRlbXBsYXRlUmVzb3VyY2VzPzogUmVzb3VyY2VXaXRoSWRbXSk6IFByb21pc2U8TW9udGhseUNvc3Q+IHtcbiAgICAvLyBDaGVjayBpZiByZXNvdXJjZSB0eXBlIGlzIGV4Y2x1ZGVkXG4gICAgaWYgKHRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyZXNvdXJjZS50eXBlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICdoaWdoJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgUmVzb3VyY2UgdHlwZSAke3Jlc291cmNlLnR5cGV9IGlzIGV4Y2x1ZGVkIGZyb20gY29zdCBhbmFseXNpc2BdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIGNhbGN1bGF0b3IgdXNpbmcgY2FuQ2FsY3VsYXRlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBzdXBwb3J0c1xuICAgIGNvbnN0IGNhbGN1bGF0b3IgPSB0aGlzLmNhbGN1bGF0b3JzLmZpbmQoY2FsYyA9PiB7XG4gICAgICBpZiAoY2FsYy5jYW5DYWxjdWxhdGUpIHtcbiAgICAgICAgcmV0dXJuIGNhbGMuY2FuQ2FsY3VsYXRlKHJlc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWxjLnN1cHBvcnRzKHJlc291cmNlLnR5cGUpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFjYWxjdWxhdG9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICBhc3N1bXB0aW9uczogW2BSZXNvdXJjZSB0eXBlICR7cmVzb3VyY2UudHlwZX0gaXMgbm90IHN1cHBvcnRlZGBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGN1bGF0b3IuY2FsY3VsYXRlQ29zdChyZXNvdXJjZSwgcmVnaW9uLCB0aGlzLnByaWNpbmdDbGllbnQsIHRlbXBsYXRlUmVzb3VyY2VzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgRmFpbGVkIHRvIGNhbGN1bGF0ZSBjb3N0OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q29zdERlbHRhKGRpZmY6IFJlc291cmNlRGlmZiwgcmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPENvc3REZWx0YT4ge1xuICAgIC8vIEZpbHRlciBvdXQgZXhjbHVkZWQgcmVzb3VyY2VzIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgY29uc3QgZmlsdGVyZWRBZGRlZCA9IGRpZmYuYWRkZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcbiAgICBjb25zdCBmaWx0ZXJlZFJlbW92ZWQgPSBkaWZmLnJlbW92ZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcbiAgICBjb25zdCBmaWx0ZXJlZE1vZGlmaWVkID0gZGlmZi5tb2RpZmllZC5maWx0ZXIociA9PiAhdGhpcy5leGNsdWRlZFJlc291cmNlVHlwZXMuaGFzKHIudHlwZSkpO1xuXG4gICAgLy8gQnVpbGQgdGVtcGxhdGUgcmVzb3VyY2UgY29udGV4dCBmcm9tIGFsbCByZXNvdXJjZXMgaW4gdGhlIGRpZmZcbiAgICBjb25zdCBhbGxSZXNvdXJjZXM6IFJlc291cmNlV2l0aElkW10gPSBbXG4gICAgICAuLi5kaWZmLmFkZGVkLFxuICAgICAgLi4uZGlmZi5yZW1vdmVkLFxuICAgICAgLi4uZGlmZi5tb2RpZmllZC5tYXAociA9PiAoe1xuICAgICAgICBsb2dpY2FsSWQ6IHIubG9naWNhbElkLFxuICAgICAgICB0eXBlOiByLnR5cGUsXG4gICAgICAgIHByb3BlcnRpZXM6IHIubmV3UHJvcGVydGllcyxcbiAgICAgIH0pKSxcbiAgICBdO1xuXG4gICAgY29uc3QgYWRkZWRDb3N0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRBZGRlZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IHJlbW92ZWRDb3N0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRSZW1vdmVkLm1hcChhc3luYyAocmVzb3VyY2UpID0+IHtcbiAgICAgICAgY29uc3QgbW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChyZXNvdXJjZSwgcmVnaW9uLCBhbGxSZXNvdXJjZXMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgICAgIHR5cGU6IHJlc291cmNlLnR5cGUsXG4gICAgICAgICAgbW9udGhseUNvc3QsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgbW9kaWZpZWRDb3N0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRNb2RpZmllZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZFJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCA9IHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHJlc291cmNlLm9sZFByb3BlcnRpZXMsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5ld1Jlc291cmNlOiBSZXNvdXJjZVdpdGhJZCA9IHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHJlc291cmNlLm5ld1Byb3BlcnRpZXMsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgb2xkTW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChvbGRSZXNvdXJjZSwgcmVnaW9uLCBhbGxSZXNvdXJjZXMpO1xuICAgICAgICBjb25zdCBuZXdNb250aGx5Q29zdCA9IGF3YWl0IHRoaXMuZ2V0UmVzb3VyY2VDb3N0KG5ld1Jlc291cmNlLCByZWdpb24sIGFsbFJlc291cmNlcyk7XG4gICAgICAgIGNvbnN0IGNvc3REZWx0YSA9IG5ld01vbnRobHlDb3N0LmFtb3VudCAtIG9sZE1vbnRobHlDb3N0LmFtb3VudDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgICAgIHR5cGU6IHJlc291cmNlLnR5cGUsXG4gICAgICAgICAgbW9udGhseUNvc3Q6IG5ld01vbnRobHlDb3N0LFxuICAgICAgICAgIG9sZE1vbnRobHlDb3N0LFxuICAgICAgICAgIG5ld01vbnRobHlDb3N0LFxuICAgICAgICAgIGNvc3REZWx0YSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCB0b3RhbEFkZGVkQ29zdCA9IGFkZGVkQ29zdHMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIubW9udGhseUNvc3QuYW1vdW50LCAwKTtcbiAgICBjb25zdCB0b3RhbFJlbW92ZWRDb3N0ID0gcmVtb3ZlZENvc3RzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLm1vbnRobHlDb3N0LmFtb3VudCwgMCk7XG4gICAgY29uc3QgdG90YWxNb2RpZmllZERlbHRhID0gbW9kaWZpZWRDb3N0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5jb3N0RGVsdGEsIDApO1xuXG4gICAgY29uc3QgdG90YWxEZWx0YSA9IHRvdGFsQWRkZWRDb3N0IC0gdG90YWxSZW1vdmVkQ29zdCArIHRvdGFsTW9kaWZpZWREZWx0YTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbERlbHRhLFxuICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgYWRkZWRDb3N0cyxcbiAgICAgIHJlbW92ZWRDb3N0cyxcbiAgICAgIG1vZGlmaWVkQ29zdHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCByZXNvdXJjZXMgYW5kIGNvbm5lY3Rpb25zXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucHJpY2luZ0NsaWVudC5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpY2luZ1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9QcmljaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBOEM7QUFDOUMsK0RBQTREO0FBQzVELDZFQUEwRTtBQUMxRSx5RkFBc0Y7QUFDdEYsNkVBQTBFO0FBQzFFLHlFQUFzRTtBQUN0RSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELCtFQUE0RTtBQUM1RSxxRUFBa0U7QUFDbEUscUZBQWtGO0FBQ2xGLDZFQUEwRTtBQUMxRSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELDZEQUEwRDtBQUMxRCwrREFBNEQ7QUFDNUQsbUZBQWdGO0FBQ2hGLCtFQUE0RTtBQUM1RSxtREFBZ0Q7QUFVaEQsTUFBYSxjQUFjO0lBQ2pCLFdBQVcsQ0FBMkI7SUFDdEMsYUFBYSxDQUFnQjtJQUM3QixxQkFBcUIsQ0FBYztJQUUzQyxZQUNFLFNBQWlCLFdBQVcsRUFDNUIsZ0JBQXlDLEVBQ3pDLHFCQUFnQyxFQUNoQyxXQUF5QixFQUN6QixhQUE2QjtRQUU3QixrREFBa0Q7UUFDbEQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNOLGlEQUFpRDtZQUNqRCxJQUFJLFlBQXNDLENBQUM7WUFDM0MsSUFBSSxXQUFXLEVBQUUsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNuQyxNQUFNLGFBQWEsR0FBRyxXQUFXLEVBQUUsYUFBYSxJQUFJLEVBQUUsQ0FBQztnQkFDdkQsWUFBWSxHQUFHLElBQUksMkJBQVksQ0FBQywwQkFBMEIsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUM3RSxDQUFDO1lBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLDZCQUFhLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxJ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QUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RixNQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVsRixNQUFNLFVBQVUsR0FBRyxjQUFjLEdBQUcsZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7UUFFMUUsT0FBTztZQUNMLFVBQVU7WUFDVixRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVU7WUFDVixZQUFZO1lBQ1osYUFBYTtTQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUEzTUQsd0NBMk1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSAnLi9DYWNoZU1hbmFnZXInO1xuaW1wb3J0IHsgQUxCQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQUxCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBBUElHYXRld2F5Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQVBJR2F0ZXdheUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgQXV0b1NjYWxpbmdHcm91cENhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0F1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yJztcbmltcG9ydCB7IENsb3VkRnJvbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9DbG91ZEZyb250Q2FsY3VsYXRvcic7XG5pbXBvcnQgeyBEeW5hbW9EQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0R5bmFtb0RCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBFQzJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQzJDYWxjdWxhdG9yJztcbmltcG9ydCB7IEVDU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0VDU0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgRWxhc3RpQ2FjaGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FbGFzdGlDYWNoZUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTGFtYmRhQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTGFtYmRhQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBMYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBOYXRHYXRld2F5Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTmF0R2F0ZXdheUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTkxCQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvTkxCQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBSRFNDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9SRFNDYWxjdWxhdG9yJztcbmltcG9ydCB7IFMzQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUzNDYWxjdWxhdG9yJztcbmltcG9ydCB7IFNOU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1NOU0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1N0ZXBGdW5jdGlvbnNDYWxjdWxhdG9yJztcbmltcG9ydCB7IFZQQ0VuZHBvaW50Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvVlBDRW5kcG9pbnRDYWxjdWxhdG9yJztcbmltcG9ydCB7IFByaWNpbmdDbGllbnQgfSBmcm9tICcuL1ByaWNpbmdDbGllbnQnO1xuaW1wb3J0IHtcbiAgUHJpY2luZ1NlcnZpY2UgYXMgSVByaWNpbmdTZXJ2aWNlLFxuICBNb250aGx5Q29zdCxcbiAgQ29zdERlbHRhLFxuICBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFVzYWdlQXNzdW1wdGlvbnNDb25maWcsIENhY2hlQ29uZmlnLCBDb3N0QW5hbHl6ZXJDb25maWcgfSBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VXaXRoSWQsIFJlc291cmNlRGlmZiB9IGZyb20gJy4uL2RpZmYvdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUHJpY2luZ1NlcnZpY2UgaW1wbGVtZW50cyBJUHJpY2luZ1NlcnZpY2Uge1xuICBwcml2YXRlIGNhbGN1bGF0b3JzOiBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yW107XG4gIHByaXZhdGUgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudDtcbiAgcHJpdmF0ZSBleGNsdWRlZFJlc291cmNlVHlwZXM6IFNldDxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlZ2lvbjogc3RyaW5nID0gJ3VzLWVhc3QtMScsXG4gICAgdXNhZ2VBc3N1bXB0aW9ucz86IFVzYWdlQXNzdW1wdGlvbnNDb25maWcsXG4gICAgZXhjbHVkZWRSZXNvdXJjZVR5cGVzPzogc3RyaW5nW10sXG4gICAgY2FjaGVDb25maWc/OiBDYWNoZUNvbmZpZyxcbiAgICBwcmljaW5nQ2xpZW50PzogUHJpY2luZ0NsaWVudCxcbiAgKSB7XG4gICAgLy8gVXNlIHByb3ZpZGVkIHByaWNpbmcgY2xpZW50IG9yIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICBpZiAocHJpY2luZ0NsaWVudCkge1xuICAgICAgdGhpcy5wcmljaW5nQ2xpZW50ID0gcHJpY2luZ0NsaWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBjYWNoZSBtYW5hZ2VyIGlmIGNhY2hpbmcgaXMgZW5hYmxlZFxuICAgICAgbGV0IGNhY2hlTWFuYWdlcjogQ2FjaGVNYW5hZ2VyIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhY2hlQ29uZmlnPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgICBjb25zdCBjYWNoZUR1cmF0aW9uID0gY2FjaGVDb25maWc/LmR1cmF0aW9uSG91cnMgPz8gMjQ7XG4gICAgICAgIGNhY2hlTWFuYWdlciA9IG5ldyBDYWNoZU1hbmFnZXIoJy5jZGstY29zdC1hbmFseXplci1jYWNoZScsIGNhY2hlRHVyYXRpb24pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByaWNpbmdDbGllbnQgPSBuZXcgUHJpY2luZ0NsaWVudChyZWdpb24sIGNhY2hlTWFuYWdlcik7XG4gICAgfVxuICAgIHRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzID0gbmV3IFNldChleGNsdWRlZFJlc291cmNlVHlwZXMgfHwgW10pO1xuICAgIFxuICAgIC8vIEJ1aWxkIGNvbmZpZyBvYmplY3QgZm9yIGNhbGN1bGF0b3JzIHRoYXQgbmVlZCBpdFxuICAgIGNvbnN0IGNvbmZpZzogQ29zdEFuYWx5emVyQ29uZmlnIHwgdW5kZWZpbmVkID0gdXNhZ2VBc3N1bXB0aW9ucyA/IHsgdXNhZ2VBc3N1bXB0aW9ucyB9IDogdW5kZWZpbmVkO1xuICAgIFxuICAgIHRoaXMuY2FsY3VsYXRvcnMgPSBbXG4gICAgICBuZXcgRUMyQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IFMzQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IExhbWJkYUNhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmxhbWJkYT8uaW52b2NhdGlvbnNQZXJNb250aCxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubGFtYmRhPy5hdmVyYWdlRHVyYXRpb25NcyxcbiAgICAgICksXG4gICAgICBuZXcgUkRTQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IER5bmFtb0RCQ2FsY3VsYXRvcihjb25maWcpLFxuICAgICAgbmV3IEVDU0NhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBBUElHYXRld2F5Q2FsY3VsYXRvcigpLFxuICAgICAgbmV3IE5hdEdhdGV3YXlDYWxjdWxhdG9yKHVzYWdlQXNzdW1wdGlvbnM/Lm5hdEdhdGV3YXk/LmRhdGFQcm9jZXNzZWRHQiksXG4gICAgICBuZXcgQUxCQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uYWxiPy5uZXdDb25uZWN0aW9uc1BlclNlY29uZCxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uYWxiPy5hY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZSxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uYWxiPy5wcm9jZXNzZWRCeXRlc0dCLFxuICAgICAgKSxcbiAgICAgIG5ldyBOTEJDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5ubGI/Lm5ld0Nvbm5lY3Rpb25zUGVyU2Vjb25kLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5ubGI/LmFjdGl2ZUNvbm5lY3Rpb25zUGVyTWludXRlLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5ubGI/LnByb2Nlc3NlZEJ5dGVzR0IsXG4gICAgICApLFxuICAgICAgbmV3IFZQQ0VuZHBvaW50Q2FsY3VsYXRvcih1c2FnZUFzc3VtcHRpb25zPy52cGNFbmRwb2ludD8uZGF0YVByb2Nlc3NlZEdCKSxcbiAgICAgIG5ldyBDbG91ZEZyb250Q2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uY2xvdWRmcm9udD8uZGF0YVRyYW5zZmVyR0IsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LmNsb3VkZnJvbnQ/LnJlcXVlc3RzLFxuICAgICAgKSxcbiAgICAgIG5ldyBFbGFzdGlDYWNoZUNhbGN1bGF0b3IoKSxcbiAgICAgIG5ldyBBdXRvU2NhbGluZ0dyb3VwQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IExhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IFNOU0NhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LnNucz8ubW9udGhseVB1Ymxpc2hlcyxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc25zPy5odHRwRGVsaXZlcmllcyxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc25zPy5lbWFpbERlbGl2ZXJpZXMsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LnNucz8uc21zRGVsaXZlcmllcyxcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uc25zPy5tb2JpbGVQdXNoRGVsaXZlcmllcyxcbiAgICAgICksXG4gICAgICBuZXcgU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LnN0ZXBGdW5jdGlvbnM/Lm1vbnRobHlFeGVjdXRpb25zLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5zdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5hdmVyYWdlRHVyYXRpb25NcyxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlc291cmNlQ29zdChyZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsIHJlZ2lvbjogc3RyaW5nLCB0ZW1wbGF0ZVJlc291cmNlcz86IFJlc291cmNlV2l0aElkW10pOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgLy8gQ2hlY2sgaWYgcmVzb3VyY2UgdHlwZSBpcyBleGNsdWRlZFxuICAgIGlmICh0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMocmVzb3VyY2UudHlwZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAnaGlnaCcsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYFJlc291cmNlIHR5cGUgJHtyZXNvdXJjZS50eXBlfSBpcyBleGNsdWRlZCBmcm9tIGNvc3QgYW5hbHlzaXNgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCBjYWxjdWxhdG9yIHVzaW5nIGNhbkNhbGN1bGF0ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gc3VwcG9ydHNcbiAgICBjb25zdCBjYWxjdWxhdG9yID0gdGhpcy5jYWxjdWxhdG9ycy5maW5kKGNhbGMgPT4ge1xuICAgICAgaWYgKGNhbGMuY2FuQ2FsY3VsYXRlKSB7XG4gICAgICAgIHJldHVybiBjYWxjLmNhbkNhbGN1bGF0ZShyZXNvdXJjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsYy5zdXBwb3J0cyhyZXNvdXJjZS50eXBlKTtcbiAgICB9KTtcblxuICAgIGlmICghY2FsY3VsYXRvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgUmVzb3VyY2UgdHlwZSAke3Jlc291cmNlLnR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxjdWxhdG9yLmNhbGN1bGF0ZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgdGhpcy5wcmljaW5nQ2xpZW50LCB0ZW1wbGF0ZVJlc291cmNlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBjYWxjdWxhdGUgY29zdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvc3REZWx0YShkaWZmOiBSZXNvdXJjZURpZmYsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb3N0RGVsdGE+IHtcbiAgICAvLyBGaWx0ZXIgb3V0IGV4Y2x1ZGVkIHJlc291cmNlcyBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIGNvbnN0IGZpbHRlcmVkQWRkZWQgPSBkaWZmLmFkZGVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRSZW1vdmVkID0gZGlmZi5yZW1vdmVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRNb2RpZmllZCA9IGRpZmYubW9kaWZpZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcblxuICAgIC8vIEJ1aWxkIHRlbXBsYXRlIHJlc291cmNlIGNvbnRleHQgZnJvbSBhbGwgcmVzb3VyY2VzIGluIHRoZSBkaWZmXG4gICAgY29uc3QgYWxsUmVzb3VyY2VzOiBSZXNvdXJjZVdpdGhJZFtdID0gW1xuICAgICAgLi4uZGlmZi5hZGRlZCxcbiAgICAgIC4uLmRpZmYucmVtb3ZlZCxcbiAgICAgIC4uLmRpZmYubW9kaWZpZWQubWFwKHIgPT4gKHtcbiAgICAgICAgbG9naWNhbElkOiByLmxvZ2ljYWxJZCxcbiAgICAgICAgdHlwZTogci50eXBlLFxuICAgICAgICBwcm9wZXJ0aWVzOiByLm5ld1Byb3BlcnRpZXMsXG4gICAgICB9KSksXG4gICAgXTtcblxuICAgIGNvbnN0IGFkZGVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkQWRkZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IGF3YWl0IHRoaXMuZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlLCByZWdpb24sIGFsbFJlc291cmNlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBtb250aGx5Q29zdCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCByZW1vdmVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkUmVtb3ZlZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGlmaWVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkTW9kaWZpZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5vbGRQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5uZXdQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9sZE1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3Qob2xkUmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgY29uc3QgbmV3TW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChuZXdSZXNvdXJjZSwgcmVnaW9uLCBhbGxSZXNvdXJjZXMpO1xuICAgICAgICBjb25zdCBjb3N0RGVsdGEgPSBuZXdNb250aGx5Q29zdC5hbW91bnQgLSBvbGRNb250aGx5Q29zdC5hbW91bnQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0OiBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBvbGRNb250aGx5Q29zdCxcbiAgICAgICAgICBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBjb3N0RGVsdGEsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgdG90YWxBZGRlZENvc3QgPSBhZGRlZENvc3RzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLm1vbnRobHlDb3N0LmFtb3VudCwgMCk7XG4gICAgY29uc3QgdG90YWxSZW1vdmVkQ29zdCA9IHJlbW92ZWRDb3N0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5tb250aGx5Q29zdC5hbW91bnQsIDApO1xuICAgIGNvbnN0IHRvdGFsTW9kaWZpZWREZWx0YSA9IG1vZGlmaWVkQ29zdHMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIuY29zdERlbHRhLCAwKTtcblxuICAgIGNvbnN0IHRvdGFsRGVsdGEgPSB0b3RhbEFkZGVkQ29zdCAtIHRvdGFsUmVtb3ZlZENvc3QgKyB0b3RhbE1vZGlmaWVkRGVsdGE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxEZWx0YSxcbiAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgIGFkZGVkQ29zdHMsXG4gICAgICByZW1vdmVkQ29zdHMsXG4gICAgICBtb2RpZmllZENvc3RzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgcmVzb3VyY2VzIGFuZCBjb25uZWN0aW9uc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnByaWNpbmdDbGllbnQuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,54 @@
1
+ import { ResourceWithId } from '../../diff/types';
2
+ import { ResourceCostCalculator, MonthlyCost, PricingClient } from '../types';
3
+ /**
4
+ * Cost breakdown for SNS pricing components
5
+ */
6
+ export interface SNSCostBreakdown {
7
+ publishCost: number;
8
+ httpDeliveryCost: number;
9
+ emailDeliveryCost: number;
10
+ smsDeliveryCost: number;
11
+ mobilePushDeliveryCost: number;
12
+ totalCost: number;
13
+ }
14
+ /**
15
+ * Calculator for AWS::SNS::Topic resources.
16
+ *
17
+ * SNS Pricing Model (as of 2024):
18
+ * - Publishes: $0.50 per million requests (first 1M free)
19
+ * - HTTP/S deliveries: $0.60 per million
20
+ * - Email deliveries: $2.00 per 100,000
21
+ * - SMS: Varies by country (using US rate as default)
22
+ * - Mobile push: $0.50 per million
23
+ *
24
+ * @see https://aws.amazon.com/sns/pricing/
25
+ */
26
+ export declare class SNSCalculator implements ResourceCostCalculator {
27
+ private readonly customMonthlyPublishes?;
28
+ private readonly customHttpDeliveries?;
29
+ private readonly customEmailDeliveries?;
30
+ private readonly customSmsDeliveries?;
31
+ private readonly customMobilePushDeliveries?;
32
+ private readonly DEFAULT_MONTHLY_PUBLISHES;
33
+ private readonly DEFAULT_HTTP_DELIVERIES;
34
+ private readonly DEFAULT_EMAIL_DELIVERIES;
35
+ private readonly DEFAULT_SMS_DELIVERIES;
36
+ private readonly DEFAULT_MOBILE_PUSH_DELIVERIES;
37
+ private readonly FALLBACK_PUBLISH_PRICE_PER_MILLION;
38
+ private readonly FALLBACK_HTTP_DELIVERY_PRICE_PER_MILLION;
39
+ private readonly FALLBACK_EMAIL_DELIVERY_PRICE_PER_100K;
40
+ private readonly FALLBACK_SMS_PRICE_PER_MESSAGE;
41
+ private readonly FALLBACK_MOBILE_PUSH_PRICE_PER_MILLION;
42
+ private readonly FREE_TIER_PUBLISHES;
43
+ constructor(customMonthlyPublishes?: number | undefined, customHttpDeliveries?: number | undefined, customEmailDeliveries?: number | undefined, customSmsDeliveries?: number | undefined, customMobilePushDeliveries?: number | undefined);
44
+ supports(resourceType: string): boolean;
45
+ calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
46
+ private getPublishPrice;
47
+ private getHttpDeliveryPrice;
48
+ private getEmailDeliveryPrice;
49
+ private getSmsPrice;
50
+ private getMobilePushPrice;
51
+ private calculateCostBreakdown;
52
+ private buildAssumptions;
53
+ private hasCustomAssumptions;
54
+ }
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SNSCalculator = void 0;
4
+ const RegionMapper_1 = require("../RegionMapper");
5
+ const Logger_1 = require("../../utils/Logger");
6
+ /**
7
+ * Calculator for AWS::SNS::Topic resources.
8
+ *
9
+ * SNS Pricing Model (as of 2024):
10
+ * - Publishes: $0.50 per million requests (first 1M free)
11
+ * - HTTP/S deliveries: $0.60 per million
12
+ * - Email deliveries: $2.00 per 100,000
13
+ * - SMS: Varies by country (using US rate as default)
14
+ * - Mobile push: $0.50 per million
15
+ *
16
+ * @see https://aws.amazon.com/sns/pricing/
17
+ */
18
+ class SNSCalculator {
19
+ customMonthlyPublishes;
20
+ customHttpDeliveries;
21
+ customEmailDeliveries;
22
+ customSmsDeliveries;
23
+ customMobilePushDeliveries;
24
+ // Default usage assumptions
25
+ DEFAULT_MONTHLY_PUBLISHES = 1_000_000;
26
+ DEFAULT_HTTP_DELIVERIES = 1_000_000;
27
+ DEFAULT_EMAIL_DELIVERIES = 0;
28
+ DEFAULT_SMS_DELIVERIES = 0;
29
+ DEFAULT_MOBILE_PUSH_DELIVERIES = 0;
30
+ // Fallback pricing rates (AWS SNS us-east-1 pricing as of 2024)
31
+ FALLBACK_PUBLISH_PRICE_PER_MILLION = 0.50;
32
+ FALLBACK_HTTP_DELIVERY_PRICE_PER_MILLION = 0.60;
33
+ FALLBACK_EMAIL_DELIVERY_PRICE_PER_100K = 2.00;
34
+ FALLBACK_SMS_PRICE_PER_MESSAGE = 0.00645; // US rate
35
+ FALLBACK_MOBILE_PUSH_PRICE_PER_MILLION = 0.50;
36
+ // Free tier thresholds
37
+ FREE_TIER_PUBLISHES = 1_000_000;
38
+ constructor(customMonthlyPublishes, customHttpDeliveries, customEmailDeliveries, customSmsDeliveries, customMobilePushDeliveries) {
39
+ this.customMonthlyPublishes = customMonthlyPublishes;
40
+ this.customHttpDeliveries = customHttpDeliveries;
41
+ this.customEmailDeliveries = customEmailDeliveries;
42
+ this.customSmsDeliveries = customSmsDeliveries;
43
+ this.customMobilePushDeliveries = customMobilePushDeliveries;
44
+ }
45
+ supports(resourceType) {
46
+ return resourceType === 'AWS::SNS::Topic';
47
+ }
48
+ async calculateCost(resource, region, pricingClient) {
49
+ const monthlyPublishes = this.customMonthlyPublishes ?? this.DEFAULT_MONTHLY_PUBLISHES;
50
+ const httpDeliveries = this.customHttpDeliveries ?? this.DEFAULT_HTTP_DELIVERIES;
51
+ const emailDeliveries = this.customEmailDeliveries ?? this.DEFAULT_EMAIL_DELIVERIES;
52
+ const smsDeliveries = this.customSmsDeliveries ?? this.DEFAULT_SMS_DELIVERIES;
53
+ const mobilePushDeliveries = this.customMobilePushDeliveries ?? this.DEFAULT_MOBILE_PUSH_DELIVERIES;
54
+ Logger_1.Logger.debug('SNS pricing calculation started', {
55
+ region,
56
+ logicalId: resource.logicalId,
57
+ monthlyPublishes,
58
+ httpDeliveries,
59
+ emailDeliveries,
60
+ smsDeliveries,
61
+ mobilePushDeliveries,
62
+ });
63
+ try {
64
+ const regionPrefix = (0, RegionMapper_1.getRegionPrefix)(region);
65
+ const normalizedRegion = (0, RegionMapper_1.normalizeRegion)(region);
66
+ // Fetch pricing data from AWS Pricing API
67
+ const publishPrice = await this.getPublishPrice(pricingClient, normalizedRegion, regionPrefix);
68
+ const httpDeliveryPrice = await this.getHttpDeliveryPrice(pricingClient, normalizedRegion, regionPrefix);
69
+ const emailDeliveryPrice = await this.getEmailDeliveryPrice(pricingClient, normalizedRegion, regionPrefix);
70
+ const smsPrice = await this.getSmsPrice(pricingClient, normalizedRegion, regionPrefix);
71
+ const mobilePushPrice = await this.getMobilePushPrice(pricingClient, normalizedRegion, regionPrefix);
72
+ const hasCustomAssumptions = this.hasCustomAssumptions();
73
+ const allPricesAvailable = publishPrice !== null &&
74
+ httpDeliveryPrice !== null &&
75
+ emailDeliveryPrice !== null &&
76
+ smsPrice !== null &&
77
+ mobilePushPrice !== null;
78
+ // Calculate costs using API prices or fallbacks
79
+ const costBreakdown = this.calculateCostBreakdown(monthlyPublishes, httpDeliveries, emailDeliveries, smsDeliveries, mobilePushDeliveries, publishPrice, httpDeliveryPrice, emailDeliveryPrice, smsPrice, mobilePushPrice);
80
+ Logger_1.Logger.debug('SNS cost calculated', {
81
+ costBreakdown,
82
+ allPricesAvailable,
83
+ });
84
+ const assumptions = this.buildAssumptions(monthlyPublishes, httpDeliveries, emailDeliveries, smsDeliveries, mobilePushDeliveries, costBreakdown, allPricesAvailable, publishPrice, httpDeliveryPrice, emailDeliveryPrice, smsPrice, mobilePushPrice);
85
+ // Determine confidence level
86
+ let confidence;
87
+ if (!allPricesAvailable && !hasCustomAssumptions) {
88
+ confidence = 'unknown';
89
+ }
90
+ else if (!allPricesAvailable && hasCustomAssumptions) {
91
+ confidence = 'low';
92
+ }
93
+ else {
94
+ confidence = 'medium';
95
+ }
96
+ // If all prices are unavailable and no custom assumptions, return zero cost
97
+ if (!allPricesAvailable && !hasCustomAssumptions) {
98
+ return {
99
+ amount: 0,
100
+ currency: 'USD',
101
+ confidence: 'unknown',
102
+ assumptions: [
103
+ `Pricing data not available for SNS in region ${region}`,
104
+ ...assumptions,
105
+ ],
106
+ };
107
+ }
108
+ return {
109
+ amount: costBreakdown.totalCost,
110
+ currency: 'USD',
111
+ confidence,
112
+ assumptions,
113
+ };
114
+ }
115
+ catch (error) {
116
+ Logger_1.Logger.debug('SNS pricing calculation failed', {
117
+ error: error instanceof Error ? error.message : String(error),
118
+ region,
119
+ });
120
+ // If user provided custom assumptions, use fallback pricing
121
+ if (this.hasCustomAssumptions()) {
122
+ const costBreakdown = this.calculateCostBreakdown(monthlyPublishes, httpDeliveries, emailDeliveries, smsDeliveries, mobilePushDeliveries, null, null, null, null, null);
123
+ return {
124
+ amount: costBreakdown.totalCost,
125
+ currency: 'USD',
126
+ confidence: 'low',
127
+ assumptions: [
128
+ 'Using fallback pricing (API error)',
129
+ `Assumes ${monthlyPublishes.toLocaleString()} publishes per month`,
130
+ `Assumes ${httpDeliveries.toLocaleString()} HTTP/S deliveries per month`,
131
+ ],
132
+ };
133
+ }
134
+ return {
135
+ amount: 0,
136
+ currency: 'USD',
137
+ confidence: 'unknown',
138
+ assumptions: [`Failed to fetch pricing: ${error instanceof Error ? error.message : String(error)}`],
139
+ };
140
+ }
141
+ }
142
+ async getPublishPrice(pricingClient, normalizedRegion, regionPrefix) {
143
+ const usageType = regionPrefix ? `${regionPrefix}-PublishRequests` : 'PublishRequests';
144
+ return pricingClient.getPrice({
145
+ serviceCode: 'AmazonSNS',
146
+ region: normalizedRegion,
147
+ filters: [
148
+ { field: 'productFamily', value: 'Notification' },
149
+ { field: 'usagetype', value: usageType },
150
+ ],
151
+ });
152
+ }
153
+ async getHttpDeliveryPrice(pricingClient, normalizedRegion, regionPrefix) {
154
+ const usageType = regionPrefix ? `${regionPrefix}-DeliveryAttempts-HTTP` : 'DeliveryAttempts-HTTP';
155
+ return pricingClient.getPrice({
156
+ serviceCode: 'AmazonSNS',
157
+ region: normalizedRegion,
158
+ filters: [
159
+ { field: 'productFamily', value: 'Notification' },
160
+ { field: 'usagetype', value: usageType },
161
+ ],
162
+ });
163
+ }
164
+ async getEmailDeliveryPrice(pricingClient, normalizedRegion, regionPrefix) {
165
+ const usageType = regionPrefix ? `${regionPrefix}-DeliveryAttempts-EMAIL` : 'DeliveryAttempts-EMAIL';
166
+ return pricingClient.getPrice({
167
+ serviceCode: 'AmazonSNS',
168
+ region: normalizedRegion,
169
+ filters: [
170
+ { field: 'productFamily', value: 'Notification' },
171
+ { field: 'usagetype', value: usageType },
172
+ ],
173
+ });
174
+ }
175
+ async getSmsPrice(pricingClient, normalizedRegion, regionPrefix) {
176
+ const usageType = regionPrefix ? `${regionPrefix}-DeliveryAttempts-SMS` : 'DeliveryAttempts-SMS';
177
+ return pricingClient.getPrice({
178
+ serviceCode: 'AmazonSNS',
179
+ region: normalizedRegion,
180
+ filters: [
181
+ { field: 'productFamily', value: 'SMS' },
182
+ { field: 'usagetype', value: usageType },
183
+ ],
184
+ });
185
+ }
186
+ async getMobilePushPrice(pricingClient, normalizedRegion, regionPrefix) {
187
+ const usageType = regionPrefix ? `${regionPrefix}-DeliveryAttempts-APNS` : 'DeliveryAttempts-APNS';
188
+ return pricingClient.getPrice({
189
+ serviceCode: 'AmazonSNS',
190
+ region: normalizedRegion,
191
+ filters: [
192
+ { field: 'productFamily', value: 'Mobile Push Notification' },
193
+ { field: 'usagetype', value: usageType },
194
+ ],
195
+ });
196
+ }
197
+ calculateCostBreakdown(monthlyPublishes, httpDeliveries, emailDeliveries, smsDeliveries, mobilePushDeliveries, publishPrice, httpDeliveryPrice, emailDeliveryPrice, smsPrice, mobilePushPrice) {
198
+ // Use API prices if available, otherwise fallback
199
+ const effectivePublishPrice = publishPrice ?? this.FALLBACK_PUBLISH_PRICE_PER_MILLION;
200
+ const effectiveHttpDeliveryPrice = httpDeliveryPrice ?? this.FALLBACK_HTTP_DELIVERY_PRICE_PER_MILLION;
201
+ const effectiveEmailDeliveryPrice = emailDeliveryPrice ?? this.FALLBACK_EMAIL_DELIVERY_PRICE_PER_100K;
202
+ const effectiveSmsPrice = smsPrice ?? this.FALLBACK_SMS_PRICE_PER_MESSAGE;
203
+ const effectiveMobilePushPrice = mobilePushPrice ?? this.FALLBACK_MOBILE_PUSH_PRICE_PER_MILLION;
204
+ // Calculate publish cost (first 1M free)
205
+ const billablePublishes = Math.max(0, monthlyPublishes - this.FREE_TIER_PUBLISHES);
206
+ const publishCost = (billablePublishes / 1_000_000) * effectivePublishPrice;
207
+ // HTTP/S delivery cost: $X per million
208
+ const httpDeliveryCost = (httpDeliveries / 1_000_000) * effectiveHttpDeliveryPrice;
209
+ // Email delivery cost: $X per 100,000
210
+ const emailDeliveryCost = (emailDeliveries / 100_000) * effectiveEmailDeliveryPrice;
211
+ // SMS delivery cost: $X per message (varies by country, using US rate)
212
+ const smsDeliveryCost = smsDeliveries * effectiveSmsPrice;
213
+ // Mobile push delivery cost: $X per million
214
+ const mobilePushDeliveryCost = (mobilePushDeliveries / 1_000_000) * effectiveMobilePushPrice;
215
+ const totalCost = publishCost + httpDeliveryCost + emailDeliveryCost + smsDeliveryCost + mobilePushDeliveryCost;
216
+ return {
217
+ publishCost,
218
+ httpDeliveryCost,
219
+ emailDeliveryCost,
220
+ smsDeliveryCost,
221
+ mobilePushDeliveryCost,
222
+ totalCost,
223
+ };
224
+ }
225
+ buildAssumptions(monthlyPublishes, httpDeliveries, emailDeliveries, smsDeliveries, mobilePushDeliveries, costBreakdown, allPricesAvailable, publishPrice, httpDeliveryPrice, emailDeliveryPrice, smsPrice, mobilePushPrice) {
226
+ const assumptions = [];
227
+ // Add usage assumptions
228
+ assumptions.push(`Assumes ${monthlyPublishes.toLocaleString()} publishes per month`);
229
+ assumptions.push(`Assumes ${httpDeliveries.toLocaleString()} HTTP/S deliveries per month`);
230
+ if (emailDeliveries > 0) {
231
+ assumptions.push(`Assumes ${emailDeliveries.toLocaleString()} email deliveries per month`);
232
+ }
233
+ if (smsDeliveries > 0) {
234
+ assumptions.push(`Assumes ${smsDeliveries.toLocaleString()} SMS deliveries per month (using US rate)`);
235
+ }
236
+ if (mobilePushDeliveries > 0) {
237
+ assumptions.push(`Assumes ${mobilePushDeliveries.toLocaleString()} mobile push deliveries per month`);
238
+ }
239
+ // Add free tier information
240
+ if (monthlyPublishes <= this.FREE_TIER_PUBLISHES) {
241
+ assumptions.push(`First ${this.FREE_TIER_PUBLISHES.toLocaleString()} publishes are free`);
242
+ }
243
+ else {
244
+ const billablePublishes = monthlyPublishes - this.FREE_TIER_PUBLISHES;
245
+ assumptions.push(`${this.FREE_TIER_PUBLISHES.toLocaleString()} free tier publishes applied, ${billablePublishes.toLocaleString()} billable`);
246
+ }
247
+ // Add cost breakdown
248
+ if (costBreakdown.publishCost > 0) {
249
+ assumptions.push(`Publish cost: $${costBreakdown.publishCost.toFixed(2)}`);
250
+ }
251
+ if (costBreakdown.httpDeliveryCost > 0) {
252
+ assumptions.push(`HTTP/S delivery cost: $${costBreakdown.httpDeliveryCost.toFixed(2)}`);
253
+ }
254
+ if (costBreakdown.emailDeliveryCost > 0) {
255
+ assumptions.push(`Email delivery cost: $${costBreakdown.emailDeliveryCost.toFixed(2)}`);
256
+ }
257
+ if (costBreakdown.smsDeliveryCost > 0) {
258
+ assumptions.push(`SMS delivery cost: $${costBreakdown.smsDeliveryCost.toFixed(2)}`);
259
+ }
260
+ if (costBreakdown.mobilePushDeliveryCost > 0) {
261
+ assumptions.push(`Mobile push delivery cost: $${costBreakdown.mobilePushDeliveryCost.toFixed(2)}`);
262
+ }
263
+ // Add fallback pricing notes
264
+ if (!allPricesAvailable) {
265
+ if (publishPrice === null) {
266
+ assumptions.push('Using fallback publish pricing (API unavailable)');
267
+ }
268
+ if (httpDeliveryPrice === null) {
269
+ assumptions.push('Using fallback HTTP delivery pricing (API unavailable)');
270
+ }
271
+ if (emailDeliveryPrice === null && emailDeliveries > 0) {
272
+ assumptions.push('Using fallback email delivery pricing (API unavailable)');
273
+ }
274
+ if (smsPrice === null && smsDeliveries > 0) {
275
+ assumptions.push('Using fallback SMS pricing (API unavailable)');
276
+ }
277
+ if (mobilePushPrice === null && mobilePushDeliveries > 0) {
278
+ assumptions.push('Using fallback mobile push pricing (API unavailable)');
279
+ }
280
+ }
281
+ // Add custom assumption notes
282
+ if (this.customMonthlyPublishes !== undefined) {
283
+ assumptions.push('Using custom publish count from configuration');
284
+ }
285
+ if (this.customHttpDeliveries !== undefined) {
286
+ assumptions.push('Using custom HTTP delivery count from configuration');
287
+ }
288
+ if (this.customEmailDeliveries !== undefined) {
289
+ assumptions.push('Using custom email delivery count from configuration');
290
+ }
291
+ if (this.customSmsDeliveries !== undefined) {
292
+ assumptions.push('Using custom SMS delivery count from configuration');
293
+ }
294
+ if (this.customMobilePushDeliveries !== undefined) {
295
+ assumptions.push('Using custom mobile push delivery count from configuration');
296
+ }
297
+ return assumptions;
298
+ }
299
+ hasCustomAssumptions() {
300
+ return (this.customMonthlyPublishes !== undefined ||
301
+ this.customHttpDeliveries !== undefined ||
302
+ this.customEmailDeliveries !== undefined ||
303
+ this.customSmsDeliveries !== undefined ||
304
+ this.customMobilePushDeliveries !== undefined);
305
+ }
306
+ }
307
+ exports.SNSCalculator = SNSCalculator;
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU05TQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmljaW5nL2NhbGN1bGF0b3JzL1NOU0NhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQW1FO0FBQ25FLCtDQUE0QztBQWM1Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEsYUFBYTtJQW1CTDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBdEJuQiw0QkFBNEI7SUFDWCx5QkFBeUIsR0FBRyxTQUFTLENBQUM7SUFDdEMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLHdCQUF3QixHQUFHLENBQUMsQ0FBQztJQUM3QixzQkFBc0IsR0FBRyxDQUFDLENBQUM7SUFDM0IsOEJBQThCLEdBQUcsQ0FBQyxDQUFDO0lBRXBELGdFQUFnRTtJQUMvQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUM7SUFDMUMsd0NBQXdDLEdBQUcsSUFBSSxDQUFDO0lBQ2hELHNDQUFzQyxHQUFHLElBQUksQ0FBQztJQUM5Qyw4QkFBOEIsR0FBRyxPQUFPLENBQUMsQ0FBQyxVQUFVO0lBQ3BELHNDQUFzQyxHQUFHLElBQUksQ0FBQztJQUUvRCx1QkFBdUI7SUFDTixtQkFBbUIsR0FBRyxTQUFTLENBQUM7SUFFakQsWUFDbUIsc0JBQStCLEVBQy9CLG9CQUE2QixFQUM3QixxQkFBOEIsRUFDOUIsbUJBQTRCLEVBQzVCLDBCQUFtQztRQUpuQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQVM7UUFDL0IseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFTO1FBQzdCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBUztRQUM5Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQVM7UUFDNUIsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUFTO0lBQ25ELENBQUM7SUFFSixRQUFRLENBQUMsWUFBb0I7UUFDM0IsT0FBTyxZQUFZLEtBQUssaUJBQWlCLENBQUM7SUFDNUMsQ0FBQztJQUVELEtBQUss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b0JBQW9CLEtBQUssU0FBUztZQUN2QyxJQUFJLENBQUMscUJBQXFCLEtBQUssU0FBUztZQUN4QyxJQUFJLENBQUMsbUJBQW1CLEtBQUssU0FBUztZQUN0QyxJQUFJLENBQUMsMEJBQTBCLEtBQUssU0FBUyxDQUM5QyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBcFpELHNDQW9aQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlV2l0aElkIH0gZnJvbSAnLi4vLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yLCBNb250aGx5Q29zdCwgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVJlZ2lvbiwgZ2V0UmVnaW9uUHJlZml4IH0gZnJvbSAnLi4vUmVnaW9uTWFwcGVyJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL0xvZ2dlcic7XG5cbi8qKlxuICogQ29zdCBicmVha2Rvd24gZm9yIFNOUyBwcmljaW5nIGNvbXBvbmVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTTlNDb3N0QnJlYWtkb3duIHtcbiAgcHVibGlzaENvc3Q6IG51bWJlcjtcbiAgaHR0cERlbGl2ZXJ5Q29zdDogbnVtYmVyO1xuICBlbWFpbERlbGl2ZXJ5Q29zdDogbnVtYmVyO1xuICBzbXNEZWxpdmVyeUNvc3Q6IG51bWJlcjtcbiAgbW9iaWxlUHVzaERlbGl2ZXJ5Q29zdDogbnVtYmVyO1xuICB0b3RhbENvc3Q6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdG9yIGZvciBBV1M6OlNOUzo6VG9waWMgcmVzb3VyY2VzLlxuICpcbiAqIFNOUyBQcmljaW5nIE1vZGVsIChhcyBvZiAyMDI0KTpcbiAqIC0gUHVibGlzaGVzOiAkMC41MCBwZXIgbWlsbGlvbiByZXF1ZXN0cyAoZmlyc3QgMU0gZnJlZSlcbiAqIC0gSFRUUC9TIGRlbGl2ZXJpZXM6ICQwLjYwIHBlciBtaWxsaW9uXG4gKiAtIEVtYWlsIGRlbGl2ZXJpZXM6ICQyLjAwIHBlciAxMDAsMDAwXG4gKiAtIFNNUzogVmFyaWVzIGJ5IGNvdW50cnkgKHVzaW5nIFVTIHJhdGUgYXMgZGVmYXVsdClcbiAqIC0gTW9iaWxlIHB1c2g6ICQwLjUwIHBlciBtaWxsaW9uXG4gKlxuICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3Nucy9wcmljaW5nL1xuICovXG5leHBvcnQgY2xhc3MgU05TQ2FsY3VsYXRvciBpbXBsZW1lbnRzIFJlc291cmNlQ29zdENhbGN1bGF0b3Ige1xuICAvLyBEZWZhdWx0IHVzYWdlIGFzc3VtcHRpb25zXG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9NT05USExZX1BVQkxJU0hFUyA9IDFfMDAwXzAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0hUVFBfREVMSVZFUklFUyA9IDFfMDAwXzAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0VNQUlMX0RFTElWRVJJRVMgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfU01TX0RFTElWRVJJRVMgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTU9CSUxFX1BVU0hfREVMSVZFUklFUyA9IDA7XG5cbiAgLy8gRmFsbGJhY2sgcHJpY2luZyByYXRlcyAoQVdTIFNOUyB1cy1lYXN0LTEgcHJpY2luZyBhcyBvZiAyMDI0KVxuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX1BVQkxJU0hfUFJJQ0VfUEVSX01JTExJT04gPSAwLjUwO1xuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX0hUVFBfREVMSVZFUllfUFJJQ0VfUEVSX01JTExJT04gPSAwLjYwO1xuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX0VNQUlMX0RFTElWRVJZX1BSSUNFX1BFUl8xMDBLID0gMi4wMDtcbiAgcHJpdmF0ZSByZWFkb25seSBGQUxMQkFDS19TTVNfUFJJQ0VfUEVSX01FU1NBR0UgPSAwLjAwNjQ1OyAvLyBVUyByYXRlXG4gIHByaXZhdGUgcmVhZG9ubHkgRkFMTEJBQ0tfTU9CSUxFX1BVU0hfUFJJQ0VfUEVSX01JTExJT04gPSAwLjUwO1xuXG4gIC8vIEZyZWUgdGllciB0aHJlc2hvbGRzXG4gIHByaXZhdGUgcmVhZG9ubHkgRlJFRV9USUVSX1BVQkxJU0hFUyA9IDFfMDAwXzAwMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1c3RvbU1vbnRobHlQdWJsaXNoZXM/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21IdHRwRGVsaXZlcmllcz86IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1c3RvbUVtYWlsRGVsaXZlcmllcz86IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1c3RvbVNtc0RlbGl2ZXJpZXM/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21Nb2JpbGVQdXNoRGVsaXZlcmllcz86IG51bWJlcixcbiAgKSB7fVxuXG4gIHN1cHBvcnRzKHJlc291cmNlVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlc291cmNlVHlwZSA9PT0gJ0FXUzo6U05TOjpUb3BpYyc7XG4gIH1cblxuICBhc3luYyBjYWxjdWxhdGVDb3N0KFxuICAgIHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50LFxuICApOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgY29uc3QgbW9udGhseVB1Ymxpc2hlcyA9IHRoaXMuY3VzdG9tTW9udGhseVB1Ymxpc2hlcyA/PyB0aGlzLkRFRkFVTFRfTU9OVEhMWV9QVUJMSVNIRVM7XG4gICAgY29uc3QgaHR0cERlbGl2ZXJpZXMgPSB0aGlzLmN1c3RvbUh0dHBEZWxpdmVyaWVzID8/IHRoaXMuREVGQVVMVF9IVFRQX0RFTElWRVJJRVM7XG4gICAgY29uc3QgZW1haWxEZWxpdmVyaWVzID0gdGhpcy5jdXN0b21FbWFpbERlbGl2ZXJpZXMgPz8gdGhpcy5ERUZBVUxUX0VNQUlMX0RFTElWRVJJRVM7XG4gICAgY29uc3Qgc21zRGVsaXZlcmllcyA9IHRoaXMuY3VzdG9tU21zRGVsaXZlcmllcyA/PyB0aGlzLkRFRkFVTFRfU01TX0RFTElWRVJJRVM7XG4gICAgY29uc3QgbW9iaWxlUHVzaERlbGl2ZXJpZXMgPSB0aGlzLmN1c3RvbU1vYmlsZVB1c2hEZWxpdmVyaWVzID8/IHRoaXMuREVGQVVMVF9NT0JJTEVfUFVTSF9ERUxJVkVSSUVTO1xuXG4gICAgTG9nZ2VyLmRlYnVnKCdTTlMgcHJpY2luZyBjYWxjdWxhdGlvbiBzdGFydGVkJywge1xuICAgICAgcmVnaW9uLFxuICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICBtb250aGx5UHVibGlzaGVzLFxuICAgICAgaHR0cERlbGl2ZXJpZXMsXG4gICAgICBlbWFpbERlbGl2ZXJpZXMsXG4gICAgICBzbXNEZWxpdmVyaWVzLFxuICAgICAgbW9iaWxlUHVzaERlbGl2ZXJpZXMsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVnaW9uUHJlZml4ID0gZ2V0UmVnaW9uUHJlZml4KHJlZ2lvbik7XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVnaW9uID0gbm9ybWFsaXplUmVnaW9uKHJlZ2lvbik7XG5cbiAgICAgIC8vIEZldGNoIHByaWNpbmcgZGF0YSBmcm9tIEFXUyBQcmljaW5nIEFQSVxuICAgICAgY29uc3QgcHVibGlzaFByaWNlID0gYXdhaXQgdGhpcy5nZXRQdWJsaXNoUHJpY2UocHJpY2luZ0NsaWVudCwgbm9ybWFsaXplZFJlZ2lvbiwgcmVnaW9uUHJlZml4KTtcbiAgICAgIGNvbnN0IGh0dHBEZWxpdmVyeVByaWNlID0gYXdhaXQgdGhpcy5nZXRIdHRwRGVsaXZlcnlQcmljZShwcmljaW5nQ2xpZW50LCBub3JtYWxpemVkUmVnaW9uLCByZWdpb25QcmVmaXgpO1xuICAgICAgY29uc3QgZW1haWxEZWxpdmVyeVByaWNlID0gYXdhaXQgdGhpcy5nZXRFbWFpbERlbGl2ZXJ5UHJpY2UocHJpY2luZ0NsaWVudCwgbm9ybWFsaXplZFJlZ2lvbiwgcmVnaW9uUHJlZml4KTtcbiAgICAgIGNvbnN0IHNtc1ByaWNlID0gYXdhaXQgdGhpcy5nZXRTbXNQcmljZShwcmljaW5nQ2xpZW50LCBub3JtYWxpemVkUmVnaW9uLCByZWdpb25QcmVmaXgpO1xuICAgICAgY29uc3QgbW9iaWxlUHVzaFByaWNlID0gYXdhaXQgdGhpcy5nZXRNb2JpbGVQdXNoUHJpY2UocHJpY2luZ0NsaWVudCwgbm9ybWFsaXplZFJlZ2lvbiwgcmVnaW9uUHJlZml4KTtcblxuICAgICAgY29uc3QgaGFzQ3VzdG9tQXNzdW1wdGlvbnMgPSB0aGlzLmhhc0N1c3RvbUFzc3VtcHRpb25zKCk7XG4gICAgICBjb25zdCBhbGxQcmljZXNBdmFpbGFibGUgPSBwdWJsaXNoUHJpY2UgIT09IG51bGwgJiZcbiAgICAgICAgaHR0cERlbGl2ZXJ5UHJpY2UgIT09IG51bGwgJiZcbiAgICAgICAgZW1haWxEZWxpdmVyeVByaWNlICE9PSBudWxsICYmXG4gICAgICAgIHNtc1ByaWNlICE9PSBudWxsICYmXG4gICAgICAgIG1vYmlsZVB1c2hQcmljZSAhPT0gbnVsbDtcblxuICAgICAgLy8gQ2FsY3VsYXRlIGNvc3RzIHVzaW5nIEFQSSBwcmljZXMgb3IgZmFsbGJhY2tzXG4gICAgICBjb25zdCBjb3N0QnJlYWtkb3duID0gdGhpcy5jYWxjdWxhdGVDb3N0QnJlYWtkb3duKFxuICAgICAgICBtb250aGx5UHVibGlzaGVzLFxuICAgICAgICBodHRwRGVsaXZlcmllcyxcbiAgICAgICAgZW1haWxEZWxpdmVyaWVzLFxuICAgICAgICBzbXNEZWxpdmVyaWVzLFxuICAgICAgICBtb2JpbGVQdXNoRGVsaXZlcmllcyxcbiAgICAgICAgcHVibGlzaFByaWNlLFxuICAgICAgICBodHRwRGVsaXZlcnlQcmljZSxcbiAgICAgICAgZW1haWxEZWxpdmVyeVByaWNlLFxuICAgICAgICBzbXNQcmljZSxcbiAgICAgICAgbW9iaWxlUHVzaFByaWNlLFxuICAgICAgKTtcblxuICAgICAgTG9nZ2VyLmRlYnVnKCdTTlMgY29zdCBjYWxjdWxhdGVkJywge1xuICAgICAgICBjb3N0QnJlYWtkb3duLFxuICAgICAgICBhbGxQcmljZXNBdmFpbGFibGUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSB0aGlzLmJ1aWxkQXNzdW1wdGlvbnMoXG4gICAgICAgIG1vbnRobHlQdWJsaXNoZXMsXG4gICAgICAgIGh0dHBEZWxpdmVyaWVzLFxuICAgICAgICBlbWFpbERlbGl2ZXJpZXMsXG4gICAgICAgIHNtc0RlbGl2ZXJpZXMsXG4gICAgICAgIG1vYmlsZVB1c2hEZWxpdmVyaWVzLFxuICAgICAgICBjb3N0QnJlYWtkb3duLFxuICAgICAgICBhbGxQcmljZXNBdmFpbGFibGUsXG4gICAgICAgIHB1Ymxpc2hQcmljZSxcbiAgICAgICAgaHR0cERlbGl2ZXJ5UHJpY2UsXG4gICAgICAgIGVtYWlsRGVsaXZlcnlQcmljZSxcbiAgICAgICAgc21zUHJpY2UsXG4gICAgICAgIG1vYmlsZVB1c2hQcmljZSxcbiAgICAgICk7XG5cbiAgICAgIC8vIERldGVybWluZSBjb25maWRlbmNlIGxldmVsXG4gICAgICBsZXQgY29uZmlkZW5jZTogJ2hpZ2gnIHwgJ21lZGl1bScgfCAnbG93JyB8ICd1bmtub3duJztcbiAgICAgIGlmICghYWxsUHJpY2VzQXZhaWxhYmxlICYmICFoYXNDdXN0b21Bc3N1bXB0aW9ucykge1xuICAgICAgICBjb25maWRlbmNlID0gJ3Vua25vd24nO1xuICAgICAgfSBlbHNlIGlmICghYWxsUHJpY2VzQXZhaWxhYmxlICYmIGhhc0N1c3RvbUFzc3VtcHRpb25zKSB7XG4gICAgICAgIGNvbmZpZGVuY2UgPSAnbG93JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbmZpZGVuY2UgPSAnbWVkaXVtJztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYWxsIHByaWNlcyBhcmUgdW5hdmFpbGFibGUgYW5kIG5vIGN1c3RvbSBhc3N1bXB0aW9ucywgcmV0dXJuIHplcm8gY29zdFxuICAgICAgaWYgKCFhbGxQcmljZXNBdmFpbGFibGUgJiYgIWhhc0N1c3RvbUFzc3VtcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgICAgIGBQcmljaW5nIGRhdGEgbm90IGF2YWlsYWJsZSBmb3IgU05TIGluIHJlZ2lvbiAke3JlZ2lvbn1gLFxuICAgICAgICAgICAgLi4uYXNzdW1wdGlvbnMsXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiBjb3N0QnJlYWtkb3duLnRvdGFsQ29zdCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlLFxuICAgICAgICBhc3N1bXB0aW9ucyxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIExvZ2dlci5kZWJ1ZygnU05TIHByaWNpbmcgY2FsY3VsYXRpb24gZmFpbGVkJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICByZWdpb24sXG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdXNlciBwcm92aWRlZCBjdXN0b20gYXNzdW1wdGlvbnMsIHVzZSBmYWxsYmFjayBwcmljaW5nXG4gICAgICBpZiAodGhpcy5oYXNDdXN0b21Bc3N1bXB0aW9ucygpKSB7XG4gICAgICAgIGNvbnN0IGNvc3RCcmVha2Rvd24gPSB0aGlzLmNhbGN1bGF0ZUNvc3RCcmVha2Rvd24oXG4gICAgICAgICAgbW9udGhseVB1Ymxpc2hlcyxcbiAgICAgICAgICBodHRwRGVsaXZlcmllcyxcbiAgICAgICAgICBlbWFpbERlbGl2ZXJpZXMsXG4gICAgICAgICAgc21zRGVsaXZlcmllcyxcbiAgICAgICAgICBtb2JpbGVQdXNoRGVsaXZlcmllcyxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbW91bnQ6IGNvc3RCcmVha2Rvd24udG90YWxDb3N0LFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAnbG93JyxcbiAgICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICAgJ1VzaW5nIGZhbGxiYWNrIHByaWNpbmcgKEFQSSBlcnJvciknLFxuICAgICAgICAgICAgYEFzc3VtZXMgJHttb250aGx5UHVibGlzaGVzLnRvTG9jYWxlU3RyaW5nKCl9IHB1Ymxpc2hlcyBwZXIgbW9udGhgLFxuICAgICAgICAgICAgYEFzc3VtZXMgJHtodHRwRGVsaXZlcmllcy50b0xvY2FsZVN0cmluZygpfSBIVFRQL1MgZGVsaXZlcmllcyBwZXIgbW9udGhgLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBmZXRjaCBwcmljaW5nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRQdWJsaXNoUHJpY2UoXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgICBub3JtYWxpemVkUmVnaW9uOiBzdHJpbmcsXG4gICAgcmVnaW9uUHJlZml4OiBzdHJpbmcsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzYWdlVHlwZSA9IHJlZ2lvblByZWZpeCA/IGAke3JlZ2lvblByZWZpeH0tUHVibGlzaFJlcXVlc3RzYCA6ICdQdWJsaXNoUmVxdWVzdHMnO1xuICAgIHJldHVybiBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgIHNlcnZpY2VDb2RlOiAnQW1hem9uU05TJyxcbiAgICAgIHJlZ2lvbjogbm9ybWFsaXplZFJlZ2lvbixcbiAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgeyBmaWVsZDogJ3Byb2R1Y3RGYW1pbHknLCB2YWx1ZTogJ05vdGlmaWNhdGlvbicgfSxcbiAgICAgICAgeyBmaWVsZDogJ3VzYWdldHlwZScsIHZhbHVlOiB1c2FnZVR5cGUgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEh0dHBEZWxpdmVyeVByaWNlKFxuICAgIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQsXG4gICAgbm9ybWFsaXplZFJlZ2lvbjogc3RyaW5nLFxuICAgIHJlZ2lvblByZWZpeDogc3RyaW5nLFxuICApOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCB1c2FnZVR5cGUgPSByZWdpb25QcmVmaXggPyBgJHtyZWdpb25QcmVmaXh9LURlbGl2ZXJ5QXR0ZW1wdHMtSFRUUGAgOiAnRGVsaXZlcnlBdHRlbXB0cy1IVFRQJztcbiAgICByZXR1cm4gcHJpY2luZ0NsaWVudC5nZXRQcmljZSh7XG4gICAgICBzZXJ2aWNlQ29kZTogJ0FtYXpvblNOUycsXG4gICAgICByZWdpb246IG5vcm1hbGl6ZWRSZWdpb24sXG4gICAgICBmaWx0ZXJzOiBbXG4gICAgICAgIHsgZmllbGQ6ICdwcm9kdWN0RmFtaWx5JywgdmFsdWU6ICdOb3RpZmljYXRpb24nIH0sXG4gICAgICAgIHsgZmllbGQ6ICd1c2FnZXR5cGUnLCB2YWx1ZTogdXNhZ2VUeXBlIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRFbWFpbERlbGl2ZXJ5UHJpY2UoXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgICBub3JtYWxpemVkUmVnaW9uOiBzdHJpbmcsXG4gICAgcmVnaW9uUHJlZml4OiBzdHJpbmcsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzYWdlVHlwZSA9IHJlZ2lvblByZWZpeCA/IGAke3JlZ2lvblByZWZpeH0tRGVsaXZlcnlBdHRlbXB0cy1FTUFJTGAgOiAnRGVsaXZlcnlBdHRlbXB0cy1FTUFJTCc7XG4gICAgcmV0dXJuIHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgc2VydmljZUNvZGU6ICdBbWF6b25TTlMnLFxuICAgICAgcmVnaW9uOiBub3JtYWxpemVkUmVnaW9uLFxuICAgICAgZmlsdGVyczogW1xuICAgICAgICB7IGZpZWxkOiAncHJvZHVjdEZhbWlseScsIHZhbHVlOiAnTm90aWZpY2F0aW9uJyB9LFxuICAgICAgICB7IGZpZWxkOiAndXNhZ2V0eXBlJywgdmFsdWU6IHVzYWdlVHlwZSB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0U21zUHJpY2UoXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgICBub3JtYWxpemVkUmVnaW9uOiBzdHJpbmcsXG4gICAgcmVnaW9uUHJlZml4OiBzdHJpbmcsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzYWdlVHlwZSA9IHJlZ2lvblByZWZpeCA/IGAke3JlZ2lvblByZWZpeH0tRGVsaXZlcnlBdHRlbXB0cy1TTVNgIDogJ0RlbGl2ZXJ5QXR0ZW1wdHMtU01TJztcbiAgICByZXR1cm4gcHJpY2luZ0NsaWVudC5nZXRQcmljZSh7XG4gICAgICBzZXJ2aWNlQ29kZTogJ0FtYXpvblNOUycsXG4gICAgICByZWdpb246IG5vcm1hbGl6ZWRSZWdpb24sXG4gICAgICBmaWx0ZXJzOiBbXG4gICAgICAgIHsgZmllbGQ6ICdwcm9kdWN0RmFtaWx5JywgdmFsdWU6ICdTTVMnIH0sXG4gICAgICAgIHsgZmllbGQ6ICd1c2FnZXR5cGUnLCB2YWx1ZTogdXNhZ2VUeXBlIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRNb2JpbGVQdXNoUHJpY2UoXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgICBub3JtYWxpemVkUmVnaW9uOiBzdHJpbmcsXG4gICAgcmVnaW9uUHJlZml4OiBzdHJpbmcsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzYWdlVHlwZSA9IHJlZ2lvblByZWZpeCA/IGAke3JlZ2lvblByZWZpeH0tRGVsaXZlcnlBdHRlbXB0cy1BUE5TYCA6ICdEZWxpdmVyeUF0dGVtcHRzLUFQTlMnO1xuICAgIHJldHVybiBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgIHNlcnZpY2VDb2RlOiAnQW1hem9uU05TJyxcbiAgICAgIHJlZ2lvbjogbm9ybWFsaXplZFJlZ2lvbixcbiAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgeyBmaWVsZDogJ3Byb2R1Y3RGYW1pbHknLCB2YWx1ZTogJ01vYmlsZSBQdXNoIE5vdGlmaWNhdGlvbicgfSxcbiAgICAgICAgeyBmaWVsZDogJ3VzYWdldHlwZScsIHZhbHVlOiB1c2FnZVR5cGUgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUNvc3RCcmVha2Rvd24oXG4gICAgbW9udGhseVB1Ymxpc2hlczogbnVtYmVyLFxuICAgIGh0dHBEZWxpdmVyaWVzOiBudW1iZXIsXG4gICAgZW1haWxEZWxpdmVyaWVzOiBudW1iZXIsXG4gICAgc21zRGVsaXZlcmllczogbnVtYmVyLFxuICAgIG1vYmlsZVB1c2hEZWxpdmVyaWVzOiBudW1iZXIsXG4gICAgcHVibGlzaFByaWNlOiBudW1iZXIgfCBudWxsLFxuICAgIGh0dHBEZWxpdmVyeVByaWNlOiBudW1iZXIgfCBudWxsLFxuICAgIGVtYWlsRGVsaXZlcnlQcmljZTogbnVtYmVyIHwgbnVsbCxcbiAgICBzbXNQcmljZTogbnVtYmVyIHwgbnVsbCxcbiAgICBtb2JpbGVQdXNoUHJpY2U6IG51bWJlciB8IG51bGwsXG4gICk6IFNOU0Nvc3RCcmVha2Rvd24ge1xuICAgIC8vIFVzZSBBUEkgcHJpY2VzIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxiYWNrXG4gICAgY29uc3QgZWZmZWN0aXZlUHVibGlzaFByaWNlID0gcHVibGlzaFByaWNlID8/IHRoaXMuRkFMTEJBQ0tfUFVCTElTSF9QUklDRV9QRVJfTUlMTElPTjtcbiAgICBjb25zdCBlZmZlY3RpdmVIdHRwRGVsaXZlcnlQcmljZSA9IGh0dHBEZWxpdmVyeVByaWNlID8/IHRoaXMuRkFMTEJBQ0tfSFRUUF9ERUxJVkVSWV9QUklDRV9QRVJfTUlMTElPTjtcbiAgICBjb25zdCBlZmZlY3RpdmVFbWFpbERlbGl2ZXJ5UHJpY2UgPSBlbWFpbERlbGl2ZXJ5UHJpY2UgPz8gdGhpcy5GQUxMQkFDS19FTUFJTF9ERUxJVkVSWV9QUklDRV9QRVJfMTAwSztcbiAgICBjb25zdCBlZmZlY3RpdmVTbXNQcmljZSA9IHNtc1ByaWNlID8/IHRoaXMuRkFMTEJBQ0tfU01TX1BSSUNFX1BFUl9NRVNTQUdFO1xuICAgIGNvbnN0IGVmZmVjdGl2ZU1vYmlsZVB1c2hQcmljZSA9IG1vYmlsZVB1c2hQcmljZSA/PyB0aGlzLkZBTExCQUNLX01PQklMRV9QVVNIX1BSSUNFX1BFUl9NSUxMSU9OO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHB1Ymxpc2ggY29zdCAoZmlyc3QgMU0gZnJlZSlcbiAgICBjb25zdCBiaWxsYWJsZVB1Ymxpc2hlcyA9IE1hdGgubWF4KDAsIG1vbnRobHlQdWJsaXNoZXMgLSB0aGlzLkZSRUVfVElFUl9QVUJMSVNIRVMpO1xuICAgIGNvbnN0IHB1Ymxpc2hDb3N0ID0gKGJpbGxhYmxlUHVibGlzaGVzIC8gMV8wMDBfMDAwKSAqIGVmZmVjdGl2ZVB1Ymxpc2hQcmljZTtcblxuICAgIC8vIEhUVFAvUyBkZWxpdmVyeSBjb3N0OiAkWCBwZXIgbWlsbGlvblxuICAgIGNvbnN0IGh0dHBEZWxpdmVyeUNvc3QgPSAoaHR0cERlbGl2ZXJpZXMgLyAxXzAwMF8wMDApICogZWZmZWN0aXZlSHR0cERlbGl2ZXJ5UHJpY2U7XG5cbiAgICAvLyBFbWFpbCBkZWxpdmVyeSBjb3N0OiAkWCBwZXIgMTAwLDAwMFxuICAgIGNvbnN0IGVtYWlsRGVsaXZlcnlDb3N0ID0gKGVtYWlsRGVsaXZlcmllcyAvIDEwMF8wMDApICogZWZmZWN0aXZlRW1haWxEZWxpdmVyeVByaWNlO1xuXG4gICAgLy8gU01TIGRlbGl2ZXJ5IGNvc3Q6ICRYIHBlciBtZXNzYWdlICh2YXJpZXMgYnkgY291bnRyeSwgdXNpbmcgVVMgcmF0ZSlcbiAgICBjb25zdCBzbXNEZWxpdmVyeUNvc3QgPSBzbXNEZWxpdmVyaWVzICogZWZmZWN0aXZlU21zUHJpY2U7XG5cbiAgICAvLyBNb2JpbGUgcHVzaCBkZWxpdmVyeSBjb3N0OiAkWCBwZXIgbWlsbGlvblxuICAgIGNvbnN0IG1vYmlsZVB1c2hEZWxpdmVyeUNvc3QgPSAobW9iaWxlUHVzaERlbGl2ZXJpZXMgLyAxXzAwMF8wMDApICogZWZmZWN0aXZlTW9iaWxlUHVzaFByaWNlO1xuXG4gICAgY29uc3QgdG90YWxDb3N0ID0gcHVibGlzaENvc3QgKyBodHRwRGVsaXZlcnlDb3N0ICsgZW1haWxEZWxpdmVyeUNvc3QgKyBzbXNEZWxpdmVyeUNvc3QgKyBtb2JpbGVQdXNoRGVsaXZlcnlDb3N0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Ymxpc2hDb3N0LFxuICAgICAgaHR0cERlbGl2ZXJ5Q29zdCxcbiAgICAgIGVtYWlsRGVsaXZlcnlDb3N0LFxuICAgICAgc21zRGVsaXZlcnlDb3N0LFxuICAgICAgbW9iaWxlUHVzaERlbGl2ZXJ5Q29zdCxcbiAgICAgIHRvdGFsQ29zdCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEFzc3VtcHRpb25zKFxuICAgIG1vbnRobHlQdWJsaXNoZXM6IG51bWJlcixcbiAgICBodHRwRGVsaXZlcmllczogbnVtYmVyLFxuICAgIGVtYWlsRGVsaXZlcmllczogbnVtYmVyLFxuICAgIHNtc0RlbGl2ZXJpZXM6IG51bWJlcixcbiAgICBtb2JpbGVQdXNoRGVsaXZlcmllczogbnVtYmVyLFxuICAgIGNvc3RCcmVha2Rvd246IFNOU0Nvc3RCcmVha2Rvd24sXG4gICAgYWxsUHJpY2VzQXZhaWxhYmxlOiBib29sZWFuLFxuICAgIHB1Ymxpc2hQcmljZTogbnVtYmVyIHwgbnVsbCxcbiAgICBodHRwRGVsaXZlcnlQcmljZTogbnVtYmVyIHwgbnVsbCxcbiAgICBlbWFpbERlbGl2ZXJ5UHJpY2U6IG51bWJlciB8IG51bGwsXG4gICAgc21zUHJpY2U6IG51bWJlciB8IG51bGwsXG4gICAgbW9iaWxlUHVzaFByaWNlOiBudW1iZXIgfCBudWxsLFxuICApOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXNzdW1wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBBZGQgdXNhZ2UgYXNzdW1wdGlvbnNcbiAgICBhc3N1bXB0aW9ucy5wdXNoKGBBc3N1bWVzICR7bW9udGhseVB1Ymxpc2hlcy50b0xvY2FsZVN0cmluZygpfSBwdWJsaXNoZXMgcGVyIG1vbnRoYCk7XG4gICAgYXNzdW1wdGlvbnMucHVzaChgQXNzdW1lcyAke2h0dHBEZWxpdmVyaWVzLnRvTG9jYWxlU3RyaW5nKCl9IEhUVFAvUyBkZWxpdmVyaWVzIHBlciBtb250aGApO1xuXG4gICAgaWYgKGVtYWlsRGVsaXZlcmllcyA+IDApIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYEFzc3VtZXMgJHtlbWFpbERlbGl2ZXJpZXMudG9Mb2NhbGVTdHJpbmcoKX0gZW1haWwgZGVsaXZlcmllcyBwZXIgbW9udGhgKTtcbiAgICB9XG4gICAgaWYgKHNtc0RlbGl2ZXJpZXMgPiAwKSB7XG4gICAgICBhc3N1bXB0aW9ucy5wdXNoKGBBc3N1bWVzICR7c21zRGVsaXZlcmllcy50b0xvY2FsZVN0cmluZygpfSBTTVMgZGVsaXZlcmllcyBwZXIgbW9udGggKHVzaW5nIFVTIHJhdGUpYCk7XG4gICAgfVxuICAgIGlmIChtb2JpbGVQdXNoRGVsaXZlcmllcyA+IDApIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYEFzc3VtZXMgJHttb2JpbGVQdXNoRGVsaXZlcmllcy50b0xvY2FsZVN0cmluZygpfSBtb2JpbGUgcHVzaCBkZWxpdmVyaWVzIHBlciBtb250aGApO1xuICAgIH1cblxuICAgIC8vIEFkZCBmcmVlIHRpZXIgaW5mb3JtYXRpb25cbiAgICBpZiAobW9udGhseVB1Ymxpc2hlcyA8PSB0aGlzLkZSRUVfVElFUl9QVUJMSVNIRVMpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYEZpcnN0ICR7dGhpcy5GUkVFX1RJRVJfUFVCTElTSEVTLnRvTG9jYWxlU3RyaW5nKCl9IHB1Ymxpc2hlcyBhcmUgZnJlZWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBiaWxsYWJsZVB1Ymxpc2hlcyA9IG1vbnRobHlQdWJsaXNoZXMgLSB0aGlzLkZSRUVfVElFUl9QVUJMSVNIRVM7XG4gICAgICBhc3N1bXB0aW9ucy5wdXNoKGAke3RoaXMuRlJFRV9USUVSX1BVQkxJU0hFUy50b0xvY2FsZVN0cmluZygpfSBmcmVlIHRpZXIgcHVibGlzaGVzIGFwcGxpZWQsICR7YmlsbGFibGVQdWJsaXNoZXMudG9Mb2NhbGVTdHJpbmcoKX0gYmlsbGFibGVgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY29zdCBicmVha2Rvd25cbiAgICBpZiAoY29zdEJyZWFrZG93bi5wdWJsaXNoQ29zdCA+IDApIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYFB1Ymxpc2ggY29zdDogJCR7Y29zdEJyZWFrZG93bi5wdWJsaXNoQ29zdC50b0ZpeGVkKDIpfWApO1xuICAgIH1cbiAgICBpZiAoY29zdEJyZWFrZG93bi5odHRwRGVsaXZlcnlDb3N0ID4gMCkge1xuICAgICAgYXNzdW1wdGlvbnMucHVzaChgSFRUUC9TIGRlbGl2ZXJ5IGNvc3Q6ICQke2Nvc3RCcmVha2Rvd24uaHR0cERlbGl2ZXJ5Q29zdC50b0ZpeGVkKDIpfWApO1xuICAgIH1cbiAgICBpZiAoY29zdEJyZWFrZG93bi5lbWFpbERlbGl2ZXJ5Q29zdCA+IDApIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goYEVtYWlsIGRlbGl2ZXJ5IGNvc3Q6ICQke2Nvc3RCcmVha2Rvd24uZW1haWxEZWxpdmVyeUNvc3QudG9GaXhlZCgyKX1gKTtcbiAgICB9XG4gICAgaWYgKGNvc3RCcmVha2Rvd24uc21zRGVsaXZlcnlDb3N0ID4gMCkge1xuICAgICAgYXNzdW1wdGlvbnMucHVzaChgU01TIGRlbGl2ZXJ5IGNvc3Q6ICQke2Nvc3RCcmVha2Rvd24uc21zRGVsaXZlcnlDb3N0LnRvRml4ZWQoMil9YCk7XG4gICAgfVxuICAgIGlmIChjb3N0QnJlYWtkb3duLm1vYmlsZVB1c2hEZWxpdmVyeUNvc3QgPiAwKSB7XG4gICAgICBhc3N1bXB0aW9ucy5wdXNoKGBNb2JpbGUgcHVzaCBkZWxpdmVyeSBjb3N0OiAkJHtjb3N0QnJlYWtkb3duLm1vYmlsZVB1c2hEZWxpdmVyeUNvc3QudG9GaXhlZCgyKX1gKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZmFsbGJhY2sgcHJpY2luZyBub3Rlc1xuICAgIGlmICghYWxsUHJpY2VzQXZhaWxhYmxlKSB7XG4gICAgICBpZiAocHVibGlzaFByaWNlID09PSBudWxsKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGZhbGxiYWNrIHB1Ymxpc2ggcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScpO1xuICAgICAgfVxuICAgICAgaWYgKGh0dHBEZWxpdmVyeVByaWNlID09PSBudWxsKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGZhbGxiYWNrIEhUVFAgZGVsaXZlcnkgcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScpO1xuICAgICAgfVxuICAgICAgaWYgKGVtYWlsRGVsaXZlcnlQcmljZSA9PT0gbnVsbCAmJiBlbWFpbERlbGl2ZXJpZXMgPiAwKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGZhbGxiYWNrIGVtYWlsIGRlbGl2ZXJ5IHByaWNpbmcgKEFQSSB1bmF2YWlsYWJsZSknKTtcbiAgICAgIH1cbiAgICAgIGlmIChzbXNQcmljZSA9PT0gbnVsbCAmJiBzbXNEZWxpdmVyaWVzID4gMCkge1xuICAgICAgICBhc3N1bXB0aW9ucy5wdXNoKCdVc2luZyBmYWxsYmFjayBTTVMgcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScpO1xuICAgICAgfVxuICAgICAgaWYgKG1vYmlsZVB1c2hQcmljZSA9PT0gbnVsbCAmJiBtb2JpbGVQdXNoRGVsaXZlcmllcyA+IDApIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgZmFsbGJhY2sgbW9iaWxlIHB1c2ggcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBjdXN0b20gYXNzdW1wdGlvbiBub3Rlc1xuICAgIGlmICh0aGlzLmN1c3RvbU1vbnRobHlQdWJsaXNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIHB1Ymxpc2ggY291bnQgZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1c3RvbUh0dHBEZWxpdmVyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBIVFRQIGRlbGl2ZXJ5IGNvdW50IGZyb20gY29uZmlndXJhdGlvbicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXN0b21FbWFpbERlbGl2ZXJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGVtYWlsIGRlbGl2ZXJ5IGNvdW50IGZyb20gY29uZmlndXJhdGlvbicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXN0b21TbXNEZWxpdmVyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBTTVMgZGVsaXZlcnkgY291bnQgZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1c3RvbU1vYmlsZVB1c2hEZWxpdmVyaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBtb2JpbGUgcHVzaCBkZWxpdmVyeSBjb3VudCBmcm9tIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGhhc0N1c3RvbUFzc3VtcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmN1c3RvbU1vbnRobHlQdWJsaXNoZXMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5jdXN0b21IdHRwRGVsaXZlcmllcyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLmN1c3RvbUVtYWlsRGVsaXZlcmllcyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLmN1c3RvbVNtc0RlbGl2ZXJpZXMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5jdXN0b21Nb2JpbGVQdXNoRGVsaXZlcmllcyAhPT0gdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,23 @@
1
+ import { ResourceWithId } from '../../diff/types';
2
+ import { ResourceCostCalculator, MonthlyCost, PricingClient } from '../types';
3
+ export type StepFunctionsWorkflowType = 'STANDARD' | 'EXPRESS';
4
+ export declare class StepFunctionsCalculator implements ResourceCostCalculator {
5
+ private readonly customMonthlyExecutions?;
6
+ private readonly customStateTransitionsPerExecution?;
7
+ private readonly customAverageDurationMs?;
8
+ private readonly DEFAULT_MONTHLY_EXECUTIONS;
9
+ private readonly DEFAULT_STATE_TRANSITIONS_PER_EXECUTION;
10
+ private readonly DEFAULT_AVERAGE_DURATION_MS;
11
+ private readonly FALLBACK_STANDARD_STATE_TRANSITION_PRICE;
12
+ private readonly FALLBACK_EXPRESS_REQUEST_PRICE;
13
+ private readonly FALLBACK_EXPRESS_DURATION_PRICE;
14
+ constructor(customMonthlyExecutions?: number | undefined, customStateTransitionsPerExecution?: number | undefined, customAverageDurationMs?: number | undefined);
15
+ supports(resourceType: string): boolean;
16
+ calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
17
+ private getWorkflowType;
18
+ private calculateStandardWorkflowCost;
19
+ private calculateExpressWorkflowCost;
20
+ private buildStandardAssumptions;
21
+ private buildExpressAssumptions;
22
+ private hasCustomAssumptions;
23
+ }
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StepFunctionsCalculator = void 0;
4
+ const RegionMapper_1 = require("../RegionMapper");
5
+ class StepFunctionsCalculator {
6
+ customMonthlyExecutions;
7
+ customStateTransitionsPerExecution;
8
+ customAverageDurationMs;
9
+ // Default usage assumptions
10
+ DEFAULT_MONTHLY_EXECUTIONS = 10000;
11
+ DEFAULT_STATE_TRANSITIONS_PER_EXECUTION = 10;
12
+ DEFAULT_AVERAGE_DURATION_MS = 1000;
13
+ // Fallback pricing rates (AWS Step Functions us-east-1 pricing as of 2024)
14
+ // Used when API pricing is unavailable but user provided usage assumptions
15
+ FALLBACK_STANDARD_STATE_TRANSITION_PRICE = 0.025 / 1000; // $0.025 per 1,000 state transitions
16
+ FALLBACK_EXPRESS_REQUEST_PRICE = 1.0 / 1000000; // $1.00 per million requests
17
+ FALLBACK_EXPRESS_DURATION_PRICE = 0.00001667; // Per GB-second
18
+ constructor(customMonthlyExecutions, customStateTransitionsPerExecution, customAverageDurationMs) {
19
+ this.customMonthlyExecutions = customMonthlyExecutions;
20
+ this.customStateTransitionsPerExecution = customStateTransitionsPerExecution;
21
+ this.customAverageDurationMs = customAverageDurationMs;
22
+ }
23
+ supports(resourceType) {
24
+ return resourceType === 'AWS::StepFunctions::StateMachine';
25
+ }
26
+ async calculateCost(resource, region, pricingClient) {
27
+ const workflowType = this.getWorkflowType(resource);
28
+ if (workflowType === 'EXPRESS') {
29
+ return this.calculateExpressWorkflowCost(resource, region, pricingClient);
30
+ }
31
+ return this.calculateStandardWorkflowCost(resource, region, pricingClient);
32
+ }
33
+ getWorkflowType(resource) {
34
+ const typeProperty = resource.properties.Type;
35
+ if (typeProperty === 'EXPRESS') {
36
+ return 'EXPRESS';
37
+ }
38
+ return 'STANDARD';
39
+ }
40
+ async calculateStandardWorkflowCost(_resource, region, pricingClient) {
41
+ const monthlyExecutions = this.customMonthlyExecutions ?? this.DEFAULT_MONTHLY_EXECUTIONS;
42
+ const stateTransitionsPerExecution = this.customStateTransitionsPerExecution ?? this.DEFAULT_STATE_TRANSITIONS_PER_EXECUTION;
43
+ const totalStateTransitions = monthlyExecutions * stateTransitionsPerExecution;
44
+ try {
45
+ const regionPrefix = (0, RegionMapper_1.getRegionPrefix)(region);
46
+ const usageType = regionPrefix
47
+ ? `${regionPrefix}-StateTransition`
48
+ : 'StateTransition';
49
+ const stateTransitionPrice = await pricingClient.getPrice({
50
+ serviceCode: 'AWSStepFunctions',
51
+ region: (0, RegionMapper_1.normalizeRegion)(region),
52
+ filters: [
53
+ { field: 'productFamily', value: 'AWS Step Functions' },
54
+ { field: 'usagetype', value: usageType },
55
+ ],
56
+ });
57
+ const assumptions = this.buildStandardAssumptions(monthlyExecutions, stateTransitionsPerExecution, totalStateTransitions);
58
+ if (stateTransitionPrice === null) {
59
+ const hasCustomAssumptions = this.hasCustomAssumptions();
60
+ if (hasCustomAssumptions) {
61
+ const monthlyCost = totalStateTransitions * this.FALLBACK_STANDARD_STATE_TRANSITION_PRICE;
62
+ return {
63
+ amount: monthlyCost,
64
+ currency: 'USD',
65
+ confidence: 'low',
66
+ assumptions: [
67
+ 'Using fallback state transition pricing (API unavailable)',
68
+ ...assumptions,
69
+ ],
70
+ };
71
+ }
72
+ return {
73
+ amount: 0,
74
+ currency: 'USD',
75
+ confidence: 'unknown',
76
+ assumptions: [
77
+ `Pricing data not available for Step Functions Standard workflow in region ${region}`,
78
+ ...assumptions,
79
+ ],
80
+ };
81
+ }
82
+ const monthlyCost = totalStateTransitions * stateTransitionPrice;
83
+ return {
84
+ amount: monthlyCost,
85
+ currency: 'USD',
86
+ confidence: 'medium',
87
+ assumptions,
88
+ };
89
+ }
90
+ catch (error) {
91
+ const assumptions = [
92
+ `Failed to fetch pricing: ${error instanceof Error ? error.message : String(error)}`,
93
+ ...this.buildStandardAssumptions(monthlyExecutions, stateTransitionsPerExecution, totalStateTransitions),
94
+ ];
95
+ const hasCustomAssumptions = this.hasCustomAssumptions();
96
+ if (hasCustomAssumptions) {
97
+ const monthlyCost = totalStateTransitions * this.FALLBACK_STANDARD_STATE_TRANSITION_PRICE;
98
+ return {
99
+ amount: monthlyCost,
100
+ currency: 'USD',
101
+ confidence: 'low',
102
+ assumptions: [
103
+ 'Using fallback pricing (API error)',
104
+ ...assumptions.slice(1),
105
+ ],
106
+ };
107
+ }
108
+ return {
109
+ amount: 0,
110
+ currency: 'USD',
111
+ confidence: 'unknown',
112
+ assumptions,
113
+ };
114
+ }
115
+ }
116
+ async calculateExpressWorkflowCost(_resource, region, pricingClient) {
117
+ const monthlyExecutions = this.customMonthlyExecutions ?? this.DEFAULT_MONTHLY_EXECUTIONS;
118
+ const averageDurationMs = this.customAverageDurationMs ?? this.DEFAULT_AVERAGE_DURATION_MS;
119
+ // Express workflows are billed based on: requests + duration (GB-seconds)
120
+ // Assume 64MB memory per execution (typical Step Functions memory allocation)
121
+ const memoryMB = 64;
122
+ const durationSeconds = averageDurationMs / 1000;
123
+ const gbSeconds = (memoryMB / 1024) * durationSeconds * monthlyExecutions;
124
+ try {
125
+ const regionPrefix = (0, RegionMapper_1.getRegionPrefix)(region);
126
+ const requestUsageType = regionPrefix
127
+ ? `${regionPrefix}-ExpressRequest`
128
+ : 'ExpressRequest';
129
+ const durationUsageType = regionPrefix
130
+ ? `${regionPrefix}-ExpressDuration`
131
+ : 'ExpressDuration';
132
+ const requestPrice = await pricingClient.getPrice({
133
+ serviceCode: 'AWSStepFunctions',
134
+ region: (0, RegionMapper_1.normalizeRegion)(region),
135
+ filters: [
136
+ { field: 'productFamily', value: 'AWS Step Functions' },
137
+ { field: 'usagetype', value: requestUsageType },
138
+ ],
139
+ });
140
+ const durationPrice = await pricingClient.getPrice({
141
+ serviceCode: 'AWSStepFunctions',
142
+ region: (0, RegionMapper_1.normalizeRegion)(region),
143
+ filters: [
144
+ { field: 'productFamily', value: 'AWS Step Functions' },
145
+ { field: 'usagetype', value: durationUsageType },
146
+ ],
147
+ });
148
+ const assumptions = this.buildExpressAssumptions(monthlyExecutions, averageDurationMs, gbSeconds);
149
+ if (requestPrice === null || durationPrice === null) {
150
+ const hasCustomAssumptions = this.hasCustomAssumptions();
151
+ if (hasCustomAssumptions) {
152
+ const effectiveRequestPrice = requestPrice ?? this.FALLBACK_EXPRESS_REQUEST_PRICE;
153
+ const effectiveDurationPrice = durationPrice ?? this.FALLBACK_EXPRESS_DURATION_PRICE;
154
+ const requestCost = monthlyExecutions * effectiveRequestPrice;
155
+ const durationCost = gbSeconds * effectiveDurationPrice;
156
+ const monthlyCost = requestCost + durationCost;
157
+ return {
158
+ amount: monthlyCost,
159
+ currency: 'USD',
160
+ confidence: 'low',
161
+ assumptions: [
162
+ requestPrice === null ? 'Using fallback request pricing (API unavailable)' : '',
163
+ durationPrice === null ? 'Using fallback duration pricing (API unavailable)' : '',
164
+ ...assumptions,
165
+ ].filter(a => a !== ''),
166
+ };
167
+ }
168
+ return {
169
+ amount: 0,
170
+ currency: 'USD',
171
+ confidence: 'unknown',
172
+ assumptions: [
173
+ `Pricing data not available for Step Functions Express workflow in region ${region}`,
174
+ ...assumptions,
175
+ ],
176
+ };
177
+ }
178
+ const requestCost = monthlyExecutions * requestPrice;
179
+ const durationCost = gbSeconds * durationPrice;
180
+ const monthlyCost = requestCost + durationCost;
181
+ return {
182
+ amount: monthlyCost,
183
+ currency: 'USD',
184
+ confidence: 'medium',
185
+ assumptions,
186
+ };
187
+ }
188
+ catch (error) {
189
+ const assumptions = [
190
+ `Failed to fetch pricing: ${error instanceof Error ? error.message : String(error)}`,
191
+ ...this.buildExpressAssumptions(monthlyExecutions, averageDurationMs, gbSeconds),
192
+ ];
193
+ const hasCustomAssumptions = this.hasCustomAssumptions();
194
+ if (hasCustomAssumptions) {
195
+ const requestCost = monthlyExecutions * this.FALLBACK_EXPRESS_REQUEST_PRICE;
196
+ const durationCost = gbSeconds * this.FALLBACK_EXPRESS_DURATION_PRICE;
197
+ const monthlyCost = requestCost + durationCost;
198
+ return {
199
+ amount: monthlyCost,
200
+ currency: 'USD',
201
+ confidence: 'low',
202
+ assumptions: [
203
+ 'Using fallback pricing (API error)',
204
+ ...assumptions.slice(1),
205
+ ],
206
+ };
207
+ }
208
+ return {
209
+ amount: 0,
210
+ currency: 'USD',
211
+ confidence: 'unknown',
212
+ assumptions,
213
+ };
214
+ }
215
+ }
216
+ buildStandardAssumptions(monthlyExecutions, stateTransitionsPerExecution, totalStateTransitions) {
217
+ const assumptions = [
218
+ `Assumes ${monthlyExecutions.toLocaleString()} executions per month`,
219
+ `Assumes ${stateTransitionsPerExecution} state transitions per execution`,
220
+ `Total estimated state transitions: ${totalStateTransitions.toLocaleString()}`,
221
+ 'STANDARD workflow type',
222
+ 'Pricing: $0.025 per 1,000 state transitions',
223
+ ];
224
+ if (this.customMonthlyExecutions !== undefined) {
225
+ assumptions.push('Using custom monthly executions from configuration');
226
+ }
227
+ if (this.customStateTransitionsPerExecution !== undefined) {
228
+ assumptions.push('Using custom state transitions per execution from configuration');
229
+ }
230
+ return assumptions;
231
+ }
232
+ buildExpressAssumptions(monthlyExecutions, averageDurationMs, gbSeconds) {
233
+ const assumptions = [
234
+ `Assumes ${monthlyExecutions.toLocaleString()} executions per month`,
235
+ `Assumes ${averageDurationMs}ms average execution duration`,
236
+ `Total estimated GB-seconds: ${gbSeconds.toFixed(2)}`,
237
+ 'EXPRESS workflow type',
238
+ 'Pricing: $1.00 per million requests + $0.00001667 per GB-second',
239
+ 'Assumes 64MB memory allocation per execution',
240
+ ];
241
+ if (this.customMonthlyExecutions !== undefined) {
242
+ assumptions.push('Using custom monthly executions from configuration');
243
+ }
244
+ if (this.customAverageDurationMs !== undefined) {
245
+ assumptions.push('Using custom average duration from configuration');
246
+ }
247
+ return assumptions;
248
+ }
249
+ hasCustomAssumptions() {
250
+ return this.customMonthlyExecutions !== undefined ||
251
+ this.customStateTransitionsPerExecution !== undefined ||
252
+ this.customAverageDurationMs !== undefined;
253
+ }
254
+ }
255
+ exports.StepFunctionsCalculator = StepFunctionsCalculator;
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJpY2luZy9jYWxjdWxhdG9ycy9TdGVwRnVuY3Rpb25zQ2FsY3VsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxrREFBbUU7QUFJbkUsTUFBYSx1QkFBdUI7SUFhZjtJQUNBO0lBQ0E7SUFkbkIsNEJBQTRCO0lBQ1gsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLHVDQUF1QyxHQUFHLEVBQUUsQ0FBQztJQUM3QywyQkFBMkIsR0FBRyxJQUFJLENBQUM7SUFFcEQsMkVBQTJFO0lBQzNFLDJFQUEyRTtJQUMxRCx3Q0FBd0MsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMscUNBQXFDO0lBQzlGLDhCQUE4QixHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyw2QkFBNkI7SUFDN0UsK0JBQStCLEdBQUcsVUFBVSxDQUFDLENBQUMsZ0JBQWdCO0lBRS9FLFlBQ21CLHVCQUFnQyxFQUNoQyxrQ0FBMkMsRUFDM0MsdUJBQWdDO1FBRmhDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBUztRQUNoQyx1Q0FBa0MsR0FBbEMsa0NBQWtDLENBQVM7UUFDM0MsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUFTO0lBQ2hELENBQUM7SUFFSixRQUFRLENBQUMsWUFBb0I7UUFDM0IsT0FBTyxZQUFZLEtBQUssa0NBQWtDLENBQUM7SUFDN0QsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQ2pCLFFBQXdCLEVBQ3hCLE1BQWMsRUFDZCxhQUE0QjtRQUU1QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBELElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7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QyxrQ0FBa0MsS0FBSyxTQUFTO1lBQ3JELElBQUksQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBblRELDBEQW1UQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlV2l0aElkIH0gZnJvbSAnLi4vLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yLCBNb250aGx5Q29zdCwgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVJlZ2lvbiwgZ2V0UmVnaW9uUHJlZml4IH0gZnJvbSAnLi4vUmVnaW9uTWFwcGVyJztcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uc1dvcmtmbG93VHlwZSA9ICdTVEFOREFSRCcgfCAnRVhQUkVTUyc7XG5cbmV4cG9ydCBjbGFzcyBTdGVwRnVuY3Rpb25zQ2FsY3VsYXRvciBpbXBsZW1lbnRzIFJlc291cmNlQ29zdENhbGN1bGF0b3Ige1xuICAvLyBEZWZhdWx0IHVzYWdlIGFzc3VtcHRpb25zXG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9NT05USExZX0VYRUNVVElPTlMgPSAxMDAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX1NUQVRFX1RSQU5TSVRJT05TX1BFUl9FWEVDVVRJT04gPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0FWRVJBR0VfRFVSQVRJT05fTVMgPSAxMDAwO1xuXG4gIC8vIEZhbGxiYWNrIHByaWNpbmcgcmF0ZXMgKEFXUyBTdGVwIEZ1bmN0aW9ucyB1cy1lYXN0LTEgcHJpY2luZyBhcyBvZiAyMDI0KVxuICAvLyBVc2VkIHdoZW4gQVBJIHByaWNpbmcgaXMgdW5hdmFpbGFibGUgYnV0IHVzZXIgcHJvdmlkZWQgdXNhZ2UgYXNzdW1wdGlvbnNcbiAgcHJpdmF0ZSByZWFkb25seSBGQUxMQkFDS19TVEFOREFSRF9TVEFURV9UUkFOU0lUSU9OX1BSSUNFID0gMC4wMjUgLyAxMDAwOyAvLyAkMC4wMjUgcGVyIDEsMDAwIHN0YXRlIHRyYW5zaXRpb25zXG4gIHByaXZhdGUgcmVhZG9ubHkgRkFMTEJBQ0tfRVhQUkVTU19SRVFVRVNUX1BSSUNFID0gMS4wIC8gMTAwMDAwMDsgLy8gJDEuMDAgcGVyIG1pbGxpb24gcmVxdWVzdHNcbiAgcHJpdmF0ZSByZWFkb25seSBGQUxMQkFDS19FWFBSRVNTX0RVUkFUSU9OX1BSSUNFID0gMC4wMDAwMTY2NzsgLy8gUGVyIEdCLXNlY29uZFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tTW9udGhseUV4ZWN1dGlvbnM/OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21TdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uPzogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tQXZlcmFnZUR1cmF0aW9uTXM/OiBudW1iZXIsXG4gICkge31cblxuICBzdXBwb3J0cyhyZXNvdXJjZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXNvdXJjZVR5cGUgPT09ICdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZSc7XG4gIH1cblxuICBhc3luYyBjYWxjdWxhdGVDb3N0KFxuICAgIHJlc291cmNlOiBSZXNvdXJjZVdpdGhJZCxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50LFxuICApOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgY29uc3Qgd29ya2Zsb3dUeXBlID0gdGhpcy5nZXRXb3JrZmxvd1R5cGUocmVzb3VyY2UpO1xuICAgIFxuICAgIGlmICh3b3JrZmxvd1R5cGUgPT09ICdFWFBSRVNTJykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlRXhwcmVzc1dvcmtmbG93Q29zdChyZXNvdXJjZSwgcmVnaW9uLCBwcmljaW5nQ2xpZW50KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlU3RhbmRhcmRXb3JrZmxvd0Nvc3QocmVzb3VyY2UsIHJlZ2lvbiwgcHJpY2luZ0NsaWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldFdvcmtmbG93VHlwZShyZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQpOiBTdGVwRnVuY3Rpb25zV29ya2Zsb3dUeXBlIHtcbiAgICBjb25zdCB0eXBlUHJvcGVydHkgPSByZXNvdXJjZS5wcm9wZXJ0aWVzLlR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlUHJvcGVydHkgPT09ICdFWFBSRVNTJykge1xuICAgICAgcmV0dXJuICdFWFBSRVNTJztcbiAgICB9XG4gICAgcmV0dXJuICdTVEFOREFSRCc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZVN0YW5kYXJkV29ya2Zsb3dDb3N0KFxuICAgIF9yZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgKTogUHJvbWlzZTxNb250aGx5Q29zdD4ge1xuICAgIGNvbnN0IG1vbnRobHlFeGVjdXRpb25zID0gdGhpcy5jdXN0b21Nb250aGx5RXhlY3V0aW9ucyA/PyB0aGlzLkRFRkFVTFRfTU9OVEhMWV9FWEVDVVRJT05TO1xuICAgIGNvbnN0IHN0YXRlVHJhbnNpdGlvbnNQZXJFeGVjdXRpb24gPSB0aGlzLmN1c3RvbVN0YXRlVHJhbnNpdGlvbnNQZXJFeGVjdXRpb24gPz8gdGhpcy5ERUZBVUxUX1NUQVRFX1RSQU5TSVRJT05TX1BFUl9FWEVDVVRJT047XG4gICAgY29uc3QgdG90YWxTdGF0ZVRyYW5zaXRpb25zID0gbW9udGhseUV4ZWN1dGlvbnMgKiBzdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZ2lvblByZWZpeCA9IGdldFJlZ2lvblByZWZpeChyZWdpb24pO1xuICAgICAgY29uc3QgdXNhZ2VUeXBlID0gcmVnaW9uUHJlZml4IFxuICAgICAgICA/IGAke3JlZ2lvblByZWZpeH0tU3RhdGVUcmFuc2l0aW9uYCBcbiAgICAgICAgOiAnU3RhdGVUcmFuc2l0aW9uJztcblxuICAgICAgY29uc3Qgc3RhdGVUcmFuc2l0aW9uUHJpY2UgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgc2VydmljZUNvZGU6ICdBV1NTdGVwRnVuY3Rpb25zJyxcbiAgICAgICAgcmVnaW9uOiBub3JtYWxpemVSZWdpb24ocmVnaW9uKSxcbiAgICAgICAgZmlsdGVyczogW1xuICAgICAgICAgIHsgZmllbGQ6ICdwcm9kdWN0RmFtaWx5JywgdmFsdWU6ICdBV1MgU3RlcCBGdW5jdGlvbnMnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3VzYWdldHlwZScsIHZhbHVlOiB1c2FnZVR5cGUgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhc3N1bXB0aW9ucyA9IHRoaXMuYnVpbGRTdGFuZGFyZEFzc3VtcHRpb25zKG1vbnRobHlFeGVjdXRpb25zLCBzdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uLCB0b3RhbFN0YXRlVHJhbnNpdGlvbnMpO1xuXG4gICAgICBpZiAoc3RhdGVUcmFuc2l0aW9uUHJpY2UgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgaGFzQ3VzdG9tQXNzdW1wdGlvbnMgPSB0aGlzLmhhc0N1c3RvbUFzc3VtcHRpb25zKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaGFzQ3VzdG9tQXNzdW1wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IHRvdGFsU3RhdGVUcmFuc2l0aW9ucyAqIHRoaXMuRkFMTEJBQ0tfU1RBTkRBUkRfU1RBVEVfVFJBTlNJVElPTl9QUklDRTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYW1vdW50OiBtb250aGx5Q29zdCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICAgIGNvbmZpZGVuY2U6ICdsb3cnLFxuICAgICAgICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ1VzaW5nIGZhbGxiYWNrIHN0YXRlIHRyYW5zaXRpb24gcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScsXG4gICAgICAgICAgICAgIC4uLmFzc3VtcHRpb25zLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICAgYFByaWNpbmcgZGF0YSBub3QgYXZhaWxhYmxlIGZvciBTdGVwIEZ1bmN0aW9ucyBTdGFuZGFyZCB3b3JrZmxvdyBpbiByZWdpb24gJHtyZWdpb259YCxcbiAgICAgICAgICAgIC4uLmFzc3VtcHRpb25zLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gdG90YWxTdGF0ZVRyYW5zaXRpb25zICogc3RhdGVUcmFuc2l0aW9uUHJpY2U7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogbW9udGhseUNvc3QsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ21lZGl1bScsXG4gICAgICAgIGFzc3VtcHRpb25zLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSBbXG4gICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggcHJpY2luZzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgLi4udGhpcy5idWlsZFN0YW5kYXJkQXNzdW1wdGlvbnMobW9udGhseUV4ZWN1dGlvbnMsIHN0YXRlVHJhbnNpdGlvbnNQZXJFeGVjdXRpb24sIHRvdGFsU3RhdGVUcmFuc2l0aW9ucyksXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBoYXNDdXN0b21Bc3N1bXB0aW9ucyA9IHRoaXMuaGFzQ3VzdG9tQXNzdW1wdGlvbnMoKTtcbiAgICAgIFxuICAgICAgaWYgKGhhc0N1c3RvbUFzc3VtcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gdG90YWxTdGF0ZVRyYW5zaXRpb25zICogdGhpcy5GQUxMQkFDS19TVEFOREFSRF9TVEFURV9UUkFOU0lUSU9OX1BSSUNFO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFtb3VudDogbW9udGhseUNvc3QsXG4gICAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICAgIGNvbmZpZGVuY2U6ICdsb3cnLFxuICAgICAgICAgIGFzc3VtcHRpb25zOiBbXG4gICAgICAgICAgICAnVXNpbmcgZmFsbGJhY2sgcHJpY2luZyAoQVBJIGVycm9yKScsXG4gICAgICAgICAgICAuLi5hc3N1bXB0aW9ucy5zbGljZSgxKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICBhc3N1bXB0aW9ucyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxjdWxhdGVFeHByZXNzV29ya2Zsb3dDb3N0KFxuICAgIF9yZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgKTogUHJvbWlzZTxNb250aGx5Q29zdD4ge1xuICAgIGNvbnN0IG1vbnRobHlFeGVjdXRpb25zID0gdGhpcy5jdXN0b21Nb250aGx5RXhlY3V0aW9ucyA/PyB0aGlzLkRFRkFVTFRfTU9OVEhMWV9FWEVDVVRJT05TO1xuICAgIGNvbnN0IGF2ZXJhZ2VEdXJhdGlvbk1zID0gdGhpcy5jdXN0b21BdmVyYWdlRHVyYXRpb25NcyA/PyB0aGlzLkRFRkFVTFRfQVZFUkFHRV9EVVJBVElPTl9NUztcbiAgICBcbiAgICAvLyBFeHByZXNzIHdvcmtmbG93cyBhcmUgYmlsbGVkIGJhc2VkIG9uOiByZXF1ZXN0cyArIGR1cmF0aW9uIChHQi1zZWNvbmRzKVxuICAgIC8vIEFzc3VtZSA2NE1CIG1lbW9yeSBwZXIgZXhlY3V0aW9uICh0eXBpY2FsIFN0ZXAgRnVuY3Rpb25zIG1lbW9yeSBhbGxvY2F0aW9uKVxuICAgIGNvbnN0IG1lbW9yeU1CID0gNjQ7XG4gICAgY29uc3QgZHVyYXRpb25TZWNvbmRzID0gYXZlcmFnZUR1cmF0aW9uTXMgLyAxMDAwO1xuICAgIGNvbnN0IGdiU2Vjb25kcyA9IChtZW1vcnlNQiAvIDEwMjQpICogZHVyYXRpb25TZWNvbmRzICogbW9udGhseUV4ZWN1dGlvbnM7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVnaW9uUHJlZml4ID0gZ2V0UmVnaW9uUHJlZml4KHJlZ2lvbik7XG4gICAgICBjb25zdCByZXF1ZXN0VXNhZ2VUeXBlID0gcmVnaW9uUHJlZml4IFxuICAgICAgICA/IGAke3JlZ2lvblByZWZpeH0tRXhwcmVzc1JlcXVlc3RgIFxuICAgICAgICA6ICdFeHByZXNzUmVxdWVzdCc7XG4gICAgICBjb25zdCBkdXJhdGlvblVzYWdlVHlwZSA9IHJlZ2lvblByZWZpeCBcbiAgICAgICAgPyBgJHtyZWdpb25QcmVmaXh9LUV4cHJlc3NEdXJhdGlvbmAgXG4gICAgICAgIDogJ0V4cHJlc3NEdXJhdGlvbic7XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RQcmljZSA9IGF3YWl0IHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgICBzZXJ2aWNlQ29kZTogJ0FXU1N0ZXBGdW5jdGlvbnMnLFxuICAgICAgICByZWdpb246IG5vcm1hbGl6ZVJlZ2lvbihyZWdpb24pLFxuICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ3Byb2R1Y3RGYW1pbHknLCB2YWx1ZTogJ0FXUyBTdGVwIEZ1bmN0aW9ucycgfSxcbiAgICAgICAgICB7IGZpZWxkOiAndXNhZ2V0eXBlJywgdmFsdWU6IHJlcXVlc3RVc2FnZVR5cGUgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkdXJhdGlvblByaWNlID0gYXdhaXQgcHJpY2luZ0NsaWVudC5nZXRQcmljZSh7XG4gICAgICAgIHNlcnZpY2VDb2RlOiAnQVdTU3RlcEZ1bmN0aW9ucycsXG4gICAgICAgIHJlZ2lvbjogbm9ybWFsaXplUmVnaW9uKHJlZ2lvbiksXG4gICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAncHJvZHVjdEZhbWlseScsIHZhbHVlOiAnQVdTIFN0ZXAgRnVuY3Rpb25zJyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICd1c2FnZXR5cGUnLCB2YWx1ZTogZHVyYXRpb25Vc2FnZVR5cGUgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhc3N1bXB0aW9ucyA9IHRoaXMuYnVpbGRFeHByZXNzQXNzdW1wdGlvbnMobW9udGhseUV4ZWN1dGlvbnMsIGF2ZXJhZ2VEdXJhdGlvbk1zLCBnYlNlY29uZHMpO1xuXG4gICAgICBpZiAocmVxdWVzdFByaWNlID09PSBudWxsIHx8IGR1cmF0aW9uUHJpY2UgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgaGFzQ3VzdG9tQXNzdW1wdGlvbnMgPSB0aGlzLmhhc0N1c3RvbUFzc3VtcHRpb25zKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaGFzQ3VzdG9tQXNzdW1wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBlZmZlY3RpdmVSZXF1ZXN0UHJpY2UgPSByZXF1ZXN0UHJpY2UgPz8gdGhpcy5GQUxMQkFDS19FWFBSRVNTX1JFUVVFU1RfUFJJQ0U7XG4gICAgICAgICAgY29uc3QgZWZmZWN0aXZlRHVyYXRpb25QcmljZSA9IGR1cmF0aW9uUHJpY2UgPz8gdGhpcy5GQUxMQkFDS19FWFBSRVNTX0RVUkFUSU9OX1BSSUNFO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RDb3N0ID0gbW9udGhseUV4ZWN1dGlvbnMgKiBlZmZlY3RpdmVSZXF1ZXN0UHJpY2U7XG4gICAgICAgICAgY29uc3QgZHVyYXRpb25Db3N0ID0gZ2JTZWNvbmRzICogZWZmZWN0aXZlRHVyYXRpb25QcmljZTtcbiAgICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IHJlcXVlc3RDb3N0ICsgZHVyYXRpb25Db3N0O1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFtb3VudDogbW9udGhseUNvc3QsXG4gICAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgICAgICBjb25maWRlbmNlOiAnbG93JyxcbiAgICAgICAgICAgIGFzc3VtcHRpb25zOiBbXG4gICAgICAgICAgICAgIHJlcXVlc3RQcmljZSA9PT0gbnVsbCA/ICdVc2luZyBmYWxsYmFjayByZXF1ZXN0IHByaWNpbmcgKEFQSSB1bmF2YWlsYWJsZSknIDogJycsXG4gICAgICAgICAgICAgIGR1cmF0aW9uUHJpY2UgPT09IG51bGwgPyAnVXNpbmcgZmFsbGJhY2sgZHVyYXRpb24gcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScgOiAnJyxcbiAgICAgICAgICAgICAgLi4uYXNzdW1wdGlvbnMsXG4gICAgICAgICAgICBdLmZpbHRlcihhID0+IGEgIT09ICcnKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICAgYFByaWNpbmcgZGF0YSBub3QgYXZhaWxhYmxlIGZvciBTdGVwIEZ1bmN0aW9ucyBFeHByZXNzIHdvcmtmbG93IGluIHJlZ2lvbiAke3JlZ2lvbn1gLFxuICAgICAgICAgICAgLi4uYXNzdW1wdGlvbnMsXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdENvc3QgPSBtb250aGx5RXhlY3V0aW9ucyAqIHJlcXVlc3RQcmljZTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uQ29zdCA9IGdiU2Vjb25kcyAqIGR1cmF0aW9uUHJpY2U7XG4gICAgICBjb25zdCBtb250aGx5Q29zdCA9IHJlcXVlc3RDb3N0ICsgZHVyYXRpb25Db3N0O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IG1vbnRobHlDb3N0LFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICdtZWRpdW0nLFxuICAgICAgICBhc3N1bXB0aW9ucyxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGFzc3VtcHRpb25zID0gW1xuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIHByaWNpbmc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgIC4uLnRoaXMuYnVpbGRFeHByZXNzQXNzdW1wdGlvbnMobW9udGhseUV4ZWN1dGlvbnMsIGF2ZXJhZ2VEdXJhdGlvbk1zLCBnYlNlY29uZHMpLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgaGFzQ3VzdG9tQXNzdW1wdGlvbnMgPSB0aGlzLmhhc0N1c3RvbUFzc3VtcHRpb25zKCk7XG4gICAgICBcbiAgICAgIGlmIChoYXNDdXN0b21Bc3N1bXB0aW9ucykge1xuICAgICAgICBjb25zdCByZXF1ZXN0Q29zdCA9IG1vbnRobHlFeGVjdXRpb25zICogdGhpcy5GQUxMQkFDS19FWFBSRVNTX1JFUVVFU1RfUFJJQ0U7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uQ29zdCA9IGdiU2Vjb25kcyAqIHRoaXMuRkFMTEJBQ0tfRVhQUkVTU19EVVJBVElPTl9QUklDRTtcbiAgICAgICAgY29uc3QgbW9udGhseUNvc3QgPSByZXF1ZXN0Q29zdCArIGR1cmF0aW9uQ29zdDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFtb3VudDogbW9udGhseUNvc3QsXG4gICAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICAgIGNvbmZpZGVuY2U6ICdsb3cnLFxuICAgICAgICAgIGFzc3VtcHRpb25zOiBbXG4gICAgICAgICAgICAnVXNpbmcgZmFsbGJhY2sgcHJpY2luZyAoQVBJIGVycm9yKScsXG4gICAgICAgICAgICAuLi5hc3N1bXB0aW9ucy5zbGljZSgxKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICBhc3N1bXB0aW9ucyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFN0YW5kYXJkQXNzdW1wdGlvbnMoXG4gICAgbW9udGhseUV4ZWN1dGlvbnM6IG51bWJlcixcbiAgICBzdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uOiBudW1iZXIsXG4gICAgdG90YWxTdGF0ZVRyYW5zaXRpb25zOiBudW1iZXIsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBhc3N1bXB0aW9ucyA9IFtcbiAgICAgIGBBc3N1bWVzICR7bW9udGhseUV4ZWN1dGlvbnMudG9Mb2NhbGVTdHJpbmcoKX0gZXhlY3V0aW9ucyBwZXIgbW9udGhgLFxuICAgICAgYEFzc3VtZXMgJHtzdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9ufSBzdGF0ZSB0cmFuc2l0aW9ucyBwZXIgZXhlY3V0aW9uYCxcbiAgICAgIGBUb3RhbCBlc3RpbWF0ZWQgc3RhdGUgdHJhbnNpdGlvbnM6ICR7dG90YWxTdGF0ZVRyYW5zaXRpb25zLnRvTG9jYWxlU3RyaW5nKCl9YCxcbiAgICAgICdTVEFOREFSRCB3b3JrZmxvdyB0eXBlJyxcbiAgICAgICdQcmljaW5nOiAkMC4wMjUgcGVyIDEsMDAwIHN0YXRlIHRyYW5zaXRpb25zJyxcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuY3VzdG9tTW9udGhseUV4ZWN1dGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIG1vbnRobHkgZXhlY3V0aW9ucyBmcm9tIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VzdG9tU3RhdGVUcmFuc2l0aW9uc1BlckV4ZWN1dGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhc3N1bXB0aW9ucy5wdXNoKCdVc2luZyBjdXN0b20gc3RhdGUgdHJhbnNpdGlvbnMgcGVyIGV4ZWN1dGlvbiBmcm9tIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRXhwcmVzc0Fzc3VtcHRpb25zKFxuICAgIG1vbnRobHlFeGVjdXRpb25zOiBudW1iZXIsXG4gICAgYXZlcmFnZUR1cmF0aW9uTXM6IG51bWJlcixcbiAgICBnYlNlY29uZHM6IG51bWJlcixcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGFzc3VtcHRpb25zID0gW1xuICAgICAgYEFzc3VtZXMgJHttb250aGx5RXhlY3V0aW9ucy50b0xvY2FsZVN0cmluZygpfSBleGVjdXRpb25zIHBlciBtb250aGAsXG4gICAgICBgQXNzdW1lcyAke2F2ZXJhZ2VEdXJhdGlvbk1zfW1zIGF2ZXJhZ2UgZXhlY3V0aW9uIGR1cmF0aW9uYCxcbiAgICAgIGBUb3RhbCBlc3RpbWF0ZWQgR0Itc2Vjb25kczogJHtnYlNlY29uZHMudG9GaXhlZCgyKX1gLFxuICAgICAgJ0VYUFJFU1Mgd29ya2Zsb3cgdHlwZScsXG4gICAgICAnUHJpY2luZzogJDEuMDAgcGVyIG1pbGxpb24gcmVxdWVzdHMgKyAkMC4wMDAwMTY2NyBwZXIgR0Itc2Vjb25kJyxcbiAgICAgICdBc3N1bWVzIDY0TUIgbWVtb3J5IGFsbG9jYXRpb24gcGVyIGV4ZWN1dGlvbicsXG4gICAgXTtcblxuICAgIGlmICh0aGlzLmN1c3RvbU1vbnRobHlFeGVjdXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBtb250aGx5IGV4ZWN1dGlvbnMgZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBhdmVyYWdlIGR1cmF0aW9uIGZyb20gY29uZmlndXJhdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiBhc3N1bXB0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgaGFzQ3VzdG9tQXNzdW1wdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tTW9udGhseUV4ZWN1dGlvbnMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICB0aGlzLmN1c3RvbVN0YXRlVHJhbnNpdGlvbnNQZXJFeGVjdXRpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICB0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
@@ -7,5 +7,7 @@ export { LambdaCalculator } from './calculators/LambdaCalculator';
7
7
  export { RDSCalculator } from './calculators/RDSCalculator';
8
8
  export { CloudFrontCalculator } from './calculators/CloudFrontCalculator';
9
9
  export { ElastiCacheCalculator } from './calculators/ElastiCacheCalculator';
10
+ export { SNSCalculator, SNSCostBreakdown } from './calculators/SNSCalculator';
10
11
  export { LaunchTemplateCalculator, LaunchTemplateConfig, EbsVolumeConfig, } from './calculators/LaunchTemplateCalculator';
12
+ export { StepFunctionsCalculator, StepFunctionsWorkflowType, } from './calculators/StepFunctionsCalculator';
11
13
  export * from './types';
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.LaunchTemplateCalculator = exports.ElastiCacheCalculator = exports.CloudFrontCalculator = exports.RDSCalculator = exports.LambdaCalculator = exports.S3Calculator = exports.EC2Calculator = exports.CacheManager = exports.PricingClient = exports.PricingService = void 0;
17
+ exports.StepFunctionsCalculator = exports.LaunchTemplateCalculator = exports.SNSCalculator = exports.ElastiCacheCalculator = exports.CloudFrontCalculator = exports.RDSCalculator = exports.LambdaCalculator = exports.S3Calculator = exports.EC2Calculator = exports.CacheManager = exports.PricingClient = exports.PricingService = void 0;
18
18
  var PricingService_1 = require("./PricingService");
19
19
  Object.defineProperty(exports, "PricingService", { enumerable: true, get: function () { return PricingService_1.PricingService; } });
20
20
  var PricingClient_1 = require("./PricingClient");
@@ -33,7 +33,11 @@ var CloudFrontCalculator_1 = require("./calculators/CloudFrontCalculator");
33
33
  Object.defineProperty(exports, "CloudFrontCalculator", { enumerable: true, get: function () { return CloudFrontCalculator_1.CloudFrontCalculator; } });
34
34
  var ElastiCacheCalculator_1 = require("./calculators/ElastiCacheCalculator");
35
35
  Object.defineProperty(exports, "ElastiCacheCalculator", { enumerable: true, get: function () { return ElastiCacheCalculator_1.ElastiCacheCalculator; } });
36
+ var SNSCalculator_1 = require("./calculators/SNSCalculator");
37
+ Object.defineProperty(exports, "SNSCalculator", { enumerable: true, get: function () { return SNSCalculator_1.SNSCalculator; } });
36
38
  var LaunchTemplateCalculator_1 = require("./calculators/LaunchTemplateCalculator");
37
39
  Object.defineProperty(exports, "LaunchTemplateCalculator", { enumerable: true, get: function () { return LaunchTemplateCalculator_1.LaunchTemplateCalculator; } });
40
+ var StepFunctionsCalculator_1 = require("./calculators/StepFunctionsCalculator");
41
+ Object.defineProperty(exports, "StepFunctionsCalculator", { enumerable: true, get: function () { return StepFunctionsCalculator_1.StepFunctionsCalculator; } });
38
42
  __exportStar(require("./types"), exports);
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFrRDtBQUF6QyxnSEFBQSxjQUFjLE9BQUE7QUFDdkIsaURBQWdEO0FBQXZDLDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwrQ0FBOEM7QUFBckMsNEdBQUEsWUFBWSxPQUFBO0FBQ3JCLDZEQUE0RDtBQUFuRCw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsMkRBQTBEO0FBQWpELDRHQUFBLFlBQVksT0FBQTtBQUNyQixtRUFBa0U7QUFBekQsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwyRUFBMEU7QUFBakUsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNkVBQTRFO0FBQW5FLDhIQUFBLHFCQUFxQixPQUFBO0FBQzlCLG1GQUlnRDtBQUg5QyxvSUFBQSx3QkFBd0IsT0FBQTtBQUkxQiwwQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBQcmljaW5nU2VydmljZSB9IGZyb20gJy4vUHJpY2luZ1NlcnZpY2UnO1xuZXhwb3J0IHsgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4vUHJpY2luZ0NsaWVudCc7XG5leHBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tICcuL0NhY2hlTWFuYWdlcic7XG5leHBvcnQgeyBFQzJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQzJDYWxjdWxhdG9yJztcbmV4cG9ydCB7IFMzQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUzNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IExhbWJkYUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3InO1xuZXhwb3J0IHsgUkRTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUkRTQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBDbG91ZEZyb250Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQ2xvdWRGcm9udENhbGN1bGF0b3InO1xuZXhwb3J0IHsgRWxhc3RpQ2FjaGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FbGFzdGlDYWNoZUNhbGN1bGF0b3InO1xuZXhwb3J0IHtcbiAgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yLFxuICBMYXVuY2hUZW1wbGF0ZUNvbmZpZyxcbiAgRWJzVm9sdW1lQ29uZmlnLFxufSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFrRDtBQUF6QyxnSEFBQSxjQUFjLE9BQUE7QUFDdkIsaURBQWdEO0FBQXZDLDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwrQ0FBOEM7QUFBckMsNEdBQUEsWUFBWSxPQUFBO0FBQ3JCLDZEQUE0RDtBQUFuRCw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsMkRBQTBEO0FBQWpELDRHQUFBLFlBQVksT0FBQTtBQUNyQixtRUFBa0U7QUFBekQsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwyRUFBMEU7QUFBakUsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNkVBQTRFO0FBQW5FLDhIQUFBLHFCQUFxQixPQUFBO0FBQzlCLDZEQUE4RTtBQUFyRSw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsbUZBSWdEO0FBSDlDLG9JQUFBLHdCQUF3QixPQUFBO0FBSTFCLGlGQUcrQztBQUY3QyxrSUFBQSx1QkFBdUIsT0FBQTtBQUd6QiwwQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBQcmljaW5nU2VydmljZSB9IGZyb20gJy4vUHJpY2luZ1NlcnZpY2UnO1xuZXhwb3J0IHsgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4vUHJpY2luZ0NsaWVudCc7XG5leHBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tICcuL0NhY2hlTWFuYWdlcic7XG5leHBvcnQgeyBFQzJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQzJDYWxjdWxhdG9yJztcbmV4cG9ydCB7IFMzQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUzNDYWxjdWxhdG9yJztcbmV4cG9ydCB7IExhbWJkYUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3InO1xuZXhwb3J0IHsgUkRTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUkRTQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBDbG91ZEZyb250Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQ2xvdWRGcm9udENhbGN1bGF0b3InO1xuZXhwb3J0IHsgRWxhc3RpQ2FjaGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FbGFzdGlDYWNoZUNhbGN1bGF0b3InO1xuZXhwb3J0IHsgU05TQ2FsY3VsYXRvciwgU05TQ29zdEJyZWFrZG93biB9IGZyb20gJy4vY2FsY3VsYXRvcnMvU05TQ2FsY3VsYXRvcic7XG5leHBvcnQge1xuICBMYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3IsXG4gIExhdW5jaFRlbXBsYXRlQ29uZmlnLFxuICBFYnNWb2x1bWVDb25maWcsXG59IGZyb20gJy4vY2FsY3VsYXRvcnMvTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yJztcbmV4cG9ydCB7XG4gIFN0ZXBGdW5jdGlvbnNDYWxjdWxhdG9yLFxuICBTdGVwRnVuY3Rpb25zV29ya2Zsb3dUeXBlLFxufSBmcm9tICcuL2NhbGN1bGF0b3JzL1N0ZXBGdW5jdGlvbnNDYWxjdWxhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuIl19
@@ -1 +1 @@
1
- v0.1.29
1
+ v0.1.31
@@ -583,6 +583,135 @@ Total: $1.03/month
583
583
  - WebSocket connections billed per minute
584
584
  - Message size up to 128 KB
585
585
 
586
+ ### AWS::SNS::Topic
587
+
588
+ **Description:** Simple Notification Service for pub/sub messaging
589
+
590
+ **Cost Components:**
591
+ - Publish requests: Per million requests (first 1M free)
592
+ - HTTP/S deliveries: Per million deliveries
593
+ - Email deliveries: Per 100,000 deliveries
594
+ - SMS deliveries: Per message (varies by country)
595
+ - Mobile push deliveries: Per million deliveries
596
+
597
+ **Default Assumptions:**
598
+ - 1 million publish requests per month
599
+ - 1 million HTTP/S deliveries per month
600
+ - 0 email deliveries per month
601
+ - 0 SMS deliveries per month
602
+ - 0 mobile push deliveries per month
603
+
604
+ **Configuration:**
605
+ ```yaml
606
+ usageAssumptions:
607
+ sns:
608
+ monthlyPublishes: 1000000
609
+ httpDeliveries: 1000000
610
+ emailDeliveries: 0
611
+ smsDeliveries: 0
612
+ mobilePushDeliveries: 0
613
+ ```
614
+
615
+ **Example:**
616
+ ```
617
+ Publish requests: 2M publishes - 1M free = 1M × $0.50/1M = $0.50
618
+ HTTP/S deliveries: 1M × $0.60/1M = $0.60
619
+ Total: $1.10/month
620
+ ```
621
+
622
+ **Example with multiple delivery types:**
623
+ ```yaml
624
+ usageAssumptions:
625
+ sns:
626
+ monthlyPublishes: 5000000
627
+ httpDeliveries: 2000000
628
+ emailDeliveries: 100000
629
+ smsDeliveries: 10000
630
+ mobilePushDeliveries: 500000
631
+ ```
632
+
633
+ ```
634
+ Publish requests: 5M - 1M free = 4M × $0.50/1M = $2.00
635
+ HTTP/S deliveries: 2M × $0.60/1M = $1.20
636
+ Email deliveries: 100K × $2.00/100K = $2.00
637
+ SMS deliveries: 10K × $0.00645 = $64.50 (US rate)
638
+ Mobile push: 500K × $0.50/1M = $0.25
639
+ Total: $69.95/month
640
+ ```
641
+
642
+ **Notes:**
643
+ - First 1 million publish requests free per month
644
+ - SMS pricing varies significantly by destination country
645
+ - US SMS rate used as fallback ($0.00645/message)
646
+ - Mobile push includes APNS (iOS), GCM/FCM (Android), ADM (Amazon)
647
+ - Data transfer costs not included
648
+ - SNS FIFO topics may have different pricing
649
+ - Large message payloads (>64KB) count as multiple requests
650
+
651
+ ### AWS::StepFunctions::StateMachine
652
+
653
+ **Description:** AWS Step Functions state machine for serverless workflow orchestration
654
+
655
+ **Workflow Types:**
656
+
657
+ Step Functions supports two workflow types with different pricing models:
658
+
659
+ | Workflow Type | Best For | Pricing Model |
660
+ |---------------|----------|---------------|
661
+ | STANDARD | Long-running, durable workflows | Per state transition |
662
+ | EXPRESS | High-volume, short-duration workflows | Per request + duration |
663
+
664
+ **Cost Components:**
665
+
666
+ **Standard Workflows:**
667
+ - State transitions: $0.025 per 1,000 state transitions
668
+
669
+ **Express Workflows:**
670
+ - Requests: $1.00 per million requests
671
+ - Duration: $0.00001667 per GB-second
672
+
673
+ **Default Assumptions:**
674
+ - 10,000 workflow executions per month
675
+ - 10 state transitions per execution (Standard workflows)
676
+ - 1,000ms average execution duration (Express workflows)
677
+ - 64MB memory allocation per execution (Express workflows)
678
+
679
+ **Configuration:**
680
+ ```yaml
681
+ usageAssumptions:
682
+ stepFunctions:
683
+ monthlyExecutions: 10000 # Executions per month
684
+ stateTransitionsPerExecution: 10 # State transitions per execution (Standard)
685
+ averageDurationMs: 1000 # Average duration in ms (Express)
686
+ ```
687
+
688
+ **Example (Standard Workflow):**
689
+ ```
690
+ Executions: 10,000
691
+ State transitions per execution: 10
692
+ Total transitions: 100,000
693
+ Cost: 100,000 × ($0.025 / 1,000) = $2.50/month
694
+ ```
695
+
696
+ **Example (Express Workflow):**
697
+ ```
698
+ Executions: 10,000
699
+ Request cost: 10,000 × ($1.00 / 1,000,000) = $0.01
700
+ Duration: 64MB memory × 1 second × 10,000 = 625 GB-seconds
701
+ Duration cost: 625 × $0.00001667 = $0.01
702
+ Total: $0.02/month
703
+ ```
704
+
705
+ **Notes:**
706
+ - Workflow type detected from `Type` property in CloudFormation template
707
+ - Defaults to STANDARD if Type property is not specified
708
+ - Standard workflows are billed per state transition (includes retries)
709
+ - Express workflows are billed per request and per GB-second of duration
710
+ - Express workflows have a maximum duration of 5 minutes
711
+ - Standard workflows can run for up to 1 year
712
+ - First 4,000 state transitions per month are free tier eligible (Standard)
713
+ - Activity polling and callbacks may incur additional charges
714
+
586
715
  ## Container Resources
587
716
 
588
717
  ### AWS::ECS::Service
@@ -695,7 +824,20 @@ usageAssumptions:
695
824
  websocket:
696
825
  messagesPerMonth: 5000000
697
826
  connectionMinutes: 500000
698
-
827
+
828
+ # Messaging
829
+ sns:
830
+ monthlyPublishes: 5000000
831
+ httpDeliveries: 2000000
832
+ emailDeliveries: 100000
833
+ smsDeliveries: 10000
834
+ mobilePushDeliveries: 500000
835
+
836
+ stepFunctions:
837
+ monthlyExecutions: 50000 # Executions per month
838
+ stateTransitionsPerExecution: 15 # State transitions per execution (Standard)
839
+ averageDurationMs: 2000 # Average duration in ms (Express)
840
+
699
841
  # Containers
700
842
  ecs:
701
843
  fargate:
@@ -722,6 +864,11 @@ const result = await analyzeCosts({
722
864
  invocationsPerMonth: 5000000,
723
865
  averageDurationMs: 500,
724
866
  },
867
+ stepFunctions: {
868
+ monthlyExecutions: 50000,
869
+ stateTransitionsPerExecution: 15,
870
+ averageDurationMs: 2000,
871
+ },
725
872
  },
726
873
  });
727
874
  ```
package/package.json CHANGED
@@ -57,7 +57,7 @@
57
57
  "jest": "^30.2.0",
58
58
  "jest-junit": "^16",
59
59
  "lint-staged": "^15.0.0",
60
- "projen": "^0.99.11",
60
+ "projen": "^0.99.12",
61
61
  "ts-jest": "^29.4.6",
62
62
  "ts-node": "^10.9.2",
63
63
  "typescript": "^5.9.3"
@@ -83,7 +83,7 @@
83
83
  "publishConfig": {
84
84
  "access": "public"
85
85
  },
86
- "version": "0.1.29",
86
+ "version": "0.1.31",
87
87
  "bugs": {
88
88
  "url": "https://github.com/buildinginthecloud/cdk-cost-analyzer/issues"
89
89
  },