cdk-cost-analyzer 0.1.29 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cdk-cost-analyzer-cache/metadata.json +8 -8
- package/dist/config/types.d.ts +16 -0
- package/dist/config/types.js +1 -1
- package/dist/pricing/PricingService.js +3 -1
- package/dist/pricing/calculators/StepFunctionsCalculator.d.ts +23 -0
- package/dist/pricing/calculators/StepFunctionsCalculator.js +256 -0
- package/dist/pricing/index.d.ts +1 -0
- package/dist/pricing/index.js +4 -2
- package/dist/releasetag.txt +1 -1
- package/docs/CALCULATORS.md +74 -0
- package/package.json +2 -2
|
@@ -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":
|
|
5
|
+
"timestamp": 1770970412966
|
|
6
6
|
},
|
|
7
7
|
"AmazonDynamoDB:US East (N. Virginia):group:DDB-ReadUnits|productFamily:Amazon DynamoDB PayPerRequest Throughput": {
|
|
8
8
|
"price": 0.023,
|
|
9
|
-
"timestamp":
|
|
9
|
+
"timestamp": 1770970412972
|
|
10
10
|
},
|
|
11
11
|
"AmazonDynamoDB:US East (N. Virginia):group:DDB-WriteUnits|productFamily:Amazon DynamoDB PayPerRequest Throughput": {
|
|
12
12
|
"price": 0.023,
|
|
13
|
-
"timestamp":
|
|
13
|
+
"timestamp": 1770970412972
|
|
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":
|
|
17
|
+
"timestamp": 1770970412982
|
|
18
18
|
},
|
|
19
19
|
"AWSLambda:US East (N. Virginia):group:AWS-Lambda-Requests": {
|
|
20
20
|
"price": 0.023,
|
|
21
|
-
"timestamp":
|
|
21
|
+
"timestamp": 1770970412992
|
|
22
22
|
},
|
|
23
23
|
"AWSLambda:US East (N. Virginia):group:AWS-Lambda-Duration": {
|
|
24
24
|
"price": 0.023,
|
|
25
|
-
"timestamp":
|
|
25
|
+
"timestamp": 1770970412992
|
|
26
26
|
},
|
|
27
27
|
"AmazonS3:EU (Frankfurt):storageClass:General Purpose|volumeType:Standard": {
|
|
28
28
|
"price": 0.023,
|
|
29
|
-
"timestamp":
|
|
29
|
+
"timestamp": 1770970420359
|
|
30
30
|
},
|
|
31
31
|
"AmazonS3:invalid-region-123:storageClass:General Purpose|volumeType:Standard": {
|
|
32
32
|
"price": 0.023,
|
|
33
|
-
"timestamp":
|
|
33
|
+
"timestamp": 1770970420398
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -62,6 +62,22 @@ export interface UsageAssumptionsConfig {
|
|
|
62
62
|
vpcEndpoint?: {
|
|
63
63
|
dataProcessedGB?: number;
|
|
64
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* Step Functions usage assumptions for cost estimation.
|
|
67
|
+
*
|
|
68
|
+
* Standard workflows are charged per state transition.
|
|
69
|
+
* Express workflows are charged per request and per GB-second of duration.
|
|
70
|
+
*
|
|
71
|
+
* @see https://aws.amazon.com/step-functions/pricing/
|
|
72
|
+
*/
|
|
73
|
+
stepFunctions?: {
|
|
74
|
+
/** Number of workflow executions per month (default: 10,000) */
|
|
75
|
+
monthlyExecutions?: number;
|
|
76
|
+
/** Number of state transitions per execution (default: 10, for Standard workflows) */
|
|
77
|
+
stateTransitionsPerExecution?: number;
|
|
78
|
+
/** Average execution duration in milliseconds (default: 1000, for Express workflows) */
|
|
79
|
+
averageDurationMs?: number;
|
|
80
|
+
};
|
|
65
81
|
}
|
|
66
82
|
export interface SynthesisConfig {
|
|
67
83
|
appPath?: string;
|
package/dist/config/types.js
CHANGED
|
@@ -12,4 +12,4 @@ class ConfigurationError extends Error {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
exports.ConfigurationError = ConfigurationError;
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJHQSxNQUFhLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUhULFlBQ0UsT0FBZSxFQUNSLFVBQWtCLEVBQ2xCLGdCQUEwQjtRQUVqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBVTtRQUdqQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQVRELGdEQVNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDb3N0QW5hbHl6ZXJDb25maWcge1xuICB0aHJlc2hvbGRzPzogVGhyZXNob2xkQ29uZmlnO1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgc3ludGhlc2lzPzogU3ludGhlc2lzQ29uZmlnO1xuICBleGNsdXNpb25zPzogRXhjbHVzaW9uc0NvbmZpZztcbiAgY2FjaGU/OiBDYWNoZUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlc2hvbGRDb25maWcge1xuICBkZWZhdWx0PzogVGhyZXNob2xkTGV2ZWxzO1xuICBlbnZpcm9ubWVudHM/OiBSZWNvcmQ8c3RyaW5nLCBUaHJlc2hvbGRMZXZlbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVzaG9sZExldmVscyB7XG4gIHdhcm5pbmc/OiBudW1iZXI7XG4gIGVycm9yPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlQXNzdW1wdGlvbnNDb25maWcge1xuICBzMz86IHtcbiAgICBzdG9yYWdlR0I/OiBudW1iZXI7XG4gICAgZ2V0UmVxdWVzdHM/OiBudW1iZXI7XG4gICAgcHV0UmVxdWVzdHM/OiBudW1iZXI7XG4gIH07XG4gIGxhbWJkYT86IHtcbiAgICBpbnZvY2F0aW9uc1Blck1vbnRoPzogbnVtYmVyO1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xuICAvKipcbiAgICogRHluYW1vREIgdXNhZ2UgYXNzdW1wdGlvbnMgZm9yIG9uLWRlbWFuZCAocGF5LXBlci1yZXF1ZXN0KSBiaWxsaW5nIG1vZGUuXG4gICAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBlc3RpbWF0ZSBtb250aGx5IGNvc3RzIGZvciBEeW5hbW9EQiB0YWJsZXNcbiAgICogY29uZmlndXJlZCB3aXRoIEJpbGxpbmdNb2RlOiBQQVlfUEVSX1JFUVVFU1QuXG4gICAqXG4gICAqIEZvciBwcm92aXNpb25lZCBiaWxsaW5nIG1vZGUsIGNvc3RzIGFyZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZVxuICAgKiBSZWFkQ2FwYWNpdHlVbml0cyBhbmQgV3JpdGVDYXBhY2l0eVVuaXRzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9keW5hbW9kYi9wcmljaW5nL1xuICAgKi9cbiAgZHluYW1vZGI/OiB7XG4gICAgLyoqIE51bWJlciBvZiByZWFkIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMTAsMDAwLDAwMCkgKi9cbiAgICByZWFkUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHdyaXRlIHJlcXVlc3RzIHBlciBtb250aCAoZGVmYXVsdDogMSwwMDAsMDAwKSAqL1xuICAgIHdyaXRlUmVxdWVzdHNQZXJNb250aD86IG51bWJlcjtcbiAgfTtcbiAgbmF0R2F0ZXdheT86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIGFsYj86IHtcbiAgICBuZXdDb25uZWN0aW9uc1BlclNlY29uZD86IG51bWJlcjtcbiAgICBhY3RpdmVDb25uZWN0aW9uc1Blck1pbnV0ZT86IG51bWJlcjtcbiAgICBwcm9jZXNzZWRCeXRlc0dCPzogbnVtYmVyO1xuICB9O1xuICBubGI/OiB7XG4gICAgbmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQ/OiBudW1iZXI7XG4gICAgYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGU/OiBudW1iZXI7XG4gICAgcHJvY2Vzc2VkQnl0ZXNHQj86IG51bWJlcjtcbiAgfTtcbiAgY2xvdWRmcm9udD86IHtcbiAgICBkYXRhVHJhbnNmZXJHQj86IG51bWJlcjtcbiAgICByZXF1ZXN0cz86IG51bWJlcjtcbiAgfTtcbiAgYXBpR2F0ZXdheT86IHtcbiAgICByZXF1ZXN0c1Blck1vbnRoPzogbnVtYmVyO1xuICB9O1xuICB2cGNFbmRwb2ludD86IHtcbiAgICBkYXRhUHJvY2Vzc2VkR0I/OiBudW1iZXI7XG4gIH07XG4gIC8qKlxuICAgKiBTdGVwIEZ1bmN0aW9ucyB1c2FnZSBhc3N1bXB0aW9ucyBmb3IgY29zdCBlc3RpbWF0aW9uLlxuICAgKiBcbiAgICogU3RhbmRhcmQgd29ya2Zsb3dzIGFyZSBjaGFyZ2VkIHBlciBzdGF0ZSB0cmFuc2l0aW9uLlxuICAgKiBFeHByZXNzIHdvcmtmbG93cyBhcmUgY2hhcmdlZCBwZXIgcmVxdWVzdCBhbmQgcGVyIEdCLXNlY29uZCBvZiBkdXJhdGlvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3N0ZXAtZnVuY3Rpb25zL3ByaWNpbmcvXG4gICAqL1xuICBzdGVwRnVuY3Rpb25zPzoge1xuICAgIC8qKiBOdW1iZXIgb2Ygd29ya2Zsb3cgZXhlY3V0aW9ucyBwZXIgbW9udGggKGRlZmF1bHQ6IDEwLDAwMCkgKi9cbiAgICBtb250aGx5RXhlY3V0aW9ucz86IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHN0YXRlIHRyYW5zaXRpb25zIHBlciBleGVjdXRpb24gKGRlZmF1bHQ6IDEwLCBmb3IgU3RhbmRhcmQgd29ya2Zsb3dzKSAqL1xuICAgIHN0YXRlVHJhbnNpdGlvbnNQZXJFeGVjdXRpb24/OiBudW1iZXI7XG4gICAgLyoqIEF2ZXJhZ2UgZXhlY3V0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMTAwMCwgZm9yIEV4cHJlc3Mgd29ya2Zsb3dzKSAqL1xuICAgIGF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRoZXNpc0NvbmZpZyB7XG4gIGFwcFBhdGg/OiBzdHJpbmc7XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIGN1c3RvbUNvbW1hbmQ/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2x1c2lvbnNDb25maWcge1xuICByZXNvdXJjZVR5cGVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVDb25maWcge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgZHVyYXRpb25Ib3Vycz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgdmFsaWQ6IGJvb2xlYW47XG4gIGVycm9yczogc3RyaW5nW107XG4gIHdhcm5pbmdzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyBjb25maWdQYXRoOiBzdHJpbmcsXG4gICAgcHVibGljIHZhbGlkYXRpb25FcnJvcnM6IHN0cmluZ1tdLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQ29uZmlndXJhdGlvbkVycm9yJztcbiAgfVxufVxuIl19
|
|
@@ -16,6 +16,7 @@ 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 StepFunctionsCalculator_1 = require("./calculators/StepFunctionsCalculator");
|
|
19
20
|
const VPCEndpointCalculator_1 = require("./calculators/VPCEndpointCalculator");
|
|
20
21
|
const PricingClient_1 = require("./PricingClient");
|
|
21
22
|
class PricingService {
|
|
@@ -55,6 +56,7 @@ class PricingService {
|
|
|
55
56
|
new ElastiCacheCalculator_1.ElastiCacheCalculator(),
|
|
56
57
|
new AutoScalingGroupCalculator_1.AutoScalingGroupCalculator(),
|
|
57
58
|
new LaunchTemplateCalculator_1.LaunchTemplateCalculator(),
|
|
59
|
+
new StepFunctionsCalculator_1.StepFunctionsCalculator(usageAssumptions?.stepFunctions?.monthlyExecutions, usageAssumptions?.stepFunctions?.stateTransitionsPerExecution, usageAssumptions?.stepFunctions?.averageDurationMs),
|
|
58
60
|
];
|
|
59
61
|
}
|
|
60
62
|
async getResourceCost(resource, region, templateResources) {
|
|
@@ -168,4 +170,4 @@ class PricingService {
|
|
|
168
170
|
}
|
|
169
171
|
}
|
|
170
172
|
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==
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpY2luZ1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9QcmljaW5nU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBOEM7QUFDOUMsK0RBQTREO0FBQzVELDZFQUEwRTtBQUMxRSx5RkFBc0Y7QUFDdEYsNkVBQTBFO0FBQzFFLHlFQUFzRTtBQUN0RSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELCtFQUE0RTtBQUM1RSxxRUFBa0U7QUFDbEUscUZBQWtGO0FBQ2xGLDZFQUEwRTtBQUMxRSwrREFBNEQ7QUFDNUQsK0RBQTREO0FBQzVELDZEQUEwRDtBQUMxRCxtRkFBZ0Y7QUFDaEYsK0VBQTRFO0FBQzVFLG1EQUFnRDtBQVVoRCxNQUFhLGNBQWM7SUFDakIsV0FBVyxDQUEyQjtJQUN0QyxhQUFhLENBQWdCO0lBQzdCLHFCQUFxQixDQUFjO0lBRTNDLFlBQ0UsU0FBaUIsV0FBVyxFQUM1QixnQkFBeUMsRUFDekMscUJBQWdDLEVBQ2hDLFdBQXlCLEVBQ3pCLGFBQTZCO1FBRTdCLGtEQUFrRDtRQUNsRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ04saURBQWlEO1lBQ2pELElBQUksWUFBc0MsQ0FBQztZQUMzQyxJQUFJLFdBQVcsRUFBRSxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sYUFBYSxHQUFHLFdBQVcsRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDO2dCQUN2RCxZQUFZLEdBQUcsSUFBSSwyQkFBWSxDQUFDLDBCQUEwQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksNkJBQWEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELElBQUksQ0FBQyxxQkFB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TUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbEYsTUFBTSxVQUFVLEdBQUcsY0FBYyxHQUFHLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO1FBRTFFLE9BQU87WUFDTCxVQUFVO1lBQ1YsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVO1lBQ1YsWUFBWTtZQUNaLGFBQWE7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBcE1ELHdDQW9NQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhY2hlTWFuYWdlciB9IGZyb20gJy4vQ2FjaGVNYW5hZ2VyJztcbmltcG9ydCB7IEFMQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0FMQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgQVBJR2F0ZXdheUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0FQSUdhdGV3YXlDYWxjdWxhdG9yJztcbmltcG9ydCB7IEF1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9BdXRvU2NhbGluZ0dyb3VwQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBDbG91ZEZyb250Q2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvQ2xvdWRGcm9udENhbGN1bGF0b3InO1xuaW1wb3J0IHsgRHluYW1vREJDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9EeW5hbW9EQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgRUMyQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRUMyQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBFQ1NDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9FQ1NDYWxjdWxhdG9yJztcbmltcG9ydCB7IEVsYXN0aUNhY2hlQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRWxhc3RpQ2FjaGVDYWxjdWxhdG9yJztcbmltcG9ydCB7IExhbWJkYUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9MYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3InO1xuaW1wb3J0IHsgTmF0R2F0ZXdheUNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL05hdEdhdGV3YXlDYWxjdWxhdG9yJztcbmltcG9ydCB7IE5MQkNhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL05MQkNhbGN1bGF0b3InO1xuaW1wb3J0IHsgUkRTQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvUkRTQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBTM0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1MzQ2FsY3VsYXRvcic7XG5pbXBvcnQgeyBTdGVwRnVuY3Rpb25zQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3InO1xuaW1wb3J0IHsgVlBDRW5kcG9pbnRDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9WUENFbmRwb2ludENhbGN1bGF0b3InO1xuaW1wb3J0IHsgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4vUHJpY2luZ0NsaWVudCc7XG5pbXBvcnQge1xuICBQcmljaW5nU2VydmljZSBhcyBJUHJpY2luZ1NlcnZpY2UsXG4gIE1vbnRobHlDb3N0LFxuICBDb3N0RGVsdGEsXG4gIFJlc291cmNlQ29zdENhbGN1bGF0b3IsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZywgQ2FjaGVDb25maWcsIENvc3RBbmFseXplckNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCwgUmVzb3VyY2VEaWZmIH0gZnJvbSAnLi4vZGlmZi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBQcmljaW5nU2VydmljZSBpbXBsZW1lbnRzIElQcmljaW5nU2VydmljZSB7XG4gIHByaXZhdGUgY2FsY3VsYXRvcnM6IFJlc291cmNlQ29zdENhbGN1bGF0b3JbXTtcbiAgcHJpdmF0ZSBwcmljaW5nQ2xpZW50OiBQcmljaW5nQ2xpZW50O1xuICBwcml2YXRlIGV4Y2x1ZGVkUmVzb3VyY2VUeXBlczogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVnaW9uOiBzdHJpbmcgPSAndXMtZWFzdC0xJyxcbiAgICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZyxcbiAgICBleGNsdWRlZFJlc291cmNlVHlwZXM/OiBzdHJpbmdbXSxcbiAgICBjYWNoZUNvbmZpZz86IENhY2hlQ29uZmlnLFxuICAgIHByaWNpbmdDbGllbnQ/OiBQcmljaW5nQ2xpZW50LFxuICApIHtcbiAgICAvLyBVc2UgcHJvdmlkZWQgcHJpY2luZyBjbGllbnQgb3IgY3JlYXRlIGEgbmV3IG9uZVxuICAgIGlmIChwcmljaW5nQ2xpZW50KSB7XG4gICAgICB0aGlzLnByaWNpbmdDbGllbnQgPSBwcmljaW5nQ2xpZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbml0aWFsaXplIGNhY2hlIG1hbmFnZXIgaWYgY2FjaGluZyBpcyBlbmFibGVkXG4gICAgICBsZXQgY2FjaGVNYW5hZ2VyOiBDYWNoZU1hbmFnZXIgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGVDb25maWc/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlRHVyYXRpb24gPSBjYWNoZUNvbmZpZz8uZHVyYXRpb25Ib3VycyA/PyAyNDtcbiAgICAgICAgY2FjaGVNYW5hZ2VyID0gbmV3IENhY2hlTWFuYWdlcignLmNkay1jb3N0LWFuYWx5emVyLWNhY2hlJywgY2FjaGVEdXJhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJpY2luZ0NsaWVudCA9IG5ldyBQcmljaW5nQ2xpZW50KHJlZ2lvbiwgY2FjaGVNYW5hZ2VyKTtcbiAgICB9XG4gICAgdGhpcy5leGNsdWRlZFJlc291cmNlVHlwZXMgPSBuZXcgU2V0KGV4Y2x1ZGVkUmVzb3VyY2VUeXBlcyB8fCBbXSk7XG4gICAgXG4gICAgLy8gQnVpbGQgY29uZmlnIG9iamVjdCBmb3IgY2FsY3VsYXRvcnMgdGhhdCBuZWVkIGl0XG4gICAgY29uc3QgY29uZmlnOiBDb3N0QW5hbHl6ZXJDb25maWcgfCB1bmRlZmluZWQgPSB1c2FnZUFzc3VtcHRpb25zID8geyB1c2FnZUFzc3VtcHRpb25zIH0gOiB1bmRlZmluZWQ7XG4gICAgXG4gICAgdGhpcy5jYWxjdWxhdG9ycyA9IFtcbiAgICAgIG5ldyBFQzJDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgUzNDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTGFtYmRhQ2FsY3VsYXRvcihcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8ubGFtYmRhPy5pbnZvY2F0aW9uc1Blck1vbnRoLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5sYW1iZGE/LmF2ZXJhZ2VEdXJhdGlvbk1zLFxuICAgICAgKSxcbiAgICAgIG5ldyBSRFNDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgRHluYW1vREJDYWxjdWxhdG9yKGNvbmZpZyksXG4gICAgICBuZXcgRUNTQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IEFQSUdhdGV3YXlDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTmF0R2F0ZXdheUNhbGN1bGF0b3IodXNhZ2VBc3N1bXB0aW9ucz8ubmF0R2F0ZXdheT8uZGF0YVByb2Nlc3NlZEdCKSxcbiAgICAgIG5ldyBBTEJDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/Lm5ld0Nvbm5lY3Rpb25zUGVyU2Vjb25kLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/LmFjdGl2ZUNvbm5lY3Rpb25zUGVyTWludXRlLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5hbGI/LnByb2Nlc3NlZEJ5dGVzR0IsXG4gICAgICApLFxuICAgICAgbmV3IE5MQkNhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8ubmV3Q29ubmVjdGlvbnNQZXJTZWNvbmQsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8uYWN0aXZlQ29ubmVjdGlvbnNQZXJNaW51dGUsXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/Lm5sYj8ucHJvY2Vzc2VkQnl0ZXNHQixcbiAgICAgICksXG4gICAgICBuZXcgVlBDRW5kcG9pbnRDYWxjdWxhdG9yKHVzYWdlQXNzdW1wdGlvbnM/LnZwY0VuZHBvaW50Py5kYXRhUHJvY2Vzc2VkR0IpLFxuICAgICAgbmV3IENsb3VkRnJvbnRDYWxjdWxhdG9yKFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5jbG91ZGZyb250Py5kYXRhVHJhbnNmZXJHQixcbiAgICAgICAgdXNhZ2VBc3N1bXB0aW9ucz8uY2xvdWRmcm9udD8ucmVxdWVzdHMsXG4gICAgICApLFxuICAgICAgbmV3IEVsYXN0aUNhY2hlQ2FsY3VsYXRvcigpLFxuICAgICAgbmV3IEF1dG9TY2FsaW5nR3JvdXBDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgTGF1bmNoVGVtcGxhdGVDYWxjdWxhdG9yKCksXG4gICAgICBuZXcgU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3IoXG4gICAgICAgIHVzYWdlQXNzdW1wdGlvbnM/LnN0ZXBGdW5jdGlvbnM/Lm1vbnRobHlFeGVjdXRpb25zLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5zdGF0ZVRyYW5zaXRpb25zUGVyRXhlY3V0aW9uLFxuICAgICAgICB1c2FnZUFzc3VtcHRpb25zPy5zdGVwRnVuY3Rpb25zPy5hdmVyYWdlRHVyYXRpb25NcyxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlc291cmNlQ29zdChyZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsIHJlZ2lvbjogc3RyaW5nLCB0ZW1wbGF0ZVJlc291cmNlcz86IFJlc291cmNlV2l0aElkW10pOiBQcm9taXNlPE1vbnRobHlDb3N0PiB7XG4gICAgLy8gQ2hlY2sgaWYgcmVzb3VyY2UgdHlwZSBpcyBleGNsdWRlZFxuICAgIGlmICh0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMocmVzb3VyY2UudHlwZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAnaGlnaCcsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYFJlc291cmNlIHR5cGUgJHtyZXNvdXJjZS50eXBlfSBpcyBleGNsdWRlZCBmcm9tIGNvc3QgYW5hbHlzaXNgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCBjYWxjdWxhdG9yIHVzaW5nIGNhbkNhbGN1bGF0ZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gc3VwcG9ydHNcbiAgICBjb25zdCBjYWxjdWxhdG9yID0gdGhpcy5jYWxjdWxhdG9ycy5maW5kKGNhbGMgPT4ge1xuICAgICAgaWYgKGNhbGMuY2FuQ2FsY3VsYXRlKSB7XG4gICAgICAgIHJldHVybiBjYWxjLmNhbkNhbGN1bGF0ZShyZXNvdXJjZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsYy5zdXBwb3J0cyhyZXNvdXJjZS50eXBlKTtcbiAgICB9KTtcblxuICAgIGlmICghY2FsY3VsYXRvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnM6IFtgUmVzb3VyY2UgdHlwZSAke3Jlc291cmNlLnR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxjdWxhdG9yLmNhbGN1bGF0ZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgdGhpcy5wcmljaW5nQ2xpZW50LCB0ZW1wbGF0ZVJlc291cmNlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zOiBbYEZhaWxlZCB0byBjYWxjdWxhdGUgY29zdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvc3REZWx0YShkaWZmOiBSZXNvdXJjZURpZmYsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb3N0RGVsdGE+IHtcbiAgICAvLyBGaWx0ZXIgb3V0IGV4Y2x1ZGVkIHJlc291cmNlcyBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIGNvbnN0IGZpbHRlcmVkQWRkZWQgPSBkaWZmLmFkZGVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRSZW1vdmVkID0gZGlmZi5yZW1vdmVkLmZpbHRlcihyID0+ICF0aGlzLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5oYXMoci50eXBlKSk7XG4gICAgY29uc3QgZmlsdGVyZWRNb2RpZmllZCA9IGRpZmYubW9kaWZpZWQuZmlsdGVyKHIgPT4gIXRoaXMuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmhhcyhyLnR5cGUpKTtcblxuICAgIC8vIEJ1aWxkIHRlbXBsYXRlIHJlc291cmNlIGNvbnRleHQgZnJvbSBhbGwgcmVzb3VyY2VzIGluIHRoZSBkaWZmXG4gICAgY29uc3QgYWxsUmVzb3VyY2VzOiBSZXNvdXJjZVdpdGhJZFtdID0gW1xuICAgICAgLi4uZGlmZi5hZGRlZCxcbiAgICAgIC4uLmRpZmYucmVtb3ZlZCxcbiAgICAgIC4uLmRpZmYubW9kaWZpZWQubWFwKHIgPT4gKHtcbiAgICAgICAgbG9naWNhbElkOiByLmxvZ2ljYWxJZCxcbiAgICAgICAgdHlwZTogci50eXBlLFxuICAgICAgICBwcm9wZXJ0aWVzOiByLm5ld1Byb3BlcnRpZXMsXG4gICAgICB9KSksXG4gICAgXTtcblxuICAgIGNvbnN0IGFkZGVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkQWRkZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBtb250aGx5Q29zdCA9IGF3YWl0IHRoaXMuZ2V0UmVzb3VyY2VDb3N0KHJlc291cmNlLCByZWdpb24sIGFsbFJlc291cmNlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBtb250aGx5Q29zdCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCByZW1vdmVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkUmVtb3ZlZC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3QocmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IG1vZGlmaWVkQ29zdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZpbHRlcmVkTW9kaWZpZWQubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5vbGRQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdSZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQgPSB7XG4gICAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiByZXNvdXJjZS5uZXdQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9sZE1vbnRobHlDb3N0ID0gYXdhaXQgdGhpcy5nZXRSZXNvdXJjZUNvc3Qob2xkUmVzb3VyY2UsIHJlZ2lvbiwgYWxsUmVzb3VyY2VzKTtcbiAgICAgICAgY29uc3QgbmV3TW9udGhseUNvc3QgPSBhd2FpdCB0aGlzLmdldFJlc291cmNlQ29zdChuZXdSZXNvdXJjZSwgcmVnaW9uLCBhbGxSZXNvdXJjZXMpO1xuICAgICAgICBjb25zdCBjb3N0RGVsdGEgPSBuZXdNb250aGx5Q29zdC5hbW91bnQgLSBvbGRNb250aGx5Q29zdC5hbW91bnQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICAgIG1vbnRobHlDb3N0OiBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBvbGRNb250aGx5Q29zdCxcbiAgICAgICAgICBuZXdNb250aGx5Q29zdCxcbiAgICAgICAgICBjb3N0RGVsdGEsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgdG90YWxBZGRlZENvc3QgPSBhZGRlZENvc3RzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyByLm1vbnRobHlDb3N0LmFtb3VudCwgMCk7XG4gICAgY29uc3QgdG90YWxSZW1vdmVkQ29zdCA9IHJlbW92ZWRDb3N0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5tb250aGx5Q29zdC5hbW91bnQsIDApO1xuICAgIGNvbnN0IHRvdGFsTW9kaWZpZWREZWx0YSA9IG1vZGlmaWVkQ29zdHMucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIHIuY29zdERlbHRhLCAwKTtcblxuICAgIGNvbnN0IHRvdGFsRGVsdGEgPSB0b3RhbEFkZGVkQ29zdCAtIHRvdGFsUmVtb3ZlZENvc3QgKyB0b3RhbE1vZGlmaWVkRGVsdGE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxEZWx0YSxcbiAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgIGFkZGVkQ29zdHMsXG4gICAgICByZW1vdmVkQ29zdHMsXG4gICAgICBtb2RpZmllZENvc3RzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgcmVzb3VyY2VzIGFuZCBjb25uZWN0aW9uc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnByaWNpbmdDbGllbnQuZGVzdHJveSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -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==
|
package/dist/pricing/index.d.ts
CHANGED
|
@@ -8,4 +8,5 @@ export { RDSCalculator } from './calculators/RDSCalculator';
|
|
|
8
8
|
export { CloudFrontCalculator } from './calculators/CloudFrontCalculator';
|
|
9
9
|
export { ElastiCacheCalculator } from './calculators/ElastiCacheCalculator';
|
|
10
10
|
export { LaunchTemplateCalculator, LaunchTemplateConfig, EbsVolumeConfig, } from './calculators/LaunchTemplateCalculator';
|
|
11
|
+
export { StepFunctionsCalculator, StepFunctionsWorkflowType, } from './calculators/StepFunctionsCalculator';
|
|
11
12
|
export * from './types';
|
package/dist/pricing/index.js
CHANGED
|
@@ -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.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");
|
|
@@ -35,5 +35,7 @@ var ElastiCacheCalculator_1 = require("./calculators/ElastiCacheCalculator");
|
|
|
35
35
|
Object.defineProperty(exports, "ElastiCacheCalculator", { enumerable: true, get: function () { return ElastiCacheCalculator_1.ElastiCacheCalculator; } });
|
|
36
36
|
var LaunchTemplateCalculator_1 = require("./calculators/LaunchTemplateCalculator");
|
|
37
37
|
Object.defineProperty(exports, "LaunchTemplateCalculator", { enumerable: true, get: function () { return LaunchTemplateCalculator_1.LaunchTemplateCalculator; } });
|
|
38
|
+
var StepFunctionsCalculator_1 = require("./calculators/StepFunctionsCalculator");
|
|
39
|
+
Object.defineProperty(exports, "StepFunctionsCalculator", { enumerable: true, get: function () { return StepFunctionsCalculator_1.StepFunctionsCalculator; } });
|
|
38
40
|
__exportStar(require("./types"), exports);
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpY2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFrRDtBQUF6QyxnSEFBQSxjQUFjLE9BQUE7QUFDdkIsaURBQWdEO0FBQXZDLDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwrQ0FBOEM7QUFBckMsNEdBQUEsWUFBWSxPQUFBO0FBQ3JCLDZEQUE0RDtBQUFuRCw4R0FBQSxhQUFhLE9BQUE7QUFDdEIsMkRBQTBEO0FBQWpELDRHQUFBLFlBQVksT0FBQTtBQUNyQixtRUFBa0U7QUFBekQsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkRBQTREO0FBQW5ELDhHQUFBLGFBQWEsT0FBQTtBQUN0QiwyRUFBMEU7QUFBakUsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNkVBQTRFO0FBQW5FLDhIQUFBLHFCQUFxQixPQUFBO0FBQzlCLG1GQUlnRDtBQUg5QyxvSUFBQSx3QkFBd0IsT0FBQTtBQUkxQixpRkFHK0M7QUFGN0Msa0lBQUEsdUJBQXVCLE9BQUE7QUFHekIsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgUHJpY2luZ1NlcnZpY2UgfSBmcm9tICcuL1ByaWNpbmdTZXJ2aWNlJztcbmV4cG9ydCB7IFByaWNpbmdDbGllbnQgfSBmcm9tICcuL1ByaWNpbmdDbGllbnQnO1xuZXhwb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSAnLi9DYWNoZU1hbmFnZXInO1xuZXhwb3J0IHsgRUMyQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRUMyQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBTM0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1MzQ2FsY3VsYXRvcic7XG5leHBvcnQgeyBMYW1iZGFDYWxjdWxhdG9yIH0gZnJvbSAnLi9jYWxjdWxhdG9ycy9MYW1iZGFDYWxjdWxhdG9yJztcbmV4cG9ydCB7IFJEU0NhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL1JEU0NhbGN1bGF0b3InO1xuZXhwb3J0IHsgQ2xvdWRGcm9udENhbGN1bGF0b3IgfSBmcm9tICcuL2NhbGN1bGF0b3JzL0Nsb3VkRnJvbnRDYWxjdWxhdG9yJztcbmV4cG9ydCB7IEVsYXN0aUNhY2hlQ2FsY3VsYXRvciB9IGZyb20gJy4vY2FsY3VsYXRvcnMvRWxhc3RpQ2FjaGVDYWxjdWxhdG9yJztcbmV4cG9ydCB7XG4gIExhdW5jaFRlbXBsYXRlQ2FsY3VsYXRvcixcbiAgTGF1bmNoVGVtcGxhdGVDb25maWcsXG4gIEVic1ZvbHVtZUNvbmZpZyxcbn0gZnJvbSAnLi9jYWxjdWxhdG9ycy9MYXVuY2hUZW1wbGF0ZUNhbGN1bGF0b3InO1xuZXhwb3J0IHtcbiAgU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3IsXG4gIFN0ZXBGdW5jdGlvbnNXb3JrZmxvd1R5cGUsXG59IGZyb20gJy4vY2FsY3VsYXRvcnMvU3RlcEZ1bmN0aW9uc0NhbGN1bGF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG4iXX0=
|
package/dist/releasetag.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v0.1.
|
|
1
|
+
v0.1.30
|
package/docs/CALCULATORS.md
CHANGED
|
@@ -583,6 +583,70 @@ Total: $1.03/month
|
|
|
583
583
|
- WebSocket connections billed per minute
|
|
584
584
|
- Message size up to 128 KB
|
|
585
585
|
|
|
586
|
+
### AWS::StepFunctions::StateMachine
|
|
587
|
+
|
|
588
|
+
**Description:** AWS Step Functions state machine for serverless workflow orchestration
|
|
589
|
+
|
|
590
|
+
**Workflow Types:**
|
|
591
|
+
|
|
592
|
+
Step Functions supports two workflow types with different pricing models:
|
|
593
|
+
|
|
594
|
+
| Workflow Type | Best For | Pricing Model |
|
|
595
|
+
|---------------|----------|---------------|
|
|
596
|
+
| STANDARD | Long-running, durable workflows | Per state transition |
|
|
597
|
+
| EXPRESS | High-volume, short-duration workflows | Per request + duration |
|
|
598
|
+
|
|
599
|
+
**Cost Components:**
|
|
600
|
+
|
|
601
|
+
**Standard Workflows:**
|
|
602
|
+
- State transitions: $0.025 per 1,000 state transitions
|
|
603
|
+
|
|
604
|
+
**Express Workflows:**
|
|
605
|
+
- Requests: $1.00 per million requests
|
|
606
|
+
- Duration: $0.00001667 per GB-second
|
|
607
|
+
|
|
608
|
+
**Default Assumptions:**
|
|
609
|
+
- 10,000 workflow executions per month
|
|
610
|
+
- 10 state transitions per execution (Standard workflows)
|
|
611
|
+
- 1,000ms average execution duration (Express workflows)
|
|
612
|
+
- 64MB memory allocation per execution (Express workflows)
|
|
613
|
+
|
|
614
|
+
**Configuration:**
|
|
615
|
+
```yaml
|
|
616
|
+
usageAssumptions:
|
|
617
|
+
stepFunctions:
|
|
618
|
+
monthlyExecutions: 10000 # Executions per month
|
|
619
|
+
stateTransitionsPerExecution: 10 # State transitions per execution (Standard)
|
|
620
|
+
averageDurationMs: 1000 # Average duration in ms (Express)
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
**Example (Standard Workflow):**
|
|
624
|
+
```
|
|
625
|
+
Executions: 10,000
|
|
626
|
+
State transitions per execution: 10
|
|
627
|
+
Total transitions: 100,000
|
|
628
|
+
Cost: 100,000 × ($0.025 / 1,000) = $2.50/month
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
**Example (Express Workflow):**
|
|
632
|
+
```
|
|
633
|
+
Executions: 10,000
|
|
634
|
+
Request cost: 10,000 × ($1.00 / 1,000,000) = $0.01
|
|
635
|
+
Duration: 64MB memory × 1 second × 10,000 = 625 GB-seconds
|
|
636
|
+
Duration cost: 625 × $0.00001667 = $0.01
|
|
637
|
+
Total: $0.02/month
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
**Notes:**
|
|
641
|
+
- Workflow type detected from `Type` property in CloudFormation template
|
|
642
|
+
- Defaults to STANDARD if Type property is not specified
|
|
643
|
+
- Standard workflows are billed per state transition (includes retries)
|
|
644
|
+
- Express workflows are billed per request and per GB-second of duration
|
|
645
|
+
- Express workflows have a maximum duration of 5 minutes
|
|
646
|
+
- Standard workflows can run for up to 1 year
|
|
647
|
+
- First 4,000 state transitions per month are free tier eligible (Standard)
|
|
648
|
+
- Activity polling and callbacks may incur additional charges
|
|
649
|
+
|
|
586
650
|
## Container Resources
|
|
587
651
|
|
|
588
652
|
### AWS::ECS::Service
|
|
@@ -696,6 +760,11 @@ usageAssumptions:
|
|
|
696
760
|
messagesPerMonth: 5000000
|
|
697
761
|
connectionMinutes: 500000
|
|
698
762
|
|
|
763
|
+
stepFunctions:
|
|
764
|
+
monthlyExecutions: 50000 # Executions per month
|
|
765
|
+
stateTransitionsPerExecution: 15 # State transitions per execution (Standard)
|
|
766
|
+
averageDurationMs: 2000 # Average duration in ms (Express)
|
|
767
|
+
|
|
699
768
|
# Containers
|
|
700
769
|
ecs:
|
|
701
770
|
fargate:
|
|
@@ -722,6 +791,11 @@ const result = await analyzeCosts({
|
|
|
722
791
|
invocationsPerMonth: 5000000,
|
|
723
792
|
averageDurationMs: 500,
|
|
724
793
|
},
|
|
794
|
+
stepFunctions: {
|
|
795
|
+
monthlyExecutions: 50000,
|
|
796
|
+
stateTransitionsPerExecution: 15,
|
|
797
|
+
averageDurationMs: 2000,
|
|
798
|
+
},
|
|
725
799
|
},
|
|
726
800
|
});
|
|
727
801
|
```
|
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.
|
|
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.
|
|
86
|
+
"version": "0.1.30",
|
|
87
87
|
"bugs": {
|
|
88
88
|
"url": "https://github.com/buildinginthecloud/cdk-cost-analyzer/issues"
|
|
89
89
|
},
|