@cdklabs/multi-az-observability 0.0.1-alpha.6 → 0.0.1-alpha.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/.jsii +2826 -1008
  2. package/.jsii.tabl.json +1 -0
  3. package/API.md +5406 -1585
  4. package/README.md +176 -152
  5. package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.d.ts +18 -14
  6. package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +98 -60
  7. package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.d.ts +3 -3
  8. package/lib/alarmsandrules/BaseOperationRegionalAlarmsAndRules.js +2 -2
  9. package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.d.ts +6 -15
  10. package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.js +2 -10
  11. package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.d.ts +11 -3
  12. package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.js +29 -13
  13. package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.d.ts +0 -8
  14. package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.js +1 -1
  15. package/lib/alarmsandrules/IOperationAlarmsAndRules.d.ts +26 -23
  16. package/lib/alarmsandrules/IOperationAlarmsAndRules.js +1 -1
  17. package/lib/alarmsandrules/IServerSideOperationRegionalAlarmsAndRules.js +1 -1
  18. package/lib/alarmsandrules/IServiceAlarmsAndRules.d.ts +19 -15
  19. package/lib/alarmsandrules/IServiceAlarmsAndRules.js +1 -1
  20. package/lib/alarmsandrules/OperationAlarmsAndRules.d.ts +21 -18
  21. package/lib/alarmsandrules/OperationAlarmsAndRules.js +60 -72
  22. package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.d.ts +5 -5
  23. package/lib/alarmsandrules/ServerSideOperationRegionalAlarmsAndRules.js +2 -3
  24. package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.d.ts +21 -13
  25. package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.js +48 -29
  26. package/lib/alarmsandrules/ServiceAlarmsAndRules.d.ts +19 -15
  27. package/lib/alarmsandrules/ServiceAlarmsAndRules.js +34 -136
  28. package/lib/alarmsandrules/props/BaseOperationRegionalAlarmsAndRulesProps.d.ts +4 -3
  29. package/lib/alarmsandrules/props/BaseOperationRegionalAlarmsAndRulesProps.js +1 -1
  30. package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.d.ts +6 -44
  31. package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.js +1 -1
  32. package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.d.ts +39 -7
  33. package/lib/alarmsandrules/props/OperationAlarmsAndRulesProps.js +1 -1
  34. package/lib/azmapper/AvailabilityZoneMapper.js +8 -9
  35. package/lib/basic_observability/BasicServiceDashboard.d.ts +0 -3
  36. package/lib/basic_observability/BasicServiceDashboard.js +24 -112
  37. package/lib/basic_observability/BasicServiceMultiAZObservability.d.ts +8 -9
  38. package/lib/basic_observability/BasicServiceMultiAZObservability.js +97 -349
  39. package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.d.ts +66 -0
  40. package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.js +3 -0
  41. package/lib/basic_observability/props/BasicServiceDashboardProps.d.ts +27 -13
  42. package/lib/basic_observability/props/BasicServiceDashboardProps.js +1 -1
  43. package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.d.ts +10 -44
  44. package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.js +1 -1
  45. package/lib/basic_observability/props/NatGatewayDetectionProps.d.ts +31 -0
  46. package/lib/basic_observability/props/NatGatewayDetectionProps.js +3 -0
  47. package/lib/canaries/CanaryFunction.js +14 -13
  48. package/lib/canaries/CanaryTest.js +4 -4
  49. package/lib/canaries/src/canary.zip +0 -0
  50. package/lib/dashboards/ContributorInsightsWidget.d.ts +1 -1
  51. package/lib/dashboards/ContributorInsightsWidget.js +13 -17
  52. package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.d.ts +2 -6
  53. package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.js +436 -510
  54. package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.d.ts +2 -10
  55. package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.js +420 -416
  56. package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.d.ts +3 -66
  57. package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.js +1 -1
  58. package/lib/dashboards/props/OperationAvailabilityWidgetProps.d.ts +7 -2
  59. package/lib/dashboards/props/OperationAvailabilityWidgetProps.js +1 -1
  60. package/lib/dashboards/props/OperationLatencyWidgetProps.d.ts +7 -2
  61. package/lib/dashboards/props/OperationLatencyWidgetProps.js +1 -1
  62. package/lib/dashboards/props/ServiceAvailabilityAndLatencyDashboardProps.d.ts +8 -8
  63. package/lib/dashboards/props/ServiceAvailabilityAndLatencyDashboardProps.js +1 -1
  64. package/lib/index.d.ts +56 -25
  65. package/lib/index.js +37 -19
  66. package/lib/metrics/ApplicationLoadBalancerMetrics.d.ts +79 -2
  67. package/lib/metrics/ApplicationLoadBalancerMetrics.js +883 -26
  68. package/lib/metrics/AvailabilityAndLatencyMetrics.d.ts +23 -0
  69. package/lib/metrics/AvailabilityAndLatencyMetrics.js +125 -31
  70. package/lib/metrics/NatGatewayMetrics.d.ts +113 -0
  71. package/lib/metrics/NatGatewayMetrics.js +357 -0
  72. package/lib/metrics/RegionalAvailabilityMetrics.js +9 -10
  73. package/lib/metrics/RegionalLatencyMetrics.d.ts +1 -1
  74. package/lib/metrics/RegionalLatencyMetrics.js +27 -20
  75. package/lib/metrics/ZonalAvailabilityMetrics.d.ts +2 -8
  76. package/lib/metrics/ZonalAvailabilityMetrics.js +13 -28
  77. package/lib/metrics/ZonalLatencyMetrics.d.ts +2 -1
  78. package/lib/metrics/ZonalLatencyMetrics.js +33 -23
  79. package/lib/metrics/props/AvailabilityAndLatencyMetricProps.d.ts +4 -0
  80. package/lib/metrics/props/AvailabilityAndLatencyMetricProps.js +1 -1
  81. package/lib/metrics/props/LatencyMetricProps.d.ts +6 -0
  82. package/lib/metrics/props/LatencyMetricProps.js +1 -1
  83. package/lib/metrics/props/ZonalAvailabilityMetricProps.d.ts +4 -0
  84. package/lib/metrics/props/ZonalAvailabilityMetricProps.js +1 -1
  85. package/lib/metrics/props/ZonalLatencyMetricProps.d.ts +4 -0
  86. package/lib/metrics/props/ZonalLatencyMetricProps.js +1 -1
  87. package/lib/monitoring/src/monitoring-layer.zip +0 -0
  88. package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.d.ts +10 -0
  89. package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.js +15 -0
  90. package/lib/{basic_observability/props/ApplicationLoadBalancerLatencyOutlierCalculation.d.ts → outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.d.ts} +1 -1
  91. package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.js +23 -0
  92. package/lib/outlier-detection/LatencyOutlierMetricAggregation.d.ts +22 -0
  93. package/lib/outlier-detection/LatencyOutlierMetricAggregation.js +27 -0
  94. package/lib/outlier-detection/OutlierDetectionFunction.js +7 -6
  95. package/lib/outlier-detection/PacketLossOutlierAlgorithm.d.ts +10 -0
  96. package/lib/outlier-detection/PacketLossOutlierAlgorithm.js +15 -0
  97. package/lib/outlier-detection/src/outlier-detection.zip +0 -0
  98. package/lib/outlier-detection/src/scipy-layer.zip +0 -0
  99. package/lib/services/CanaryMetrics.d.ts +4 -3
  100. package/lib/services/CanaryMetrics.js +3 -4
  101. package/lib/services/CanaryTestAvailabilityMetricsOverride.d.ts +21 -0
  102. package/lib/services/CanaryTestAvailabilityMetricsOverride.js +23 -0
  103. package/lib/services/CanaryTestLatencyMetricsOverride.d.ts +15 -0
  104. package/lib/services/CanaryTestLatencyMetricsOverride.js +20 -0
  105. package/lib/services/CanaryTestMetricsOverride.d.ts +1 -13
  106. package/lib/services/CanaryTestMetricsOverride.js +2 -4
  107. package/lib/services/ContributorInsightRuleDetails.js +1 -1
  108. package/lib/services/ICanaryMetrics.d.ts +4 -3
  109. package/lib/services/ICanaryMetrics.js +1 -1
  110. package/lib/services/ICanaryTestAvailabilityMetricsOverride.d.ts +23 -0
  111. package/lib/services/ICanaryTestAvailabilityMetricsOverride.js +3 -0
  112. package/lib/services/ICanaryTestLatencyMetricsOverride.d.ts +13 -0
  113. package/lib/services/ICanaryTestLatencyMetricsOverride.js +3 -0
  114. package/lib/services/ICanaryTestMetricsOverride.d.ts +0 -12
  115. package/lib/services/ICanaryTestMetricsOverride.js +1 -1
  116. package/lib/services/IInstrumentedServiceMultiAZObservability.d.ts +13 -3
  117. package/lib/services/IInstrumentedServiceMultiAZObservability.js +1 -1
  118. package/lib/services/IOperation.d.ts +8 -6
  119. package/lib/services/IOperation.js +1 -1
  120. package/lib/services/IOperationAvailabilityMetricDetails.d.ts +18 -0
  121. package/lib/services/IOperationAvailabilityMetricDetails.js +3 -0
  122. package/lib/services/IOperationLatencyMetricDetails.d.ts +12 -0
  123. package/lib/services/IOperationLatencyMetricDetails.js +3 -0
  124. package/lib/services/IOperationMetricDetails.d.ts +0 -12
  125. package/lib/services/IOperationMetricDetails.js +1 -1
  126. package/lib/services/IService.d.ts +18 -4
  127. package/lib/services/IService.js +1 -1
  128. package/lib/services/IServiceAvailabilityMetricDetails.d.ts +18 -0
  129. package/lib/services/IServiceAvailabilityMetricDetails.js +3 -0
  130. package/lib/services/IServiceLatencyMetricDetails.d.ts +12 -0
  131. package/lib/services/IServiceLatencyMetricDetails.js +3 -0
  132. package/lib/services/IServiceMetricDetails.d.ts +0 -12
  133. package/lib/services/IServiceMetricDetails.js +1 -1
  134. package/lib/services/InstrumentedServiceMultiAZObservability.d.ts +15 -3
  135. package/lib/services/InstrumentedServiceMultiAZObservability.js +252 -228
  136. package/lib/services/Operation.d.ts +8 -6
  137. package/lib/services/Operation.js +4 -3
  138. package/lib/services/OperationAvailabilityMetricDetails.d.ts +22 -0
  139. package/lib/services/OperationAvailabilityMetricDetails.js +24 -0
  140. package/lib/services/OperationLatencyMetricDetails.d.ts +16 -0
  141. package/lib/services/OperationLatencyMetricDetails.js +21 -0
  142. package/lib/services/OperationMetricDetails.d.ts +1 -13
  143. package/lib/services/OperationMetricDetails.js +2 -8
  144. package/lib/services/Service.d.ts +18 -4
  145. package/lib/services/Service.js +4 -2
  146. package/lib/services/ServiceAvailabilityMetricDetails.d.ts +21 -0
  147. package/lib/services/ServiceAvailabilityMetricDetails.js +20 -0
  148. package/lib/services/ServiceLatencyMetricDetails.d.ts +15 -0
  149. package/lib/services/ServiceLatencyMetricDetails.js +19 -0
  150. package/lib/services/ServiceMetricDetails.d.ts +1 -13
  151. package/lib/services/ServiceMetricDetails.js +2 -4
  152. package/lib/services/props/CanaryMetricProps.d.ts +4 -3
  153. package/lib/services/props/CanaryMetricProps.js +1 -1
  154. package/lib/services/props/CanaryTestAvailabilityMetricsOverrideProps.d.ts +22 -0
  155. package/lib/services/props/CanaryTestAvailabilityMetricsOverrideProps.js +3 -0
  156. package/lib/services/props/CanaryTestLatencyMetricsOverrideProps.d.ts +14 -0
  157. package/lib/services/props/CanaryTestLatencyMetricsOverrideProps.js +3 -0
  158. package/lib/services/props/CanaryTestMetricsOverrideProps.d.ts +0 -16
  159. package/lib/services/props/CanaryTestMetricsOverrideProps.js +1 -1
  160. package/lib/services/props/InstrumentedServiceMultiAZObservabilityProps.d.ts +50 -5
  161. package/lib/services/props/InstrumentedServiceMultiAZObservabilityProps.js +1 -1
  162. package/lib/services/props/MetricDimensions.js +1 -1
  163. package/lib/services/props/OperationAvailabilityMetricDetailsProps.d.ts +22 -0
  164. package/lib/services/props/OperationAvailabilityMetricDetailsProps.js +3 -0
  165. package/lib/services/props/OperationLatencyMetricDetailsProps.d.ts +14 -0
  166. package/lib/services/props/OperationLatencyMetricDetailsProps.js +3 -0
  167. package/lib/services/props/OperationMetricDetailsProps.d.ts +0 -16
  168. package/lib/services/props/OperationMetricDetailsProps.js +1 -1
  169. package/lib/services/props/OperationProps.d.ts +4 -3
  170. package/lib/services/props/OperationProps.js +1 -1
  171. package/lib/services/props/ServiceAvailabilityMetricDetailsProps.d.ts +18 -0
  172. package/lib/services/props/ServiceAvailabilityMetricDetailsProps.js +3 -0
  173. package/lib/services/props/ServiceLatencyMetricDetailsProps.d.ts +12 -0
  174. package/lib/services/props/ServiceLatencyMetricDetailsProps.js +3 -0
  175. package/lib/services/props/ServiceMetricDetailsProps.d.ts +0 -12
  176. package/lib/services/props/ServiceMetricDetailsProps.js +1 -1
  177. package/lib/services/props/ServiceProps.d.ts +18 -4
  178. package/lib/services/props/ServiceProps.js +1 -1
  179. package/lib/utilities/MetricsHelper.d.ts +17 -9
  180. package/lib/utilities/MetricsHelper.js +34 -10
  181. package/lib/utilities/MinimumUnhealthyTargets.d.ts +25 -0
  182. package/lib/utilities/MinimumUnhealthyTargets.js +3 -0
  183. package/package.json +14 -14
  184. package/rosetta/default.ts-fixture +72 -0
  185. package/rosetta/service.ts-fixture +144 -0
  186. package/lib/basic_observability/props/ApplicationLoadBalancerLatencyOutlierCalculation.js +0 -23
  187. package/lib/services/IBasicServiceMultiAZObservability.d.ts +0 -45
  188. package/lib/services/IBasicServiceMultiAZObservability.js +0 -3
@@ -1,6 +1,8 @@
1
1
  import { IMetric } from 'aws-cdk-lib/aws-cloudwatch';
2
2
  import { AvailabilityMetricProps } from './props/AvailabilityMetricProps';
3
3
  import { LatencyMetricProps } from './props/LatencyMetricProps';
4
+ import { ZonalAvailabilityMetricProps } from './props/ZonalAvailabilityMetricProps';
5
+ import { ZonalLatencyMetricProps } from './props/ZonalLatencyMetricProps';
4
6
  /**
5
7
  * Class for creating availability and latency metrics that can be used in alarms and graphs
6
8
  */
@@ -14,6 +16,15 @@ export declare class AvailabilityAndLatencyMetrics {
14
16
  static createAvailabilityMetric(props: AvailabilityMetricProps, dimensions: {
15
17
  [key: string]: string;
16
18
  }): IMetric;
19
+ /**
20
+ * Creates availability metrics for a specific AZ
21
+ * @param props
22
+ * @param dimensions
23
+ * @returns
24
+ */
25
+ static createZonalAvailabilityMetric(props: ZonalAvailabilityMetricProps, dimensions: {
26
+ [key: string]: string;
27
+ }): IMetric;
17
28
  /**
18
29
  * General purpose method to create latency metrics, the reason this creates an array of metrics while the
19
30
  * equivalent availability metric method doesn't is because in availability, we can just sum the count of different
@@ -28,6 +39,15 @@ export declare class AvailabilityAndLatencyMetrics {
28
39
  static createLatencyMetrics(props: LatencyMetricProps, dimensions: {
29
40
  [key: string]: string;
30
41
  }): IMetric[];
42
+ /**
43
+ * Creates a latency metric with the provided name
44
+ * @param props
45
+ * @param dimensions
46
+ * @returns
47
+ */
48
+ static createLatencyMetric(props: LatencyMetricProps, dimensions: {
49
+ [key: string]: string;
50
+ }): IMetric;
31
51
  /**
32
52
  * Takes all of the success or failure latency metric names and creates an average of those
33
53
  * names, if there's only 1 name, it just returns that metric
@@ -47,4 +67,7 @@ export declare class AvailabilityAndLatencyMetrics {
47
67
  static createLatencyCountMetric(props: LatencyMetricProps, dimensions: {
48
68
  [key: string]: string;
49
69
  }): IMetric;
70
+ static createZonalLatencyCountMetric(props: ZonalLatencyMetricProps, dimensions: {
71
+ [key: string]: string;
72
+ }): IMetric;
50
73
  }
@@ -17,21 +17,13 @@ class AvailabilityAndLatencyMetrics {
17
17
  * @returns
18
18
  */
19
19
  static createAvailabilityMetric(props, dimensions) {
20
- let counter = 0;
21
- let key = '';
22
20
  let usingMetrics = {};
23
21
  let successKeys = [];
24
22
  let faultKeys = [];
25
23
  if (props.metricDetails.successMetricNames !== undefined &&
26
24
  props.metricType != AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT) {
27
25
  props.metricDetails.successMetricNames.forEach((successMetric) => {
28
- let keyPrefix = (props.keyPrefix === undefined || props.keyPrefix == ''
29
- ? ''
30
- : props.keyPrefix.toLowerCase() + '_') +
31
- props.metricDetails.operationName.toLowerCase() +
32
- '_' +
33
- successMetric.toLowerCase();
34
- key = keyPrefix + '_' + counter++;
26
+ let key = `${props.metricDetails.operationName.toLowerCase()}_${props.metricType.toString().toLowerCase()}_${successMetric.toLowerCase()}`;
35
27
  successKeys.push(key);
36
28
  usingMetrics[key] = new aws_cloudwatch_1.Metric({
37
29
  namespace: props.metricDetails.metricNamespace,
@@ -47,13 +39,7 @@ class AvailabilityAndLatencyMetrics {
47
39
  if (props.metricDetails.faultMetricNames !== undefined &&
48
40
  props.metricType != AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_COUNT) {
49
41
  props.metricDetails.faultMetricNames.forEach((faultMetric) => {
50
- let keyPrefix = (props.keyPrefix === undefined || props.keyPrefix == ''
51
- ? ''
52
- : props.keyPrefix.toLowerCase() + '_') +
53
- props.metricDetails.operationName.toLowerCase() +
54
- '_' +
55
- faultMetric.toLowerCase();
56
- key = keyPrefix + '_' + counter++;
42
+ let key = `${props.metricDetails.operationName.toLowerCase()}_${props.metricType.toString().toLowerCase()}_${faultMetric.toLowerCase()}`;
57
43
  faultKeys.push(key);
58
44
  usingMetrics[key] = new aws_cloudwatch_1.Metric({
59
45
  namespace: props.metricDetails.metricNamespace,
@@ -69,19 +55,19 @@ class AvailabilityAndLatencyMetrics {
69
55
  let expression = '';
70
56
  switch (props.metricType) {
71
57
  case AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE:
72
- expression = `((${successKeys.join('+')}) / (${successKeys.join('+')}+${faultKeys.join('+')})) * 100`;
58
+ expression = `((${successKeys.join('+')}) / (${successKeys.join('+')}+${faultKeys.join('+')})) * 100 + TIME_SERIES(0)`;
73
59
  break;
74
60
  case AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT:
75
- expression = `${successKeys.join('+')}+${faultKeys.join('+')}`;
61
+ expression = `${successKeys.join('+')}+${faultKeys.join('+')} + TIME_SERIES(0)`;
76
62
  break;
77
63
  case AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT:
78
- expression = `(${faultKeys.join('+')})`;
64
+ expression = `(${faultKeys.join('+')}) + TIME_SERIES(0)`;
79
65
  break;
80
66
  case AvailabilityMetricType_1.AvailabilityMetricType.FAULT_RATE:
81
- expression = `((${faultKeys.join('+')}) / (${successKeys.join('+')}+${faultKeys.join('+')})) * 100`;
67
+ expression = `((${faultKeys.join('+')}) / (${successKeys.join('+')}+${faultKeys.join('+')})) * 100 + TIME_SERIES(0)`;
82
68
  break;
83
69
  case AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_COUNT:
84
- expression = `(${successKeys.join('+')})`;
70
+ expression = `(${successKeys.join('+')}) + TIME_SERIES(0)`;
85
71
  break;
86
72
  }
87
73
  return new aws_cloudwatch_1.MathExpression({
@@ -89,6 +75,75 @@ class AvailabilityAndLatencyMetrics {
89
75
  label: props.label,
90
76
  period: props.metricDetails.period,
91
77
  usingMetrics: usingMetrics,
78
+ color: props.color
79
+ });
80
+ }
81
+ /**
82
+ * Creates availability metrics for a specific AZ
83
+ * @param props
84
+ * @param dimensions
85
+ * @returns
86
+ */
87
+ static createZonalAvailabilityMetric(props, dimensions) {
88
+ let usingMetrics = {};
89
+ let successKeys = [];
90
+ let faultKeys = [];
91
+ if (props.metricDetails.successMetricNames !== undefined &&
92
+ props.metricType != AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT) {
93
+ props.metricDetails.successMetricNames.forEach((successMetric) => {
94
+ let key = `${props.availabilityZone.substring(props.availabilityZone.length - 1)}_${props.metricDetails.operationName.toLowerCase()}_${props.metricType.toString().toLowerCase()}_${successMetric.toLowerCase()}`;
95
+ successKeys.push(key);
96
+ usingMetrics[key] = new aws_cloudwatch_1.Metric({
97
+ namespace: props.metricDetails.metricNamespace,
98
+ metricName: successMetric,
99
+ unit: props.metricDetails.unit,
100
+ period: props.metricDetails.period,
101
+ statistic: props.metricDetails.alarmStatistic,
102
+ dimensionsMap: dimensions,
103
+ label: successMetric,
104
+ });
105
+ });
106
+ }
107
+ if (props.metricDetails.faultMetricNames !== undefined &&
108
+ props.metricType != AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_COUNT) {
109
+ props.metricDetails.faultMetricNames.forEach((faultMetric) => {
110
+ let key = `${props.availabilityZone.substring(props.availabilityZone.length - 1)}_${props.metricDetails.operationName.toLowerCase()}_${props.metricType.toString().toLowerCase()}_${faultMetric.toLowerCase()}`;
111
+ faultKeys.push(key);
112
+ usingMetrics[key] = new aws_cloudwatch_1.Metric({
113
+ namespace: props.metricDetails.metricNamespace,
114
+ metricName: faultMetric,
115
+ unit: props.metricDetails.unit,
116
+ period: props.metricDetails.period,
117
+ statistic: props.metricDetails.alarmStatistic,
118
+ dimensionsMap: dimensions,
119
+ label: faultMetric,
120
+ });
121
+ });
122
+ }
123
+ let expression = '';
124
+ switch (props.metricType) {
125
+ case AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_RATE:
126
+ expression = `((${successKeys.join('+')}) / (${successKeys.join('+')}+${faultKeys.join('+')})) * 100 + TIME_SERIES(0)`;
127
+ break;
128
+ case AvailabilityMetricType_1.AvailabilityMetricType.REQUEST_COUNT:
129
+ expression = `${successKeys.join('+')}+${faultKeys.join('+')} + TIME_SERIES(0)`;
130
+ break;
131
+ case AvailabilityMetricType_1.AvailabilityMetricType.FAULT_COUNT:
132
+ expression = `(${faultKeys.join('+')}) + TIME_SERIES(0)`;
133
+ break;
134
+ case AvailabilityMetricType_1.AvailabilityMetricType.FAULT_RATE:
135
+ expression = `((${faultKeys.join('+')}) / (${successKeys.join('+')}+${faultKeys.join('+')})) * 100 + TIME_SERIES(0)`;
136
+ break;
137
+ case AvailabilityMetricType_1.AvailabilityMetricType.SUCCESS_COUNT:
138
+ expression = `(${successKeys.join('+')}) + TIME_SERIES(0)`;
139
+ break;
140
+ }
141
+ return new aws_cloudwatch_1.MathExpression({
142
+ expression: expression,
143
+ label: props.label,
144
+ period: props.metricDetails.period,
145
+ usingMetrics: usingMetrics,
146
+ color: props.color
92
147
  });
93
148
  }
94
149
  /**
@@ -113,16 +168,38 @@ class AvailabilityAndLatencyMetrics {
113
168
  names = props.metricDetails.faultMetricNames;
114
169
  break;
115
170
  }
116
- return names.map((x) => new aws_cloudwatch_1.Metric({
117
- metricName: x,
171
+ return names.map((metricName) => new aws_cloudwatch_1.Metric({
172
+ metricName: metricName,
118
173
  namespace: props.metricDetails.metricNamespace,
119
174
  unit: props.metricDetails.unit,
120
175
  period: props.metricDetails.period,
121
176
  statistic: props.statistic,
122
177
  dimensionsMap: dimensions,
123
178
  label: props.label,
179
+ color: props.color
124
180
  }));
125
181
  }
182
+ /**
183
+ * Creates a latency metric with the provided name
184
+ * @param props
185
+ * @param dimensions
186
+ * @returns
187
+ */
188
+ static createLatencyMetric(props, dimensions) {
189
+ if (!(props.metricName)) {
190
+ throw new Error("You must provide a metric name.");
191
+ }
192
+ return new aws_cloudwatch_1.Metric({
193
+ metricName: props.metricName,
194
+ namespace: props.metricDetails.metricNamespace,
195
+ unit: props.metricDetails.unit,
196
+ period: props.metricDetails.period,
197
+ statistic: props.statistic,
198
+ dimensionsMap: dimensions,
199
+ label: props.label,
200
+ color: props.color
201
+ });
202
+ }
126
203
  /**
127
204
  * Takes all of the success or failure latency metric names and creates an average of those
128
205
  * names, if there's only 1 name, it just returns that metric
@@ -150,6 +227,7 @@ class AvailabilityAndLatencyMetrics {
150
227
  label: props.label,
151
228
  period: props.metricDetails.period,
152
229
  usingMetrics: usingMetrics,
230
+ color: props.color
153
231
  });
154
232
  }
155
233
  }
@@ -168,22 +246,38 @@ class AvailabilityAndLatencyMetrics {
168
246
  else {
169
247
  let usingMetrics = {};
170
248
  latencyMetrics.forEach((metric, index) => {
171
- let keyPrefix = (props.keyPrefix === undefined || props.keyPrefix == ''
172
- ? ''
173
- : props.keyPrefix.toLowerCase() + '_') +
174
- props.metricDetails.operationName.toLowerCase() +
175
- '_' +
176
- props.metricType.toString().toLowerCase();
177
- usingMetrics[keyPrefix + index] = metric;
249
+ let key = `${props.metricDetails.operationName.toLowerCase()}_${props.metricType.toString().toLowerCase()}_${index}`;
250
+ usingMetrics[key] = metric;
251
+ });
252
+ return new aws_cloudwatch_1.MathExpression({
253
+ expression: Object.keys(usingMetrics).join('+'),
254
+ label: props.label,
255
+ period: props.metricDetails.period,
256
+ usingMetrics: usingMetrics,
257
+ color: props.color
258
+ });
259
+ }
260
+ }
261
+ static createZonalLatencyCountMetric(props, dimensions) {
262
+ let latencyMetrics = AvailabilityAndLatencyMetrics.createLatencyMetrics(props, dimensions);
263
+ if (latencyMetrics.length == 1) {
264
+ return latencyMetrics[0];
265
+ }
266
+ else {
267
+ let usingMetrics = {};
268
+ latencyMetrics.forEach((metric, index) => {
269
+ let key = `${props.availabilityZone.substring(props.availabilityZone.length - 1)}_${props.metricDetails.operationName.toLowerCase()}_${props.metricType.toString().toLowerCase()}_${index}`;
270
+ usingMetrics[key] = metric;
178
271
  });
179
272
  return new aws_cloudwatch_1.MathExpression({
180
273
  expression: Object.keys(usingMetrics).join('+'),
181
274
  label: props.label,
182
275
  period: props.metricDetails.period,
183
276
  usingMetrics: usingMetrics,
277
+ color: props.color
184
278
  });
185
279
  }
186
280
  }
187
281
  }
188
282
  exports.AvailabilityAndLatencyMetrics = AvailabilityAndLatencyMetrics;
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0cmljcy9BdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBQ3RDLCtEQUE2RTtBQUc3RSxnRkFBNkU7QUFDN0Usc0VBQW1FO0FBRW5FOztHQUVHO0FBQ0gsTUFBYSw2QkFBNkI7SUFFeEM7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsd0JBQXdCLENBQzdCLEtBQThCLEVBQzlCLFVBQXFDO1FBRXJDLElBQUksT0FBTyxHQUFXLENBQUMsQ0FBQztRQUN4QixJQUFJLEdBQUcsR0FBVyxFQUFFLENBQUM7UUFFckIsSUFBSSxZQUFZLEdBQStCLEVBQUUsQ0FBQztRQUVsRCxJQUFJLFdBQVcsR0FBYSxFQUFFLENBQUM7UUFDL0IsSUFBSSxTQUFTLEdBQWEsRUFBRSxDQUFDO1FBRTdCLElBQ0UsS0FBSyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsS0FBSyxTQUFTO1lBQ3BELEtBQUssQ0FBQyxVQUFVLElBQUksK0NBQXNCLENBQUMsV0FBVyxFQUN0RCxDQUFDO1lBQ0QsS0FBSyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQzVDLENBQUMsYUFBcUIsRUFBRSxFQUFFO2dCQUN4QixJQUFJLFNBQVMsR0FDWCxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRTtvQkFDckQsQ0FBQyxDQUFDLEVBQUU7b0JBQ0osQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDO29CQUN4QyxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUU7b0JBQy9DLEdBQUc7b0JBQ0gsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dC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eEIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDL0MsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO2dCQUNsQixNQUFNLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNO2dCQUNsQyxZQUFZLEVBQUUsWUFBWTthQUMzQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBak9ELHNFQWlPQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbmltcG9ydCB7IElNZXRyaWMsIE1ldHJpYywgTWF0aEV4cHJlc3Npb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyB9IGZyb20gJy4vcHJvcHMvQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMnO1xuaW1wb3J0IHsgTGF0ZW5jeU1ldHJpY1Byb3BzIH0gZnJvbSAnLi9wcm9wcy9MYXRlbmN5TWV0cmljUHJvcHMnO1xuaW1wb3J0IHsgQXZhaWxhYmlsaXR5TWV0cmljVHlwZSB9IGZyb20gJy4uL3V0aWxpdGllcy9BdmFpbGFiaWxpdHlNZXRyaWNUeXBlJztcbmltcG9ydCB7IExhdGVuY3lNZXRyaWNUeXBlIH0gZnJvbSAnLi4vdXRpbGl0aWVzL0xhdGVuY3lNZXRyaWNUeXBlJztcblxuLyoqXG4gKiBDbGFzcyBmb3IgY3JlYXRpbmcgYXZhaWxhYmlsaXR5IGFuZCBsYXRlbmN5IG1ldHJpY3MgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbGFybXMgYW5kIGdyYXBoc1xuICovXG5leHBvcnQgY2xhc3MgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3Mge1xuXG4gIC8qKlxuICAgKiBHZW5lcmFsIHB1cnBvc2UgbWV0aG9kIHRvIGNyZWF0ZSBhdmFpbGFiaWxpdHkgbWV0cmljc1xuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHBhcmFtIGRpbWVuc2lvbnNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBdmFpbGFiaWxpdHlNZXRyaWMoXG4gICAgcHJvcHM6IEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzLFxuICAgIGRpbWVuc2lvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICk6IElNZXRyaWMge1xuICAgIGxldCBjb3VudGVyOiBudW1iZXIgPSAwO1xuICAgIGxldCBrZXk6IHN0cmluZyA9ICcnO1xuXG4gICAgbGV0IHVzaW5nTWV0cmljczogeyBba2V5OiBzdHJpbmddOiBJTWV0cmljIH0gPSB7fTtcblxuICAgIGxldCBzdWNjZXNzS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgZmF1bHRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5zdWNjZXNzTWV0cmljTmFtZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcHJvcHMubWV0cmljVHlwZSAhPSBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5UXG4gICAgKSB7XG4gICAgICBwcm9wcy5tZXRyaWNEZXRhaWxzLnN1Y2Nlc3NNZXRyaWNOYW1lcy5mb3JFYWNoKFxuICAgICAgICAoc3VjY2Vzc01ldHJpYzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgbGV0IGtleVByZWZpeCA9XG4gICAgICAgICAgICAocHJvcHMua2V5UHJlZml4ID09PSB1bmRlZmluZWQgfHwgcHJvcHMua2V5UHJlZml4ID09ICcnXG4gICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgOiBwcm9wcy5rZXlQcmVmaXgudG9Mb3dlckNhc2UoKSArICdfJykgK1xuICAgICAgICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5vcGVyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAgICAgJ18nICtcbiAgICAgICAgICAgIHN1Y2Nlc3NNZXRyaWMudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgIGtleSA9IGtleVByZWZpeCArICdfJyArIGNvdW50ZXIrKztcbiAgICAgICAgICBzdWNjZXNzS2V5cy5wdXNoKGtleSk7XG5cbiAgICAgICAgICB1c2luZ01ldHJpY3Nba2V5XSA9IG5ldyBNZXRyaWMoe1xuICAgICAgICAgICAgbmFtZXNwYWNlOiBwcm9wcy5tZXRyaWNEZXRhaWxzLm1ldHJpY05hbWVzcGFjZSxcbiAgICAgICAgICAgIG1ldHJpY05hbWU6IHN1Y2Nlc3NNZXRyaWMsXG4gICAgICAgICAgICB1bml0OiBwcm9wcy5tZXRyaWNEZXRhaWxzLnVuaXQsXG4gICAgICAgICAgICBwZXJpb2Q6IHByb3BzLm1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgICAgICAgc3RhdGlzdGljOiBwcm9wcy5tZXRyaWNEZXRhaWxzLmFsYXJtU3RhdGlzdGljLFxuICAgICAgICAgICAgZGltZW5zaW9uc01hcDogZGltZW5zaW9ucyxcbiAgICAgICAgICAgIGxhYmVsOiBzdWNjZXNzTWV0cmljLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy5tZXRyaWNEZXRhaWxzLmZhdWx0TWV0cmljTmFtZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcHJvcHMubWV0cmljVHlwZSAhPSBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfQ09VTlRcbiAgICApIHtcbiAgICAgIHByb3BzLm1ldHJpY0RldGFpbHMuZmF1bHRNZXRyaWNOYW1lcy5mb3JFYWNoKChmYXVsdE1ldHJpYykgPT4ge1xuICAgICAgICBsZXQga2V5UHJlZml4ID1cbiAgICAgICAgICAocHJvcHMua2V5UHJlZml4ID09PSB1bmRlZmluZWQgfHwgcHJvcHMua2V5UHJlZml4ID09ICcnXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IHByb3BzLmtleVByZWZpeC50b0xvd2VyQ2FzZSgpICsgJ18nKSArXG4gICAgICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5vcGVyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAgICdfJyArXG4gICAgICAgICAgZmF1bHRNZXRyaWMudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBrZXkgPSBrZXlQcmVmaXggKyAnXycgKyBjb3VudGVyKys7XG4gICAgICAgIGZhdWx0S2V5cy5wdXNoKGtleSk7XG5cbiAgICAgICAgdXNpbmdNZXRyaWNzW2tleV0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgICBuYW1lc3BhY2U6IHByb3BzLm1ldHJpY0RldGFpbHMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgIG1ldHJpY05hbWU6IGZhdWx0TWV0cmljLFxuICAgICAgICAgIHVuaXQ6IHByb3BzLm1ldHJpY0RldGFpbHMudW5pdCxcbiAgICAgICAgICBwZXJpb2Q6IHByb3BzLm1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgICAgIHN0YXRpc3RpYzogcHJvcHMubWV0cmljRGV0YWlscy5hbGFybVN0YXRpc3RpYyxcbiAgICAgICAgICBkaW1lbnNpb25zTWFwOiBkaW1lbnNpb25zLFxuICAgICAgICAgIGxhYmVsOiBmYXVsdE1ldHJpYyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgZXhwcmVzc2lvbjogc3RyaW5nID0gJyc7XG5cbiAgICBzd2l0Y2ggKHByb3BzLm1ldHJpY1R5cGUpIHtcbiAgICAgIGNhc2UgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX1JBVEU6XG4gICAgICAgIGV4cHJlc3Npb24gPSBgKCgke3N1Y2Nlc3NLZXlzLmpvaW4oJysnKX0pIC8gKCR7c3VjY2Vzc0tleXMuam9pbignKycpfSske2ZhdWx0S2V5cy5qb2luKCcrJyl9KSkgKiAxMDBgO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5SRVFVRVNUX0NPVU5UOlxuICAgICAgICBleHByZXNzaW9uID0gYCR7c3VjY2Vzc0tleXMuam9pbignKycpfSske2ZhdWx0S2V5cy5qb2luKCcrJyl9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQ6XG4gICAgICAgIGV4cHJlc3Npb24gPSBgKCR7ZmF1bHRLZXlzLmpvaW4oJysnKX0pYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfUkFURTpcbiAgICAgICAgZXhwcmVzc2lvbiA9IGAoKCR7ZmF1bHRLZXlzLmpvaW4oJysnKX0pIC8gKCR7c3VjY2Vzc0tleXMuam9pbignKycpfSske2ZhdWx0S2V5cy5qb2luKCcrJyl9KSkgKiAxMDBgO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX0NPVU5UOlxuICAgICAgICBleHByZXNzaW9uID0gYCgke3N1Y2Nlc3NLZXlzLmpvaW4oJysnKX0pYDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uLFxuICAgICAgbGFiZWw6IHByb3BzLmxhYmVsLFxuICAgICAgcGVyaW9kOiBwcm9wcy5tZXRyaWNEZXRhaWxzLnBlcmlvZCxcbiAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYWwgcHVycG9zZSBtZXRob2QgdG8gY3JlYXRlIGxhdGVuY3kgbWV0cmljcywgdGhlIHJlYXNvbiB0aGlzIGNyZWF0ZXMgYW4gYXJyYXkgb2YgbWV0cmljcyB3aGlsZSB0aGVcbiAgICogZXF1aXZhbGVudCBhdmFpbGFiaWxpdHkgbWV0cmljIG1ldGhvZCBkb2Vzbid0IGlzIGJlY2F1c2UgaW4gYXZhaWxhYmlsaXR5LCB3ZSBjYW4ganVzdCBzdW0gdGhlIGNvdW50IG9mIGRpZmZlcmVudFxuICAgKiBtZXRyaWMgbmFtZXMgd2hpbGUgZm9yIGxhdGVuY3kgd2UgY2FuJ3Qgc3VtIHRoZSBjb3VudCBiZWNhdXNlIHRoYXQncyBub3Qgd2hhdCdzIGJlaW5nIG1lYXN1cmVkLiBJdCBhbGxvd3MgdGhlXG4gICAqIGNhbGxlciB0byBkZWNpZGUgaWYgdGhleSBvbmx5IHdhbnQgdG8gdGFrZSB0aGUgZmlyc3QgbmFtZSwgb3IgYXZlcmFnZSBhbGwgb2YgdGhlIG5hbWVzXG4gICAqIChsaWtlIFN1Y2Nlc3NMYXRlbmN5IGFuZCBCaWdJdGVtU3VjY2Vzc0xhdGVuY3kpLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHBhcmFtIGRpbWVuc2lvbnNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVMYXRlbmN5TWV0cmljcyhcbiAgICBwcm9wczogTGF0ZW5jeU1ldHJpY1Byb3BzLFxuICAgIGRpbWVuc2lvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICk6IElNZXRyaWNbXSB7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXTtcblxuICAgIHN3aXRjaCAocHJvcHMubWV0cmljVHlwZSkge1xuICAgICAgZGVmYXVsdDpcbiAgICAgIGNhc2UgTGF0ZW5jeU1ldHJpY1R5cGUuU1VDQ0VTU19MQVRFTkNZOlxuICAgICAgICBuYW1lcyA9IHByb3BzLm1ldHJpY0RldGFpbHMuc3VjY2Vzc01ldHJpY05hbWVzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTGF0ZW5jeU1ldHJpY1R5cGUuRkFVTFRfTEFURU5DWTpcbiAgICAgICAgbmFtZXMgPSBwcm9wcy5tZXRyaWNEZXRhaWxzLmZhdWx0TWV0cmljTmFtZXM7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lcy5tYXAoXG4gICAgICAoeCkgPT5cbiAgICAgICAgbmV3IE1ldHJpYyh7XG4gICAgICAgICAgbWV0cmljTmFtZTogeCxcbiAgICAgICAgICBuYW1lc3BhY2U6IHByb3BzLm1ldHJpY0RldGFpbHMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgIHVuaXQ6IHByb3BzLm1ldHJpY0RldGFpbHMudW5pdCxcbiAgICAgICAgICBwZXJpb2Q6IHByb3BzLm1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgICAgIHN0YXRpc3RpYzogcHJvcHMuc3RhdGlzdGljLFxuICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IGRpbWVuc2lvbnMsXG4gICAgICAgICAgbGFiZWw6IHByb3BzLmxhYmVsLFxuICAgICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGFsbCBvZiB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIGxhdGVuY3kgbWV0cmljIG5hbWVzIGFuZCBjcmVhdGVzIGFuIGF2ZXJhZ2Ugb2YgdGhvc2VcbiAgICogbmFtZXMsIGlmIHRoZXJlJ3Mgb25seSAxIG5hbWUsIGl0IGp1c3QgcmV0dXJucyB0aGF0IG1ldHJpY1xuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHBhcmFtIGRpbWVuc2lvbnNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBdmVyYWdlTGF0ZW5jeU1ldHJpYyhcbiAgICBwcm9wczogTGF0ZW5jeU1ldHJpY1Byb3BzLFxuICAgIGRpbWVuc2lvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICk6IElNZXRyaWMge1xuICAgIGxldCBsYXRlbmN5TWV0cmljczogSU1ldHJpY1tdID1cbiAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUxhdGVuY3lNZXRyaWNzKHByb3BzLCBkaW1lbnNpb25zKTtcblxuICAgIGlmIChsYXRlbmN5TWV0cmljcy5sZW5ndGggPT0gMSkge1xuICAgICAgcmV0dXJuIGxhdGVuY3lNZXRyaWNzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdXNpbmdNZXRyaWNzOiB7IFtrZXk6IHN0cmluZ106IElNZXRyaWMgfSA9IHt9O1xuXG4gICAgICBsYXRlbmN5TWV0cmljcy5mb3JFYWNoKChtZXRyaWM6IElNZXRyaWMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgbGV0IGtleVByZWZpeDogc3RyaW5nID1cbiAgICAgICAgICAocHJvcHMua2V5UHJlZml4ID09PSB1bmRlZmluZWQgfHwgcHJvcHMua2V5UHJlZml4ID09ICcnXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IHByb3BzLmtleVByZWZpeC50b0xvd2VyQ2FzZSgpICsgJ18nKSArXG4gICAgICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5vcGVyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAgICdfJyArXG4gICAgICAgICAgcHJvcHMubWV0cmljVHlwZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgdXNpbmdNZXRyaWNzW2tleVByZWZpeCArIGluZGV4XSA9IG1ldHJpYztcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgZXhwcmVzc2lvbjogYCgke09iamVjdC5rZXlzKHVzaW5nTWV0cmljcykuam9pbignKycpfSkvJHtPYmplY3Qua2V5cyh1c2luZ01ldHJpY3MpLmxlbmd0aH1gLFxuICAgICAgICBsYWJlbDogcHJvcHMubGFiZWwsXG4gICAgICAgIHBlcmlvZDogcHJvcHMubWV0cmljRGV0YWlscy5wZXJpb2QsXG4gICAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb3VudCBvZiBoaWdoIGxhdGVuY3kgbWV0cmljcyBmb3IgZWl0aGVyIFN1Y2Nlc3NMYXRlbmN5IG9yIEZhdWx0TGF0ZW5jeSwgd2lsbCB0b3RhbFxuICAgKiB0aGUgY291bnQgb2YgcmVxdWVzdHMgdGhhdCBleGNlZWQgYSB0aHJlc2hvbGQgeW91IGRlZmluZSBpbiB5b3VyIHN0YXRpc3RpYywgbGlrZSBUQygyMDA6KSBhY3Jvc3NcbiAgICogYWxsIG1ldHJpYyBuYW1lcyB0aGF0IGFyZSBwYXJ0IG9mIGVpdGhlciBTdWNjZXNzIG9yIEZhdWx0IGxhdGVuY3kuXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUxhdGVuY3lDb3VudE1ldHJpYyhcbiAgICBwcm9wczogTGF0ZW5jeU1ldHJpY1Byb3BzLFxuICAgIGRpbWVuc2lvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICk6IElNZXRyaWMge1xuICAgIGxldCBsYXRlbmN5TWV0cmljczogSU1ldHJpY1tdID1cbiAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUxhdGVuY3lNZXRyaWNzKHByb3BzLCBkaW1lbnNpb25zKTtcblxuICAgIGlmIChsYXRlbmN5TWV0cmljcy5sZW5ndGggPT0gMSkge1xuICAgICAgcmV0dXJuIGxhdGVuY3lNZXRyaWNzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdXNpbmdNZXRyaWNzOiB7IFtrZXk6IHN0cmluZ106IElNZXRyaWMgfSA9IHt9O1xuXG4gICAgICBsYXRlbmN5TWV0cmljcy5mb3JFYWNoKChtZXRyaWM6IElNZXRyaWMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgbGV0IGtleVByZWZpeDogc3RyaW5nID1cbiAgICAgICAgICAocHJvcHMua2V5UHJlZml4ID09PSB1bmRlZmluZWQgfHwgcHJvcHMua2V5UHJlZml4ID09ICcnXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IHByb3BzLmtleVByZWZpeC50b0xvd2VyQ2FzZSgpICsgJ18nKSArXG4gICAgICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5vcGVyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAgICdfJyArXG4gICAgICAgICAgcHJvcHMubWV0cmljVHlwZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgdXNpbmdNZXRyaWNzW2tleVByZWZpeCArIGluZGV4XSA9IG1ldHJpYztcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IE1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgZXhwcmVzc2lvbjogT2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKCcrJyksXG4gICAgICAgIGxhYmVsOiBwcm9wcy5sYWJlbCxcbiAgICAgICAgcGVyaW9kOiBwcm9wcy5tZXRyaWNEZXRhaWxzLnBlcmlvZCxcbiAgICAgICAgdXNpbmdNZXRyaWNzOiB1c2luZ01ldHJpY3MsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWV0cmljcy9BdmFpbGFiaWxpdHlBbmRMYXRlbmN5TWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBQ3RDLCtEQUE2RTtBQUc3RSxnRkFBNkU7QUFDN0Usc0VBQW1FO0FBSW5FOztHQUVHO0FBQ0gsTUFBYSw2QkFBNkI7SUFFeEM7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsd0JBQXdCLENBQzdCLEtBQThCLEVBQzlCLFVBQXFDO1FBRXJDLElBQUksWUFBWSxHQUErQixFQUFFLENBQUM7UUFFbEQsSUFBSSxXQUFXLEdBQWEsRUFBRSxDQUFDO1FBQy9CLElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUU3QixJQUNFLEtBQUssQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEtBQUssU0FBUztZQUNwRCxLQUFLLENBQUMsVUFBVSxJQUFJLCtDQUFzQixDQUFDLFdBQVcsRUFDdEQsQ0FBQztZQUNELEtBQUssQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBcUIsRUFBRSxFQUFFO2dCQUNyRSxJQUFJLEdBQUcsR0FBVyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBRW5KLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRXRCLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLHVCQUFNLENBQUM7b0JBQzdCLFNBQVMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLGVBQWU7b0JBQzlDLFVBQVUsRUFBRSxhQUFhO29CQUN6QixJQUFJLEVB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SSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQy9DLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTTtnQkFDbEMsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSzthQUNuQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBeFZELHNFQXdWQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbmltcG9ydCB7IElNZXRyaWMsIE1ldHJpYywgTWF0aEV4cHJlc3Npb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBBdmFpbGFiaWxpdHlNZXRyaWNQcm9wcyB9IGZyb20gJy4vcHJvcHMvQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMnO1xuaW1wb3J0IHsgTGF0ZW5jeU1ldHJpY1Byb3BzIH0gZnJvbSAnLi9wcm9wcy9MYXRlbmN5TWV0cmljUHJvcHMnO1xuaW1wb3J0IHsgQXZhaWxhYmlsaXR5TWV0cmljVHlwZSB9IGZyb20gJy4uL3V0aWxpdGllcy9BdmFpbGFiaWxpdHlNZXRyaWNUeXBlJztcbmltcG9ydCB7IExhdGVuY3lNZXRyaWNUeXBlIH0gZnJvbSAnLi4vdXRpbGl0aWVzL0xhdGVuY3lNZXRyaWNUeXBlJztcbmltcG9ydCB7IFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMgfSBmcm9tICcuL3Byb3BzL1pvbmFsQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMnO1xuaW1wb3J0IHsgWm9uYWxMYXRlbmN5TWV0cmljUHJvcHMgfSBmcm9tICcuL3Byb3BzL1pvbmFsTGF0ZW5jeU1ldHJpY1Byb3BzJztcblxuLyoqXG4gKiBDbGFzcyBmb3IgY3JlYXRpbmcgYXZhaWxhYmlsaXR5IGFuZCBsYXRlbmN5IG1ldHJpY3MgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbGFybXMgYW5kIGdyYXBoc1xuICovXG5leHBvcnQgY2xhc3MgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3Mge1xuXG4gIC8qKlxuICAgKiBHZW5lcmFsIHB1cnBvc2UgbWV0aG9kIHRvIGNyZWF0ZSBhdmFpbGFiaWxpdHkgbWV0cmljc1xuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHBhcmFtIGRpbWVuc2lvbnNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBdmFpbGFiaWxpdHlNZXRyaWMoXG4gICAgcHJvcHM6IEF2YWlsYWJpbGl0eU1ldHJpY1Byb3BzLFxuICAgIGRpbWVuc2lvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICk6IElNZXRyaWMge1xuICAgIGxldCB1c2luZ01ldHJpY3M6IHsgW2tleTogc3RyaW5nXTogSU1ldHJpYyB9ID0ge307XG5cbiAgICBsZXQgc3VjY2Vzc0tleXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGZhdWx0S2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChcbiAgICAgIHByb3BzLm1ldHJpY0RldGFpbHMuc3VjY2Vzc01ldHJpY05hbWVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHByb3BzLm1ldHJpY1R5cGUgIT0gQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5GQVVMVF9DT1VOVFxuICAgICkge1xuICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5zdWNjZXNzTWV0cmljTmFtZXMuZm9yRWFjaCgoc3VjY2Vzc01ldHJpYzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgbGV0IGtleTogc3RyaW5nID0gYCR7cHJvcHMubWV0cmljRGV0YWlscy5vcGVyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCl9XyR7cHJvcHMubWV0cmljVHlwZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCl9XyR7c3VjY2Vzc01ldHJpYy50b0xvd2VyQ2FzZSgpfWA7XG5cbiAgICAgICAgICBzdWNjZXNzS2V5cy5wdXNoKGtleSk7XG5cbiAgICAgICAgICB1c2luZ01ldHJpY3Nba2V5XSA9IG5ldyBNZXRyaWMoe1xuICAgICAgICAgICAgbmFtZXNwYWNlOiBwcm9wcy5tZXRyaWNEZXRhaWxzLm1ldHJpY05hbWVzcGFjZSxcbiAgICAgICAgICAgIG1ldHJpY05hbWU6IHN1Y2Nlc3NNZXRyaWMsXG4gICAgICAgICAgICB1bml0OiBwcm9wcy5tZXRyaWNEZXRhaWxzLnVuaXQsXG4gICAgICAgICAgICBwZXJpb2Q6IHByb3BzLm1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgICAgICAgc3RhdGlzdGljOiBwcm9wcy5tZXRyaWNEZXRhaWxzLmFsYXJtU3RhdGlzdGljLFxuICAgICAgICAgICAgZGltZW5zaW9uc01hcDogZGltZW5zaW9ucyxcbiAgICAgICAgICAgIGxhYmVsOiBzdWNjZXNzTWV0cmljLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy5tZXRyaWNEZXRhaWxzLmZhdWx0TWV0cmljTmFtZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcHJvcHMubWV0cmljVHlwZSAhPSBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfQ09VTlRcbiAgICApIHtcbiAgICAgIHByb3BzLm1ldHJpY0RldGFpbHMuZmF1bHRNZXRyaWNOYW1lcy5mb3JFYWNoKChmYXVsdE1ldHJpYykgPT4ge1xuICAgICAgICBsZXQga2V5OiBzdHJpbmcgPSBgJHtwcm9wcy5tZXRyaWNEZXRhaWxzLm9wZXJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKX1fJHtwcm9wcy5tZXRyaWNUeXBlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKX1fJHtmYXVsdE1ldHJpYy50b0xvd2VyQ2FzZSgpfWA7XG5cbiAgICAgICAgZmF1bHRLZXlzLnB1c2goa2V5KTtcblxuICAgICAgICB1c2luZ01ldHJpY3Nba2V5XSA9IG5ldyBNZXRyaWMoe1xuICAgICAgICAgIG5hbWVzcGFjZTogcHJvcHMubWV0cmljRGV0YWlscy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgbWV0cmljTmFtZTogZmF1bHRNZXRyaWMsXG4gICAgICAgICAgdW5pdDogcHJvcHMubWV0cmljRGV0YWlscy51bml0LFxuICAgICAgICAgIHBlcmlvZDogcHJvcHMubWV0cmljRGV0YWlscy5wZXJpb2QsXG4gICAgICAgICAgc3RhdGlzdGljOiBwcm9wcy5tZXRyaWNEZXRhaWxzLmFsYXJtU3RhdGlzdGljLFxuICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IGRpbWVuc2lvbnMsXG4gICAgICAgICAgbGFiZWw6IGZhdWx0TWV0cmljLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBleHByZXNzaW9uOiBzdHJpbmcgPSAnJztcblxuICAgIHN3aXRjaCAocHJvcHMubWV0cmljVHlwZSkge1xuICAgICAgY2FzZSBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURTpcbiAgICAgICAgZXhwcmVzc2lvbiA9IGAoKCR7c3VjY2Vzc0tleXMuam9pbignKycpfSkgLyAoJHtzdWNjZXNzS2V5cy5qb2luKCcrJyl9KyR7ZmF1bHRLZXlzLmpvaW4oJysnKX0pKSAqIDEwMCArIFRJTUVfU0VSSUVTKDApYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuUkVRVUVTVF9DT1VOVDpcbiAgICAgICAgZXhwcmVzc2lvbiA9IGAke3N1Y2Nlc3NLZXlzLmpvaW4oJysnKX0rJHtmYXVsdEtleXMuam9pbignKycpfSArIFRJTUVfU0VSSUVTKDApYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQ6XG4gICAgICAgIGV4cHJlc3Npb24gPSBgKCR7ZmF1bHRLZXlzLmpvaW4oJysnKX0pICsgVElNRV9TRVJJRVMoMClgO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5GQVVMVF9SQVRFOlxuICAgICAgICBleHByZXNzaW9uID0gYCgoJHtmYXVsdEtleXMuam9pbignKycpfSkgLyAoJHtzdWNjZXNzS2V5cy5qb2luKCcrJyl9KyR7ZmF1bHRLZXlzLmpvaW4oJysnKX0pKSAqIDEwMCArIFRJTUVfU0VSSUVTKDApYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuU1VDQ0VTU19DT1VOVDpcbiAgICAgICAgZXhwcmVzc2lvbiA9IGAoJHtzdWNjZXNzS2V5cy5qb2luKCcrJyl9KSArIFRJTUVfU0VSSUVTKDApYDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uLFxuICAgICAgbGFiZWw6IHByb3BzLmxhYmVsLFxuICAgICAgcGVyaW9kOiBwcm9wcy5tZXRyaWNEZXRhaWxzLnBlcmlvZCxcbiAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgY29sb3I6IHByb3BzLmNvbG9yXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIENyZWF0ZXMgYXZhaWxhYmlsaXR5IG1ldHJpY3MgZm9yIGEgc3BlY2lmaWMgQVpcbiAgICogQHBhcmFtIHByb3BzIFxuICAgKiBAcGFyYW0gZGltZW5zaW9ucyBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlWm9uYWxBdmFpbGFiaWxpdHlNZXRyaWMoXG4gICAgcHJvcHM6IFpvbmFsQXZhaWxhYmlsaXR5TWV0cmljUHJvcHMsXG4gICAgZGltZW5zaW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgKTogSU1ldHJpYyB7XG4gICAgbGV0IHVzaW5nTWV0cmljczogeyBba2V5OiBzdHJpbmddOiBJTWV0cmljIH0gPSB7fTtcblxuICAgIGxldCBzdWNjZXNzS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgZmF1bHRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5zdWNjZXNzTWV0cmljTmFtZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcHJvcHMubWV0cmljVHlwZSAhPSBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLkZBVUxUX0NPVU5UXG4gICAgKSB7XG4gICAgICBwcm9wcy5tZXRyaWNEZXRhaWxzLnN1Y2Nlc3NNZXRyaWNOYW1lcy5mb3JFYWNoKChzdWNjZXNzTWV0cmljOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBsZXQga2V5OiBzdHJpbmcgPSBgJHtwcm9wcy5hdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhwcm9wcy5hdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpfV8ke3Byb3BzLm1ldHJpY0RldGFpbHMub3BlcmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpfV8ke3Byb3BzLm1ldHJpY1R5cGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpfV8ke3N1Y2Nlc3NNZXRyaWMudG9Mb3dlckNhc2UoKX1gO1xuXG4gICAgICAgICAgc3VjY2Vzc0tleXMucHVzaChrZXkpO1xuXG4gICAgICAgICAgdXNpbmdNZXRyaWNzW2tleV0gPSBuZXcgTWV0cmljKHtcbiAgICAgICAgICAgIG5hbWVzcGFjZTogcHJvcHMubWV0cmljRGV0YWlscy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgICBtZXRyaWNOYW1lOiBzdWNjZXNzTWV0cmljLFxuICAgICAgICAgICAgdW5pdDogcHJvcHMubWV0cmljRGV0YWlscy51bml0LFxuICAgICAgICAgICAgcGVyaW9kOiBwcm9wcy5tZXRyaWNEZXRhaWxzLnBlcmlvZCxcbiAgICAgICAgICAgIHN0YXRpc3RpYzogcHJvcHMubWV0cmljRGV0YWlscy5hbGFybVN0YXRpc3RpYyxcbiAgICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IGRpbWVuc2lvbnMsXG4gICAgICAgICAgICBsYWJlbDogc3VjY2Vzc01ldHJpYyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcHJvcHMubWV0cmljRGV0YWlscy5mYXVsdE1ldHJpY05hbWVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHByb3BzLm1ldHJpY1R5cGUgIT0gQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5TVUNDRVNTX0NPVU5UXG4gICAgKSB7XG4gICAgICBwcm9wcy5tZXRyaWNEZXRhaWxzLmZhdWx0TWV0cmljTmFtZXMuZm9yRWFjaCgoZmF1bHRNZXRyaWMpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nID0gYCR7cHJvcHMuYXZhaWxhYmlsaXR5Wm9uZS5zdWJzdHJpbmcocHJvcHMuYXZhaWxhYmlsaXR5Wm9uZS5sZW5ndGggLSAxKX1fJHtwcm9wcy5tZXRyaWNEZXRhaWxzLm9wZXJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKX1fJHtwcm9wcy5tZXRyaWNUeXBlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKX1fJHtmYXVsdE1ldHJpYy50b0xvd2VyQ2FzZSgpfWA7XG5cbiAgICAgICAgZmF1bHRLZXlzLnB1c2goa2V5KTtcblxuICAgICAgICB1c2luZ01ldHJpY3Nba2V5XSA9IG5ldyBNZXRyaWMoe1xuICAgICAgICAgIG5hbWVzcGFjZTogcHJvcHMubWV0cmljRGV0YWlscy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICAgICAgbWV0cmljTmFtZTogZmF1bHRNZXRyaWMsXG4gICAgICAgICAgdW5pdDogcHJvcHMubWV0cmljRGV0YWlscy51bml0LFxuICAgICAgICAgIHBlcmlvZDogcHJvcHMubWV0cmljRGV0YWlscy5wZXJpb2QsXG4gICAgICAgICAgc3RhdGlzdGljOiBwcm9wcy5tZXRyaWNEZXRhaWxzLmFsYXJtU3RhdGlzdGljLFxuICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IGRpbWVuc2lvbnMsXG4gICAgICAgICAgbGFiZWw6IGZhdWx0TWV0cmljLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBleHByZXNzaW9uOiBzdHJpbmcgPSAnJztcblxuICAgIHN3aXRjaCAocHJvcHMubWV0cmljVHlwZSkge1xuICAgICAgY2FzZSBBdmFpbGFiaWxpdHlNZXRyaWNUeXBlLlNVQ0NFU1NfUkFURTpcbiAgICAgICAgZXhwcmVzc2lvbiA9IGAoKCR7c3VjY2Vzc0tleXMuam9pbignKycpfSkgLyAoJHtzdWNjZXNzS2V5cy5qb2luKCcrJyl9KyR7ZmF1bHRLZXlzLmpvaW4oJysnKX0pKSAqIDEwMCArIFRJTUVfU0VSSUVTKDApYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuUkVRVUVTVF9DT1VOVDpcbiAgICAgICAgZXhwcmVzc2lvbiA9IGAke3N1Y2Nlc3NLZXlzLmpvaW4oJysnKX0rJHtmYXVsdEtleXMuam9pbignKycpfSArIFRJTUVfU0VSSUVTKDApYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuRkFVTFRfQ09VTlQ6XG4gICAgICAgIGV4cHJlc3Npb24gPSBgKCR7ZmF1bHRLZXlzLmpvaW4oJysnKX0pICsgVElNRV9TRVJJRVMoMClgO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQXZhaWxhYmlsaXR5TWV0cmljVHlwZS5GQVVMVF9SQVRFOlxuICAgICAgICBleHByZXNzaW9uID0gYCgoJHtmYXVsdEtleXMuam9pbignKycpfSkgLyAoJHtzdWNjZXNzS2V5cy5qb2luKCcrJyl9KyR7ZmF1bHRLZXlzLmpvaW4oJysnKX0pKSAqIDEwMCArIFRJTUVfU0VSSUVTKDApYDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF2YWlsYWJpbGl0eU1ldHJpY1R5cGUuU1VDQ0VTU19DT1VOVDpcbiAgICAgICAgZXhwcmVzc2lvbiA9IGAoJHtzdWNjZXNzS2V5cy5qb2luKCcrJyl9KSArIFRJTUVfU0VSSUVTKDApYDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uLFxuICAgICAgbGFiZWw6IHByb3BzLmxhYmVsLFxuICAgICAgcGVyaW9kOiBwcm9wcy5tZXRyaWNEZXRhaWxzLnBlcmlvZCxcbiAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgY29sb3I6IHByb3BzLmNvbG9yXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbCBwdXJwb3NlIG1ldGhvZCB0byBjcmVhdGUgbGF0ZW5jeSBtZXRyaWNzLCB0aGUgcmVhc29uIHRoaXMgY3JlYXRlcyBhbiBhcnJheSBvZiBtZXRyaWNzIHdoaWxlIHRoZVxuICAgKiBlcXVpdmFsZW50IGF2YWlsYWJpbGl0eSBtZXRyaWMgbWV0aG9kIGRvZXNuJ3QgaXMgYmVjYXVzZSBpbiBhdmFpbGFiaWxpdHksIHdlIGNhbiBqdXN0IHN1bSB0aGUgY291bnQgb2YgZGlmZmVyZW50XG4gICAqIG1ldHJpYyBuYW1lcyB3aGlsZSBmb3IgbGF0ZW5jeSB3ZSBjYW4ndCBzdW0gdGhlIGNvdW50IGJlY2F1c2UgdGhhdCdzIG5vdCB3aGF0J3MgYmVpbmcgbWVhc3VyZWQuIEl0IGFsbG93cyB0aGVcbiAgICogY2FsbGVyIHRvIGRlY2lkZSBpZiB0aGV5IG9ubHkgd2FudCB0byB0YWtlIHRoZSBmaXJzdCBuYW1lLCBvciBhdmVyYWdlIGFsbCBvZiB0aGUgbmFtZXNcbiAgICogKGxpa2UgU3VjY2Vzc0xhdGVuY3kgYW5kIEJpZ0l0ZW1TdWNjZXNzTGF0ZW5jeSkuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKiBAcGFyYW0gZGltZW5zaW9uc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUxhdGVuY3lNZXRyaWNzKFxuICAgIHByb3BzOiBMYXRlbmN5TWV0cmljUHJvcHMsXG4gICAgZGltZW5zaW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgKTogSU1ldHJpY1tdIHtcbiAgICBsZXQgbmFtZXM6IHN0cmluZ1tdO1xuXG4gICAgc3dpdGNoIChwcm9wcy5tZXRyaWNUeXBlKSB7XG4gICAgICBkZWZhdWx0OlxuICAgICAgY2FzZSBMYXRlbmN5TWV0cmljVHlwZS5TVUNDRVNTX0xBVEVOQ1k6XG4gICAgICAgIG5hbWVzID0gcHJvcHMubWV0cmljRGV0YWlscy5zdWNjZXNzTWV0cmljTmFtZXM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMYXRlbmN5TWV0cmljVHlwZS5GQVVMVF9MQVRFTkNZOlxuICAgICAgICBuYW1lcyA9IHByb3BzLm1ldHJpY0RldGFpbHMuZmF1bHRNZXRyaWNOYW1lcztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWVzLm1hcChcbiAgICAgIChtZXRyaWNOYW1lOiBzdHJpbmcpID0+XG4gICAgICAgIG5ldyBNZXRyaWMoe1xuICAgICAgICAgIG1ldHJpY05hbWU6IG1ldHJpY05hbWUsXG4gICAgICAgICAgbmFtZXNwYWNlOiBwcm9wcy5tZXRyaWNEZXRhaWxzLm1ldHJpY05hbWVzcGFjZSxcbiAgICAgICAgICB1bml0OiBwcm9wcy5tZXRyaWNEZXRhaWxzLnVuaXQsXG4gICAgICAgICAgcGVyaW9kOiBwcm9wcy5tZXRyaWNEZXRhaWxzLnBlcmlvZCxcbiAgICAgICAgICBzdGF0aXN0aWM6IHByb3BzLnN0YXRpc3RpYyxcbiAgICAgICAgICBkaW1lbnNpb25zTWFwOiBkaW1lbnNpb25zLFxuICAgICAgICAgIGxhYmVsOiBwcm9wcy5sYWJlbCxcbiAgICAgICAgICBjb2xvcjogcHJvcHMuY29sb3JcbiAgICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbGF0ZW5jeSBtZXRyaWMgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZVxuICAgKiBAcGFyYW0gcHJvcHMgXG4gICAqIEBwYXJhbSBkaW1lbnNpb25zIFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVMYXRlbmN5TWV0cmljKFxuICAgIHByb3BzOiBMYXRlbmN5TWV0cmljUHJvcHMsXG4gICAgZGltZW5zaW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVxuICApOiBJTWV0cmljIHtcbiAgICBpZiAoIShwcm9wcy5tZXRyaWNOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgcHJvdmlkZSBhIG1ldHJpYyBuYW1lLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lOiBwcm9wcy5tZXRyaWNOYW1lISxcbiAgICAgIG5hbWVzcGFjZTogcHJvcHMubWV0cmljRGV0YWlscy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICB1bml0OiBwcm9wcy5tZXRyaWNEZXRhaWxzLnVuaXQsXG4gICAgICBwZXJpb2Q6IHByb3BzLm1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgc3RhdGlzdGljOiBwcm9wcy5zdGF0aXN0aWMsXG4gICAgICBkaW1lbnNpb25zTWFwOiBkaW1lbnNpb25zLFxuICAgICAgbGFiZWw6IHByb3BzLmxhYmVsLFxuICAgICAgY29sb3I6IHByb3BzLmNvbG9yXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYWxsIG9mIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgbGF0ZW5jeSBtZXRyaWMgbmFtZXMgYW5kIGNyZWF0ZXMgYW4gYXZlcmFnZSBvZiB0aG9zZVxuICAgKiBuYW1lcywgaWYgdGhlcmUncyBvbmx5IDEgbmFtZSwgaXQganVzdCByZXR1cm5zIHRoYXQgbWV0cmljXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKiBAcGFyYW0gZGltZW5zaW9uc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUF2ZXJhZ2VMYXRlbmN5TWV0cmljKFxuICAgIHByb3BzOiBMYXRlbmN5TWV0cmljUHJvcHMsXG4gICAgZGltZW5zaW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgKTogSU1ldHJpYyB7XG4gICAgbGV0IGxhdGVuY3lNZXRyaWNzOiBJTWV0cmljW10gPVxuICAgICAgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlTGF0ZW5jeU1ldHJpY3MocHJvcHMsIGRpbWVuc2lvbnMpO1xuXG4gICAgaWYgKGxhdGVuY3lNZXRyaWNzLmxlbmd0aCA9PSAxKSB7XG4gICAgICByZXR1cm4gbGF0ZW5jeU1ldHJpY3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB1c2luZ01ldHJpY3M6IHsgW2tleTogc3RyaW5nXTogSU1ldHJpYyB9ID0ge307XG5cbiAgICAgIGxhdGVuY3lNZXRyaWNzLmZvckVhY2goKG1ldHJpYzogSU1ldHJpYywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBsZXQga2V5UHJlZml4OiBzdHJpbmcgPVxuICAgICAgICAgIChwcm9wcy5rZXlQcmVmaXggPT09IHVuZGVmaW5lZCB8fCBwcm9wcy5rZXlQcmVmaXggPT0gJydcbiAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgIDogcHJvcHMua2V5UHJlZml4LnRvTG93ZXJDYXNlKCkgKyAnXycpICtcbiAgICAgICAgICBwcm9wcy5tZXRyaWNEZXRhaWxzLm9wZXJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKSArXG4gICAgICAgICAgJ18nICtcbiAgICAgICAgICBwcm9wcy5tZXRyaWNUeXBlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICB1c2luZ01ldHJpY3Nba2V5UHJlZml4ICsgaW5kZXhdID0gbWV0cmljO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICBleHByZXNzaW9uOiBgKCR7T2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKCcrJyl9KS8ke09iamVjdC5rZXlzKHVzaW5nTWV0cmljcykubGVuZ3RofWAsXG4gICAgICAgIGxhYmVsOiBwcm9wcy5sYWJlbCxcbiAgICAgICAgcGVyaW9kOiBwcm9wcy5tZXRyaWNEZXRhaWxzLnBlcmlvZCxcbiAgICAgICAgdXNpbmdNZXRyaWNzOiB1c2luZ01ldHJpY3MsXG4gICAgICAgIGNvbG9yOiBwcm9wcy5jb2xvclxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb3VudCBvZiBoaWdoIGxhdGVuY3kgbWV0cmljcyBmb3IgZWl0aGVyIFN1Y2Nlc3NMYXRlbmN5IG9yIEZhdWx0TGF0ZW5jeSwgd2lsbCB0b3RhbFxuICAgKiB0aGUgY291bnQgb2YgcmVxdWVzdHMgdGhhdCBleGNlZWQgYSB0aHJlc2hvbGQgeW91IGRlZmluZSBpbiB5b3VyIHN0YXRpc3RpYywgbGlrZSBUQygyMDA6KSBhY3Jvc3NcbiAgICogYWxsIG1ldHJpYyBuYW1lcyB0aGF0IGFyZSBwYXJ0IG9mIGVpdGhlciBTdWNjZXNzIG9yIEZhdWx0IGxhdGVuY3kuXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUxhdGVuY3lDb3VudE1ldHJpYyhcbiAgICBwcm9wczogTGF0ZW5jeU1ldHJpY1Byb3BzLFxuICAgIGRpbWVuc2lvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICk6IElNZXRyaWMge1xuICAgIGxldCBsYXRlbmN5TWV0cmljczogSU1ldHJpY1tdID1cbiAgICAgIEF2YWlsYWJpbGl0eUFuZExhdGVuY3lNZXRyaWNzLmNyZWF0ZUxhdGVuY3lNZXRyaWNzKHByb3BzLCBkaW1lbnNpb25zKTtcblxuICAgIGlmIChsYXRlbmN5TWV0cmljcy5sZW5ndGggPT0gMSkge1xuICAgICAgcmV0dXJuIGxhdGVuY3lNZXRyaWNzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdXNpbmdNZXRyaWNzOiB7IFtrZXk6IHN0cmluZ106IElNZXRyaWMgfSA9IHt9O1xuXG4gICAgICBsYXRlbmN5TWV0cmljcy5mb3JFYWNoKChtZXRyaWM6IElNZXRyaWMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nID0gYCR7cHJvcHMubWV0cmljRGV0YWlscy5vcGVyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCl9XyR7cHJvcHMubWV0cmljVHlwZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCl9XyR7aW5kZXh9YDtcbiAgICAgICAgdXNpbmdNZXRyaWNzW2tleV0gPSBtZXRyaWM7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG5ldyBNYXRoRXhwcmVzc2lvbih7XG4gICAgICAgIGV4cHJlc3Npb246IE9iamVjdC5rZXlzKHVzaW5nTWV0cmljcykuam9pbignKycpLFxuICAgICAgICBsYWJlbDogcHJvcHMubGFiZWwsXG4gICAgICAgIHBlcmlvZDogcHJvcHMubWV0cmljRGV0YWlscy5wZXJpb2QsXG4gICAgICAgIHVzaW5nTWV0cmljczogdXNpbmdNZXRyaWNzLFxuICAgICAgICBjb2xvcjogcHJvcHMuY29sb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVab25hbExhdGVuY3lDb3VudE1ldHJpYyhcbiAgICBwcm9wczogWm9uYWxMYXRlbmN5TWV0cmljUHJvcHMsXG4gICAgZGltZW5zaW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgKTogSU1ldHJpYyB7XG4gICAgbGV0IGxhdGVuY3lNZXRyaWNzOiBJTWV0cmljW10gPVxuICAgICAgQXZhaWxhYmlsaXR5QW5kTGF0ZW5jeU1ldHJpY3MuY3JlYXRlTGF0ZW5jeU1ldHJpY3MocHJvcHMsIGRpbWVuc2lvbnMpO1xuXG4gICAgaWYgKGxhdGVuY3lNZXRyaWNzLmxlbmd0aCA9PSAxKSB7XG4gICAgICByZXR1cm4gbGF0ZW5jeU1ldHJpY3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB1c2luZ01ldHJpY3M6IHsgW2tleTogc3RyaW5nXTogSU1ldHJpYyB9ID0ge307XG5cbiAgICAgIGxhdGVuY3lNZXRyaWNzLmZvckVhY2goKG1ldHJpYzogSU1ldHJpYywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBsZXQga2V5OiBzdHJpbmcgPSBgJHtwcm9wcy5hdmFpbGFiaWxpdHlab25lLnN1YnN0cmluZyhwcm9wcy5hdmFpbGFiaWxpdHlab25lLmxlbmd0aCAtIDEpfV8ke3Byb3BzLm1ldHJpY0RldGFpbHMub3BlcmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpfV8ke3Byb3BzLm1ldHJpY1R5cGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpfV8ke2luZGV4fWA7XG4gICAgICAgIHVzaW5nTWV0cmljc1trZXldID0gbWV0cmljO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICBleHByZXNzaW9uOiBPYmplY3Qua2V5cyh1c2luZ01ldHJpY3MpLmpvaW4oJysnKSxcbiAgICAgICAgbGFiZWw6IHByb3BzLmxhYmVsLFxuICAgICAgICBwZXJpb2Q6IHByb3BzLm1ldHJpY0RldGFpbHMucGVyaW9kLFxuICAgICAgICB1c2luZ01ldHJpY3M6IHVzaW5nTWV0cmljcyxcbiAgICAgICAgY29sb3I6IHByb3BzLmNvbG9yXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,113 @@
1
+ import { CfnNatGateway } from "aws-cdk-lib/aws-ec2";
2
+ import { IAlarm, IMetric, IWidget } from "aws-cdk-lib/aws-cloudwatch";
3
+ import { Duration } from "aws-cdk-lib";
4
+ import { IConstruct } from "constructs";
5
+ import { IAvailabilityZoneMapper } from "../azmapper/IAvailabilityZoneMapper";
6
+ import { PacketLossOutlierAlgorithm } from "../outlier-detection/PacketLossOutlierAlgorithm";
7
+ /**
8
+ * Provides functions for getting CloudWatch metrics and alarms for NAT Gateways.
9
+ */
10
+ export declare class NatGatewayMetrics {
11
+ /**
12
+ * Gets the count of packet drops for all NAT Gateways that belong to the provided AZ
13
+ * @param natgws
14
+ * @param availabilityZoneId
15
+ * @param period
16
+ * @returns
17
+ */
18
+ static getDroppedPacketCountMetricForAZ(natgws: CfnNatGateway[], availabilityZoneId: string, period: Duration, prefix?: string, color?: string): IMetric;
19
+ /**
20
+ * Get the packet drop rate for all NAT Gateways that belong to the provided AZ
21
+ * @param natgws
22
+ * @param availabilityZoneId
23
+ * @param period
24
+ * @returns Percent of packet drops like 52%
25
+ */
26
+ static getDroppedPacketRateMetricForAZ(natgws: CfnNatGateway[], availabilityZoneId: string, period: Duration, prefix?: string, color?: string): IMetric;
27
+ /**
28
+ * Get the packet count for all NAT Gateways that belong to the provided AZ
29
+ * @param natgws
30
+ * @param availabilityZoneId
31
+ * @param period
32
+ * @returns
33
+ */
34
+ static getTotalPacketCountMetricForAZ(natgws: CfnNatGateway[], availabilityZoneId: string, period: Duration, prefix?: string, color?: string): IMetric;
35
+ /**
36
+ * Returns an alarm indicating if the quantity of packet drops in a single AZ across all NAT Gateways in that
37
+ * AZ exceeds a threshold compared to all packet loss across all AZs.
38
+ *
39
+ * For example:
40
+ *
41
+ * A = 150 packets
42
+ * B = 175 packets
43
+ * C = 160 packets
44
+ *
45
+ * And the selected AZ is "A", then the calculation is 150 / (150 + 175 + 160).
46
+ *
47
+ * @param scope
48
+ * @param natgws
49
+ * @param availabilityZoneId
50
+ * @param availabilityZone
51
+ * @param threshold
52
+ * @param period
53
+ * @param evaluationPeriods
54
+ * @param datapointsToAlarm
55
+ * @returns
56
+ */
57
+ static isAZAnOutlierForPacketLossNATGW(scope: IConstruct, natgws: {
58
+ [key: string]: CfnNatGateway[];
59
+ }, algorithm: PacketLossOutlierAlgorithm, availabilityZone: string, azMapper: IAvailabilityZoneMapper, threshold: number, period: Duration, evaluationPeriods: number, datapointsToAlarm: number): IAlarm;
60
+ /**
61
+ * Creates an alarm to determine is the packet loss rate in a single AZ across all NAT Gateways provided
62
+ * for that AZ exceed the provided threshold.
63
+ * @param scope
64
+ * @param natgws
65
+ * @param availabilityZoneId
66
+ * @param availabilityZone
67
+ * @param threshold
68
+ * @param period
69
+ * @param evaluationPeriods
70
+ * @param datapointsToAlarm
71
+ * @returns
72
+ */
73
+ static isThereAnAZPacketLossImpactNATGW(scope: IConstruct, natgws: CfnNatGateway[], availabilityZoneId: string, availabilityZone: string, threshold: number, period: Duration, evaluationPeriods: number, datapointsToAlarm: number): IAlarm;
74
+ /**
75
+ * Gets the count of all packets from all NAT Gateways in each provided Availability Zone.
76
+ * @param natgws
77
+ * @param azMapper
78
+ * @param period
79
+ * @returns
80
+ */
81
+ static getTotalPacketCountForEveryAZ(natgws: {
82
+ [key: string]: CfnNatGateway[];
83
+ }, azMapper: IAvailabilityZoneMapper, period: Duration): {
84
+ [key: string]: IMetric;
85
+ };
86
+ /**
87
+ * Gets the count of packet drops from all NAT Gateways in each provided Availability Zone.
88
+ * @param natgws
89
+ * @param azMapper
90
+ * @param period
91
+ * @returns
92
+ */
93
+ static getTotalPacketDropsForEveryAZ(natgws: {
94
+ [key: string]: CfnNatGateway[];
95
+ }, azMapper: IAvailabilityZoneMapper, period: Duration): {
96
+ [key: string]: IMetric;
97
+ };
98
+ /**
99
+ * Gets the packet drop rate from all NAT Gateways in each provided Availability Zone.
100
+ * @param natgws
101
+ * @param azMapper
102
+ * @param period
103
+ * @returns
104
+ */
105
+ static getTotalPacketDropRateForEveryAZ(natgws: {
106
+ [key: string]: CfnNatGateway[];
107
+ }, azMapper: IAvailabilityZoneMapper, period: Duration): {
108
+ [key: string]: IMetric;
109
+ };
110
+ static generateNatGatewayWidgets(natgws: {
111
+ [key: string]: CfnNatGateway[];
112
+ }, azMapper: IAvailabilityZoneMapper, period: Duration, packetDropRateThreshold: number): IWidget[];
113
+ }