@cdktn/provider-newrelic 14.0.0

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 (154) hide show
  1. package/.jsii +198156 -0
  2. package/LICENSE +355 -0
  3. package/README.md +94 -0
  4. package/lib/account-management/index.d.ts +122 -0
  5. package/lib/account-management/index.js +293 -0
  6. package/lib/alert-channel/index.d.ts +351 -0
  7. package/lib/alert-channel/index.js +769 -0
  8. package/lib/alert-compound-condition/index.d.ts +233 -0
  9. package/lib/alert-compound-condition/index.js +506 -0
  10. package/lib/alert-condition/index.d.ts +271 -0
  11. package/lib/alert-condition/index.js +558 -0
  12. package/lib/alert-muting-rule/index.d.ts +309 -0
  13. package/lib/alert-muting-rule/index.js +714 -0
  14. package/lib/alert-policy/index.d.ts +91 -0
  15. package/lib/alert-policy/index.js +174 -0
  16. package/lib/alert-policy-channel/index.d.ts +114 -0
  17. package/lib/alert-policy-channel/index.js +258 -0
  18. package/lib/api-access-key/index.d.ts +102 -0
  19. package/lib/api-access-key/index.js +220 -0
  20. package/lib/application-settings/index.d.ts +414 -0
  21. package/lib/application-settings/index.js +944 -0
  22. package/lib/browser-application/index.d.ts +149 -0
  23. package/lib/browser-application/index.js +341 -0
  24. package/lib/cloud-aws-eu-sovereign-integrations/index.d.ts +199 -0
  25. package/lib/cloud-aws-eu-sovereign-integrations/index.js +481 -0
  26. package/lib/cloud-aws-eu-sovereign-link-account/index.d.ts +90 -0
  27. package/lib/cloud-aws-eu-sovereign-link-account/index.js +171 -0
  28. package/lib/cloud-aws-govcloud-integrations/index.d.ts +1523 -0
  29. package/lib/cloud-aws-govcloud-integrations/index.js +3776 -0
  30. package/lib/cloud-aws-govcloud-link-account/index.d.ts +90 -0
  31. package/lib/cloud-aws-govcloud-link-account/index.js +171 -0
  32. package/lib/cloud-aws-integrations/index.d.ts +3345 -0
  33. package/lib/cloud-aws-integrations/index.js +8599 -0
  34. package/lib/cloud-aws-link-account/index.d.ts +90 -0
  35. package/lib/cloud-aws-link-account/index.js +171 -0
  36. package/lib/cloud-azure-integrations/index.d.ts +1666 -0
  37. package/lib/cloud-azure-integrations/index.js +4361 -0
  38. package/lib/cloud-azure-link-account/index.d.ts +109 -0
  39. package/lib/cloud-azure-link-account/index.js +204 -0
  40. package/lib/cloud-gcp-integrations/index.d.ts +1049 -0
  41. package/lib/cloud-gcp-integrations/index.js +2810 -0
  42. package/lib/cloud-gcp-link-account/index.d.ts +79 -0
  43. package/lib/cloud-gcp-link-account/index.js +150 -0
  44. package/lib/cloud-oci-link-account/index.d.ts +195 -0
  45. package/lib/cloud-oci-link-account/index.js +366 -0
  46. package/lib/data-newrelic-account/index.d.ts +82 -0
  47. package/lib/data-newrelic-account/index.js +160 -0
  48. package/lib/data-newrelic-alert-channel/index.d.ts +126 -0
  49. package/lib/data-newrelic-alert-channel/index.js +298 -0
  50. package/lib/data-newrelic-alert-policy/index.d.ts +82 -0
  51. package/lib/data-newrelic-alert-policy/index.js +161 -0
  52. package/lib/data-newrelic-application/index.d.ts +60 -0
  53. package/lib/data-newrelic-application/index.js +122 -0
  54. package/lib/data-newrelic-authentication-domain/index.d.ts +47 -0
  55. package/lib/data-newrelic-authentication-domain/index.js +97 -0
  56. package/lib/data-newrelic-cloud-account/index.d.ts +79 -0
  57. package/lib/data-newrelic-cloud-account/index.js +150 -0
  58. package/lib/data-newrelic-entity/index.d.ts +189 -0
  59. package/lib/data-newrelic-entity/index.js +401 -0
  60. package/lib/data-newrelic-group/index.d.ts +58 -0
  61. package/lib/data-newrelic-group/index.js +116 -0
  62. package/lib/data-newrelic-key-transaction/index.d.ts +82 -0
  63. package/lib/data-newrelic-key-transaction/index.js +161 -0
  64. package/lib/data-newrelic-notification-destination/index.d.ts +165 -0
  65. package/lib/data-newrelic-notification-destination/index.js +372 -0
  66. package/lib/data-newrelic-obfuscation-expression/index.d.ts +69 -0
  67. package/lib/data-newrelic-obfuscation-expression/index.js +132 -0
  68. package/lib/data-newrelic-service-level-alert-helper/index.d.ts +111 -0
  69. package/lib/data-newrelic-service-level-alert-helper/index.js +244 -0
  70. package/lib/data-newrelic-synthetics-private-location/index.d.ts +80 -0
  71. package/lib/data-newrelic-synthetics-private-location/index.js +153 -0
  72. package/lib/data-newrelic-synthetics-secure-credential/index.d.ts +71 -0
  73. package/lib/data-newrelic-synthetics-secure-credential/index.js +140 -0
  74. package/lib/data-newrelic-test-grok-pattern/index.d.ts +149 -0
  75. package/lib/data-newrelic-test-grok-pattern/index.js +318 -0
  76. package/lib/data-newrelic-user/index.d.ts +69 -0
  77. package/lib/data-newrelic-user/index.js +136 -0
  78. package/lib/data-partition-rule/index.d.ts +146 -0
  79. package/lib/data-partition-rule/index.js +319 -0
  80. package/lib/entity-tags/index.d.ts +156 -0
  81. package/lib/entity-tags/index.js +368 -0
  82. package/lib/events-to-metrics-rule/index.d.ts +102 -0
  83. package/lib/events-to-metrics-rule/index.js +196 -0
  84. package/lib/group/index.d.ts +79 -0
  85. package/lib/group/index.js +150 -0
  86. package/lib/index.d.ts +74 -0
  87. package/lib/index.js +80 -0
  88. package/lib/infra-alert-condition/index.d.ts +293 -0
  89. package/lib/infra-alert-condition/index.js +665 -0
  90. package/lib/insights-event/index.d.ts +186 -0
  91. package/lib/insights-event/index.js +425 -0
  92. package/lib/key-transaction/index.d.ts +100 -0
  93. package/lib/key-transaction/index.js +191 -0
  94. package/lib/lazy-index.d.ts +4 -0
  95. package/lib/lazy-index.js +77 -0
  96. package/lib/log-parsing-rule/index.d.ts +132 -0
  97. package/lib/log-parsing-rule/index.js +250 -0
  98. package/lib/monitor-downtime/index.d.ts +259 -0
  99. package/lib/monitor-downtime/index.js +594 -0
  100. package/lib/notification-channel/index.d.ts +240 -0
  101. package/lib/notification-channel/index.js +546 -0
  102. package/lib/notification-destination/index.d.ts +406 -0
  103. package/lib/notification-destination/index.js +1030 -0
  104. package/lib/nrql-alert-condition/index.d.ts +976 -0
  105. package/lib/nrql-alert-condition/index.js +2320 -0
  106. package/lib/nrql-drop-rule/index.d.ts +127 -0
  107. package/lib/nrql-drop-rule/index.js +287 -0
  108. package/lib/obfuscation-expression/index.d.ts +90 -0
  109. package/lib/obfuscation-expression/index.js +171 -0
  110. package/lib/obfuscation-rule/index.d.ts +173 -0
  111. package/lib/obfuscation-rule/index.js +361 -0
  112. package/lib/one-dashboard/index-structs/index.d.ts +6 -0
  113. package/lib/one-dashboard/index-structs/index.js +23 -0
  114. package/lib/one-dashboard/index-structs/structs0.d.ts +7000 -0
  115. package/lib/one-dashboard/index-structs/structs0.js +17966 -0
  116. package/lib/one-dashboard/index-structs/structs400.d.ts +3703 -0
  117. package/lib/one-dashboard/index-structs/structs400.js +9484 -0
  118. package/lib/one-dashboard/index.d.ts +116 -0
  119. package/lib/one-dashboard/index.js +246 -0
  120. package/lib/one-dashboard-json/index.d.ts +116 -0
  121. package/lib/one-dashboard-json/index.js +278 -0
  122. package/lib/one-dashboard-raw/index.d.ts +278 -0
  123. package/lib/one-dashboard-raw/index.js +646 -0
  124. package/lib/pipeline-cloud-rule/index.d.ts +90 -0
  125. package/lib/pipeline-cloud-rule/index.js +171 -0
  126. package/lib/provider/index.d.ts +164 -0
  127. package/lib/provider/index.js +354 -0
  128. package/lib/service-level/index.d.ts +505 -0
  129. package/lib/service-level/index.js +1429 -0
  130. package/lib/synthetics-alert-condition/index.d.ts +101 -0
  131. package/lib/synthetics-alert-condition/index.js +193 -0
  132. package/lib/synthetics-broken-links-monitor/index.d.ts +221 -0
  133. package/lib/synthetics-broken-links-monitor/index.js +455 -0
  134. package/lib/synthetics-cert-check-monitor/index.d.ts +226 -0
  135. package/lib/synthetics-cert-check-monitor/index.js +469 -0
  136. package/lib/synthetics-monitor/index.d.ts +408 -0
  137. package/lib/synthetics-monitor/index.js +843 -0
  138. package/lib/synthetics-multilocation-alert-condition/index.d.ts +181 -0
  139. package/lib/synthetics-multilocation-alert-condition/index.js +403 -0
  140. package/lib/synthetics-private-location/index.d.ts +94 -0
  141. package/lib/synthetics-private-location/index.js +187 -0
  142. package/lib/synthetics-script-monitor/index.d.ts +352 -0
  143. package/lib/synthetics-script-monitor/index.js +736 -0
  144. package/lib/synthetics-secure-credential/index.d.ts +136 -0
  145. package/lib/synthetics-secure-credential/index.js +300 -0
  146. package/lib/synthetics-step-monitor/index.d.ts +372 -0
  147. package/lib/synthetics-step-monitor/index.js +809 -0
  148. package/lib/user/index.d.ts +89 -0
  149. package/lib/user/index.js +168 -0
  150. package/lib/workflow/index.d.ts +445 -0
  151. package/lib/workflow/index.js +1058 -0
  152. package/lib/workload/index.d.ts +518 -0
  153. package/lib/workload/index.js +1279 -0
  154. package/package.json +155 -0
@@ -0,0 +1,2320 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NrqlAlertCondition = exports.NrqlAlertConditionWarningOutputReference = exports.NrqlAlertConditionWarningPredictionOutputReference = exports.NrqlAlertConditionTimeoutsOutputReference = exports.NrqlAlertConditionTermList = exports.NrqlAlertConditionTermOutputReference = exports.NrqlAlertConditionTermPredictionOutputReference = exports.NrqlAlertConditionOutlierConfigurationOutputReference = exports.NrqlAlertConditionOutlierConfigurationDbscanOutputReference = exports.NrqlAlertConditionNrqlOutputReference = exports.NrqlAlertConditionCriticalOutputReference = exports.NrqlAlertConditionCriticalPredictionOutputReference = void 0;
5
+ exports.nrqlAlertConditionCriticalPredictionToTerraform = nrqlAlertConditionCriticalPredictionToTerraform;
6
+ exports.nrqlAlertConditionCriticalPredictionToHclTerraform = nrqlAlertConditionCriticalPredictionToHclTerraform;
7
+ exports.nrqlAlertConditionCriticalToTerraform = nrqlAlertConditionCriticalToTerraform;
8
+ exports.nrqlAlertConditionCriticalToHclTerraform = nrqlAlertConditionCriticalToHclTerraform;
9
+ exports.nrqlAlertConditionNrqlToTerraform = nrqlAlertConditionNrqlToTerraform;
10
+ exports.nrqlAlertConditionNrqlToHclTerraform = nrqlAlertConditionNrqlToHclTerraform;
11
+ exports.nrqlAlertConditionOutlierConfigurationDbscanToTerraform = nrqlAlertConditionOutlierConfigurationDbscanToTerraform;
12
+ exports.nrqlAlertConditionOutlierConfigurationDbscanToHclTerraform = nrqlAlertConditionOutlierConfigurationDbscanToHclTerraform;
13
+ exports.nrqlAlertConditionOutlierConfigurationToTerraform = nrqlAlertConditionOutlierConfigurationToTerraform;
14
+ exports.nrqlAlertConditionOutlierConfigurationToHclTerraform = nrqlAlertConditionOutlierConfigurationToHclTerraform;
15
+ exports.nrqlAlertConditionTermPredictionToTerraform = nrqlAlertConditionTermPredictionToTerraform;
16
+ exports.nrqlAlertConditionTermPredictionToHclTerraform = nrqlAlertConditionTermPredictionToHclTerraform;
17
+ exports.nrqlAlertConditionTermToTerraform = nrqlAlertConditionTermToTerraform;
18
+ exports.nrqlAlertConditionTermToHclTerraform = nrqlAlertConditionTermToHclTerraform;
19
+ exports.nrqlAlertConditionTimeoutsToTerraform = nrqlAlertConditionTimeoutsToTerraform;
20
+ exports.nrqlAlertConditionTimeoutsToHclTerraform = nrqlAlertConditionTimeoutsToHclTerraform;
21
+ exports.nrqlAlertConditionWarningPredictionToTerraform = nrqlAlertConditionWarningPredictionToTerraform;
22
+ exports.nrqlAlertConditionWarningPredictionToHclTerraform = nrqlAlertConditionWarningPredictionToHclTerraform;
23
+ exports.nrqlAlertConditionWarningToTerraform = nrqlAlertConditionWarningToTerraform;
24
+ exports.nrqlAlertConditionWarningToHclTerraform = nrqlAlertConditionWarningToHclTerraform;
25
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
26
+ const cdktn = require("cdktn");
27
+ function nrqlAlertConditionCriticalPredictionToTerraform(struct) {
28
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
29
+ return struct;
30
+ }
31
+ if (cdktn.isComplexElement(struct)) {
32
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
33
+ }
34
+ return {
35
+ predict_by: cdktn.numberToTerraform(struct.predictBy),
36
+ prefer_prediction_violation: cdktn.booleanToTerraform(struct.preferPredictionViolation),
37
+ };
38
+ }
39
+ function nrqlAlertConditionCriticalPredictionToHclTerraform(struct) {
40
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
41
+ return struct;
42
+ }
43
+ if (cdktn.isComplexElement(struct)) {
44
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
45
+ }
46
+ const attrs = {
47
+ predict_by: {
48
+ value: cdktn.numberToHclTerraform(struct.predictBy),
49
+ isBlock: false,
50
+ type: "simple",
51
+ storageClassType: "number",
52
+ },
53
+ prefer_prediction_violation: {
54
+ value: cdktn.booleanToHclTerraform(struct.preferPredictionViolation),
55
+ isBlock: false,
56
+ type: "simple",
57
+ storageClassType: "boolean",
58
+ },
59
+ };
60
+ // remove undefined attributes
61
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
62
+ }
63
+ class NrqlAlertConditionCriticalPredictionOutputReference extends cdktn.ComplexObject {
64
+ /**
65
+ * @param terraformResource The parent resource
66
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
67
+ */
68
+ constructor(terraformResource, terraformAttribute) {
69
+ super(terraformResource, terraformAttribute, false, 0);
70
+ this.isEmptyObject = false;
71
+ }
72
+ get internalValue() {
73
+ let hasAnyValues = this.isEmptyObject;
74
+ const internalValueResult = {};
75
+ if (this._predictBy !== undefined) {
76
+ hasAnyValues = true;
77
+ internalValueResult.predictBy = this._predictBy;
78
+ }
79
+ if (this._preferPredictionViolation !== undefined) {
80
+ hasAnyValues = true;
81
+ internalValueResult.preferPredictionViolation = this._preferPredictionViolation;
82
+ }
83
+ return hasAnyValues ? internalValueResult : undefined;
84
+ }
85
+ set internalValue(value) {
86
+ if (value === undefined) {
87
+ this.isEmptyObject = false;
88
+ this._predictBy = undefined;
89
+ this._preferPredictionViolation = undefined;
90
+ }
91
+ else {
92
+ this.isEmptyObject = Object.keys(value).length === 0;
93
+ this._predictBy = value.predictBy;
94
+ this._preferPredictionViolation = value.preferPredictionViolation;
95
+ }
96
+ }
97
+ get predictBy() {
98
+ return this.getNumberAttribute('predict_by');
99
+ }
100
+ set predictBy(value) {
101
+ this._predictBy = value;
102
+ }
103
+ resetPredictBy() {
104
+ this._predictBy = undefined;
105
+ }
106
+ // Temporarily expose input value. Use with caution.
107
+ get predictByInput() {
108
+ return this._predictBy;
109
+ }
110
+ get preferPredictionViolation() {
111
+ return this.getBooleanAttribute('prefer_prediction_violation');
112
+ }
113
+ set preferPredictionViolation(value) {
114
+ this._preferPredictionViolation = value;
115
+ }
116
+ resetPreferPredictionViolation() {
117
+ this._preferPredictionViolation = undefined;
118
+ }
119
+ // Temporarily expose input value. Use with caution.
120
+ get preferPredictionViolationInput() {
121
+ return this._preferPredictionViolation;
122
+ }
123
+ }
124
+ exports.NrqlAlertConditionCriticalPredictionOutputReference = NrqlAlertConditionCriticalPredictionOutputReference;
125
+ _a = JSII_RTTI_SYMBOL_1;
126
+ NrqlAlertConditionCriticalPredictionOutputReference[_a] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionCriticalPredictionOutputReference", version: "14.0.0" };
127
+ function nrqlAlertConditionCriticalToTerraform(struct) {
128
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
129
+ return struct;
130
+ }
131
+ if (cdktn.isComplexElement(struct)) {
132
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
133
+ }
134
+ return {
135
+ disable_health_status_reporting: cdktn.booleanToTerraform(struct.disableHealthStatusReporting),
136
+ duration: cdktn.numberToTerraform(struct.duration),
137
+ operator: cdktn.stringToTerraform(struct.operator),
138
+ threshold: cdktn.numberToTerraform(struct.threshold),
139
+ threshold_duration: cdktn.numberToTerraform(struct.thresholdDuration),
140
+ threshold_occurrences: cdktn.stringToTerraform(struct.thresholdOccurrences),
141
+ time_function: cdktn.stringToTerraform(struct.timeFunction),
142
+ prediction: nrqlAlertConditionCriticalPredictionToTerraform(struct.prediction),
143
+ };
144
+ }
145
+ function nrqlAlertConditionCriticalToHclTerraform(struct) {
146
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
147
+ return struct;
148
+ }
149
+ if (cdktn.isComplexElement(struct)) {
150
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
151
+ }
152
+ const attrs = {
153
+ disable_health_status_reporting: {
154
+ value: cdktn.booleanToHclTerraform(struct.disableHealthStatusReporting),
155
+ isBlock: false,
156
+ type: "simple",
157
+ storageClassType: "boolean",
158
+ },
159
+ duration: {
160
+ value: cdktn.numberToHclTerraform(struct.duration),
161
+ isBlock: false,
162
+ type: "simple",
163
+ storageClassType: "number",
164
+ },
165
+ operator: {
166
+ value: cdktn.stringToHclTerraform(struct.operator),
167
+ isBlock: false,
168
+ type: "simple",
169
+ storageClassType: "string",
170
+ },
171
+ threshold: {
172
+ value: cdktn.numberToHclTerraform(struct.threshold),
173
+ isBlock: false,
174
+ type: "simple",
175
+ storageClassType: "number",
176
+ },
177
+ threshold_duration: {
178
+ value: cdktn.numberToHclTerraform(struct.thresholdDuration),
179
+ isBlock: false,
180
+ type: "simple",
181
+ storageClassType: "number",
182
+ },
183
+ threshold_occurrences: {
184
+ value: cdktn.stringToHclTerraform(struct.thresholdOccurrences),
185
+ isBlock: false,
186
+ type: "simple",
187
+ storageClassType: "string",
188
+ },
189
+ time_function: {
190
+ value: cdktn.stringToHclTerraform(struct.timeFunction),
191
+ isBlock: false,
192
+ type: "simple",
193
+ storageClassType: "string",
194
+ },
195
+ prediction: {
196
+ value: nrqlAlertConditionCriticalPredictionToHclTerraform(struct.prediction),
197
+ isBlock: true,
198
+ type: "set",
199
+ storageClassType: "NrqlAlertConditionCriticalPredictionList",
200
+ },
201
+ };
202
+ // remove undefined attributes
203
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
204
+ }
205
+ class NrqlAlertConditionCriticalOutputReference extends cdktn.ComplexObject {
206
+ /**
207
+ * @param terraformResource The parent resource
208
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
209
+ */
210
+ constructor(terraformResource, terraformAttribute) {
211
+ super(terraformResource, terraformAttribute, false, 0);
212
+ this.isEmptyObject = false;
213
+ // prediction - computed: false, optional: true, required: false
214
+ this._prediction = new NrqlAlertConditionCriticalPredictionOutputReference(this, "prediction");
215
+ }
216
+ get internalValue() {
217
+ let hasAnyValues = this.isEmptyObject;
218
+ const internalValueResult = {};
219
+ if (this._disableHealthStatusReporting !== undefined) {
220
+ hasAnyValues = true;
221
+ internalValueResult.disableHealthStatusReporting = this._disableHealthStatusReporting;
222
+ }
223
+ if (this._duration !== undefined) {
224
+ hasAnyValues = true;
225
+ internalValueResult.duration = this._duration;
226
+ }
227
+ if (this._operator !== undefined) {
228
+ hasAnyValues = true;
229
+ internalValueResult.operator = this._operator;
230
+ }
231
+ if (this._threshold !== undefined) {
232
+ hasAnyValues = true;
233
+ internalValueResult.threshold = this._threshold;
234
+ }
235
+ if (this._thresholdDuration !== undefined) {
236
+ hasAnyValues = true;
237
+ internalValueResult.thresholdDuration = this._thresholdDuration;
238
+ }
239
+ if (this._thresholdOccurrences !== undefined) {
240
+ hasAnyValues = true;
241
+ internalValueResult.thresholdOccurrences = this._thresholdOccurrences;
242
+ }
243
+ if (this._timeFunction !== undefined) {
244
+ hasAnyValues = true;
245
+ internalValueResult.timeFunction = this._timeFunction;
246
+ }
247
+ if (this._prediction?.internalValue !== undefined) {
248
+ hasAnyValues = true;
249
+ internalValueResult.prediction = this._prediction?.internalValue;
250
+ }
251
+ return hasAnyValues ? internalValueResult : undefined;
252
+ }
253
+ set internalValue(value) {
254
+ if (value === undefined) {
255
+ this.isEmptyObject = false;
256
+ this._disableHealthStatusReporting = undefined;
257
+ this._duration = undefined;
258
+ this._operator = undefined;
259
+ this._threshold = undefined;
260
+ this._thresholdDuration = undefined;
261
+ this._thresholdOccurrences = undefined;
262
+ this._timeFunction = undefined;
263
+ this._prediction.internalValue = undefined;
264
+ }
265
+ else {
266
+ this.isEmptyObject = Object.keys(value).length === 0;
267
+ this._disableHealthStatusReporting = value.disableHealthStatusReporting;
268
+ this._duration = value.duration;
269
+ this._operator = value.operator;
270
+ this._threshold = value.threshold;
271
+ this._thresholdDuration = value.thresholdDuration;
272
+ this._thresholdOccurrences = value.thresholdOccurrences;
273
+ this._timeFunction = value.timeFunction;
274
+ this._prediction.internalValue = value.prediction;
275
+ }
276
+ }
277
+ get disableHealthStatusReporting() {
278
+ return this.getBooleanAttribute('disable_health_status_reporting');
279
+ }
280
+ set disableHealthStatusReporting(value) {
281
+ this._disableHealthStatusReporting = value;
282
+ }
283
+ resetDisableHealthStatusReporting() {
284
+ this._disableHealthStatusReporting = undefined;
285
+ }
286
+ // Temporarily expose input value. Use with caution.
287
+ get disableHealthStatusReportingInput() {
288
+ return this._disableHealthStatusReporting;
289
+ }
290
+ get duration() {
291
+ return this.getNumberAttribute('duration');
292
+ }
293
+ set duration(value) {
294
+ this._duration = value;
295
+ }
296
+ resetDuration() {
297
+ this._duration = undefined;
298
+ }
299
+ // Temporarily expose input value. Use with caution.
300
+ get durationInput() {
301
+ return this._duration;
302
+ }
303
+ get operator() {
304
+ return this.getStringAttribute('operator');
305
+ }
306
+ set operator(value) {
307
+ this._operator = value;
308
+ }
309
+ resetOperator() {
310
+ this._operator = undefined;
311
+ }
312
+ // Temporarily expose input value. Use with caution.
313
+ get operatorInput() {
314
+ return this._operator;
315
+ }
316
+ get threshold() {
317
+ return this.getNumberAttribute('threshold');
318
+ }
319
+ set threshold(value) {
320
+ this._threshold = value;
321
+ }
322
+ // Temporarily expose input value. Use with caution.
323
+ get thresholdInput() {
324
+ return this._threshold;
325
+ }
326
+ get thresholdDuration() {
327
+ return this.getNumberAttribute('threshold_duration');
328
+ }
329
+ set thresholdDuration(value) {
330
+ this._thresholdDuration = value;
331
+ }
332
+ resetThresholdDuration() {
333
+ this._thresholdDuration = undefined;
334
+ }
335
+ // Temporarily expose input value. Use with caution.
336
+ get thresholdDurationInput() {
337
+ return this._thresholdDuration;
338
+ }
339
+ get thresholdOccurrences() {
340
+ return this.getStringAttribute('threshold_occurrences');
341
+ }
342
+ set thresholdOccurrences(value) {
343
+ this._thresholdOccurrences = value;
344
+ }
345
+ resetThresholdOccurrences() {
346
+ this._thresholdOccurrences = undefined;
347
+ }
348
+ // Temporarily expose input value. Use with caution.
349
+ get thresholdOccurrencesInput() {
350
+ return this._thresholdOccurrences;
351
+ }
352
+ get timeFunction() {
353
+ return this.getStringAttribute('time_function');
354
+ }
355
+ set timeFunction(value) {
356
+ this._timeFunction = value;
357
+ }
358
+ resetTimeFunction() {
359
+ this._timeFunction = undefined;
360
+ }
361
+ // Temporarily expose input value. Use with caution.
362
+ get timeFunctionInput() {
363
+ return this._timeFunction;
364
+ }
365
+ get prediction() {
366
+ return this._prediction;
367
+ }
368
+ putPrediction(value) {
369
+ this._prediction.internalValue = value;
370
+ }
371
+ resetPrediction() {
372
+ this._prediction.internalValue = undefined;
373
+ }
374
+ // Temporarily expose input value. Use with caution.
375
+ get predictionInput() {
376
+ return this._prediction.internalValue;
377
+ }
378
+ }
379
+ exports.NrqlAlertConditionCriticalOutputReference = NrqlAlertConditionCriticalOutputReference;
380
+ _b = JSII_RTTI_SYMBOL_1;
381
+ NrqlAlertConditionCriticalOutputReference[_b] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionCriticalOutputReference", version: "14.0.0" };
382
+ function nrqlAlertConditionNrqlToTerraform(struct) {
383
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
384
+ return struct;
385
+ }
386
+ if (cdktn.isComplexElement(struct)) {
387
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
388
+ }
389
+ return {
390
+ data_account_id: cdktn.numberToTerraform(struct.dataAccountId),
391
+ evaluation_offset: cdktn.numberToTerraform(struct.evaluationOffset),
392
+ query: cdktn.stringToTerraform(struct.query),
393
+ since_value: cdktn.stringToTerraform(struct.sinceValue),
394
+ };
395
+ }
396
+ function nrqlAlertConditionNrqlToHclTerraform(struct) {
397
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
398
+ return struct;
399
+ }
400
+ if (cdktn.isComplexElement(struct)) {
401
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
402
+ }
403
+ const attrs = {
404
+ data_account_id: {
405
+ value: cdktn.numberToHclTerraform(struct.dataAccountId),
406
+ isBlock: false,
407
+ type: "simple",
408
+ storageClassType: "number",
409
+ },
410
+ evaluation_offset: {
411
+ value: cdktn.numberToHclTerraform(struct.evaluationOffset),
412
+ isBlock: false,
413
+ type: "simple",
414
+ storageClassType: "number",
415
+ },
416
+ query: {
417
+ value: cdktn.stringToHclTerraform(struct.query),
418
+ isBlock: false,
419
+ type: "simple",
420
+ storageClassType: "string",
421
+ },
422
+ since_value: {
423
+ value: cdktn.stringToHclTerraform(struct.sinceValue),
424
+ isBlock: false,
425
+ type: "simple",
426
+ storageClassType: "string",
427
+ },
428
+ };
429
+ // remove undefined attributes
430
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
431
+ }
432
+ class NrqlAlertConditionNrqlOutputReference extends cdktn.ComplexObject {
433
+ /**
434
+ * @param terraformResource The parent resource
435
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
436
+ */
437
+ constructor(terraformResource, terraformAttribute) {
438
+ super(terraformResource, terraformAttribute, false, 0);
439
+ this.isEmptyObject = false;
440
+ }
441
+ get internalValue() {
442
+ let hasAnyValues = this.isEmptyObject;
443
+ const internalValueResult = {};
444
+ if (this._dataAccountId !== undefined) {
445
+ hasAnyValues = true;
446
+ internalValueResult.dataAccountId = this._dataAccountId;
447
+ }
448
+ if (this._evaluationOffset !== undefined) {
449
+ hasAnyValues = true;
450
+ internalValueResult.evaluationOffset = this._evaluationOffset;
451
+ }
452
+ if (this._query !== undefined) {
453
+ hasAnyValues = true;
454
+ internalValueResult.query = this._query;
455
+ }
456
+ if (this._sinceValue !== undefined) {
457
+ hasAnyValues = true;
458
+ internalValueResult.sinceValue = this._sinceValue;
459
+ }
460
+ return hasAnyValues ? internalValueResult : undefined;
461
+ }
462
+ set internalValue(value) {
463
+ if (value === undefined) {
464
+ this.isEmptyObject = false;
465
+ this._dataAccountId = undefined;
466
+ this._evaluationOffset = undefined;
467
+ this._query = undefined;
468
+ this._sinceValue = undefined;
469
+ }
470
+ else {
471
+ this.isEmptyObject = Object.keys(value).length === 0;
472
+ this._dataAccountId = value.dataAccountId;
473
+ this._evaluationOffset = value.evaluationOffset;
474
+ this._query = value.query;
475
+ this._sinceValue = value.sinceValue;
476
+ }
477
+ }
478
+ get dataAccountId() {
479
+ return this.getNumberAttribute('data_account_id');
480
+ }
481
+ set dataAccountId(value) {
482
+ this._dataAccountId = value;
483
+ }
484
+ resetDataAccountId() {
485
+ this._dataAccountId = undefined;
486
+ }
487
+ // Temporarily expose input value. Use with caution.
488
+ get dataAccountIdInput() {
489
+ return this._dataAccountId;
490
+ }
491
+ get evaluationOffset() {
492
+ return this.getNumberAttribute('evaluation_offset');
493
+ }
494
+ set evaluationOffset(value) {
495
+ this._evaluationOffset = value;
496
+ }
497
+ resetEvaluationOffset() {
498
+ this._evaluationOffset = undefined;
499
+ }
500
+ // Temporarily expose input value. Use with caution.
501
+ get evaluationOffsetInput() {
502
+ return this._evaluationOffset;
503
+ }
504
+ get query() {
505
+ return this.getStringAttribute('query');
506
+ }
507
+ set query(value) {
508
+ this._query = value;
509
+ }
510
+ // Temporarily expose input value. Use with caution.
511
+ get queryInput() {
512
+ return this._query;
513
+ }
514
+ get sinceValue() {
515
+ return this.getStringAttribute('since_value');
516
+ }
517
+ set sinceValue(value) {
518
+ this._sinceValue = value;
519
+ }
520
+ resetSinceValue() {
521
+ this._sinceValue = undefined;
522
+ }
523
+ // Temporarily expose input value. Use with caution.
524
+ get sinceValueInput() {
525
+ return this._sinceValue;
526
+ }
527
+ }
528
+ exports.NrqlAlertConditionNrqlOutputReference = NrqlAlertConditionNrqlOutputReference;
529
+ _c = JSII_RTTI_SYMBOL_1;
530
+ NrqlAlertConditionNrqlOutputReference[_c] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionNrqlOutputReference", version: "14.0.0" };
531
+ function nrqlAlertConditionOutlierConfigurationDbscanToTerraform(struct) {
532
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
533
+ return struct;
534
+ }
535
+ if (cdktn.isComplexElement(struct)) {
536
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
537
+ }
538
+ return {
539
+ epsilon: cdktn.numberToTerraform(struct.epsilon),
540
+ evaluation_group_facet: cdktn.stringToTerraform(struct.evaluationGroupFacet),
541
+ minimum_points: cdktn.numberToTerraform(struct.minimumPoints),
542
+ };
543
+ }
544
+ function nrqlAlertConditionOutlierConfigurationDbscanToHclTerraform(struct) {
545
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
546
+ return struct;
547
+ }
548
+ if (cdktn.isComplexElement(struct)) {
549
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
550
+ }
551
+ const attrs = {
552
+ epsilon: {
553
+ value: cdktn.numberToHclTerraform(struct.epsilon),
554
+ isBlock: false,
555
+ type: "simple",
556
+ storageClassType: "number",
557
+ },
558
+ evaluation_group_facet: {
559
+ value: cdktn.stringToHclTerraform(struct.evaluationGroupFacet),
560
+ isBlock: false,
561
+ type: "simple",
562
+ storageClassType: "string",
563
+ },
564
+ minimum_points: {
565
+ value: cdktn.numberToHclTerraform(struct.minimumPoints),
566
+ isBlock: false,
567
+ type: "simple",
568
+ storageClassType: "number",
569
+ },
570
+ };
571
+ // remove undefined attributes
572
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
573
+ }
574
+ class NrqlAlertConditionOutlierConfigurationDbscanOutputReference extends cdktn.ComplexObject {
575
+ /**
576
+ * @param terraformResource The parent resource
577
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
578
+ */
579
+ constructor(terraformResource, terraformAttribute) {
580
+ super(terraformResource, terraformAttribute, false, 0);
581
+ this.isEmptyObject = false;
582
+ }
583
+ get internalValue() {
584
+ let hasAnyValues = this.isEmptyObject;
585
+ const internalValueResult = {};
586
+ if (this._epsilon !== undefined) {
587
+ hasAnyValues = true;
588
+ internalValueResult.epsilon = this._epsilon;
589
+ }
590
+ if (this._evaluationGroupFacet !== undefined) {
591
+ hasAnyValues = true;
592
+ internalValueResult.evaluationGroupFacet = this._evaluationGroupFacet;
593
+ }
594
+ if (this._minimumPoints !== undefined) {
595
+ hasAnyValues = true;
596
+ internalValueResult.minimumPoints = this._minimumPoints;
597
+ }
598
+ return hasAnyValues ? internalValueResult : undefined;
599
+ }
600
+ set internalValue(value) {
601
+ if (value === undefined) {
602
+ this.isEmptyObject = false;
603
+ this._epsilon = undefined;
604
+ this._evaluationGroupFacet = undefined;
605
+ this._minimumPoints = undefined;
606
+ }
607
+ else {
608
+ this.isEmptyObject = Object.keys(value).length === 0;
609
+ this._epsilon = value.epsilon;
610
+ this._evaluationGroupFacet = value.evaluationGroupFacet;
611
+ this._minimumPoints = value.minimumPoints;
612
+ }
613
+ }
614
+ get epsilon() {
615
+ return this.getNumberAttribute('epsilon');
616
+ }
617
+ set epsilon(value) {
618
+ this._epsilon = value;
619
+ }
620
+ // Temporarily expose input value. Use with caution.
621
+ get epsilonInput() {
622
+ return this._epsilon;
623
+ }
624
+ get evaluationGroupFacet() {
625
+ return this.getStringAttribute('evaluation_group_facet');
626
+ }
627
+ set evaluationGroupFacet(value) {
628
+ this._evaluationGroupFacet = value;
629
+ }
630
+ resetEvaluationGroupFacet() {
631
+ this._evaluationGroupFacet = undefined;
632
+ }
633
+ // Temporarily expose input value. Use with caution.
634
+ get evaluationGroupFacetInput() {
635
+ return this._evaluationGroupFacet;
636
+ }
637
+ get minimumPoints() {
638
+ return this.getNumberAttribute('minimum_points');
639
+ }
640
+ set minimumPoints(value) {
641
+ this._minimumPoints = value;
642
+ }
643
+ // Temporarily expose input value. Use with caution.
644
+ get minimumPointsInput() {
645
+ return this._minimumPoints;
646
+ }
647
+ }
648
+ exports.NrqlAlertConditionOutlierConfigurationDbscanOutputReference = NrqlAlertConditionOutlierConfigurationDbscanOutputReference;
649
+ _d = JSII_RTTI_SYMBOL_1;
650
+ NrqlAlertConditionOutlierConfigurationDbscanOutputReference[_d] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionOutlierConfigurationDbscanOutputReference", version: "14.0.0" };
651
+ function nrqlAlertConditionOutlierConfigurationToTerraform(struct) {
652
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
653
+ return struct;
654
+ }
655
+ if (cdktn.isComplexElement(struct)) {
656
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
657
+ }
658
+ return {
659
+ dbscan: nrqlAlertConditionOutlierConfigurationDbscanToTerraform(struct.dbscan),
660
+ };
661
+ }
662
+ function nrqlAlertConditionOutlierConfigurationToHclTerraform(struct) {
663
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
664
+ return struct;
665
+ }
666
+ if (cdktn.isComplexElement(struct)) {
667
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
668
+ }
669
+ const attrs = {
670
+ dbscan: {
671
+ value: nrqlAlertConditionOutlierConfigurationDbscanToHclTerraform(struct.dbscan),
672
+ isBlock: true,
673
+ type: "list",
674
+ storageClassType: "NrqlAlertConditionOutlierConfigurationDbscanList",
675
+ },
676
+ };
677
+ // remove undefined attributes
678
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
679
+ }
680
+ class NrqlAlertConditionOutlierConfigurationOutputReference extends cdktn.ComplexObject {
681
+ /**
682
+ * @param terraformResource The parent resource
683
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
684
+ */
685
+ constructor(terraformResource, terraformAttribute) {
686
+ super(terraformResource, terraformAttribute, false, 0);
687
+ this.isEmptyObject = false;
688
+ // dbscan - computed: false, optional: false, required: true
689
+ this._dbscan = new NrqlAlertConditionOutlierConfigurationDbscanOutputReference(this, "dbscan");
690
+ }
691
+ get internalValue() {
692
+ let hasAnyValues = this.isEmptyObject;
693
+ const internalValueResult = {};
694
+ if (this._dbscan?.internalValue !== undefined) {
695
+ hasAnyValues = true;
696
+ internalValueResult.dbscan = this._dbscan?.internalValue;
697
+ }
698
+ return hasAnyValues ? internalValueResult : undefined;
699
+ }
700
+ set internalValue(value) {
701
+ if (value === undefined) {
702
+ this.isEmptyObject = false;
703
+ this._dbscan.internalValue = undefined;
704
+ }
705
+ else {
706
+ this.isEmptyObject = Object.keys(value).length === 0;
707
+ this._dbscan.internalValue = value.dbscan;
708
+ }
709
+ }
710
+ get dbscan() {
711
+ return this._dbscan;
712
+ }
713
+ putDbscan(value) {
714
+ this._dbscan.internalValue = value;
715
+ }
716
+ // Temporarily expose input value. Use with caution.
717
+ get dbscanInput() {
718
+ return this._dbscan.internalValue;
719
+ }
720
+ }
721
+ exports.NrqlAlertConditionOutlierConfigurationOutputReference = NrqlAlertConditionOutlierConfigurationOutputReference;
722
+ _e = JSII_RTTI_SYMBOL_1;
723
+ NrqlAlertConditionOutlierConfigurationOutputReference[_e] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionOutlierConfigurationOutputReference", version: "14.0.0" };
724
+ function nrqlAlertConditionTermPredictionToTerraform(struct) {
725
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
726
+ return struct;
727
+ }
728
+ if (cdktn.isComplexElement(struct)) {
729
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
730
+ }
731
+ return {
732
+ predict_by: cdktn.numberToTerraform(struct.predictBy),
733
+ prefer_prediction_violation: cdktn.booleanToTerraform(struct.preferPredictionViolation),
734
+ };
735
+ }
736
+ function nrqlAlertConditionTermPredictionToHclTerraform(struct) {
737
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
738
+ return struct;
739
+ }
740
+ if (cdktn.isComplexElement(struct)) {
741
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
742
+ }
743
+ const attrs = {
744
+ predict_by: {
745
+ value: cdktn.numberToHclTerraform(struct.predictBy),
746
+ isBlock: false,
747
+ type: "simple",
748
+ storageClassType: "number",
749
+ },
750
+ prefer_prediction_violation: {
751
+ value: cdktn.booleanToHclTerraform(struct.preferPredictionViolation),
752
+ isBlock: false,
753
+ type: "simple",
754
+ storageClassType: "boolean",
755
+ },
756
+ };
757
+ // remove undefined attributes
758
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
759
+ }
760
+ class NrqlAlertConditionTermPredictionOutputReference extends cdktn.ComplexObject {
761
+ /**
762
+ * @param terraformResource The parent resource
763
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
764
+ */
765
+ constructor(terraformResource, terraformAttribute) {
766
+ super(terraformResource, terraformAttribute, false, 0);
767
+ this.isEmptyObject = false;
768
+ }
769
+ get internalValue() {
770
+ let hasAnyValues = this.isEmptyObject;
771
+ const internalValueResult = {};
772
+ if (this._predictBy !== undefined) {
773
+ hasAnyValues = true;
774
+ internalValueResult.predictBy = this._predictBy;
775
+ }
776
+ if (this._preferPredictionViolation !== undefined) {
777
+ hasAnyValues = true;
778
+ internalValueResult.preferPredictionViolation = this._preferPredictionViolation;
779
+ }
780
+ return hasAnyValues ? internalValueResult : undefined;
781
+ }
782
+ set internalValue(value) {
783
+ if (value === undefined) {
784
+ this.isEmptyObject = false;
785
+ this._predictBy = undefined;
786
+ this._preferPredictionViolation = undefined;
787
+ }
788
+ else {
789
+ this.isEmptyObject = Object.keys(value).length === 0;
790
+ this._predictBy = value.predictBy;
791
+ this._preferPredictionViolation = value.preferPredictionViolation;
792
+ }
793
+ }
794
+ get predictBy() {
795
+ return this.getNumberAttribute('predict_by');
796
+ }
797
+ set predictBy(value) {
798
+ this._predictBy = value;
799
+ }
800
+ resetPredictBy() {
801
+ this._predictBy = undefined;
802
+ }
803
+ // Temporarily expose input value. Use with caution.
804
+ get predictByInput() {
805
+ return this._predictBy;
806
+ }
807
+ get preferPredictionViolation() {
808
+ return this.getBooleanAttribute('prefer_prediction_violation');
809
+ }
810
+ set preferPredictionViolation(value) {
811
+ this._preferPredictionViolation = value;
812
+ }
813
+ resetPreferPredictionViolation() {
814
+ this._preferPredictionViolation = undefined;
815
+ }
816
+ // Temporarily expose input value. Use with caution.
817
+ get preferPredictionViolationInput() {
818
+ return this._preferPredictionViolation;
819
+ }
820
+ }
821
+ exports.NrqlAlertConditionTermPredictionOutputReference = NrqlAlertConditionTermPredictionOutputReference;
822
+ _f = JSII_RTTI_SYMBOL_1;
823
+ NrqlAlertConditionTermPredictionOutputReference[_f] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionTermPredictionOutputReference", version: "14.0.0" };
824
+ function nrqlAlertConditionTermToTerraform(struct) {
825
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
826
+ return struct;
827
+ }
828
+ if (cdktn.isComplexElement(struct)) {
829
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
830
+ }
831
+ return {
832
+ disable_health_status_reporting: cdktn.booleanToTerraform(struct.disableHealthStatusReporting),
833
+ duration: cdktn.numberToTerraform(struct.duration),
834
+ operator: cdktn.stringToTerraform(struct.operator),
835
+ priority: cdktn.stringToTerraform(struct.priority),
836
+ threshold: cdktn.numberToTerraform(struct.threshold),
837
+ threshold_duration: cdktn.numberToTerraform(struct.thresholdDuration),
838
+ threshold_occurrences: cdktn.stringToTerraform(struct.thresholdOccurrences),
839
+ time_function: cdktn.stringToTerraform(struct.timeFunction),
840
+ prediction: nrqlAlertConditionTermPredictionToTerraform(struct.prediction),
841
+ };
842
+ }
843
+ function nrqlAlertConditionTermToHclTerraform(struct) {
844
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
845
+ return struct;
846
+ }
847
+ if (cdktn.isComplexElement(struct)) {
848
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
849
+ }
850
+ const attrs = {
851
+ disable_health_status_reporting: {
852
+ value: cdktn.booleanToHclTerraform(struct.disableHealthStatusReporting),
853
+ isBlock: false,
854
+ type: "simple",
855
+ storageClassType: "boolean",
856
+ },
857
+ duration: {
858
+ value: cdktn.numberToHclTerraform(struct.duration),
859
+ isBlock: false,
860
+ type: "simple",
861
+ storageClassType: "number",
862
+ },
863
+ operator: {
864
+ value: cdktn.stringToHclTerraform(struct.operator),
865
+ isBlock: false,
866
+ type: "simple",
867
+ storageClassType: "string",
868
+ },
869
+ priority: {
870
+ value: cdktn.stringToHclTerraform(struct.priority),
871
+ isBlock: false,
872
+ type: "simple",
873
+ storageClassType: "string",
874
+ },
875
+ threshold: {
876
+ value: cdktn.numberToHclTerraform(struct.threshold),
877
+ isBlock: false,
878
+ type: "simple",
879
+ storageClassType: "number",
880
+ },
881
+ threshold_duration: {
882
+ value: cdktn.numberToHclTerraform(struct.thresholdDuration),
883
+ isBlock: false,
884
+ type: "simple",
885
+ storageClassType: "number",
886
+ },
887
+ threshold_occurrences: {
888
+ value: cdktn.stringToHclTerraform(struct.thresholdOccurrences),
889
+ isBlock: false,
890
+ type: "simple",
891
+ storageClassType: "string",
892
+ },
893
+ time_function: {
894
+ value: cdktn.stringToHclTerraform(struct.timeFunction),
895
+ isBlock: false,
896
+ type: "simple",
897
+ storageClassType: "string",
898
+ },
899
+ prediction: {
900
+ value: nrqlAlertConditionTermPredictionToHclTerraform(struct.prediction),
901
+ isBlock: true,
902
+ type: "set",
903
+ storageClassType: "NrqlAlertConditionTermPredictionList",
904
+ },
905
+ };
906
+ // remove undefined attributes
907
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
908
+ }
909
+ class NrqlAlertConditionTermOutputReference extends cdktn.ComplexObject {
910
+ /**
911
+ * @param terraformResource The parent resource
912
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
913
+ * @param complexObjectIndex the index of this item in the list
914
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
915
+ */
916
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
917
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
918
+ this.isEmptyObject = false;
919
+ // prediction - computed: false, optional: true, required: false
920
+ this._prediction = new NrqlAlertConditionTermPredictionOutputReference(this, "prediction");
921
+ }
922
+ get internalValue() {
923
+ if (this.resolvableValue) {
924
+ return this.resolvableValue;
925
+ }
926
+ let hasAnyValues = this.isEmptyObject;
927
+ const internalValueResult = {};
928
+ if (this._disableHealthStatusReporting !== undefined) {
929
+ hasAnyValues = true;
930
+ internalValueResult.disableHealthStatusReporting = this._disableHealthStatusReporting;
931
+ }
932
+ if (this._duration !== undefined) {
933
+ hasAnyValues = true;
934
+ internalValueResult.duration = this._duration;
935
+ }
936
+ if (this._operator !== undefined) {
937
+ hasAnyValues = true;
938
+ internalValueResult.operator = this._operator;
939
+ }
940
+ if (this._priority !== undefined) {
941
+ hasAnyValues = true;
942
+ internalValueResult.priority = this._priority;
943
+ }
944
+ if (this._threshold !== undefined) {
945
+ hasAnyValues = true;
946
+ internalValueResult.threshold = this._threshold;
947
+ }
948
+ if (this._thresholdDuration !== undefined) {
949
+ hasAnyValues = true;
950
+ internalValueResult.thresholdDuration = this._thresholdDuration;
951
+ }
952
+ if (this._thresholdOccurrences !== undefined) {
953
+ hasAnyValues = true;
954
+ internalValueResult.thresholdOccurrences = this._thresholdOccurrences;
955
+ }
956
+ if (this._timeFunction !== undefined) {
957
+ hasAnyValues = true;
958
+ internalValueResult.timeFunction = this._timeFunction;
959
+ }
960
+ if (this._prediction?.internalValue !== undefined) {
961
+ hasAnyValues = true;
962
+ internalValueResult.prediction = this._prediction?.internalValue;
963
+ }
964
+ return hasAnyValues ? internalValueResult : undefined;
965
+ }
966
+ set internalValue(value) {
967
+ if (value === undefined) {
968
+ this.isEmptyObject = false;
969
+ this.resolvableValue = undefined;
970
+ this._disableHealthStatusReporting = undefined;
971
+ this._duration = undefined;
972
+ this._operator = undefined;
973
+ this._priority = undefined;
974
+ this._threshold = undefined;
975
+ this._thresholdDuration = undefined;
976
+ this._thresholdOccurrences = undefined;
977
+ this._timeFunction = undefined;
978
+ this._prediction.internalValue = undefined;
979
+ }
980
+ else if (cdktn.Tokenization.isResolvable(value)) {
981
+ this.isEmptyObject = false;
982
+ this.resolvableValue = value;
983
+ }
984
+ else {
985
+ this.isEmptyObject = Object.keys(value).length === 0;
986
+ this.resolvableValue = undefined;
987
+ this._disableHealthStatusReporting = value.disableHealthStatusReporting;
988
+ this._duration = value.duration;
989
+ this._operator = value.operator;
990
+ this._priority = value.priority;
991
+ this._threshold = value.threshold;
992
+ this._thresholdDuration = value.thresholdDuration;
993
+ this._thresholdOccurrences = value.thresholdOccurrences;
994
+ this._timeFunction = value.timeFunction;
995
+ this._prediction.internalValue = value.prediction;
996
+ }
997
+ }
998
+ get disableHealthStatusReporting() {
999
+ return this.getBooleanAttribute('disable_health_status_reporting');
1000
+ }
1001
+ set disableHealthStatusReporting(value) {
1002
+ this._disableHealthStatusReporting = value;
1003
+ }
1004
+ resetDisableHealthStatusReporting() {
1005
+ this._disableHealthStatusReporting = undefined;
1006
+ }
1007
+ // Temporarily expose input value. Use with caution.
1008
+ get disableHealthStatusReportingInput() {
1009
+ return this._disableHealthStatusReporting;
1010
+ }
1011
+ get duration() {
1012
+ return this.getNumberAttribute('duration');
1013
+ }
1014
+ set duration(value) {
1015
+ this._duration = value;
1016
+ }
1017
+ resetDuration() {
1018
+ this._duration = undefined;
1019
+ }
1020
+ // Temporarily expose input value. Use with caution.
1021
+ get durationInput() {
1022
+ return this._duration;
1023
+ }
1024
+ get operator() {
1025
+ return this.getStringAttribute('operator');
1026
+ }
1027
+ set operator(value) {
1028
+ this._operator = value;
1029
+ }
1030
+ resetOperator() {
1031
+ this._operator = undefined;
1032
+ }
1033
+ // Temporarily expose input value. Use with caution.
1034
+ get operatorInput() {
1035
+ return this._operator;
1036
+ }
1037
+ get priority() {
1038
+ return this.getStringAttribute('priority');
1039
+ }
1040
+ set priority(value) {
1041
+ this._priority = value;
1042
+ }
1043
+ resetPriority() {
1044
+ this._priority = undefined;
1045
+ }
1046
+ // Temporarily expose input value. Use with caution.
1047
+ get priorityInput() {
1048
+ return this._priority;
1049
+ }
1050
+ get threshold() {
1051
+ return this.getNumberAttribute('threshold');
1052
+ }
1053
+ set threshold(value) {
1054
+ this._threshold = value;
1055
+ }
1056
+ // Temporarily expose input value. Use with caution.
1057
+ get thresholdInput() {
1058
+ return this._threshold;
1059
+ }
1060
+ get thresholdDuration() {
1061
+ return this.getNumberAttribute('threshold_duration');
1062
+ }
1063
+ set thresholdDuration(value) {
1064
+ this._thresholdDuration = value;
1065
+ }
1066
+ resetThresholdDuration() {
1067
+ this._thresholdDuration = undefined;
1068
+ }
1069
+ // Temporarily expose input value. Use with caution.
1070
+ get thresholdDurationInput() {
1071
+ return this._thresholdDuration;
1072
+ }
1073
+ get thresholdOccurrences() {
1074
+ return this.getStringAttribute('threshold_occurrences');
1075
+ }
1076
+ set thresholdOccurrences(value) {
1077
+ this._thresholdOccurrences = value;
1078
+ }
1079
+ resetThresholdOccurrences() {
1080
+ this._thresholdOccurrences = undefined;
1081
+ }
1082
+ // Temporarily expose input value. Use with caution.
1083
+ get thresholdOccurrencesInput() {
1084
+ return this._thresholdOccurrences;
1085
+ }
1086
+ get timeFunction() {
1087
+ return this.getStringAttribute('time_function');
1088
+ }
1089
+ set timeFunction(value) {
1090
+ this._timeFunction = value;
1091
+ }
1092
+ resetTimeFunction() {
1093
+ this._timeFunction = undefined;
1094
+ }
1095
+ // Temporarily expose input value. Use with caution.
1096
+ get timeFunctionInput() {
1097
+ return this._timeFunction;
1098
+ }
1099
+ get prediction() {
1100
+ return this._prediction;
1101
+ }
1102
+ putPrediction(value) {
1103
+ this._prediction.internalValue = value;
1104
+ }
1105
+ resetPrediction() {
1106
+ this._prediction.internalValue = undefined;
1107
+ }
1108
+ // Temporarily expose input value. Use with caution.
1109
+ get predictionInput() {
1110
+ return this._prediction.internalValue;
1111
+ }
1112
+ }
1113
+ exports.NrqlAlertConditionTermOutputReference = NrqlAlertConditionTermOutputReference;
1114
+ _g = JSII_RTTI_SYMBOL_1;
1115
+ NrqlAlertConditionTermOutputReference[_g] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionTermOutputReference", version: "14.0.0" };
1116
+ class NrqlAlertConditionTermList extends cdktn.ComplexList {
1117
+ /**
1118
+ * @param terraformResource The parent resource
1119
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1120
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1121
+ */
1122
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
1123
+ super(terraformResource, terraformAttribute, wrapsSet);
1124
+ this.terraformResource = terraformResource;
1125
+ this.terraformAttribute = terraformAttribute;
1126
+ this.wrapsSet = wrapsSet;
1127
+ }
1128
+ /**
1129
+ * @param index the index of the item to return
1130
+ */
1131
+ get(index) {
1132
+ return new NrqlAlertConditionTermOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
1133
+ }
1134
+ }
1135
+ exports.NrqlAlertConditionTermList = NrqlAlertConditionTermList;
1136
+ _h = JSII_RTTI_SYMBOL_1;
1137
+ NrqlAlertConditionTermList[_h] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionTermList", version: "14.0.0" };
1138
+ function nrqlAlertConditionTimeoutsToTerraform(struct) {
1139
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1140
+ return struct;
1141
+ }
1142
+ if (cdktn.isComplexElement(struct)) {
1143
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1144
+ }
1145
+ return {
1146
+ create: cdktn.stringToTerraform(struct.create),
1147
+ };
1148
+ }
1149
+ function nrqlAlertConditionTimeoutsToHclTerraform(struct) {
1150
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1151
+ return struct;
1152
+ }
1153
+ if (cdktn.isComplexElement(struct)) {
1154
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1155
+ }
1156
+ const attrs = {
1157
+ create: {
1158
+ value: cdktn.stringToHclTerraform(struct.create),
1159
+ isBlock: false,
1160
+ type: "simple",
1161
+ storageClassType: "string",
1162
+ },
1163
+ };
1164
+ // remove undefined attributes
1165
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1166
+ }
1167
+ class NrqlAlertConditionTimeoutsOutputReference extends cdktn.ComplexObject {
1168
+ /**
1169
+ * @param terraformResource The parent resource
1170
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1171
+ */
1172
+ constructor(terraformResource, terraformAttribute) {
1173
+ super(terraformResource, terraformAttribute, false);
1174
+ this.isEmptyObject = false;
1175
+ }
1176
+ get internalValue() {
1177
+ if (this.resolvableValue) {
1178
+ return this.resolvableValue;
1179
+ }
1180
+ let hasAnyValues = this.isEmptyObject;
1181
+ const internalValueResult = {};
1182
+ if (this._create !== undefined) {
1183
+ hasAnyValues = true;
1184
+ internalValueResult.create = this._create;
1185
+ }
1186
+ return hasAnyValues ? internalValueResult : undefined;
1187
+ }
1188
+ set internalValue(value) {
1189
+ if (value === undefined) {
1190
+ this.isEmptyObject = false;
1191
+ this.resolvableValue = undefined;
1192
+ this._create = undefined;
1193
+ }
1194
+ else if (cdktn.Tokenization.isResolvable(value)) {
1195
+ this.isEmptyObject = false;
1196
+ this.resolvableValue = value;
1197
+ }
1198
+ else {
1199
+ this.isEmptyObject = Object.keys(value).length === 0;
1200
+ this.resolvableValue = undefined;
1201
+ this._create = value.create;
1202
+ }
1203
+ }
1204
+ get create() {
1205
+ return this.getStringAttribute('create');
1206
+ }
1207
+ set create(value) {
1208
+ this._create = value;
1209
+ }
1210
+ resetCreate() {
1211
+ this._create = undefined;
1212
+ }
1213
+ // Temporarily expose input value. Use with caution.
1214
+ get createInput() {
1215
+ return this._create;
1216
+ }
1217
+ }
1218
+ exports.NrqlAlertConditionTimeoutsOutputReference = NrqlAlertConditionTimeoutsOutputReference;
1219
+ _j = JSII_RTTI_SYMBOL_1;
1220
+ NrqlAlertConditionTimeoutsOutputReference[_j] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionTimeoutsOutputReference", version: "14.0.0" };
1221
+ function nrqlAlertConditionWarningPredictionToTerraform(struct) {
1222
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1223
+ return struct;
1224
+ }
1225
+ if (cdktn.isComplexElement(struct)) {
1226
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1227
+ }
1228
+ return {
1229
+ predict_by: cdktn.numberToTerraform(struct.predictBy),
1230
+ prefer_prediction_violation: cdktn.booleanToTerraform(struct.preferPredictionViolation),
1231
+ };
1232
+ }
1233
+ function nrqlAlertConditionWarningPredictionToHclTerraform(struct) {
1234
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1235
+ return struct;
1236
+ }
1237
+ if (cdktn.isComplexElement(struct)) {
1238
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1239
+ }
1240
+ const attrs = {
1241
+ predict_by: {
1242
+ value: cdktn.numberToHclTerraform(struct.predictBy),
1243
+ isBlock: false,
1244
+ type: "simple",
1245
+ storageClassType: "number",
1246
+ },
1247
+ prefer_prediction_violation: {
1248
+ value: cdktn.booleanToHclTerraform(struct.preferPredictionViolation),
1249
+ isBlock: false,
1250
+ type: "simple",
1251
+ storageClassType: "boolean",
1252
+ },
1253
+ };
1254
+ // remove undefined attributes
1255
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1256
+ }
1257
+ class NrqlAlertConditionWarningPredictionOutputReference extends cdktn.ComplexObject {
1258
+ /**
1259
+ * @param terraformResource The parent resource
1260
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1261
+ */
1262
+ constructor(terraformResource, terraformAttribute) {
1263
+ super(terraformResource, terraformAttribute, false, 0);
1264
+ this.isEmptyObject = false;
1265
+ }
1266
+ get internalValue() {
1267
+ let hasAnyValues = this.isEmptyObject;
1268
+ const internalValueResult = {};
1269
+ if (this._predictBy !== undefined) {
1270
+ hasAnyValues = true;
1271
+ internalValueResult.predictBy = this._predictBy;
1272
+ }
1273
+ if (this._preferPredictionViolation !== undefined) {
1274
+ hasAnyValues = true;
1275
+ internalValueResult.preferPredictionViolation = this._preferPredictionViolation;
1276
+ }
1277
+ return hasAnyValues ? internalValueResult : undefined;
1278
+ }
1279
+ set internalValue(value) {
1280
+ if (value === undefined) {
1281
+ this.isEmptyObject = false;
1282
+ this._predictBy = undefined;
1283
+ this._preferPredictionViolation = undefined;
1284
+ }
1285
+ else {
1286
+ this.isEmptyObject = Object.keys(value).length === 0;
1287
+ this._predictBy = value.predictBy;
1288
+ this._preferPredictionViolation = value.preferPredictionViolation;
1289
+ }
1290
+ }
1291
+ get predictBy() {
1292
+ return this.getNumberAttribute('predict_by');
1293
+ }
1294
+ set predictBy(value) {
1295
+ this._predictBy = value;
1296
+ }
1297
+ resetPredictBy() {
1298
+ this._predictBy = undefined;
1299
+ }
1300
+ // Temporarily expose input value. Use with caution.
1301
+ get predictByInput() {
1302
+ return this._predictBy;
1303
+ }
1304
+ get preferPredictionViolation() {
1305
+ return this.getBooleanAttribute('prefer_prediction_violation');
1306
+ }
1307
+ set preferPredictionViolation(value) {
1308
+ this._preferPredictionViolation = value;
1309
+ }
1310
+ resetPreferPredictionViolation() {
1311
+ this._preferPredictionViolation = undefined;
1312
+ }
1313
+ // Temporarily expose input value. Use with caution.
1314
+ get preferPredictionViolationInput() {
1315
+ return this._preferPredictionViolation;
1316
+ }
1317
+ }
1318
+ exports.NrqlAlertConditionWarningPredictionOutputReference = NrqlAlertConditionWarningPredictionOutputReference;
1319
+ _k = JSII_RTTI_SYMBOL_1;
1320
+ NrqlAlertConditionWarningPredictionOutputReference[_k] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionWarningPredictionOutputReference", version: "14.0.0" };
1321
+ function nrqlAlertConditionWarningToTerraform(struct) {
1322
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1323
+ return struct;
1324
+ }
1325
+ if (cdktn.isComplexElement(struct)) {
1326
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1327
+ }
1328
+ return {
1329
+ disable_health_status_reporting: cdktn.booleanToTerraform(struct.disableHealthStatusReporting),
1330
+ duration: cdktn.numberToTerraform(struct.duration),
1331
+ operator: cdktn.stringToTerraform(struct.operator),
1332
+ threshold: cdktn.numberToTerraform(struct.threshold),
1333
+ threshold_duration: cdktn.numberToTerraform(struct.thresholdDuration),
1334
+ threshold_occurrences: cdktn.stringToTerraform(struct.thresholdOccurrences),
1335
+ time_function: cdktn.stringToTerraform(struct.timeFunction),
1336
+ prediction: nrqlAlertConditionWarningPredictionToTerraform(struct.prediction),
1337
+ };
1338
+ }
1339
+ function nrqlAlertConditionWarningToHclTerraform(struct) {
1340
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1341
+ return struct;
1342
+ }
1343
+ if (cdktn.isComplexElement(struct)) {
1344
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1345
+ }
1346
+ const attrs = {
1347
+ disable_health_status_reporting: {
1348
+ value: cdktn.booleanToHclTerraform(struct.disableHealthStatusReporting),
1349
+ isBlock: false,
1350
+ type: "simple",
1351
+ storageClassType: "boolean",
1352
+ },
1353
+ duration: {
1354
+ value: cdktn.numberToHclTerraform(struct.duration),
1355
+ isBlock: false,
1356
+ type: "simple",
1357
+ storageClassType: "number",
1358
+ },
1359
+ operator: {
1360
+ value: cdktn.stringToHclTerraform(struct.operator),
1361
+ isBlock: false,
1362
+ type: "simple",
1363
+ storageClassType: "string",
1364
+ },
1365
+ threshold: {
1366
+ value: cdktn.numberToHclTerraform(struct.threshold),
1367
+ isBlock: false,
1368
+ type: "simple",
1369
+ storageClassType: "number",
1370
+ },
1371
+ threshold_duration: {
1372
+ value: cdktn.numberToHclTerraform(struct.thresholdDuration),
1373
+ isBlock: false,
1374
+ type: "simple",
1375
+ storageClassType: "number",
1376
+ },
1377
+ threshold_occurrences: {
1378
+ value: cdktn.stringToHclTerraform(struct.thresholdOccurrences),
1379
+ isBlock: false,
1380
+ type: "simple",
1381
+ storageClassType: "string",
1382
+ },
1383
+ time_function: {
1384
+ value: cdktn.stringToHclTerraform(struct.timeFunction),
1385
+ isBlock: false,
1386
+ type: "simple",
1387
+ storageClassType: "string",
1388
+ },
1389
+ prediction: {
1390
+ value: nrqlAlertConditionWarningPredictionToHclTerraform(struct.prediction),
1391
+ isBlock: true,
1392
+ type: "set",
1393
+ storageClassType: "NrqlAlertConditionWarningPredictionList",
1394
+ },
1395
+ };
1396
+ // remove undefined attributes
1397
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1398
+ }
1399
+ class NrqlAlertConditionWarningOutputReference extends cdktn.ComplexObject {
1400
+ /**
1401
+ * @param terraformResource The parent resource
1402
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1403
+ */
1404
+ constructor(terraformResource, terraformAttribute) {
1405
+ super(terraformResource, terraformAttribute, false, 0);
1406
+ this.isEmptyObject = false;
1407
+ // prediction - computed: false, optional: true, required: false
1408
+ this._prediction = new NrqlAlertConditionWarningPredictionOutputReference(this, "prediction");
1409
+ }
1410
+ get internalValue() {
1411
+ let hasAnyValues = this.isEmptyObject;
1412
+ const internalValueResult = {};
1413
+ if (this._disableHealthStatusReporting !== undefined) {
1414
+ hasAnyValues = true;
1415
+ internalValueResult.disableHealthStatusReporting = this._disableHealthStatusReporting;
1416
+ }
1417
+ if (this._duration !== undefined) {
1418
+ hasAnyValues = true;
1419
+ internalValueResult.duration = this._duration;
1420
+ }
1421
+ if (this._operator !== undefined) {
1422
+ hasAnyValues = true;
1423
+ internalValueResult.operator = this._operator;
1424
+ }
1425
+ if (this._threshold !== undefined) {
1426
+ hasAnyValues = true;
1427
+ internalValueResult.threshold = this._threshold;
1428
+ }
1429
+ if (this._thresholdDuration !== undefined) {
1430
+ hasAnyValues = true;
1431
+ internalValueResult.thresholdDuration = this._thresholdDuration;
1432
+ }
1433
+ if (this._thresholdOccurrences !== undefined) {
1434
+ hasAnyValues = true;
1435
+ internalValueResult.thresholdOccurrences = this._thresholdOccurrences;
1436
+ }
1437
+ if (this._timeFunction !== undefined) {
1438
+ hasAnyValues = true;
1439
+ internalValueResult.timeFunction = this._timeFunction;
1440
+ }
1441
+ if (this._prediction?.internalValue !== undefined) {
1442
+ hasAnyValues = true;
1443
+ internalValueResult.prediction = this._prediction?.internalValue;
1444
+ }
1445
+ return hasAnyValues ? internalValueResult : undefined;
1446
+ }
1447
+ set internalValue(value) {
1448
+ if (value === undefined) {
1449
+ this.isEmptyObject = false;
1450
+ this._disableHealthStatusReporting = undefined;
1451
+ this._duration = undefined;
1452
+ this._operator = undefined;
1453
+ this._threshold = undefined;
1454
+ this._thresholdDuration = undefined;
1455
+ this._thresholdOccurrences = undefined;
1456
+ this._timeFunction = undefined;
1457
+ this._prediction.internalValue = undefined;
1458
+ }
1459
+ else {
1460
+ this.isEmptyObject = Object.keys(value).length === 0;
1461
+ this._disableHealthStatusReporting = value.disableHealthStatusReporting;
1462
+ this._duration = value.duration;
1463
+ this._operator = value.operator;
1464
+ this._threshold = value.threshold;
1465
+ this._thresholdDuration = value.thresholdDuration;
1466
+ this._thresholdOccurrences = value.thresholdOccurrences;
1467
+ this._timeFunction = value.timeFunction;
1468
+ this._prediction.internalValue = value.prediction;
1469
+ }
1470
+ }
1471
+ get disableHealthStatusReporting() {
1472
+ return this.getBooleanAttribute('disable_health_status_reporting');
1473
+ }
1474
+ set disableHealthStatusReporting(value) {
1475
+ this._disableHealthStatusReporting = value;
1476
+ }
1477
+ resetDisableHealthStatusReporting() {
1478
+ this._disableHealthStatusReporting = undefined;
1479
+ }
1480
+ // Temporarily expose input value. Use with caution.
1481
+ get disableHealthStatusReportingInput() {
1482
+ return this._disableHealthStatusReporting;
1483
+ }
1484
+ get duration() {
1485
+ return this.getNumberAttribute('duration');
1486
+ }
1487
+ set duration(value) {
1488
+ this._duration = value;
1489
+ }
1490
+ resetDuration() {
1491
+ this._duration = undefined;
1492
+ }
1493
+ // Temporarily expose input value. Use with caution.
1494
+ get durationInput() {
1495
+ return this._duration;
1496
+ }
1497
+ get operator() {
1498
+ return this.getStringAttribute('operator');
1499
+ }
1500
+ set operator(value) {
1501
+ this._operator = value;
1502
+ }
1503
+ resetOperator() {
1504
+ this._operator = undefined;
1505
+ }
1506
+ // Temporarily expose input value. Use with caution.
1507
+ get operatorInput() {
1508
+ return this._operator;
1509
+ }
1510
+ get threshold() {
1511
+ return this.getNumberAttribute('threshold');
1512
+ }
1513
+ set threshold(value) {
1514
+ this._threshold = value;
1515
+ }
1516
+ // Temporarily expose input value. Use with caution.
1517
+ get thresholdInput() {
1518
+ return this._threshold;
1519
+ }
1520
+ get thresholdDuration() {
1521
+ return this.getNumberAttribute('threshold_duration');
1522
+ }
1523
+ set thresholdDuration(value) {
1524
+ this._thresholdDuration = value;
1525
+ }
1526
+ resetThresholdDuration() {
1527
+ this._thresholdDuration = undefined;
1528
+ }
1529
+ // Temporarily expose input value. Use with caution.
1530
+ get thresholdDurationInput() {
1531
+ return this._thresholdDuration;
1532
+ }
1533
+ get thresholdOccurrences() {
1534
+ return this.getStringAttribute('threshold_occurrences');
1535
+ }
1536
+ set thresholdOccurrences(value) {
1537
+ this._thresholdOccurrences = value;
1538
+ }
1539
+ resetThresholdOccurrences() {
1540
+ this._thresholdOccurrences = undefined;
1541
+ }
1542
+ // Temporarily expose input value. Use with caution.
1543
+ get thresholdOccurrencesInput() {
1544
+ return this._thresholdOccurrences;
1545
+ }
1546
+ get timeFunction() {
1547
+ return this.getStringAttribute('time_function');
1548
+ }
1549
+ set timeFunction(value) {
1550
+ this._timeFunction = value;
1551
+ }
1552
+ resetTimeFunction() {
1553
+ this._timeFunction = undefined;
1554
+ }
1555
+ // Temporarily expose input value. Use with caution.
1556
+ get timeFunctionInput() {
1557
+ return this._timeFunction;
1558
+ }
1559
+ get prediction() {
1560
+ return this._prediction;
1561
+ }
1562
+ putPrediction(value) {
1563
+ this._prediction.internalValue = value;
1564
+ }
1565
+ resetPrediction() {
1566
+ this._prediction.internalValue = undefined;
1567
+ }
1568
+ // Temporarily expose input value. Use with caution.
1569
+ get predictionInput() {
1570
+ return this._prediction.internalValue;
1571
+ }
1572
+ }
1573
+ exports.NrqlAlertConditionWarningOutputReference = NrqlAlertConditionWarningOutputReference;
1574
+ _l = JSII_RTTI_SYMBOL_1;
1575
+ NrqlAlertConditionWarningOutputReference[_l] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionWarningOutputReference", version: "14.0.0" };
1576
+ /**
1577
+ * Represents a {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/nrql_alert_condition newrelic_nrql_alert_condition}
1578
+ */
1579
+ class NrqlAlertCondition extends cdktn.TerraformResource {
1580
+ // ==============
1581
+ // STATIC Methods
1582
+ // ==============
1583
+ /**
1584
+ * Generates CDKTN code for importing a NrqlAlertCondition resource upon running "cdktn plan <stack-name>"
1585
+ * @param scope The scope in which to define this construct
1586
+ * @param importToId The construct id used in the generated config for the NrqlAlertCondition to import
1587
+ * @param importFromId The id of the existing NrqlAlertCondition that should be imported. Refer to the {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/nrql_alert_condition#import import section} in the documentation of this resource for the id to use
1588
+ * @param provider? Optional instance of the provider where the NrqlAlertCondition to import is found
1589
+ */
1590
+ static generateConfigForImport(scope, importToId, importFromId, provider) {
1591
+ return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "newrelic_nrql_alert_condition", importId: importFromId, provider });
1592
+ }
1593
+ // ===========
1594
+ // INITIALIZER
1595
+ // ===========
1596
+ /**
1597
+ * Create a new {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/nrql_alert_condition newrelic_nrql_alert_condition} Resource
1598
+ *
1599
+ * @param scope The scope in which to define this construct
1600
+ * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
1601
+ * @param options NrqlAlertConditionConfig
1602
+ */
1603
+ constructor(scope, id, config) {
1604
+ super(scope, id, {
1605
+ terraformResourceType: 'newrelic_nrql_alert_condition',
1606
+ terraformGeneratorMetadata: {
1607
+ providerName: 'newrelic',
1608
+ providerVersion: '3.80.2',
1609
+ providerVersionConstraint: '~> 3.7'
1610
+ },
1611
+ provider: config.provider,
1612
+ dependsOn: config.dependsOn,
1613
+ count: config.count,
1614
+ lifecycle: config.lifecycle,
1615
+ provisioners: config.provisioners,
1616
+ connection: config.connection,
1617
+ forEach: config.forEach
1618
+ });
1619
+ // critical - computed: false, optional: true, required: false
1620
+ this._critical = new NrqlAlertConditionCriticalOutputReference(this, "critical");
1621
+ // nrql - computed: false, optional: false, required: true
1622
+ this._nrql = new NrqlAlertConditionNrqlOutputReference(this, "nrql");
1623
+ // outlier_configuration - computed: false, optional: true, required: false
1624
+ this._outlierConfiguration = new NrqlAlertConditionOutlierConfigurationOutputReference(this, "outlier_configuration");
1625
+ // term - computed: false, optional: true, required: false
1626
+ this._term = new NrqlAlertConditionTermList(this, "term", true);
1627
+ // timeouts - computed: false, optional: true, required: false
1628
+ this._timeouts = new NrqlAlertConditionTimeoutsOutputReference(this, "timeouts");
1629
+ // warning - computed: false, optional: true, required: false
1630
+ this._warning = new NrqlAlertConditionWarningOutputReference(this, "warning");
1631
+ this._accountId = config.accountId;
1632
+ this._aggregationDelay = config.aggregationDelay;
1633
+ this._aggregationMethod = config.aggregationMethod;
1634
+ this._aggregationTimer = config.aggregationTimer;
1635
+ this._aggregationWindow = config.aggregationWindow;
1636
+ this._baselineDirection = config.baselineDirection;
1637
+ this._closeViolationsOnExpiration = config.closeViolationsOnExpiration;
1638
+ this._description = config.description;
1639
+ this._enabled = config.enabled;
1640
+ this._evaluationDelay = config.evaluationDelay;
1641
+ this._expirationDuration = config.expirationDuration;
1642
+ this._fillOption = config.fillOption;
1643
+ this._fillValue = config.fillValue;
1644
+ this._id = config.id;
1645
+ this._ignoreOnExpectedTermination = config.ignoreOnExpectedTermination;
1646
+ this._name = config.name;
1647
+ this._openViolationOnExpiration = config.openViolationOnExpiration;
1648
+ this._policyId = config.policyId;
1649
+ this._runbookUrl = config.runbookUrl;
1650
+ this._signalSeasonality = config.signalSeasonality;
1651
+ this._slideBy = config.slideBy;
1652
+ this._targetEntity = config.targetEntity;
1653
+ this._titleTemplate = config.titleTemplate;
1654
+ this._type = config.type;
1655
+ this._violationTimeLimit = config.violationTimeLimit;
1656
+ this._violationTimeLimitSeconds = config.violationTimeLimitSeconds;
1657
+ this._critical.internalValue = config.critical;
1658
+ this._nrql.internalValue = config.nrql;
1659
+ this._outlierConfiguration.internalValue = config.outlierConfiguration;
1660
+ this._term.internalValue = config.term;
1661
+ this._timeouts.internalValue = config.timeouts;
1662
+ this._warning.internalValue = config.warning;
1663
+ }
1664
+ get accountId() {
1665
+ return this.getNumberAttribute('account_id');
1666
+ }
1667
+ set accountId(value) {
1668
+ this._accountId = value;
1669
+ }
1670
+ resetAccountId() {
1671
+ this._accountId = undefined;
1672
+ }
1673
+ // Temporarily expose input value. Use with caution.
1674
+ get accountIdInput() {
1675
+ return this._accountId;
1676
+ }
1677
+ get aggregationDelay() {
1678
+ return this.getStringAttribute('aggregation_delay');
1679
+ }
1680
+ set aggregationDelay(value) {
1681
+ this._aggregationDelay = value;
1682
+ }
1683
+ resetAggregationDelay() {
1684
+ this._aggregationDelay = undefined;
1685
+ }
1686
+ // Temporarily expose input value. Use with caution.
1687
+ get aggregationDelayInput() {
1688
+ return this._aggregationDelay;
1689
+ }
1690
+ get aggregationMethod() {
1691
+ return this.getStringAttribute('aggregation_method');
1692
+ }
1693
+ set aggregationMethod(value) {
1694
+ this._aggregationMethod = value;
1695
+ }
1696
+ resetAggregationMethod() {
1697
+ this._aggregationMethod = undefined;
1698
+ }
1699
+ // Temporarily expose input value. Use with caution.
1700
+ get aggregationMethodInput() {
1701
+ return this._aggregationMethod;
1702
+ }
1703
+ get aggregationTimer() {
1704
+ return this.getStringAttribute('aggregation_timer');
1705
+ }
1706
+ set aggregationTimer(value) {
1707
+ this._aggregationTimer = value;
1708
+ }
1709
+ resetAggregationTimer() {
1710
+ this._aggregationTimer = undefined;
1711
+ }
1712
+ // Temporarily expose input value. Use with caution.
1713
+ get aggregationTimerInput() {
1714
+ return this._aggregationTimer;
1715
+ }
1716
+ get aggregationWindow() {
1717
+ return this.getNumberAttribute('aggregation_window');
1718
+ }
1719
+ set aggregationWindow(value) {
1720
+ this._aggregationWindow = value;
1721
+ }
1722
+ resetAggregationWindow() {
1723
+ this._aggregationWindow = undefined;
1724
+ }
1725
+ // Temporarily expose input value. Use with caution.
1726
+ get aggregationWindowInput() {
1727
+ return this._aggregationWindow;
1728
+ }
1729
+ get baselineDirection() {
1730
+ return this.getStringAttribute('baseline_direction');
1731
+ }
1732
+ set baselineDirection(value) {
1733
+ this._baselineDirection = value;
1734
+ }
1735
+ resetBaselineDirection() {
1736
+ this._baselineDirection = undefined;
1737
+ }
1738
+ // Temporarily expose input value. Use with caution.
1739
+ get baselineDirectionInput() {
1740
+ return this._baselineDirection;
1741
+ }
1742
+ get closeViolationsOnExpiration() {
1743
+ return this.getBooleanAttribute('close_violations_on_expiration');
1744
+ }
1745
+ set closeViolationsOnExpiration(value) {
1746
+ this._closeViolationsOnExpiration = value;
1747
+ }
1748
+ resetCloseViolationsOnExpiration() {
1749
+ this._closeViolationsOnExpiration = undefined;
1750
+ }
1751
+ // Temporarily expose input value. Use with caution.
1752
+ get closeViolationsOnExpirationInput() {
1753
+ return this._closeViolationsOnExpiration;
1754
+ }
1755
+ get description() {
1756
+ return this.getStringAttribute('description');
1757
+ }
1758
+ set description(value) {
1759
+ this._description = value;
1760
+ }
1761
+ resetDescription() {
1762
+ this._description = undefined;
1763
+ }
1764
+ // Temporarily expose input value. Use with caution.
1765
+ get descriptionInput() {
1766
+ return this._description;
1767
+ }
1768
+ get enabled() {
1769
+ return this.getBooleanAttribute('enabled');
1770
+ }
1771
+ set enabled(value) {
1772
+ this._enabled = value;
1773
+ }
1774
+ resetEnabled() {
1775
+ this._enabled = undefined;
1776
+ }
1777
+ // Temporarily expose input value. Use with caution.
1778
+ get enabledInput() {
1779
+ return this._enabled;
1780
+ }
1781
+ // entity_guid - computed: true, optional: false, required: false
1782
+ get entityGuid() {
1783
+ return this.getStringAttribute('entity_guid');
1784
+ }
1785
+ get evaluationDelay() {
1786
+ return this.getNumberAttribute('evaluation_delay');
1787
+ }
1788
+ set evaluationDelay(value) {
1789
+ this._evaluationDelay = value;
1790
+ }
1791
+ resetEvaluationDelay() {
1792
+ this._evaluationDelay = undefined;
1793
+ }
1794
+ // Temporarily expose input value. Use with caution.
1795
+ get evaluationDelayInput() {
1796
+ return this._evaluationDelay;
1797
+ }
1798
+ get expirationDuration() {
1799
+ return this.getNumberAttribute('expiration_duration');
1800
+ }
1801
+ set expirationDuration(value) {
1802
+ this._expirationDuration = value;
1803
+ }
1804
+ resetExpirationDuration() {
1805
+ this._expirationDuration = undefined;
1806
+ }
1807
+ // Temporarily expose input value. Use with caution.
1808
+ get expirationDurationInput() {
1809
+ return this._expirationDuration;
1810
+ }
1811
+ get fillOption() {
1812
+ return this.getStringAttribute('fill_option');
1813
+ }
1814
+ set fillOption(value) {
1815
+ this._fillOption = value;
1816
+ }
1817
+ resetFillOption() {
1818
+ this._fillOption = undefined;
1819
+ }
1820
+ // Temporarily expose input value. Use with caution.
1821
+ get fillOptionInput() {
1822
+ return this._fillOption;
1823
+ }
1824
+ get fillValue() {
1825
+ return this.getNumberAttribute('fill_value');
1826
+ }
1827
+ set fillValue(value) {
1828
+ this._fillValue = value;
1829
+ }
1830
+ resetFillValue() {
1831
+ this._fillValue = undefined;
1832
+ }
1833
+ // Temporarily expose input value. Use with caution.
1834
+ get fillValueInput() {
1835
+ return this._fillValue;
1836
+ }
1837
+ get id() {
1838
+ return this.getStringAttribute('id');
1839
+ }
1840
+ set id(value) {
1841
+ this._id = value;
1842
+ }
1843
+ resetId() {
1844
+ this._id = undefined;
1845
+ }
1846
+ // Temporarily expose input value. Use with caution.
1847
+ get idInput() {
1848
+ return this._id;
1849
+ }
1850
+ get ignoreOnExpectedTermination() {
1851
+ return this.getBooleanAttribute('ignore_on_expected_termination');
1852
+ }
1853
+ set ignoreOnExpectedTermination(value) {
1854
+ this._ignoreOnExpectedTermination = value;
1855
+ }
1856
+ resetIgnoreOnExpectedTermination() {
1857
+ this._ignoreOnExpectedTermination = undefined;
1858
+ }
1859
+ // Temporarily expose input value. Use with caution.
1860
+ get ignoreOnExpectedTerminationInput() {
1861
+ return this._ignoreOnExpectedTermination;
1862
+ }
1863
+ get name() {
1864
+ return this.getStringAttribute('name');
1865
+ }
1866
+ set name(value) {
1867
+ this._name = value;
1868
+ }
1869
+ // Temporarily expose input value. Use with caution.
1870
+ get nameInput() {
1871
+ return this._name;
1872
+ }
1873
+ get openViolationOnExpiration() {
1874
+ return this.getBooleanAttribute('open_violation_on_expiration');
1875
+ }
1876
+ set openViolationOnExpiration(value) {
1877
+ this._openViolationOnExpiration = value;
1878
+ }
1879
+ resetOpenViolationOnExpiration() {
1880
+ this._openViolationOnExpiration = undefined;
1881
+ }
1882
+ // Temporarily expose input value. Use with caution.
1883
+ get openViolationOnExpirationInput() {
1884
+ return this._openViolationOnExpiration;
1885
+ }
1886
+ get policyId() {
1887
+ return this.getNumberAttribute('policy_id');
1888
+ }
1889
+ set policyId(value) {
1890
+ this._policyId = value;
1891
+ }
1892
+ // Temporarily expose input value. Use with caution.
1893
+ get policyIdInput() {
1894
+ return this._policyId;
1895
+ }
1896
+ get runbookUrl() {
1897
+ return this.getStringAttribute('runbook_url');
1898
+ }
1899
+ set runbookUrl(value) {
1900
+ this._runbookUrl = value;
1901
+ }
1902
+ resetRunbookUrl() {
1903
+ this._runbookUrl = undefined;
1904
+ }
1905
+ // Temporarily expose input value. Use with caution.
1906
+ get runbookUrlInput() {
1907
+ return this._runbookUrl;
1908
+ }
1909
+ get signalSeasonality() {
1910
+ return this.getStringAttribute('signal_seasonality');
1911
+ }
1912
+ set signalSeasonality(value) {
1913
+ this._signalSeasonality = value;
1914
+ }
1915
+ resetSignalSeasonality() {
1916
+ this._signalSeasonality = undefined;
1917
+ }
1918
+ // Temporarily expose input value. Use with caution.
1919
+ get signalSeasonalityInput() {
1920
+ return this._signalSeasonality;
1921
+ }
1922
+ get slideBy() {
1923
+ return this.getNumberAttribute('slide_by');
1924
+ }
1925
+ set slideBy(value) {
1926
+ this._slideBy = value;
1927
+ }
1928
+ resetSlideBy() {
1929
+ this._slideBy = undefined;
1930
+ }
1931
+ // Temporarily expose input value. Use with caution.
1932
+ get slideByInput() {
1933
+ return this._slideBy;
1934
+ }
1935
+ get targetEntity() {
1936
+ return this.getStringAttribute('target_entity');
1937
+ }
1938
+ set targetEntity(value) {
1939
+ this._targetEntity = value;
1940
+ }
1941
+ resetTargetEntity() {
1942
+ this._targetEntity = undefined;
1943
+ }
1944
+ // Temporarily expose input value. Use with caution.
1945
+ get targetEntityInput() {
1946
+ return this._targetEntity;
1947
+ }
1948
+ get titleTemplate() {
1949
+ return this.getStringAttribute('title_template');
1950
+ }
1951
+ set titleTemplate(value) {
1952
+ this._titleTemplate = value;
1953
+ }
1954
+ resetTitleTemplate() {
1955
+ this._titleTemplate = undefined;
1956
+ }
1957
+ // Temporarily expose input value. Use with caution.
1958
+ get titleTemplateInput() {
1959
+ return this._titleTemplate;
1960
+ }
1961
+ get type() {
1962
+ return this.getStringAttribute('type');
1963
+ }
1964
+ set type(value) {
1965
+ this._type = value;
1966
+ }
1967
+ resetType() {
1968
+ this._type = undefined;
1969
+ }
1970
+ // Temporarily expose input value. Use with caution.
1971
+ get typeInput() {
1972
+ return this._type;
1973
+ }
1974
+ get violationTimeLimit() {
1975
+ return this.getStringAttribute('violation_time_limit');
1976
+ }
1977
+ set violationTimeLimit(value) {
1978
+ this._violationTimeLimit = value;
1979
+ }
1980
+ resetViolationTimeLimit() {
1981
+ this._violationTimeLimit = undefined;
1982
+ }
1983
+ // Temporarily expose input value. Use with caution.
1984
+ get violationTimeLimitInput() {
1985
+ return this._violationTimeLimit;
1986
+ }
1987
+ get violationTimeLimitSeconds() {
1988
+ return this.getNumberAttribute('violation_time_limit_seconds');
1989
+ }
1990
+ set violationTimeLimitSeconds(value) {
1991
+ this._violationTimeLimitSeconds = value;
1992
+ }
1993
+ resetViolationTimeLimitSeconds() {
1994
+ this._violationTimeLimitSeconds = undefined;
1995
+ }
1996
+ // Temporarily expose input value. Use with caution.
1997
+ get violationTimeLimitSecondsInput() {
1998
+ return this._violationTimeLimitSeconds;
1999
+ }
2000
+ get critical() {
2001
+ return this._critical;
2002
+ }
2003
+ putCritical(value) {
2004
+ this._critical.internalValue = value;
2005
+ }
2006
+ resetCritical() {
2007
+ this._critical.internalValue = undefined;
2008
+ }
2009
+ // Temporarily expose input value. Use with caution.
2010
+ get criticalInput() {
2011
+ return this._critical.internalValue;
2012
+ }
2013
+ get nrql() {
2014
+ return this._nrql;
2015
+ }
2016
+ putNrql(value) {
2017
+ this._nrql.internalValue = value;
2018
+ }
2019
+ // Temporarily expose input value. Use with caution.
2020
+ get nrqlInput() {
2021
+ return this._nrql.internalValue;
2022
+ }
2023
+ get outlierConfiguration() {
2024
+ return this._outlierConfiguration;
2025
+ }
2026
+ putOutlierConfiguration(value) {
2027
+ this._outlierConfiguration.internalValue = value;
2028
+ }
2029
+ resetOutlierConfiguration() {
2030
+ this._outlierConfiguration.internalValue = undefined;
2031
+ }
2032
+ // Temporarily expose input value. Use with caution.
2033
+ get outlierConfigurationInput() {
2034
+ return this._outlierConfiguration.internalValue;
2035
+ }
2036
+ get term() {
2037
+ return this._term;
2038
+ }
2039
+ putTerm(value) {
2040
+ this._term.internalValue = value;
2041
+ }
2042
+ resetTerm() {
2043
+ this._term.internalValue = undefined;
2044
+ }
2045
+ // Temporarily expose input value. Use with caution.
2046
+ get termInput() {
2047
+ return this._term.internalValue;
2048
+ }
2049
+ get timeouts() {
2050
+ return this._timeouts;
2051
+ }
2052
+ putTimeouts(value) {
2053
+ this._timeouts.internalValue = value;
2054
+ }
2055
+ resetTimeouts() {
2056
+ this._timeouts.internalValue = undefined;
2057
+ }
2058
+ // Temporarily expose input value. Use with caution.
2059
+ get timeoutsInput() {
2060
+ return this._timeouts.internalValue;
2061
+ }
2062
+ get warning() {
2063
+ return this._warning;
2064
+ }
2065
+ putWarning(value) {
2066
+ this._warning.internalValue = value;
2067
+ }
2068
+ resetWarning() {
2069
+ this._warning.internalValue = undefined;
2070
+ }
2071
+ // Temporarily expose input value. Use with caution.
2072
+ get warningInput() {
2073
+ return this._warning.internalValue;
2074
+ }
2075
+ // =========
2076
+ // SYNTHESIS
2077
+ // =========
2078
+ synthesizeAttributes() {
2079
+ return {
2080
+ account_id: cdktn.numberToTerraform(this._accountId),
2081
+ aggregation_delay: cdktn.stringToTerraform(this._aggregationDelay),
2082
+ aggregation_method: cdktn.stringToTerraform(this._aggregationMethod),
2083
+ aggregation_timer: cdktn.stringToTerraform(this._aggregationTimer),
2084
+ aggregation_window: cdktn.numberToTerraform(this._aggregationWindow),
2085
+ baseline_direction: cdktn.stringToTerraform(this._baselineDirection),
2086
+ close_violations_on_expiration: cdktn.booleanToTerraform(this._closeViolationsOnExpiration),
2087
+ description: cdktn.stringToTerraform(this._description),
2088
+ enabled: cdktn.booleanToTerraform(this._enabled),
2089
+ evaluation_delay: cdktn.numberToTerraform(this._evaluationDelay),
2090
+ expiration_duration: cdktn.numberToTerraform(this._expirationDuration),
2091
+ fill_option: cdktn.stringToTerraform(this._fillOption),
2092
+ fill_value: cdktn.numberToTerraform(this._fillValue),
2093
+ id: cdktn.stringToTerraform(this._id),
2094
+ ignore_on_expected_termination: cdktn.booleanToTerraform(this._ignoreOnExpectedTermination),
2095
+ name: cdktn.stringToTerraform(this._name),
2096
+ open_violation_on_expiration: cdktn.booleanToTerraform(this._openViolationOnExpiration),
2097
+ policy_id: cdktn.numberToTerraform(this._policyId),
2098
+ runbook_url: cdktn.stringToTerraform(this._runbookUrl),
2099
+ signal_seasonality: cdktn.stringToTerraform(this._signalSeasonality),
2100
+ slide_by: cdktn.numberToTerraform(this._slideBy),
2101
+ target_entity: cdktn.stringToTerraform(this._targetEntity),
2102
+ title_template: cdktn.stringToTerraform(this._titleTemplate),
2103
+ type: cdktn.stringToTerraform(this._type),
2104
+ violation_time_limit: cdktn.stringToTerraform(this._violationTimeLimit),
2105
+ violation_time_limit_seconds: cdktn.numberToTerraform(this._violationTimeLimitSeconds),
2106
+ critical: nrqlAlertConditionCriticalToTerraform(this._critical.internalValue),
2107
+ nrql: nrqlAlertConditionNrqlToTerraform(this._nrql.internalValue),
2108
+ outlier_configuration: nrqlAlertConditionOutlierConfigurationToTerraform(this._outlierConfiguration.internalValue),
2109
+ term: cdktn.listMapper(nrqlAlertConditionTermToTerraform, true)(this._term.internalValue),
2110
+ timeouts: nrqlAlertConditionTimeoutsToTerraform(this._timeouts.internalValue),
2111
+ warning: nrqlAlertConditionWarningToTerraform(this._warning.internalValue),
2112
+ };
2113
+ }
2114
+ synthesizeHclAttributes() {
2115
+ const attrs = {
2116
+ account_id: {
2117
+ value: cdktn.numberToHclTerraform(this._accountId),
2118
+ isBlock: false,
2119
+ type: "simple",
2120
+ storageClassType: "number",
2121
+ },
2122
+ aggregation_delay: {
2123
+ value: cdktn.stringToHclTerraform(this._aggregationDelay),
2124
+ isBlock: false,
2125
+ type: "simple",
2126
+ storageClassType: "string",
2127
+ },
2128
+ aggregation_method: {
2129
+ value: cdktn.stringToHclTerraform(this._aggregationMethod),
2130
+ isBlock: false,
2131
+ type: "simple",
2132
+ storageClassType: "string",
2133
+ },
2134
+ aggregation_timer: {
2135
+ value: cdktn.stringToHclTerraform(this._aggregationTimer),
2136
+ isBlock: false,
2137
+ type: "simple",
2138
+ storageClassType: "string",
2139
+ },
2140
+ aggregation_window: {
2141
+ value: cdktn.numberToHclTerraform(this._aggregationWindow),
2142
+ isBlock: false,
2143
+ type: "simple",
2144
+ storageClassType: "number",
2145
+ },
2146
+ baseline_direction: {
2147
+ value: cdktn.stringToHclTerraform(this._baselineDirection),
2148
+ isBlock: false,
2149
+ type: "simple",
2150
+ storageClassType: "string",
2151
+ },
2152
+ close_violations_on_expiration: {
2153
+ value: cdktn.booleanToHclTerraform(this._closeViolationsOnExpiration),
2154
+ isBlock: false,
2155
+ type: "simple",
2156
+ storageClassType: "boolean",
2157
+ },
2158
+ description: {
2159
+ value: cdktn.stringToHclTerraform(this._description),
2160
+ isBlock: false,
2161
+ type: "simple",
2162
+ storageClassType: "string",
2163
+ },
2164
+ enabled: {
2165
+ value: cdktn.booleanToHclTerraform(this._enabled),
2166
+ isBlock: false,
2167
+ type: "simple",
2168
+ storageClassType: "boolean",
2169
+ },
2170
+ evaluation_delay: {
2171
+ value: cdktn.numberToHclTerraform(this._evaluationDelay),
2172
+ isBlock: false,
2173
+ type: "simple",
2174
+ storageClassType: "number",
2175
+ },
2176
+ expiration_duration: {
2177
+ value: cdktn.numberToHclTerraform(this._expirationDuration),
2178
+ isBlock: false,
2179
+ type: "simple",
2180
+ storageClassType: "number",
2181
+ },
2182
+ fill_option: {
2183
+ value: cdktn.stringToHclTerraform(this._fillOption),
2184
+ isBlock: false,
2185
+ type: "simple",
2186
+ storageClassType: "string",
2187
+ },
2188
+ fill_value: {
2189
+ value: cdktn.numberToHclTerraform(this._fillValue),
2190
+ isBlock: false,
2191
+ type: "simple",
2192
+ storageClassType: "number",
2193
+ },
2194
+ id: {
2195
+ value: cdktn.stringToHclTerraform(this._id),
2196
+ isBlock: false,
2197
+ type: "simple",
2198
+ storageClassType: "string",
2199
+ },
2200
+ ignore_on_expected_termination: {
2201
+ value: cdktn.booleanToHclTerraform(this._ignoreOnExpectedTermination),
2202
+ isBlock: false,
2203
+ type: "simple",
2204
+ storageClassType: "boolean",
2205
+ },
2206
+ name: {
2207
+ value: cdktn.stringToHclTerraform(this._name),
2208
+ isBlock: false,
2209
+ type: "simple",
2210
+ storageClassType: "string",
2211
+ },
2212
+ open_violation_on_expiration: {
2213
+ value: cdktn.booleanToHclTerraform(this._openViolationOnExpiration),
2214
+ isBlock: false,
2215
+ type: "simple",
2216
+ storageClassType: "boolean",
2217
+ },
2218
+ policy_id: {
2219
+ value: cdktn.numberToHclTerraform(this._policyId),
2220
+ isBlock: false,
2221
+ type: "simple",
2222
+ storageClassType: "number",
2223
+ },
2224
+ runbook_url: {
2225
+ value: cdktn.stringToHclTerraform(this._runbookUrl),
2226
+ isBlock: false,
2227
+ type: "simple",
2228
+ storageClassType: "string",
2229
+ },
2230
+ signal_seasonality: {
2231
+ value: cdktn.stringToHclTerraform(this._signalSeasonality),
2232
+ isBlock: false,
2233
+ type: "simple",
2234
+ storageClassType: "string",
2235
+ },
2236
+ slide_by: {
2237
+ value: cdktn.numberToHclTerraform(this._slideBy),
2238
+ isBlock: false,
2239
+ type: "simple",
2240
+ storageClassType: "number",
2241
+ },
2242
+ target_entity: {
2243
+ value: cdktn.stringToHclTerraform(this._targetEntity),
2244
+ isBlock: false,
2245
+ type: "simple",
2246
+ storageClassType: "string",
2247
+ },
2248
+ title_template: {
2249
+ value: cdktn.stringToHclTerraform(this._titleTemplate),
2250
+ isBlock: false,
2251
+ type: "simple",
2252
+ storageClassType: "string",
2253
+ },
2254
+ type: {
2255
+ value: cdktn.stringToHclTerraform(this._type),
2256
+ isBlock: false,
2257
+ type: "simple",
2258
+ storageClassType: "string",
2259
+ },
2260
+ violation_time_limit: {
2261
+ value: cdktn.stringToHclTerraform(this._violationTimeLimit),
2262
+ isBlock: false,
2263
+ type: "simple",
2264
+ storageClassType: "string",
2265
+ },
2266
+ violation_time_limit_seconds: {
2267
+ value: cdktn.numberToHclTerraform(this._violationTimeLimitSeconds),
2268
+ isBlock: false,
2269
+ type: "simple",
2270
+ storageClassType: "number",
2271
+ },
2272
+ critical: {
2273
+ value: nrqlAlertConditionCriticalToHclTerraform(this._critical.internalValue),
2274
+ isBlock: true,
2275
+ type: "list",
2276
+ storageClassType: "NrqlAlertConditionCriticalList",
2277
+ },
2278
+ nrql: {
2279
+ value: nrqlAlertConditionNrqlToHclTerraform(this._nrql.internalValue),
2280
+ isBlock: true,
2281
+ type: "list",
2282
+ storageClassType: "NrqlAlertConditionNrqlList",
2283
+ },
2284
+ outlier_configuration: {
2285
+ value: nrqlAlertConditionOutlierConfigurationToHclTerraform(this._outlierConfiguration.internalValue),
2286
+ isBlock: true,
2287
+ type: "list",
2288
+ storageClassType: "NrqlAlertConditionOutlierConfigurationList",
2289
+ },
2290
+ term: {
2291
+ value: cdktn.listMapperHcl(nrqlAlertConditionTermToHclTerraform, true)(this._term.internalValue),
2292
+ isBlock: true,
2293
+ type: "set",
2294
+ storageClassType: "NrqlAlertConditionTermList",
2295
+ },
2296
+ timeouts: {
2297
+ value: nrqlAlertConditionTimeoutsToHclTerraform(this._timeouts.internalValue),
2298
+ isBlock: true,
2299
+ type: "struct",
2300
+ storageClassType: "NrqlAlertConditionTimeouts",
2301
+ },
2302
+ warning: {
2303
+ value: nrqlAlertConditionWarningToHclTerraform(this._warning.internalValue),
2304
+ isBlock: true,
2305
+ type: "list",
2306
+ storageClassType: "NrqlAlertConditionWarningList",
2307
+ },
2308
+ };
2309
+ // remove undefined attributes
2310
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2311
+ }
2312
+ }
2313
+ exports.NrqlAlertCondition = NrqlAlertCondition;
2314
+ _m = JSII_RTTI_SYMBOL_1;
2315
+ NrqlAlertCondition[_m] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertCondition", version: "14.0.0" };
2316
+ // =================
2317
+ // STATIC PROPERTIES
2318
+ // =================
2319
+ NrqlAlertCondition.tfResourceType = "newrelic_nrql_alert_condition";
2320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbnJxbC1hbGVydC1jb25kaXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQStOQSwwR0FTQztBQUdELGdIQXNCQztBQTJIRCxzRkFlQztBQUdELDRGQTBEQztBQWtPRCw4RUFXQztBQUdELG9GQWtDQztBQXNJRCwwSEFVQztBQUdELGdJQTRCQztBQWlHRCw4R0FRQztBQUdELG9IQWdCQztBQThERCxrR0FTQztBQUdELHdHQXNCQztBQWlJRCw4RUFnQkM7QUFHRCxvRkFnRUM7QUFzUUQsc0ZBUUM7QUFHRCw0RkFnQkM7QUEyRUQsd0dBU0M7QUFHRCw4R0FzQkM7QUEySEQsb0ZBZUM7QUFHRCwwRkEwREM7O0FBcjRERCwrQkFBK0I7QUFzTi9CLFNBQWdCLCtDQUErQyxDQUFDLE1BQW1HO0lBQ2pLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxVQUFVLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxTQUFTLENBQUM7UUFDdEQsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU8sQ0FBQyx5QkFBeUIsQ0FBQztLQUN6RixDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLGtEQUFrRCxDQUFDLE1BQW1HO0lBQ3BLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENB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SUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLG9DQUFvQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO2dCQUNoRyxPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsS0FBSztnQkFDWCxnQkFBZ0IsRUFBRSw0QkFBNEI7YUFDL0M7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLHdDQUF3QyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO2dCQUM3RSxPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsUUFBUTtnQkFDZCxnQkFBZ0IsRUFBRSw0QkFBNEI7YUFDL0M7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsS0FBSyxFQUFFLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO2dCQUMzRSxPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsTUFBTTtnQkFDWixnQkFBZ0IsRUFBRSwrQkFBK0I7YUFDbEQ7U0FDRixDQUFDO1FBRUYsOEJBQThCO1FBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFFLENBQUMsQ0FBQTtJQUM1SCxDQUFDOztBQWowQkgsZ0RBazBCQzs7O0FBaDBCQyxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNHLGlDQUFjLEdBQUcsK0JBQStCLEFBQWxDLENBQW1DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMjEsIDIwMjZcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvblxuLy8gZ2VuZXJhdGVkIGZyb20gdGVycmFmb3JtIHJlc291cmNlIHNjaGVtYVxuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGNka3RuIGZyb20gJ2Nka3RuJztcblxuLy8gQ29uZmlndXJhdGlvblxuXG5leHBvcnQgaW50ZXJmYWNlIE5ycWxBbGVydENvbmRpdGlvbkNvbmZpZyBleHRlbmRzIGNka3RuLlRlcnJhZm9ybU1ldGFBcmd1bWVudHMge1xuICAvKipcbiAgKiBUaGUgTmV3IFJlbGljIGFjY291bnQgSUQgZm9yIG1hbmFnaW5nIHlvdXIgTlJRTCBhbGVydCBjb25kaXRpb25zLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2FjY291bnRfaWQgTnJxbEFsZXJ0Q29uZGl0aW9uI2FjY291bnRfaWR9XG4gICovXG4gIHJlYWRvbmx5IGFjY291bnRJZD86IG51bWJlcjtcbiAgLyoqXG4gICogSG93IGxvbmcgd2Ugd2FpdCBmb3IgZGF0YSB0aGF0IGJlbG9uZ3MgaW4gZWFjaCBhZ2dyZWdhdGlvbiB3aW5kb3cuIERlcGVuZGluZyBvbiB5b3VyIGRhdGEsIGEgbG9uZ2VyIGRlbGF5IG1heSBpbmNyZWFzZSBhY2N1cmFjeSBidXQgZGVsYXkgbm90aWZpY2F0aW9ucy4gVXNlIGFnZ3JlZ2F0aW9uRGVsYXkgd2l0aCB0aGUgRVZFTlRfRkxPVyBhbmQgQ0FERU5DRSBhZ2dyZWdhdGlvbiBtZXRob2RzLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2FnZ3JlZ2F0aW9uX2RlbGF5IE5ycWxBbGVydENvbmRpdGlvbiNhZ2dyZWdhdGlvbl9kZWxheX1cbiAgKi9cbiAgcmVhZG9ubHkgYWdncmVnYXRpb25EZWxheT86IHN0cmluZztcbiAgLyoqXG4gICogVGhlIG1ldGhvZCB0aGF0IGRldGVybWluZXMgd2hlbiB3ZSBjb25zaWRlciBhbiBhZ2dyZWdhdGlvbiB3aW5kb3cgdG8gYmUgY29tcGxldGUgc28gdGhhdCB3ZSBjYW4gZXZhbHVhdGUgdGhlIHNpZ25hbCBmb3IgaW5jaWRlbnRzLiBEZWZhdWx0IGlzIEVWRU5UX0ZMT1cuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jYWdncmVnYXRpb25fbWV0aG9kIE5ycWxBbGVydENvbmRpdGlvbiNhZ2dyZWdhdGlvbl9tZXRob2R9XG4gICovXG4gIHJlYWRvbmx5IGFnZ3JlZ2F0aW9uTWV0aG9kPzogc3RyaW5nO1xuICAvKipcbiAgKiBIb3cgbG9uZyB3ZSB3YWl0IGFmdGVyIGVhY2ggZGF0YSBwb2ludCBhcnJpdmVzIHRvIG1ha2Ugc3VyZSB3ZSd2ZSBwcm9jZXNzZWQgdGhlIHdob2xlIGJhdGNoLiBVc2UgYWdncmVnYXRpb25UaW1lciB3aXRoIHRoZSBFVkVOVF9USU1FUiBhZ2dyZWdhdGlvbiBtZXRob2QuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jYWdncmVnYXRpb25fdGltZXIgTnJxbEFsZXJ0Q29uZGl0aW9uI2FnZ3JlZ2F0aW9uX3RpbWVyfVxuICAqL1xuICByZWFkb25seSBhZ2dyZWdhdGlvblRpbWVyPzogc3RyaW5nO1xuICAvKipcbiAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRpbWUgd2luZG93IHVzZWQgdG8gZXZhbHVhdGUgdGhlIE5SUUwgcXVlcnksIGluIHNlY29uZHMuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jYWdncmVnYXRpb25fd2luZG93IE5ycWxBbGVydENvbmRpdGlvbiNhZ2dyZWdhdGlvbl93aW5kb3d9XG4gICovXG4gIHJlYWRvbmx5IGFnZ3JlZ2F0aW9uV2luZG93PzogbnVtYmVyO1xuICAvKipcbiAgKiBUaGUgYmFzZWxpbmUgZGlyZWN0aW9uIG9mIGEgYmFzZWxpbmUgTlJRTCBhbGVydCBjb25kaXRpb24uIFZhbGlkIHZhbHVlcyBhcmU6ICdMT1dFUl9PTkxZJywgJ1VQUEVSX0FORF9MT1dFUicsICdVUFBFUl9PTkxZJyAoY2FzZSBpbnNlbnNpdGl2ZSkuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jYmFzZWxpbmVfZGlyZWN0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNiYXNlbGluZV9kaXJlY3Rpb259XG4gICovXG4gIHJlYWRvbmx5IGJhc2VsaW5lRGlyZWN0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgKiBXaGV0aGVyIHRvIGNsb3NlIGFsbCBvcGVuIGluY2lkZW50cyB3aGVuIHRoZSBzaWduYWwgZXhwaXJlcy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNjbG9zZV92aW9sYXRpb25zX29uX2V4cGlyYXRpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI2Nsb3NlX3Zpb2xhdGlvbnNfb25fZXhwaXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgY2xvc2VWaW9sYXRpb25zT25FeHBpcmF0aW9uPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIE5SUUwgYWxlcnQgY29uZGl0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2Rlc2NyaXB0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNkZXNjcmlwdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB0aGUgYWxlcnQgY29uZGl0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2VuYWJsZWQgTnJxbEFsZXJ0Q29uZGl0aW9uI2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIEhvdyBsb25nIHdlIHdhaXQgdW50aWwgdGhlIHNpZ25hbCBzdGFydHMgZXZhbHVhdGluZy4gVGhlIG1heGltdW0gZGVsYXkgaXMgNzIwMCBzZWNvbmRzICgxMjAgbWludXRlcylcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNldmFsdWF0aW9uX2RlbGF5IE5ycWxBbGVydENvbmRpdGlvbiNldmFsdWF0aW9uX2RlbGF5fVxuICAqL1xuICByZWFkb25seSBldmFsdWF0aW9uRGVsYXk/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBhbW91bnQgb2YgdGltZSAoaW4gc2Vjb25kcykgdG8gd2FpdCBiZWZvcmUgY29uc2lkZXJpbmcgdGhlIHNpZ25hbCBleHBpcmVkLiAgTXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMzAgdG8gMTcyODAwIChpbmNsdXNpdmUpXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jZXhwaXJhdGlvbl9kdXJhdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jZXhwaXJhdGlvbl9kdXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZXhwaXJhdGlvbkR1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgKiBXaGljaCBzdHJhdGVneSB0byB1c2Ugd2hlbiBmaWxsaW5nIGdhcHMgaW4gdGhlIHNpZ25hbC4gSWYgc3RhdGljLCB0aGUgJ2ZpbGwgdmFsdWUnIHdpbGwgYmUgdXNlZCBmb3IgZmlsbGluZyBnYXBzIGluIHRoZSBzaWduYWwuIFZhbGlkIHZhbHVlcyBhcmU6ICdOT05FJywgJ0xBU1RfVkFMVUUnLCBvciAnU1RBVElDJyAoY2FzZSBpbnNlbnNpdGl2ZSkuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jZmlsbF9vcHRpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI2ZpbGxfb3B0aW9ufVxuICAqL1xuICByZWFkb25seSBmaWxsT3B0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgKiBJZiB1c2luZyB0aGUgJ3N0YXRpYycgZmlsbCBvcHRpb24sIHRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIGZvciBmaWxsaW5nIGdhcHMgaW4gdGhlIHNpZ25hbC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNmaWxsX3ZhbHVlIE5ycWxBbGVydENvbmRpdGlvbiNmaWxsX3ZhbHVlfVxuICAqL1xuICByZWFkb25seSBmaWxsVmFsdWU/OiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNpZCBOcnFsQWxlcnRDb25kaXRpb24jaWR9XG4gICpcbiAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgaWQgZmllbGQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgcmVzb3VyY2VzIGluIFRlcnJhZm9ybSBwcm92aWRlcnMgdXNpbmcgYSBUZXJyYWZvcm0gcHJvdmlkZXIgU0RLIHZlcnNpb24gYmVsb3cgMi5cbiAgKiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyBzZXR0aW5nIHRoaXMgdmFsdWUgaXQgbWlnaHQgbm90IGJlIHNldHRhYmxlLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgdGhlIHByb3ZpZGVyIGRvY3VtZW50YXRpb24gdG8gZW5zdXJlIGl0IHNob3VsZCBiZSBzZXR0YWJsZS5cbiAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFdoZXRoZXIgdG8gaWdub3JlIGV4cGVjdGVkIHRlcm1pbmF0aW9uIG9mIGEgc2lnbmFsIHdoZW4gY29uc2lkZXJpbmcgd2hldGhlciB0byBjcmVhdGUgYSBsb3NzIG9mIHNpZ25hbCBpbmNpZGVudFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2lnbm9yZV9vbl9leHBlY3RlZF90ZXJtaW5hdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jaWdub3JlX29uX2V4cGVjdGVkX3Rlcm1pbmF0aW9ufVxuICAqL1xuICByZWFkb25seSBpZ25vcmVPbkV4cGVjdGVkVGVybWluYXRpb24/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFRoZSB0aXRsZSBvZiB0aGUgY29uZGl0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI25hbWUgTnJxbEFsZXJ0Q29uZGl0aW9uI25hbWV9XG4gICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICogV2hldGhlciB0byBjcmVhdGUgYSBuZXcgaW5jaWRlbnQgdG8gY2FwdHVyZSB0aGF0IHRoZSBzaWduYWwgZXhwaXJlZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNvcGVuX3Zpb2xhdGlvbl9vbl9leHBpcmF0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNvcGVuX3Zpb2xhdGlvbl9vbl9leHBpcmF0aW9ufVxuICAqL1xuICByZWFkb25seSBvcGVuVmlvbGF0aW9uT25FeHBpcmF0aW9uPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgSUQgb2YgdGhlIHBvbGljeSB3aGVyZSB0aGlzIGNvbmRpdGlvbiBzaG91bGQgYmUgdXNlZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNwb2xpY3lfaWQgTnJxbEFsZXJ0Q29uZGl0aW9uI3BvbGljeV9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgcG9saWN5SWQ6IG51bWJlcjtcbiAgLyoqXG4gICogUnVuYm9vayBVUkwgdG8gZGlzcGxheSBpbiBub3RpZmljYXRpb25zLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3J1bmJvb2tfdXJsIE5ycWxBbGVydENvbmRpdGlvbiNydW5ib29rX3VybH1cbiAgKi9cbiAgcmVhZG9ubHkgcnVuYm9va1VybD86IHN0cmluZztcbiAgLyoqXG4gICogU2Vhc29uYWxpdHkgdW5kZXIgd2hpY2ggYSBjb25kaXRpb24ncyBzaWduYWwocykgYXJlIGV2YWx1YXRlZC4gVmFsaWQgdmFsdWVzIGFyZTogJ05FV19SRUxJQ19DQUxDVUxBVElPTicsICdIT1VSTFknLCAnREFJTFknLCAnV0VFS0xZJywgb3IgJ05PTkUnLiBUbyBoYXZlIE5ldyBSZWxpYyBjYWxjdWxhdGUgc2Vhc29uYWxpdHkgYXV0b21hdGljYWxseSwgc2V0IHRvICdORVdfUkVMSUNfQ0FMQ1VMQVRJT04nIChkZWZhdWx0KS4gVG8gdHVybiBvZmYgc2Vhc29uYWxpdHkgY29tcGxldGVseSwgc2V0IHRvICdOT05FJy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNzaWduYWxfc2Vhc29uYWxpdHkgTnJxbEFsZXJ0Q29uZGl0aW9uI3NpZ25hbF9zZWFzb25hbGl0eX1cbiAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsU2Vhc29uYWxpdHk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSBkdXJhdGlvbiBvZiBvdmVybGFwcGluZyB0aW1lIHdpbmRvd3MgdXNlZCB0byBzbW9vdGggdGhlIGNoYXJ0IGxpbmUsIGluIHNlY29uZHMuIE11c3QgYmUgYSBmYWN0b3Igb2YgYGFnZ3JlZ2F0aW9uX3dpbmRvd2AgYW5kIGxlc3MgdGhhbiB0aGUgYWdncmVnYXRpb24gd2luZG93LiBJZiBgYWdncmVnYXRpb25fd2luZG93YCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzYwMCBzZWNvbmRzLCBpdCBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAzMCBzZWNvbmRzLiBJZiBgYWdncmVnYXRpb25fd2luZG93YCBpcyBncmVhdGVyIHRoYW4gMzYwMCBzZWNvbmRzIGJ1dCBsZXNzIHRoYW4gNzIwMCBzZWNvbmRzLCBpdCBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBgYWdncmVnYXRpb25fd2luZG93IC8gMTIwYC4gIElmIGBhZ2dyZWdhdGlvbl93aW5kb3dgIGlzIGdyZWF0ZXIgdGhhbiA3MjAwIHNlY29uZHMsIGl0IHNob3VsZCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIGBhZ2dyZWdhdGlvbl93aW5kb3cgLyAyNFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3NsaWRlX2J5IE5ycWxBbGVydENvbmRpdGlvbiNzbGlkZV9ieX1cbiAgKi9cbiAgcmVhZG9ubHkgc2xpZGVCeT86IG51bWJlcjtcbiAgLyoqXG4gICogQkVUQSBQUkVWSUVXOiB0aGUgYHRhcmdldF9lbnRpdHlgIGZpZWxkIGlzIGluIGxpbWl0ZWQgcmVsZWFzZSBhbmQgb25seSBlbmFibGVkIGZvciBwcmV2aWV3IG9uIGEgcGVyLWFjY291bnQgYmFzaXMuIC0gVGhlIEdVSUQgb2YgdGhlIGVudGl0eSBleHBsaWNpdGx5IHRhcmdldGVkIGJ5IHRoZSBjb25kaXRpb24uIElzc3VlcyB0cmlnZ2VyZWQgYnkgdGhpcyBjb25kaXRpb24gd2lsbCBhZmZlY3QgdGhlIGhlYWx0aCBzdGF0dXMgb2YgdGhpcyBlbnRpdHkgaW5zdGVhZCBvZiBoYXZpbmcgdGhlIGFmZmVjdGVkIGVudGl0eSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5XG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jdGFyZ2V0X2VudGl0eSBOcnFsQWxlcnRDb25kaXRpb24jdGFyZ2V0X2VudGl0eX1cbiAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RW50aXR5Pzogc3RyaW5nO1xuICAvKipcbiAgKiBUaGlzIGZpZWxkIGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgY3VzdG9tIHRpdGxlIHRvIGJlIHVzZWQgd2hlbiBpbmNpZGVudHMgYXJlIG9wZW5lZCBieSB0aGUgY29uZGl0aW9uLiBTZXR0aW5nIHRoaXMgZmllbGQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCB0aXRsZS4gTXVzdCBiZSBIYW5kbGViYXJzIGZvcm1hdC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aXRsZV90ZW1wbGF0ZSBOcnFsQWxlcnRDb25kaXRpb24jdGl0bGVfdGVtcGxhdGV9XG4gICovXG4gIHJlYWRvbmx5IHRpdGxlVGVtcGxhdGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSB0eXBlIG9mIE5SUUwgYWxlcnQgY29uZGl0aW9uIHRvIGNyZWF0ZS4gVmFsaWQgdmFsdWVzIGFyZTogJ3N0YXRpYycsICdiYXNlbGluZScsICdvdXRsaWVyJy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0eXBlIE5ycWxBbGVydENvbmRpdGlvbiN0eXBlfVxuICAqL1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICAvKipcbiAgKiBTZXRzIGEgdGltZSBsaW1pdCwgaW4gaG91cnMsIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IGZvcmNlLWNsb3NlIGEgbG9uZy1sYXN0aW5nIGluY2lkZW50IGFmdGVyIHRoZSB0aW1lIGxpbWl0IHlvdSBzZWxlY3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ09ORV9IT1VSJywgJ1RXT19IT1VSUycsICdGT1VSX0hPVVJTJywgJ0VJR0hUX0hPVVJTJywgJ1RXRUxWRV9IT1VSUycsICdUV0VOVFlfRk9VUl9IT1VSUycsICdUSElSVFlfREFZUycgKGNhc2UgaW5zZW5zaXRpdmUpLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3Zpb2xhdGlvbl90aW1lX2xpbWl0IE5ycWxBbGVydENvbmRpdGlvbiN2aW9sYXRpb25fdGltZV9saW1pdH1cbiAgKi9cbiAgcmVhZG9ubHkgdmlvbGF0aW9uVGltZUxpbWl0Pzogc3RyaW5nO1xuICAvKipcbiAgKiBTZXRzIGEgdGltZSBsaW1pdCwgaW4gc2Vjb25kcywgdGhhdCB3aWxsIGF1dG9tYXRpY2FsbHkgZm9yY2UtY2xvc2UgYSBsb25nLWxhc3RpbmcgaW5jaWRlbnQgYWZ0ZXIgdGhlIHRpbWUgbGltaXQgeW91IHNlbGVjdC4gIE11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIDMwMCB0byAyNTkyMDAwIChpbmNsdXNpdmUpXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jdmlvbGF0aW9uX3RpbWVfbGltaXRfc2Vjb25kcyBOcnFsQWxlcnRDb25kaXRpb24jdmlvbGF0aW9uX3RpbWVfbGltaXRfc2Vjb25kc31cbiAgKi9cbiAgcmVhZG9ubHkgdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICogY3JpdGljYWwgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNjcml0aWNhbCBOcnFsQWxlcnRDb25kaXRpb24jY3JpdGljYWx9XG4gICovXG4gIHJlYWRvbmx5IGNyaXRpY2FsPzogTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWw7XG4gIC8qKlxuICAqIG5ycWwgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNucnFsIE5ycWxBbGVydENvbmRpdGlvbiNucnFsfVxuICAqL1xuICByZWFkb25seSBucnFsOiBOcnFsQWxlcnRDb25kaXRpb25OcnFsO1xuICAvKipcbiAgKiBvdXRsaWVyX2NvbmZpZ3VyYXRpb24gYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNvdXRsaWVyX2NvbmZpZ3VyYXRpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI291dGxpZXJfY29uZmlndXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgb3V0bGllckNvbmZpZ3VyYXRpb24/OiBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICogdGVybSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3Rlcm0gTnJxbEFsZXJ0Q29uZGl0aW9uI3Rlcm19XG4gICovXG4gIHJlYWRvbmx5IHRlcm0/OiBOcnFsQWxlcnRDb25kaXRpb25UZXJtW10gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogdGltZW91dHMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aW1lb3V0cyBOcnFsQWxlcnRDb25kaXRpb24jdGltZW91dHN9XG4gICovXG4gIHJlYWRvbmx5IHRpbWVvdXRzPzogTnJxbEFsZXJ0Q29uZGl0aW9uVGltZW91dHM7XG4gIC8qKlxuICAqIHdhcm5pbmcgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN3YXJuaW5nIE5ycWxBbGVydENvbmRpdGlvbiN3YXJuaW5nfVxuICAqL1xuICByZWFkb25seSB3YXJuaW5nPzogTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uIHtcbiAgLyoqXG4gICogQkVUQSBQUkVWSUVXOiB0aGUgYHByZWRpY3RfYnlgIGZpZWxkIGlzIGluIGxpbWl0ZWQgcmVsZWFzZSBhbmQgb25seSBlbmFibGVkIGZvciBwcmV2aWV3IG9uIGEgcGVyLWFjY291bnQgYmFzaXMuIC0gVGhlIGR1cmF0aW9uLCBpbiBzZWNvbmRzLCB0aGF0IHRoZSBwcmVkaWN0aW9uIHNob3VsZCBsb29rIGludG8gdGhlIGZ1dHVyZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNwcmVkaWN0X2J5IE5ycWxBbGVydENvbmRpdGlvbiNwcmVkaWN0X2J5fVxuICAqL1xuICByZWFkb25seSBwcmVkaWN0Qnk/OiBudW1iZXI7XG4gIC8qKlxuICAqIEJFVEEgUFJFVklFVzogdGhlIGBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb25gIGZpZWxkIGlzIGluIGxpbWl0ZWQgcmVsZWFzZSBhbmQgb25seSBlbmFibGVkIGZvciBwcmV2aWV3IG9uIGEgcGVyLWFjY291bnQgYmFzaXMuIC0gSWYgYSBwcmVkaWN0aW9uIGluY2lkZW50IGlzIG9wZW4gd2hlbiBhIHRlcm0ncyBzdGF0aWMgdGhyZXNob2xkIGlzIGJyZWFjaGVkIGJ5IHRoZSBhY3R1YWwgc2lnbmFsLCBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGNsb3NlIHRoZSBwcmVkaWN0aW9uIGluY2lkZW50IGFuZCBvcGVuIGEgc3RhdGljIGluY2lkZW50LiBTZXR0aW5nIGBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb25gIHRvIGB0cnVlYCBvdmVycmlkZXMgdGhpcyBiZWhhdmlvciBsZWF2aW5nIHRoZSBwcmVkaWN0aW9uIGluY2lkZW50IG9wZW4gYW5kIHByZXZlbnRpbmcgYSBzdGF0aWMgaW5jaWRlbnQgZnJvbSBvcGVuaW5nLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3ByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jcHJlZmVyX3ByZWRpY3Rpb25fdmlvbGF0aW9ufVxuICAqL1xuICByZWFkb25seSBwcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlIHwgTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHByZWRpY3RfYnk6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEucHJlZGljdEJ5KSxcbiAgICBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb246IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLnByZWZlclByZWRpY3Rpb25WaW9sYXRpb24pLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdD86IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvbk91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvbik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgcHJlZGljdF9ieToge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEucHJlZGljdEJ5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFByZWRpY3Rpb25PdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fcHJlZGljdEJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnByZWRpY3RCeSA9IHRoaXMuX3ByZWRpY3RCeTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbiA9IHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb247XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFByZWRpY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9wcmVkaWN0QnkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9wcmVkaWN0QnkgPSB2YWx1ZS5wcmVkaWN0Qnk7XG4gICAgICB0aGlzLl9wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uID0gdmFsdWUucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbjtcbiAgICB9XG4gIH1cblxuICAvLyBwcmVkaWN0X2J5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3ByZWRpY3RCeT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgcHJlZGljdEJ5KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgncHJlZGljdF9ieScpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJlZGljdEJ5KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wcmVkaWN0QnkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQcmVkaWN0QnkoKSB7XG4gICAgdGhpcy5fcHJlZGljdEJ5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwcmVkaWN0QnlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZGljdEJ5O1xuICB9XG5cbiAgLy8gcHJlZmVyX3ByZWRpY3Rpb25fdmlvbGF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgncHJlZmVyX3ByZWRpY3Rpb25fdmlvbGF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBwcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbigpIHtcbiAgICB0aGlzLl9wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb247XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWwge1xuICAvKipcbiAgKiBWaW9sYXRpb25zIHdpbGwgbm90IGNoYW5nZSBzeXN0ZW0gaGVhbHRoIHN0YXR1cyBmb3IgdGhpcyB0ZXJtLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2Rpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmcgTnJxbEFsZXJ0Q29uZGl0aW9uI2Rpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmd9XG4gICovXG4gIHJlYWRvbmx5IGRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIEluIG1pbnV0ZXMsIG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIDEgdG8gMTIwIChpbmNsdXNpdmUpLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2R1cmF0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNkdXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKlxuICAqIE9uZSBvZiAoYWJvdmUsIGFib3ZlX29yX2VxdWFscywgYmVsb3csIGJlbG93X29yX2VxdWFscywgZXF1YWxzLCBub3RfZXF1YWxzKS4gRGVmYXVsdHMgdG8gJ2VxdWFscycuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jb3BlcmF0b3IgTnJxbEFsZXJ0Q29uZGl0aW9uI29wZXJhdG9yfVxuICAqL1xuICByZWFkb25seSBvcGVyYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICogRm9yIGJhc2VsaW5lIGNvbmRpdGlvbnMgbXVzdCBiZSBpbiByYW5nZSBbMSwgMTAwMF0uXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jdGhyZXNob2xkIE5ycWxBbGVydENvbmRpdGlvbiN0aHJlc2hvbGR9XG4gICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZDogbnVtYmVyO1xuICAvKipcbiAgKiBUaGUgZHVyYXRpb24sIGluIHNlY29uZHMsIHRoYXQgdGhlIHRocmVzaG9sZCBtdXN0IHZpb2xhdGUgaW4gb3JkZXIgdG8gY3JlYXRlIGFuIGluY2lkZW50LiBWYWx1ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlICdhZ2dyZWdhdGlvbl93aW5kb3cnICh3aGljaCBoYXMgYSBkZWZhdWx0IG9mIDYwIHNlY29uZHMpLiBWYWx1ZSBtdXN0IGJlIHdpdGhpbiAxMjAtODY0MDAgc2Vjb25kcyBmb3IgYmFzZWxpbmUgY29uZGl0aW9ucywgYW5kIHdpdGhpbiA2MC04NjQwMCBzZWNvbmRzIGZvciBzdGF0aWMgY29uZGl0aW9uc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RocmVzaG9sZF9kdXJhdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jdGhyZXNob2xkX2R1cmF0aW9ufVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGREdXJhdGlvbj86IG51bWJlcjtcbiAgLyoqXG4gICogVGhlIGNyaXRlcmlhIGZvciBob3cgbWFueSBkYXRhIHBvaW50cyBtdXN0IGJlIGluIHZpb2xhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0aHJlc2hvbGQgZHVyYXRpb24uIFZhbGlkIHZhbHVlcyBhcmU6ICdBTEwnIG9yICdBVF9MRUFTVF9PTkNFJyAoY2FzZSBpbnNlbnNpdGl2ZSkuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jdGhyZXNob2xkX29jY3VycmVuY2VzIE5ycWxBbGVydENvbmRpdGlvbiN0aHJlc2hvbGRfb2NjdXJyZW5jZXN9XG4gICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZE9jY3VycmVuY2VzPzogc3RyaW5nO1xuICAvKipcbiAgKiBWYWxpZCB2YWx1ZXMgYXJlOiAnYWxsJyBvciAnYW55J1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RpbWVfZnVuY3Rpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI3RpbWVfZnVuY3Rpb259XG4gICovXG4gIHJlYWRvbmx5IHRpbWVGdW5jdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICogcHJlZGljdGlvbiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3ByZWRpY3Rpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI3ByZWRpY3Rpb259XG4gICovXG4gIHJlYWRvbmx5IHByZWRpY3Rpb24/OiBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFByZWRpY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFRvVGVycmFmb3JtKHN0cnVjdD86IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsT3V0cHV0UmVmZXJlbmNlIHwgTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWwpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGlzYWJsZV9oZWFsdGhfc3RhdHVzX3JlcG9ydGluZzogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyksXG4gICAgZHVyYXRpb246IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuZHVyYXRpb24pLFxuICAgIG9wZXJhdG9yOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm9wZXJhdG9yKSxcbiAgICB0aHJlc2hvbGQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkKSxcbiAgICB0aHJlc2hvbGRfZHVyYXRpb246IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkRHVyYXRpb24pLFxuICAgIHRocmVzaG9sZF9vY2N1cnJlbmNlczogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGRPY2N1cnJlbmNlcyksXG4gICAgdGltZV9mdW5jdGlvbjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50aW1lRnVuY3Rpb24pLFxuICAgIHByZWRpY3Rpb246IG5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvblRvVGVycmFmb3JtKHN0cnVjdCEucHJlZGljdGlvbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbE91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGR1cmF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kdXJhdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgb3BlcmF0b3I6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm9wZXJhdG9yKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0aHJlc2hvbGQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGhyZXNob2xkX2R1cmF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGREdXJhdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGhyZXNob2xkX29jY3VycmVuY2VzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGRPY2N1cnJlbmNlcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGltZV9mdW5jdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGltZUZ1bmN0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBwcmVkaWN0aW9uOiB7XG4gICAgICB2YWx1ZTogbnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0aW9uKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFByZWRpY3Rpb25MaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nID0gdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2R1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmR1cmF0aW9uID0gdGhpcy5fZHVyYXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcGVyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5vcGVyYXRvciA9IHRoaXMuX29wZXJhdG9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRocmVzaG9sZCA9IHRoaXMuX3RocmVzaG9sZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RocmVzaG9sZER1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRocmVzaG9sZER1cmF0aW9uID0gdGhpcy5fdGhyZXNob2xkRHVyYXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHRoaXMuX3RocmVzaG9sZE9jY3VycmVuY2VzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGltZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRpbWVGdW5jdGlvbiA9IHRoaXMuX3RpbWVGdW5jdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWRpY3Rpb24/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJlZGljdGlvbiA9IHRoaXMuX3ByZWRpY3Rpb24/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RpbWVGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHZhbHVlLmRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHZhbHVlLmR1cmF0aW9uO1xuICAgICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZS5vcGVyYXRvcjtcbiAgICAgIHRoaXMuX3RocmVzaG9sZCA9IHZhbHVlLnRocmVzaG9sZDtcbiAgICAgIHRoaXMuX3RocmVzaG9sZER1cmF0aW9uID0gdmFsdWUudGhyZXNob2xkRHVyYXRpb247XG4gICAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHZhbHVlLnRocmVzaG9sZE9jY3VycmVuY2VzO1xuICAgICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdmFsdWUudGltZUZ1bmN0aW9uO1xuICAgICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWUucHJlZGljdGlvbjtcbiAgICB9XG4gIH1cblxuICAvLyBkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZGlzYWJsZV9oZWFsdGhfc3RhdHVzX3JlcG9ydGluZycpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcoKSB7XG4gICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZ0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nO1xuICB9XG5cbiAgLy8gZHVyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGR1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZHVyYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGR1cmF0aW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kdXJhdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldER1cmF0aW9uKCkge1xuICAgIHRoaXMuX2R1cmF0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkdXJhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcbiAgfVxuXG4gIC8vIG9wZXJhdG9yIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX29wZXJhdG9yPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBvcGVyYXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ29wZXJhdG9yJyk7XG4gIH1cbiAgcHVibGljIHNldCBvcGVyYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPcGVyYXRvcigpIHtcbiAgICB0aGlzLl9vcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb3BlcmF0b3JJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3I7XG4gIH1cblxuICAvLyB0aHJlc2hvbGQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdGhyZXNob2xkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB0aHJlc2hvbGQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCd0aHJlc2hvbGQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aHJlc2hvbGQ7XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfZHVyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkRHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGhyZXNob2xkX2R1cmF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGREdXJhdGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGREdXJhdGlvbigpIHtcbiAgICB0aGlzLl90aHJlc2hvbGREdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkRHVyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkRHVyYXRpb247XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfb2NjdXJyZW5jZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkT2NjdXJyZW5jZXM/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZE9jY3VycmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGhyZXNob2xkX29jY3VycmVuY2VzJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGRPY2N1cnJlbmNlcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGRPY2N1cnJlbmNlcygpIHtcbiAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkT2NjdXJyZW5jZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXM7XG4gIH1cblxuICAvLyB0aW1lX2Z1bmN0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RpbWVGdW5jdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGltZUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGltZV9mdW5jdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZUZ1bmN0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aW1lRnVuY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lRnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lRnVuY3Rpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUZ1bmN0aW9uO1xuICB9XG5cbiAgLy8gcHJlZGljdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcmVkaWN0aW9uID0gbmV3IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvbk91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInByZWRpY3Rpb25cIik7XG4gIHB1YmxpYyBnZXQgcHJlZGljdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZGljdGlvbjtcbiAgfVxuICBwdWJsaWMgcHV0UHJlZGljdGlvbih2YWx1ZTogTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uKSB7XG4gICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UHJlZGljdGlvbigpIHtcbiAgICB0aGlzLl9wcmVkaWN0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByZWRpY3Rpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIE5ycWxBbGVydENvbmRpdGlvbk5ycWwge1xuICAvKipcbiAgKiBUaGUgTmV3IFJlbGljIGFjY291bnQgSUQgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgdGhlIE5SUUwgYWxlcnQgY29uZGl0aW9uJ3MgYHF1ZXJ5YDsgd2lsbCBkZWZhdWx0IHRvIGBhY2NvdW50X2lkYCBpZiB1bnNwZWNpZmllZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNkYXRhX2FjY291bnRfaWQgTnJxbEFsZXJ0Q29uZGl0aW9uI2RhdGFfYWNjb3VudF9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgZGF0YUFjY291bnRJZD86IG51bWJlcjtcbiAgLyoqXG4gICogTlJRTCBxdWVyaWVzIGFyZSBldmFsdWF0ZWQgaW4gb25lLW1pbnV0ZSB0aW1lIHdpbmRvd3MuIFRoZSBzdGFydCB0aW1lIGRlcGVuZHMgb24gdGhlIHZhbHVlIHlvdSBwcm92aWRlIGluIHRoZSBOUlFMIGNvbmRpdGlvbidzIGBldmFsdWF0aW9uX29mZnNldGAuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jZXZhbHVhdGlvbl9vZmZzZXQgTnJxbEFsZXJ0Q29uZGl0aW9uI2V2YWx1YXRpb25fb2Zmc2V0fVxuICAqL1xuICByZWFkb25seSBldmFsdWF0aW9uT2Zmc2V0PzogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jcXVlcnkgTnJxbEFsZXJ0Q29uZGl0aW9uI3F1ZXJ5fVxuICAqL1xuICByZWFkb25seSBxdWVyeTogc3RyaW5nO1xuICAvKipcbiAgKiBOUlFMIHF1ZXJpZXMgYXJlIGV2YWx1YXRlZCBpbiBvbmUtbWludXRlIHRpbWUgd2luZG93cy4gVGhlIHN0YXJ0IHRpbWUgZGVwZW5kcyBvbiB0aGUgdmFsdWUgeW91IHByb3ZpZGUgaW4gdGhlIE5SUUwgY29uZGl0aW9uJ3MgYHNpbmNlX3ZhbHVlYC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNzaW5jZV92YWx1ZSBOcnFsQWxlcnRDb25kaXRpb24jc2luY2VfdmFsdWV9XG4gICovXG4gIHJlYWRvbmx5IHNpbmNlVmFsdWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25OcnFsVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uTnJxbE91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbk5ycWwpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGF0YV9hY2NvdW50X2lkOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmRhdGFBY2NvdW50SWQpLFxuICAgIGV2YWx1YXRpb25fb2Zmc2V0OiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmV2YWx1YXRpb25PZmZzZXQpLFxuICAgIHF1ZXJ5OiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnF1ZXJ5KSxcbiAgICBzaW5jZV92YWx1ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5zaW5jZVZhbHVlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25OcnFsVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uTnJxbE91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbk5ycWwpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRhdGFfYWNjb3VudF9pZDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGF0YUFjY291bnRJZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgZXZhbHVhdGlvbl9vZmZzZXQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmV2YWx1YXRpb25PZmZzZXQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHF1ZXJ5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5xdWVyeSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc2luY2VfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnNpbmNlVmFsdWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgTnJxbEFsZXJ0Q29uZGl0aW9uTnJxbE91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogTnJxbEFsZXJ0Q29uZGl0aW9uTnJxbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGF0YUFjY291bnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kYXRhQWNjb3VudElkID0gdGhpcy5fZGF0YUFjY291bnRJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V2YWx1YXRpb25PZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXZhbHVhdGlvbk9mZnNldCA9IHRoaXMuX2V2YWx1YXRpb25PZmZzZXQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9xdWVyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5xdWVyeSA9IHRoaXMuX3F1ZXJ5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2luY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaW5jZVZhbHVlID0gdGhpcy5fc2luY2VWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IE5ycWxBbGVydENvbmRpdGlvbk5ycWwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9kYXRhQWNjb3VudElkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXZhbHVhdGlvbk9mZnNldCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3F1ZXJ5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc2luY2VWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZGF0YUFjY291bnRJZCA9IHZhbHVlLmRhdGFBY2NvdW50SWQ7XG4gICAgICB0aGlzLl9ldmFsdWF0aW9uT2Zmc2V0ID0gdmFsdWUuZXZhbHVhdGlvbk9mZnNldDtcbiAgICAgIHRoaXMuX3F1ZXJ5ID0gdmFsdWUucXVlcnk7XG4gICAgICB0aGlzLl9zaW5jZVZhbHVlID0gdmFsdWUuc2luY2VWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBkYXRhX2FjY291bnRfaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kYXRhQWNjb3VudElkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBkYXRhQWNjb3VudElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZGF0YV9hY2NvdW50X2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBkYXRhQWNjb3VudElkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kYXRhQWNjb3VudElkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGF0YUFjY291bnRJZCgpIHtcbiAgICB0aGlzLl9kYXRhQWNjb3VudElkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkYXRhQWNjb3VudElkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFBY2NvdW50SWQ7XG4gIH1cblxuICAvLyBldmFsdWF0aW9uX29mZnNldCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9ldmFsdWF0aW9uT2Zmc2V0PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBldmFsdWF0aW9uT2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZXZhbHVhdGlvbl9vZmZzZXQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV2YWx1YXRpb25PZmZzZXQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2V2YWx1YXRpb25PZmZzZXQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFdmFsdWF0aW9uT2Zmc2V0KCkge1xuICAgIHRoaXMuX2V2YWx1YXRpb25PZmZzZXQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV2YWx1YXRpb25PZmZzZXRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGlvbk9mZnNldDtcbiAgfVxuXG4gIC8vIHF1ZXJ5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3F1ZXJ5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3F1ZXJ5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBxdWVyeSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcXVlcnkgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcXVlcnlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gIH1cblxuICAvLyBzaW5jZV92YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zaW5jZVZhbHVlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaW5jZVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc2luY2VfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpbmNlVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NpbmNlVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTaW5jZVZhbHVlKCkge1xuICAgIHRoaXMuX3NpbmNlVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNpbmNlVmFsdWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2luY2VWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbkRic2NhbiB7XG4gIC8qKlxuICAqIEJFVEEgUFJFVklFVzogdGhlIGBlcHNpbG9uYCBmaWVsZCBpcyBpbiBsaW1pdGVkIHJlbGVhc2UgYW5kIG9ubHkgZW5hYmxlZCBmb3IgcHJldmlldyBvbiBhIHBlci1hY2NvdW50IGJhc2lzLiAtIFJhZGl1cyAoZGlzdGFuY2UgdGhyZXNob2xkKSBmb3IgREJTQ0FOIGluIHRoZSB1bml0cyBvZiB0aGUgcXVlcnkgcmVzdWx0LiBTbWFsbGVyIHZhbHVlcyB0aWdodGVuIGNsdXN0ZXJzOyBsYXJnZXIgdmFsdWVzIGJyb2FkZW4gdGhlbS4gTXVzdCBiZSA+IDAuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jZXBzaWxvbiBOcnFsQWxlcnRDb25kaXRpb24jZXBzaWxvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZXBzaWxvbjogbnVtYmVyO1xuICAvKipcbiAgKiBCRVRBIFBSRVZJRVc6IHRoZSBgZXZhbHVhdGlvbl9ncm91cF9mYWNldGAgZmllbGQgaXMgaW4gbGltaXRlZCByZWxlYXNlIGFuZCBvbmx5IGVuYWJsZWQgZm9yIHByZXZpZXcgb24gYSBwZXItYWNjb3VudCBiYXNpcy4gLSBPcHRpb25hbCBOUlFMIGZhY2V0IGF0dHJpYnV0ZSB1c2VkIHRvIHNlZ21lbnQgZGF0YSBpbnRvIGdyb3VwcyAoZS5nLiBgaG9zdGAsIGByZWdpb25gKSBiZWZvcmUgcnVubmluZyBvdXRsaWVyIGRldGVjdGlvbi4gT21pdCB0byBldmFsdWF0ZSBhbGwgcmVzdWx0cyB0b2dldGhlci5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNldmFsdWF0aW9uX2dyb3VwX2ZhY2V0IE5ycWxBbGVydENvbmRpdGlvbiNldmFsdWF0aW9uX2dyb3VwX2ZhY2V0fVxuICAqL1xuICByZWFkb25seSBldmFsdWF0aW9uR3JvdXBGYWNldD86IHN0cmluZztcbiAgLyoqXG4gICogQkVUQSBQUkVWSUVXOiB0aGUgYG1pbmltdW1fcG9pbnRzYCBmaWVsZCBpcyBpbiBsaW1pdGVkIHJlbGVhc2UgYW5kIG9ubHkgZW5hYmxlZCBmb3IgcHJldmlldyBvbiBhIHBlci1hY2NvdW50IGJhc2lzLiAtIE1pbmltdW0gbnVtYmVyIG9mIG5laWdoYm9yaW5nIHBvaW50cyBuZWVkZWQgdG8gZm9ybSBhIGNsdXN0ZXIuIE11c3QgYmUgPj0gMS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNtaW5pbXVtX3BvaW50cyBOcnFsQWxlcnRDb25kaXRpb24jbWluaW11bV9wb2ludHN9XG4gICovXG4gIHJlYWRvbmx5IG1pbmltdW1Qb2ludHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uRGJzY2FuVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW5PdXRwdXRSZWZlcmVuY2UgfCBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbkRic2Nhbik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlcHNpbG9uOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmVwc2lsb24pLFxuICAgIGV2YWx1YXRpb25fZ3JvdXBfZmFjZXQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZXZhbHVhdGlvbkdyb3VwRmFjZXQpLFxuICAgIG1pbmltdW1fcG9pbnRzOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1pbmltdW1Qb2ludHMpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uRGJzY2FuVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW5PdXRwdXRSZWZlcmVuY2UgfCBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbkRic2Nhbik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZXBzaWxvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZXBzaWxvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgZXZhbHVhdGlvbl9ncm91cF9mYWNldDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZXZhbHVhdGlvbkdyb3VwRmFjZXQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIG1pbmltdW1fcG9pbnRzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5taW5pbXVtUG9pbnRzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uRGJzY2FuT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbkRic2NhbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZXBzaWxvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5lcHNpbG9uID0gdGhpcy5fZXBzaWxvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V2YWx1YXRpb25Hcm91cEZhY2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV2YWx1YXRpb25Hcm91cEZhY2V0ID0gdGhpcy5fZXZhbHVhdGlvbkdyb3VwRmFjZXQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9taW5pbXVtUG9pbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1pbmltdW1Qb2ludHMgPSB0aGlzLl9taW5pbXVtUG9pbnRzO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9lcHNpbG9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXZhbHVhdGlvbkdyb3VwRmFjZXQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9taW5pbXVtUG9pbnRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9lcHNpbG9uID0gdmFsdWUuZXBzaWxvbjtcbiAgICAgIHRoaXMuX2V2YWx1YXRpb25Hcm91cEZhY2V0ID0gdmFsdWUuZXZhbHVhdGlvbkdyb3VwRmFjZXQ7XG4gICAgICB0aGlzLl9taW5pbXVtUG9pbnRzID0gdmFsdWUubWluaW11bVBvaW50cztcbiAgICB9XG4gIH1cblxuICAvLyBlcHNpbG9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2Vwc2lsb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGVwc2lsb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdlcHNpbG9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBlcHNpbG9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9lcHNpbG9uID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVwc2lsb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXBzaWxvbjtcbiAgfVxuXG4gIC8vIGV2YWx1YXRpb25fZ3JvdXBfZmFjZXQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXZhbHVhdGlvbkdyb3VwRmFjZXQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGV2YWx1YXRpb25Hcm91cEZhY2V0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZXZhbHVhdGlvbl9ncm91cF9mYWNldCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXZhbHVhdGlvbkdyb3VwRmFjZXQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2V2YWx1YXRpb25Hcm91cEZhY2V0ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RXZhbHVhdGlvbkdyb3VwRmFjZXQoKSB7XG4gICAgdGhpcy5fZXZhbHVhdGlvbkdyb3VwRmFjZXQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV2YWx1YXRpb25Hcm91cEZhY2V0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2YWx1YXRpb25Hcm91cEZhY2V0O1xuICB9XG5cbiAgLy8gbWluaW11bV9wb2ludHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWluaW11bVBvaW50cz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWluaW11bVBvaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21pbmltdW1fcG9pbnRzJyk7XG4gIH1cbiAgcHVibGljIHNldCBtaW5pbXVtUG9pbnRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW5pbXVtUG9pbnRzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1pbmltdW1Qb2ludHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWluaW11bVBvaW50cztcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAqIGRic2NhbiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2Ric2NhbiBOcnFsQWxlcnRDb25kaXRpb24jZGJzY2FufVxuICAqL1xuICByZWFkb25seSBkYnNjYW46IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uRGJzY2FuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25Ub1RlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRic2NhbjogbnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmRic2NhbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBkYnNjYW46IHtcbiAgICAgIHZhbHVlOiBucnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbkRic2NhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGJzY2FuKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW5MaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGJzY2FuPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRic2NhbiA9IHRoaXMuX2Ric2Nhbj8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZGJzY2FuLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2Ric2Nhbi5pbnRlcm5hbFZhbHVlID0gdmFsdWUuZGJzY2FuO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRic2NhbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9kYnNjYW4gPSBuZXcgTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW5PdXRwdXRSZWZlcmVuY2UodGhpcywgXCJkYnNjYW5cIik7XG4gIHB1YmxpYyBnZXQgZGJzY2FuKCkge1xuICAgIHJldHVybiB0aGlzLl9kYnNjYW47XG4gIH1cbiAgcHVibGljIHB1dERic2Nhbih2YWx1ZTogTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW4pIHtcbiAgICB0aGlzLl9kYnNjYW4uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkYnNjYW5JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGJzY2FuLmludGVybmFsVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTnJxbEFsZXJ0Q29uZGl0aW9uVGVybVByZWRpY3Rpb24ge1xuICAvKipcbiAgKiBCRVRBIFBSRVZJRVc6IHRoZSBgcHJlZGljdF9ieWAgZmllbGQgaXMgaW4gbGltaXRlZCByZWxlYXNlIGFuZCBvbmx5IGVuYWJsZWQgZm9yIHByZXZpZXcgb24gYSBwZXItYWNjb3VudCBiYXNpcy4gLSBUaGUgZHVyYXRpb24sIGluIHNlY29uZHMsIHRoYXQgdGhlIHByZWRpY3Rpb24gc2hvdWxkIGxvb2sgaW50byB0aGUgZnV0dXJlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3ByZWRpY3RfYnkgTnJxbEFsZXJ0Q29uZGl0aW9uI3ByZWRpY3RfYnl9XG4gICovXG4gIHJlYWRvbmx5IHByZWRpY3RCeT86IG51bWJlcjtcbiAgLyoqXG4gICogQkVUQSBQUkVWSUVXOiB0aGUgYHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbmAgZmllbGQgaXMgaW4gbGltaXRlZCByZWxlYXNlIGFuZCBvbmx5IGVuYWJsZWQgZm9yIHByZXZpZXcgb24gYSBwZXItYWNjb3VudCBiYXNpcy4gLSBJZiBhIHByZWRpY3Rpb24gaW5jaWRlbnQgaXMgb3BlbiB3aGVuIGEgdGVybSdzIHN0YXRpYyB0aHJlc2hvbGQgaXMgYnJlYWNoZWQgYnkgdGhlIGFjdHVhbCBzaWduYWwsIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2xvc2UgdGhlIHByZWRpY3Rpb24gaW5jaWRlbnQgYW5kIG9wZW4gYSBzdGF0aWMgaW5jaWRlbnQuIFNldHRpbmcgYHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbmAgdG8gYHRydWVgIG92ZXJyaWRlcyB0aGlzIGJlaGF2aW9yIGxlYXZpbmcgdGhlIHByZWRpY3Rpb24gaW5jaWRlbnQgb3BlbiBhbmQgcHJldmVudGluZyBhIHN0YXRpYyBpbmNpZGVudCBmcm9tIG9wZW5pbmcuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jcHJlZmVyX3ByZWRpY3Rpb25fdmlvbGF0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb259XG4gICovXG4gIHJlYWRvbmx5IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb24/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvblRvVGVycmFmb3JtKHN0cnVjdD86IE5ycWxBbGVydENvbmRpdGlvblRlcm1QcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlIHwgTnJxbEFsZXJ0Q29uZGl0aW9uVGVybVByZWRpY3Rpb24pOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJlZGljdF9ieTogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0QnkpLFxuICAgIHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbjogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uVGVybVByZWRpY3Rpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvbk91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvblRlcm1QcmVkaWN0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBwcmVkaWN0X2J5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0QnkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnByZWZlclByZWRpY3Rpb25WaW9sYXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvblRlcm1QcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fcHJlZGljdEJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnByZWRpY3RCeSA9IHRoaXMuX3ByZWRpY3RCeTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbiA9IHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb247XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3ByZWRpY3RCeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX3ByZWRpY3RCeSA9IHZhbHVlLnByZWRpY3RCeTtcbiAgICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB2YWx1ZS5wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByZWRpY3RfYnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcHJlZGljdEJ5PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBwcmVkaWN0QnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdwcmVkaWN0X2J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBwcmVkaWN0QnkodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3ByZWRpY3RCeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByZWRpY3RCeSgpIHtcbiAgICB0aGlzLl9wcmVkaWN0QnkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByZWRpY3RCeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVkaWN0Qnk7XG4gIH1cblxuICAvLyBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbj86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb24odmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uKCkge1xuICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbjtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBOcnFsQWxlcnRDb25kaXRpb25UZXJtIHtcbiAgLyoqXG4gICogVmlvbGF0aW9ucyB3aWxsIG5vdCBjaGFuZ2Ugc3lzdGVtIGhlYWx0aCBzdGF0dXMgZm9yIHRoaXMgdGVybS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nIE5ycWxBbGVydENvbmRpdGlvbiNkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nfVxuICAqL1xuICByZWFkb25seSBkaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBJbiBtaW51dGVzLCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiAxIHRvIDEyMCAoaW5jbHVzaXZlKS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNkdXJhdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jZHVyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgKiBPbmUgb2YgKGFib3ZlLCBhYm92ZV9vcl9lcXVhbHMsIGJlbG93LCBiZWxvd19vcl9lcXVhbHMsIGVxdWFscywgbm90X2VxdWFscykuIERlZmF1bHRzIHRvICdlcXVhbHMnLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI29wZXJhdG9yIE5ycWxBbGVydENvbmRpdGlvbiNvcGVyYXRvcn1cbiAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAqIE9uZSBvZiAoY3JpdGljYWwsIHdhcm5pbmcpLiBEZWZhdWx0cyB0byAnY3JpdGljYWwnLiBBdCBsZWFzdCBvbmUgY29uZGl0aW9uIHRlcm0gbXVzdCBoYXZlIHByaW9yaXR5IHNldCB0byAnY3JpdGljYWwnLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3ByaW9yaXR5IE5ycWxBbGVydENvbmRpdGlvbiNwcmlvcml0eX1cbiAgKi9cbiAgcmVhZG9ubHkgcHJpb3JpdHk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIEZvciBiYXNlbGluZSBjb25kaXRpb25zIG11c3QgYmUgaW4gcmFuZ2UgWzEsIDEwMDBdLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RocmVzaG9sZCBOcnFsQWxlcnRDb25kaXRpb24jdGhyZXNob2xkfVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgLyoqXG4gICogVGhlIGR1cmF0aW9uLCBpbiBzZWNvbmRzLCB0aGF0IHRoZSB0aHJlc2hvbGQgbXVzdCB2aW9sYXRlIGluIG9yZGVyIHRvIGNyZWF0ZSBhbiBpbmNpZGVudC4gVmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSAnYWdncmVnYXRpb25fd2luZG93JyAod2hpY2ggaGFzIGEgZGVmYXVsdCBvZiA2MCBzZWNvbmRzKS4gVmFsdWUgbXVzdCBiZSB3aXRoaW4gMTIwLTg2NDAwIHNlY29uZHMgZm9yIGJhc2VsaW5lIGNvbmRpdGlvbnMsIGFuZCB3aXRoaW4gNjAtODY0MDAgc2Vjb25kcyBmb3Igc3RhdGljIGNvbmRpdGlvbnNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aHJlc2hvbGRfZHVyYXRpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI3RocmVzaG9sZF9kdXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkRHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBjcml0ZXJpYSBmb3IgaG93IG1hbnkgZGF0YSBwb2ludHMgbXVzdCBiZSBpbiB2aW9sYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdGhyZXNob2xkIGR1cmF0aW9uLiBWYWxpZCB2YWx1ZXMgYXJlOiAnQUxMJyBvciAnQVRfTEVBU1RfT05DRScgKGNhc2UgaW5zZW5zaXRpdmUpLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RocmVzaG9sZF9vY2N1cnJlbmNlcyBOcnFsQWxlcnRDb25kaXRpb24jdGhyZXNob2xkX29jY3VycmVuY2VzfVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGRPY2N1cnJlbmNlcz86IHN0cmluZztcbiAgLyoqXG4gICogVmFsaWQgdmFsdWVzIGFyZTogJ2FsbCcgb3IgJ2FueSdcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aW1lX2Z1bmN0aW9uIE5ycWxBbGVydENvbmRpdGlvbiN0aW1lX2Z1bmN0aW9ufVxuICAqL1xuICByZWFkb25seSB0aW1lRnVuY3Rpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIHByZWRpY3Rpb24gYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNwcmVkaWN0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNwcmVkaWN0aW9ufVxuICAqL1xuICByZWFkb25seSBwcmVkaWN0aW9uPzogTnJxbEFsZXJ0Q29uZGl0aW9uVGVybVByZWRpY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25UZXJtVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uVGVybSB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmc6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcpLFxuICAgIGR1cmF0aW9uOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmR1cmF0aW9uKSxcbiAgICBvcGVyYXRvcjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5vcGVyYXRvciksXG4gICAgcHJpb3JpdHk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucHJpb3JpdHkpLFxuICAgIHRocmVzaG9sZDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGQpLFxuICAgIHRocmVzaG9sZF9kdXJhdGlvbjogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGREdXJhdGlvbiksXG4gICAgdGhyZXNob2xkX29jY3VycmVuY2VzOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZE9jY3VycmVuY2VzKSxcbiAgICB0aW1lX2Z1bmN0aW9uOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnRpbWVGdW5jdGlvbiksXG4gICAgcHJlZGljdGlvbjogbnJxbEFsZXJ0Q29uZGl0aW9uVGVybVByZWRpY3Rpb25Ub1RlcnJhZm9ybShzdHJ1Y3QhLnByZWRpY3Rpb24pLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG5ycWxBbGVydENvbmRpdGlvblRlcm1Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25UZXJtIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmc6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgZHVyYXRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmR1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBvcGVyYXRvcjoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEub3BlcmF0b3IpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHByaW9yaXR5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmlvcml0eSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGhyZXNob2xkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHRocmVzaG9sZF9kdXJhdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkRHVyYXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHRocmVzaG9sZF9vY2N1cnJlbmNlczoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkT2NjdXJyZW5jZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHRpbWVfZnVuY3Rpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRpbWVGdW5jdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcHJlZGljdGlvbjoge1xuICAgICAgdmFsdWU6IG5ycWxBbGVydENvbmRpdGlvblRlcm1QcmVkaWN0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0aW9uKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJOcnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvbkxpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgTnJxbEFsZXJ0Q29uZGl0aW9uVGVybU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25UZXJtIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgPSB0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZHVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZHVyYXRpb24gPSB0aGlzLl9kdXJhdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wZXJhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm9wZXJhdG9yID0gdGhpcy5fb3BlcmF0b3I7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wcmlvcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5wcmlvcml0eSA9IHRoaXMuX3ByaW9yaXR5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRocmVzaG9sZCA9IHRoaXMuX3RocmVzaG9sZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RocmVzaG9sZER1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRocmVzaG9sZER1cmF0aW9uID0gdGhpcy5fdGhyZXNob2xkRHVyYXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHRoaXMuX3RocmVzaG9sZE9jY3VycmVuY2VzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGltZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRpbWVGdW5jdGlvbiA9IHRoaXMuX3RpbWVGdW5jdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWRpY3Rpb24/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJlZGljdGlvbiA9IHRoaXMuX3ByZWRpY3Rpb24/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25UZXJtIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcHJpb3JpdHkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGREdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RocmVzaG9sZE9jY3VycmVuY2VzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgPSB2YWx1ZS5kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nO1xuICAgICAgdGhpcy5fZHVyYXRpb24gPSB2YWx1ZS5kdXJhdGlvbjtcbiAgICAgIHRoaXMuX29wZXJhdG9yID0gdmFsdWUub3BlcmF0b3I7XG4gICAgICB0aGlzLl9wcmlvcml0eSA9IHZhbHVlLnByaW9yaXR5O1xuICAgICAgdGhpcy5fdGhyZXNob2xkID0gdmFsdWUudGhyZXNob2xkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB2YWx1ZS50aHJlc2hvbGREdXJhdGlvbjtcbiAgICAgIHRoaXMuX3RocmVzaG9sZE9jY3VycmVuY2VzID0gdmFsdWUudGhyZXNob2xkT2NjdXJyZW5jZXM7XG4gICAgICB0aGlzLl90aW1lRnVuY3Rpb24gPSB2YWx1ZS50aW1lRnVuY3Rpb247XG4gICAgICB0aGlzLl9wcmVkaWN0aW9uLmludGVybmFsVmFsdWUgPSB2YWx1ZS5wcmVkaWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmcgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nJyk7XG4gIH1cbiAgcHVibGljIHNldCBkaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZygpIHtcbiAgICB0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc7XG4gIH1cblxuICAvLyBkdXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kdXJhdGlvbj86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgZHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdkdXJhdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZHVyYXRpb24odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2R1cmF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RHVyYXRpb24oKSB7XG4gICAgdGhpcy5fZHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGR1cmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xuICB9XG5cbiAgLy8gb3BlcmF0b3IgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfb3BlcmF0b3I/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnb3BlcmF0b3InKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wZXJhdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9vcGVyYXRvciA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE9wZXJhdG9yKCkge1xuICAgIHRoaXMuX29wZXJhdG9yID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBvcGVyYXRvcklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9vcGVyYXRvcjtcbiAgfVxuXG4gIC8vIHByaW9yaXR5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3ByaW9yaXR5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwcmlvcml0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3ByaW9yaXR5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBwcmlvcml0eSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcHJpb3JpdHkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQcmlvcml0eSgpIHtcbiAgICB0aGlzLl9wcmlvcml0eSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcHJpb3JpdHlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpb3JpdHk7XG4gIH1cblxuICAvLyB0aHJlc2hvbGQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdGhyZXNob2xkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB0aHJlc2hvbGQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCd0aHJlc2hvbGQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aHJlc2hvbGQ7XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfZHVyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkRHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGhyZXNob2xkX2R1cmF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGREdXJhdGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGREdXJhdGlvbigpIHtcbiAgICB0aGlzLl90aHJlc2hvbGREdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkRHVyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkRHVyYXRpb247XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfb2NjdXJyZW5jZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkT2NjdXJyZW5jZXM/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZE9jY3VycmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGhyZXNob2xkX29jY3VycmVuY2VzJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGRPY2N1cnJlbmNlcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGRPY2N1cnJlbmNlcygpIHtcbiAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkT2NjdXJyZW5jZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXM7XG4gIH1cblxuICAvLyB0aW1lX2Z1bmN0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RpbWVGdW5jdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGltZUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGltZV9mdW5jdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZUZ1bmN0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aW1lRnVuY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lRnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lRnVuY3Rpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUZ1bmN0aW9uO1xuICB9XG5cbiAgLy8gcHJlZGljdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcmVkaWN0aW9uID0gbmV3IE5ycWxBbGVydENvbmRpdGlvblRlcm1QcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicHJlZGljdGlvblwiKTtcbiAgcHVibGljIGdldCBwcmVkaWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVkaWN0aW9uO1xuICB9XG4gIHB1YmxpYyBwdXRQcmVkaWN0aW9uKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvbikge1xuICAgIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByZWRpY3Rpb24oKSB7XG4gICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwcmVkaWN0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTnJxbEFsZXJ0Q29uZGl0aW9uVGVybUxpc3QgZXh0ZW5kcyBjZGt0bi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IE5ycWxBbGVydENvbmRpdGlvblRlcm1bXSB8IGNka3RuLklSZXNvbHZhYmxlXG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIHdyYXBzU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCBwcm90ZWN0ZWQgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHByb3RlY3RlZCB3cmFwc1NldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIHdyYXBzU2V0KVxuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogTnJxbEFsZXJ0Q29uZGl0aW9uVGVybU91dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBOcnFsQWxlcnRDb25kaXRpb25UZXJtT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTnJxbEFsZXJ0Q29uZGl0aW9uVGltZW91dHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jY3JlYXRlIE5ycWxBbGVydENvbmRpdGlvbiNjcmVhdGV9XG4gICovXG4gIHJlYWRvbmx5IGNyZWF0ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ycWxBbGVydENvbmRpdGlvblRpbWVvdXRzVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uVGltZW91dHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY3JlYXRlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25UaW1lb3V0c1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IE5ycWxBbGVydENvbmRpdGlvblRpbWVvdXRzIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGNyZWF0ZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY3JlYXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvblRpbWVvdXRzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RuLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25UaW1lb3V0cyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fY3JlYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNyZWF0ZSA9IHRoaXMuX2NyZWF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IE5ycWxBbGVydENvbmRpdGlvblRpbWVvdXRzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NyZWF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jcmVhdGUgPSB2YWx1ZS5jcmVhdGU7XG4gICAgfVxuICB9XG5cbiAgLy8gY3JlYXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NyZWF0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgY3JlYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY3JlYXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCBjcmVhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NyZWF0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENyZWF0ZSgpIHtcbiAgICB0aGlzLl9jcmVhdGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNyZWF0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1ByZWRpY3Rpb24ge1xuICAvKipcbiAgKiBCRVRBIFBSRVZJRVc6IHRoZSBgcHJlZGljdF9ieWAgZmllbGQgaXMgaW4gbGltaXRlZCByZWxlYXNlIGFuZCBvbmx5IGVuYWJsZWQgZm9yIHByZXZpZXcgb24gYSBwZXItYWNjb3VudCBiYXNpcy4gLSBUaGUgZHVyYXRpb24sIGluIHNlY29uZHMsIHRoYXQgdGhlIHByZWRpY3Rpb24gc2hvdWxkIGxvb2sgaW50byB0aGUgZnV0dXJlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3ByZWRpY3RfYnkgTnJxbEFsZXJ0Q29uZGl0aW9uI3ByZWRpY3RfYnl9XG4gICovXG4gIHJlYWRvbmx5IHByZWRpY3RCeT86IG51bWJlcjtcbiAgLyoqXG4gICogQkVUQSBQUkVWSUVXOiB0aGUgYHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbmAgZmllbGQgaXMgaW4gbGltaXRlZCByZWxlYXNlIGFuZCBvbmx5IGVuYWJsZWQgZm9yIHByZXZpZXcgb24gYSBwZXItYWNjb3VudCBiYXNpcy4gLSBJZiBhIHByZWRpY3Rpb24gaW5jaWRlbnQgaXMgb3BlbiB3aGVuIGEgdGVybSdzIHN0YXRpYyB0aHJlc2hvbGQgaXMgYnJlYWNoZWQgYnkgdGhlIGFjdHVhbCBzaWduYWwsIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2xvc2UgdGhlIHByZWRpY3Rpb24gaW5jaWRlbnQgYW5kIG9wZW4gYSBzdGF0aWMgaW5jaWRlbnQuIFNldHRpbmcgYHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbmAgdG8gYHRydWVgIG92ZXJyaWRlcyB0aGlzIGJlaGF2aW9yIGxlYXZpbmcgdGhlIHByZWRpY3Rpb24gaW5jaWRlbnQgb3BlbiBhbmQgcHJldmVudGluZyBhIHN0YXRpYyBpbmNpZGVudCBmcm9tIG9wZW5pbmcuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jcHJlZmVyX3ByZWRpY3Rpb25fdmlvbGF0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb259XG4gICovXG4gIHJlYWRvbmx5IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb24/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvblRvVGVycmFmb3JtKHN0cnVjdD86IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdQcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlIHwgTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1ByZWRpY3Rpb24pOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJlZGljdF9ieTogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0QnkpLFxuICAgIHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbjogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1ByZWRpY3Rpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvbk91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdQcmVkaWN0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBwcmVkaWN0X2J5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0QnkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnByZWZlclByZWRpY3Rpb25WaW9sYXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdQcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fcHJlZGljdEJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnByZWRpY3RCeSA9IHRoaXMuX3ByZWRpY3RCeTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbiA9IHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb247XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3ByZWRpY3RCeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX3ByZWRpY3RCeSA9IHZhbHVlLnByZWRpY3RCeTtcbiAgICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB2YWx1ZS5wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByZWRpY3RfYnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcHJlZGljdEJ5PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBwcmVkaWN0QnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdwcmVkaWN0X2J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBwcmVkaWN0QnkodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3ByZWRpY3RCeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByZWRpY3RCeSgpIHtcbiAgICB0aGlzLl9wcmVkaWN0QnkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByZWRpY3RCeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVkaWN0Qnk7XG4gIH1cblxuICAvLyBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbj86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb24odmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uKCkge1xuICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbjtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBOcnFsQWxlcnRDb25kaXRpb25XYXJuaW5nIHtcbiAgLyoqXG4gICogVmlvbGF0aW9ucyB3aWxsIG5vdCBjaGFuZ2Ugc3lzdGVtIGhlYWx0aCBzdGF0dXMgZm9yIHRoaXMgdGVybS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nIE5ycWxBbGVydENvbmRpdGlvbiNkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nfVxuICAqL1xuICByZWFkb25seSBkaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBJbiBtaW51dGVzLCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiAxIHRvIDEyMCAoaW5jbHVzaXZlKS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNkdXJhdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jZHVyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgKiBPbmUgb2YgKGFib3ZlLCBhYm92ZV9vcl9lcXVhbHMsIGJlbG93LCBiZWxvd19vcl9lcXVhbHMsIGVxdWFscywgbm90X2VxdWFscykuIERlZmF1bHRzIHRvICdlcXVhbHMnLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI29wZXJhdG9yIE5ycWxBbGVydENvbmRpdGlvbiNvcGVyYXRvcn1cbiAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAqIEZvciBiYXNlbGluZSBjb25kaXRpb25zIG11c3QgYmUgaW4gcmFuZ2UgWzEsIDEwMDBdLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RocmVzaG9sZCBOcnFsQWxlcnRDb25kaXRpb24jdGhyZXNob2xkfVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgLyoqXG4gICogVGhlIGR1cmF0aW9uLCBpbiBzZWNvbmRzLCB0aGF0IHRoZSB0aHJlc2hvbGQgbXVzdCB2aW9sYXRlIGluIG9yZGVyIHRvIGNyZWF0ZSBhbiBpbmNpZGVudC4gVmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSAnYWdncmVnYXRpb25fd2luZG93JyAod2hpY2ggaGFzIGEgZGVmYXVsdCBvZiA2MCBzZWNvbmRzKS4gVmFsdWUgbXVzdCBiZSB3aXRoaW4gMTIwLTg2NDAwIHNlY29uZHMgZm9yIGJhc2VsaW5lIGNvbmRpdGlvbnMsIGFuZCB3aXRoaW4gNjAtODY0MDAgc2Vjb25kcyBmb3Igc3RhdGljIGNvbmRpdGlvbnNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aHJlc2hvbGRfZHVyYXRpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI3RocmVzaG9sZF9kdXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkRHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBjcml0ZXJpYSBmb3IgaG93IG1hbnkgZGF0YSBwb2ludHMgbXVzdCBiZSBpbiB2aW9sYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdGhyZXNob2xkIGR1cmF0aW9uLiBWYWxpZCB2YWx1ZXMgYXJlOiAnQUxMJyBvciAnQVRfTEVBU1RfT05DRScgKGNhc2UgaW5zZW5zaXRpdmUpLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RocmVzaG9sZF9vY2N1cnJlbmNlcyBOcnFsQWxlcnRDb25kaXRpb24jdGhyZXNob2xkX29jY3VycmVuY2VzfVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGRPY2N1cnJlbmNlcz86IHN0cmluZztcbiAgLyoqXG4gICogVmFsaWQgdmFsdWVzIGFyZTogJ2FsbCcgb3IgJ2FueSdcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aW1lX2Z1bmN0aW9uIE5ycWxBbGVydENvbmRpdGlvbiN0aW1lX2Z1bmN0aW9ufVxuICAqL1xuICByZWFkb25seSB0aW1lRnVuY3Rpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIHByZWRpY3Rpb24gYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNwcmVkaWN0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNwcmVkaWN0aW9ufVxuICAqL1xuICByZWFkb25seSBwcmVkaWN0aW9uPzogTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1ByZWRpY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25XYXJuaW5nVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ091dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmcpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGlzYWJsZV9oZWFsdGhfc3RhdHVzX3JlcG9ydGluZzogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyksXG4gICAgZHVyYXRpb246IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuZHVyYXRpb24pLFxuICAgIG9wZXJhdG9yOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm9wZXJhdG9yKSxcbiAgICB0aHJlc2hvbGQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkKSxcbiAgICB0aHJlc2hvbGRfZHVyYXRpb246IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkRHVyYXRpb24pLFxuICAgIHRocmVzaG9sZF9vY2N1cnJlbmNlczogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGRPY2N1cnJlbmNlcyksXG4gICAgdGltZV9mdW5jdGlvbjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50aW1lRnVuY3Rpb24pLFxuICAgIHByZWRpY3Rpb246IG5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdQcmVkaWN0aW9uVG9UZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0aW9uKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25XYXJuaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ091dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmcpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmc6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgZHVyYXRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmR1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBvcGVyYXRvcjoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEub3BlcmF0b3IpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHRocmVzaG9sZDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICB0aHJlc2hvbGRfZHVyYXRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZER1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICB0aHJlc2hvbGRfb2NjdXJyZW5jZXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZE9jY3VycmVuY2VzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0aW1lX2Z1bmN0aW9uOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aW1lRnVuY3Rpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHByZWRpY3Rpb246IHtcbiAgICAgIHZhbHVlOiBucnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdCEucHJlZGljdGlvbiksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1ByZWRpY3Rpb25MaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kdXJhdGlvbiA9IHRoaXMuX2R1cmF0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3BlcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQub3BlcmF0b3IgPSB0aGlzLl9vcGVyYXRvcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGQgPSB0aGlzLl90aHJlc2hvbGQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl90aHJlc2hvbGREdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGREdXJhdGlvbiA9IHRoaXMuX3RocmVzaG9sZER1cmF0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGhyZXNob2xkT2NjdXJyZW5jZXMgPSB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RpbWVGdW5jdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aW1lRnVuY3Rpb24gPSB0aGlzLl90aW1lRnVuY3Rpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl9wcmVkaWN0aW9uPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnByZWRpY3Rpb24gPSB0aGlzLl9wcmVkaWN0aW9uPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RpbWVGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHZhbHVlLmRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHZhbHVlLmR1cmF0aW9uO1xuICAgICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZS5vcGVyYXRvcjtcbiAgICAgIHRoaXMuX3RocmVzaG9sZCA9IHZhbHVlLnRocmVzaG9sZDtcbiAgICAgIHRoaXMuX3RocmVzaG9sZER1cmF0aW9uID0gdmFsdWUudGhyZXNob2xkRHVyYXRpb247XG4gICAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHZhbHVlLnRocmVzaG9sZE9jY3VycmVuY2VzO1xuICAgICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdmFsdWUudGltZUZ1bmN0aW9uO1xuICAgICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWUucHJlZGljdGlvbjtcbiAgICB9XG4gIH1cblxuICAvLyBkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZGlzYWJsZV9oZWFsdGhfc3RhdHVzX3JlcG9ydGluZycpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcoKSB7XG4gICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZ0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nO1xuICB9XG5cbiAgLy8gZHVyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGR1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZHVyYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGR1cmF0aW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kdXJhdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldER1cmF0aW9uKCkge1xuICAgIHRoaXMuX2R1cmF0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkdXJhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcbiAgfVxuXG4gIC8vIG9wZXJhdG9yIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX29wZXJhdG9yPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBvcGVyYXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ29wZXJhdG9yJyk7XG4gIH1cbiAgcHVibGljIHNldCBvcGVyYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPcGVyYXRvcigpIHtcbiAgICB0aGlzLl9vcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb3BlcmF0b3JJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3I7XG4gIH1cblxuICAvLyB0aHJlc2hvbGQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdGhyZXNob2xkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB0aHJlc2hvbGQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCd0aHJlc2hvbGQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aHJlc2hvbGQ7XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfZHVyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkRHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGhyZXNob2xkX2R1cmF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGREdXJhdGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGREdXJhdGlvbigpIHtcbiAgICB0aGlzLl90aHJlc2hvbGREdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkRHVyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkRHVyYXRpb247XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfb2NjdXJyZW5jZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkT2NjdXJyZW5jZXM/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZE9jY3VycmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGhyZXNob2xkX29jY3VycmVuY2VzJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGRPY2N1cnJlbmNlcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGRPY2N1cnJlbmNlcygpIHtcbiAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkT2NjdXJyZW5jZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXM7XG4gIH1cblxuICAvLyB0aW1lX2Z1bmN0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RpbWVGdW5jdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGltZUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGltZV9mdW5jdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZUZ1bmN0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aW1lRnVuY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lRnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lRnVuY3Rpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUZ1bmN0aW9uO1xuICB9XG5cbiAgLy8gcHJlZGljdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcmVkaWN0aW9uID0gbmV3IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdQcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicHJlZGljdGlvblwiKTtcbiAgcHVibGljIGdldCBwcmVkaWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVkaWN0aW9uO1xuICB9XG4gIHB1YmxpYyBwdXRQcmVkaWN0aW9uKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvbikge1xuICAgIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByZWRpY3Rpb24oKSB7XG4gICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwcmVkaWN0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiogUmVwcmVzZW50cyBhIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uIG5ld3JlbGljX25ycWxfYWxlcnRfY29uZGl0aW9ufVxuKi9cbmV4cG9ydCBjbGFzcyBOcnFsQWxlcnRDb25kaXRpb24gZXh0ZW5kcyBjZGt0bi5UZXJyYWZvcm1SZXNvdXJjZSB7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIFBST1BFUlRJRVNcbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZlJlc291cmNlVHlwZSA9IFwibmV3cmVsaWNfbnJxbF9hbGVydF9jb25kaXRpb25cIjtcblxuICAvLyA9PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PVxuICAvKipcbiAgKiBHZW5lcmF0ZXMgQ0RLVE4gY29kZSBmb3IgaW1wb3J0aW5nIGEgTnJxbEFsZXJ0Q29uZGl0aW9uIHJlc291cmNlIHVwb24gcnVubmluZyBcImNka3RuIHBsYW4gPHN0YWNrLW5hbWU+XCJcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpbXBvcnRUb0lkIFRoZSBjb25zdHJ1Y3QgaWQgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBmb3IgdGhlIE5ycWxBbGVydENvbmRpdGlvbiB0byBpbXBvcnRcbiAgKiBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgTnJxbEFsZXJ0Q29uZGl0aW9uIHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBSZWZlciB0byB0aGUge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlXG4gICogQHBhcmFtIHByb3ZpZGVyPyBPcHRpb25hbCBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgd2hlcmUgdGhlIE5ycWxBbGVydENvbmRpdGlvbiB0byBpbXBvcnQgaXMgZm91bmRcbiAgKi9cbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNvbmZpZ0ZvckltcG9ydChzY29wZTogQ29uc3RydWN0LCBpbXBvcnRUb0lkOiBzdHJpbmcsIGltcG9ydEZyb21JZDogc3RyaW5nLCBwcm92aWRlcj86IGNka3RuLlRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2RrdG4uSW1wb3J0YWJsZVJlc291cmNlKHNjb3BlLCBpbXBvcnRUb0lkLCB7IHRlcnJhZm9ybVJlc291cmNlVHlwZTogXCJuZXdyZWxpY19ucnFsX2FsZXJ0X2NvbmRpdGlvblwiLCBpbXBvcnRJZDogaW1wb3J0RnJvbUlkLCBwcm92aWRlciB9KTtcbiAgICAgIH1cblxuICAvLyA9PT09PT09PT09PVxuICAvLyBJTklUSUFMSVpFUlxuICAvLyA9PT09PT09PT09PVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiBuZXdyZWxpY19ucnFsX2FsZXJ0X2NvbmRpdGlvbn0gUmVzb3VyY2VcbiAgKlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGlkIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSBhbW9uZ3N0IHNpYmxpbmdzIGluIHRoZSBzYW1lIHNjb3BlXG4gICogQHBhcmFtIG9wdGlvbnMgTnJxbEFsZXJ0Q29uZGl0aW9uQ29uZmlnXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IE5ycWxBbGVydENvbmRpdGlvbkNvbmZpZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiAnbmV3cmVsaWNfbnJxbF9hbGVydF9jb25kaXRpb24nLFxuICAgICAgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXJOYW1lOiAnbmV3cmVsaWMnLFxuICAgICAgICBwcm92aWRlclZlcnNpb246ICczLjgwLjInLFxuICAgICAgICBwcm92aWRlclZlcnNpb25Db25zdHJhaW50OiAnfj4gMy43J1xuICAgICAgfSxcbiAgICAgIHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIsXG4gICAgICBkZXBlbmRzT246IGNvbmZpZy5kZXBlbmRzT24sXG4gICAgICBjb3VudDogY29uZmlnLmNvdW50LFxuICAgICAgbGlmZWN5Y2xlOiBjb25maWcubGlmZWN5Y2xlLFxuICAgICAgcHJvdmlzaW9uZXJzOiBjb25maWcucHJvdmlzaW9uZXJzLFxuICAgICAgY29ubmVjdGlvbjogY29uZmlnLmNvbm5lY3Rpb24sXG4gICAgICBmb3JFYWNoOiBjb25maWcuZm9yRWFjaFxuICAgIH0pO1xuICAgIHRoaXMuX2FjY291bnRJZCA9IGNvbmZpZy5hY2NvdW50SWQ7XG4gICAgdGhpcy5fYWdncmVnYXRpb25EZWxheSA9IGNvbmZpZy5hZ2dyZWdhdGlvbkRlbGF5O1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uTWV0aG9kID0gY29uZmlnLmFnZ3JlZ2F0aW9uTWV0aG9kO1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uVGltZXIgPSBjb25maWcuYWdncmVnYXRpb25UaW1lcjtcbiAgICB0aGlzLl9hZ2dyZWdhdGlvbldpbmRvdyA9IGNvbmZpZy5hZ2dyZWdhdGlvbldpbmRvdztcbiAgICB0aGlzLl9iYXNlbGluZURpcmVjdGlvbiA9IGNvbmZpZy5iYXNlbGluZURpcmVjdGlvbjtcbiAgICB0aGlzLl9jbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb24gPSBjb25maWcuY2xvc2VWaW9sYXRpb25zT25FeHBpcmF0aW9uO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gY29uZmlnLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2VuYWJsZWQgPSBjb25maWcuZW5hYmxlZDtcbiAgICB0aGlzLl9ldmFsdWF0aW9uRGVsYXkgPSBjb25maWcuZXZhbHVhdGlvbkRlbGF5O1xuICAgIHRoaXMuX2V4cGlyYXRpb25EdXJhdGlvbiA9IGNvbmZpZy5leHBpcmF0aW9uRHVyYXRpb247XG4gICAgdGhpcy5fZmlsbE9wdGlvbiA9IGNvbmZpZy5maWxsT3B0aW9uO1xuICAgIHRoaXMuX2ZpbGxWYWx1ZSA9IGNvbmZpZy5maWxsVmFsdWU7XG4gICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XG4gICAgdGhpcy5faWdub3JlT25FeHBlY3RlZFRlcm1pbmF0aW9uID0gY29uZmlnLmlnbm9yZU9uRXhwZWN0ZWRUZXJtaW5hdGlvbjtcbiAgICB0aGlzLl9uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5fb3BlblZpb2xhdGlvbk9uRXhwaXJhdGlvbiA9IGNvbmZpZy5vcGVuVmlvbGF0aW9uT25FeHBpcmF0aW9uO1xuICAgIHRoaXMuX3BvbGljeUlkID0gY29uZmlnLnBvbGljeUlkO1xuICAgIHRoaXMuX3J1bmJvb2tVcmwgPSBjb25maWcucnVuYm9va1VybDtcbiAgICB0aGlzLl9zaWduYWxTZWFzb25hbGl0eSA9IGNvbmZpZy5zaWduYWxTZWFzb25hbGl0eTtcbiAgICB0aGlzLl9zbGlkZUJ5ID0gY29uZmlnLnNsaWRlQnk7XG4gICAgdGhpcy5fdGFyZ2V0RW50aXR5ID0gY29uZmlnLnRhcmdldEVudGl0eTtcbiAgICB0aGlzLl90aXRsZVRlbXBsYXRlID0gY29uZmlnLnRpdGxlVGVtcGxhdGU7XG4gICAgdGhpcy5fdHlwZSA9IGNvbmZpZy50eXBlO1xuICAgIHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdCA9IGNvbmZpZy52aW9sYXRpb25UaW1lTGltaXQ7XG4gICAgdGhpcy5fdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcyA9IGNvbmZpZy52aW9sYXRpb25UaW1lTGltaXRTZWNvbmRzO1xuICAgIHRoaXMuX2NyaXRpY2FsLmludGVybmFsVmFsdWUgPSBjb25maWcuY3JpdGljYWw7XG4gICAgdGhpcy5fbnJxbC5pbnRlcm5hbFZhbHVlID0gY29uZmlnLm5ycWw7XG4gICAgdGhpcy5fb3V0bGllckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5vdXRsaWVyQ29uZmlndXJhdGlvbjtcbiAgICB0aGlzLl90ZXJtLmludGVybmFsVmFsdWUgPSBjb25maWcudGVybTtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnRpbWVvdXRzO1xuICAgIHRoaXMuX3dhcm5pbmcuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy53YXJuaW5nO1xuICB9XG5cbiAgLy8gPT09PT09PT09PVxuICAvLyBBVFRSSUJVVEVTXG4gIC8vID09PT09PT09PT1cblxuICAvLyBhY2NvdW50X2lkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYWNjb3VudElkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBhY2NvdW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdhY2NvdW50X2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBhY2NvdW50SWQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2FjY291bnRJZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFjY291bnRJZCgpIHtcbiAgICB0aGlzLl9hY2NvdW50SWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFjY291bnRJZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hY2NvdW50SWQ7XG4gIH1cblxuICAvLyBhZ2dyZWdhdGlvbl9kZWxheSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hZ2dyZWdhdGlvbkRlbGF5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvbkRlbGF5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnYWdncmVnYXRpb25fZGVsYXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFnZ3JlZ2F0aW9uRGVsYXkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uRGVsYXkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBZ2dyZWdhdGlvbkRlbGF5KCkge1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uRGVsYXkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uRGVsYXlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWdncmVnYXRpb25EZWxheTtcbiAgfVxuXG4gIC8vIGFnZ3JlZ2F0aW9uX21ldGhvZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hZ2dyZWdhdGlvbk1ldGhvZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb25NZXRob2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhZ2dyZWdhdGlvbl9tZXRob2QnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFnZ3JlZ2F0aW9uTWV0aG9kKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hZ2dyZWdhdGlvbk1ldGhvZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFnZ3JlZ2F0aW9uTWV0aG9kKCkge1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uTWV0aG9kID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvbk1ldGhvZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hZ2dyZWdhdGlvbk1ldGhvZDtcbiAgfVxuXG4gIC8vIGFnZ3JlZ2F0aW9uX3RpbWVyIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2FnZ3JlZ2F0aW9uVGltZXI/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uVGltZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhZ2dyZWdhdGlvbl90aW1lcicpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWdncmVnYXRpb25UaW1lcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYWdncmVnYXRpb25UaW1lciA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFnZ3JlZ2F0aW9uVGltZXIoKSB7XG4gICAgdGhpcy5fYWdncmVnYXRpb25UaW1lciA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb25UaW1lcklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hZ2dyZWdhdGlvblRpbWVyO1xuICB9XG5cbiAgLy8gYWdncmVnYXRpb25fd2luZG93IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYWdncmVnYXRpb25XaW5kb3c/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uV2luZG93KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnYWdncmVnYXRpb25fd2luZG93Jyk7XG4gIH1cbiAgcHVibGljIHNldCBhZ2dyZWdhdGlvbldpbmRvdyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fYWdncmVnYXRpb25XaW5kb3cgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBZ2dyZWdhdGlvbldpbmRvdygpIHtcbiAgICB0aGlzLl9hZ2dyZWdhdGlvbldpbmRvdyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb25XaW5kb3dJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWdncmVnYXRpb25XaW5kb3c7XG4gIH1cblxuICAvLyBiYXNlbGluZV9kaXJlY3Rpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYmFzZWxpbmVEaXJlY3Rpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGJhc2VsaW5lRGlyZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnYmFzZWxpbmVfZGlyZWN0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBiYXNlbGluZURpcmVjdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYmFzZWxpbmVEaXJlY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRCYXNlbGluZURpcmVjdGlvbigpIHtcbiAgICB0aGlzLl9iYXNlbGluZURpcmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYmFzZWxpbmVEaXJlY3Rpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYmFzZWxpbmVEaXJlY3Rpb247XG4gIH1cblxuICAvLyBjbG9zZV92aW9sYXRpb25zX29uX2V4cGlyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY2xvc2VWaW9sYXRpb25zT25FeHBpcmF0aW9uPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBjbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnY2xvc2VfdmlvbGF0aW9uc19vbl9leHBpcmF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBjbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb24odmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2Nsb3NlVmlvbGF0aW9uc09uRXhwaXJhdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENsb3NlVmlvbGF0aW9uc09uRXhwaXJhdGlvbigpIHtcbiAgICB0aGlzLl9jbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNsb3NlVmlvbGF0aW9uc09uRXhwaXJhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb247XG4gIH1cblxuICAvLyBkZXNjcmlwdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kZXNjcmlwdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkZXNjcmlwdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgLy8gZW5hYmxlZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9lbmFibGVkPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBlbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2VuYWJsZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2VuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFbmFibGVkKCkge1xuICAgIHRoaXMuX2VuYWJsZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIC8vIGVudGl0eV9ndWlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZW50aXR5R3VpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2VudGl0eV9ndWlkJyk7XG4gIH1cblxuICAvLyBldmFsdWF0aW9uX2RlbGF5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2V2YWx1YXRpb25EZWxheT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgZXZhbHVhdGlvbkRlbGF5KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZXZhbHVhdGlvbl9kZWxheScpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXZhbHVhdGlvbkRlbGF5KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9ldmFsdWF0aW9uRGVsYXkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFdmFsdWF0aW9uRGVsYXkoKSB7XG4gICAgdGhpcy5fZXZhbHVhdGlvbkRlbGF5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBldmFsdWF0aW9uRGVsYXlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGlvbkRlbGF5O1xuICB9XG5cbiAgLy8gZXhwaXJhdGlvbl9kdXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9leHBpcmF0aW9uRHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGV4cGlyYXRpb25EdXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2V4cGlyYXRpb25fZHVyYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cGlyYXRpb25EdXJhdGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXhwaXJhdGlvbkR1cmF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RXhwaXJhdGlvbkR1cmF0aW9uKCkge1xuICAgIHRoaXMuX2V4cGlyYXRpb25EdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXhwaXJhdGlvbkR1cmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4cGlyYXRpb25EdXJhdGlvbjtcbiAgfVxuXG4gIC8vIGZpbGxfb3B0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZpbGxPcHRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGZpbGxPcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdmaWxsX29wdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmlsbE9wdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZmlsbE9wdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZpbGxPcHRpb24oKSB7XG4gICAgdGhpcy5fZmlsbE9wdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmlsbE9wdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9maWxsT3B0aW9uO1xuICB9XG5cbiAgLy8gZmlsbF92YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9maWxsVmFsdWU/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGZpbGxWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2ZpbGxfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZpbGxWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZmlsbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RmlsbFZhbHVlKCkge1xuICAgIHRoaXMuX2ZpbGxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmlsbFZhbHVlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGxWYWx1ZTtcbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldElkKCkge1xuICAgIHRoaXMuX2lkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8vIGlnbm9yZV9vbl9leHBlY3RlZF90ZXJtaW5hdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pZ25vcmVPbkV4cGVjdGVkVGVybWluYXRpb24/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGlnbm9yZU9uRXhwZWN0ZWRUZXJtaW5hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdpZ25vcmVfb25fZXhwZWN0ZWRfdGVybWluYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlnbm9yZU9uRXhwZWN0ZWRUZXJtaW5hdGlvbih2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5faWdub3JlT25FeHBlY3RlZFRlcm1pbmF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SWdub3JlT25FeHBlY3RlZFRlcm1pbmF0aW9uKCkge1xuICAgIHRoaXMuX2lnbm9yZU9uRXhwZWN0ZWRUZXJtaW5hdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaWdub3JlT25FeHBlY3RlZFRlcm1pbmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lnbm9yZU9uRXhwZWN0ZWRUZXJtaW5hdGlvbjtcbiAgfVxuXG4gIC8vIG5hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLy8gb3Blbl92aW9sYXRpb25fb25fZXhwaXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9vcGVuVmlvbGF0aW9uT25FeHBpcmF0aW9uPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBvcGVuVmlvbGF0aW9uT25FeHBpcmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ29wZW5fdmlvbGF0aW9uX29uX2V4cGlyYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wZW5WaW9sYXRpb25PbkV4cGlyYXRpb24odmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX29wZW5WaW9sYXRpb25PbkV4cGlyYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPcGVuVmlvbGF0aW9uT25FeHBpcmF0aW9uKCkge1xuICAgIHRoaXMuX29wZW5WaW9sYXRpb25PbkV4cGlyYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG9wZW5WaW9sYXRpb25PbkV4cGlyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlblZpb2xhdGlvbk9uRXhwaXJhdGlvbjtcbiAgfVxuXG4gIC8vIHBvbGljeV9pZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9wb2xpY3lJZD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgcG9saWN5SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdwb2xpY3lfaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBvbGljeUlkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wb2xpY3lJZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwb2xpY3lJZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wb2xpY3lJZDtcbiAgfVxuXG4gIC8vIHJ1bmJvb2tfdXJsIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3J1bmJvb2tVcmw/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHJ1bmJvb2tVcmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdydW5ib29rX3VybCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcnVuYm9va1VybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcnVuYm9va1VybCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFJ1bmJvb2tVcmwoKSB7XG4gICAgdGhpcy5fcnVuYm9va1VybCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcnVuYm9va1VybElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ydW5ib29rVXJsO1xuICB9XG5cbiAgLy8gc2lnbmFsX3NlYXNvbmFsaXR5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NpZ25hbFNlYXNvbmFsaXR5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaWduYWxTZWFzb25hbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3NpZ25hbF9zZWFzb25hbGl0eScpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2lnbmFsU2Vhc29uYWxpdHkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NpZ25hbFNlYXNvbmFsaXR5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U2lnbmFsU2Vhc29uYWxpdHkoKSB7XG4gICAgdGhpcy5fc2lnbmFsU2Vhc29uYWxpdHkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNpZ25hbFNlYXNvbmFsaXR5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbFNlYXNvbmFsaXR5O1xuICB9XG5cbiAgLy8gc2xpZGVfYnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc2xpZGVCeT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgc2xpZGVCeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3NsaWRlX2J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBzbGlkZUJ5KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zbGlkZUJ5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U2xpZGVCeSgpIHtcbiAgICB0aGlzLl9zbGlkZUJ5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzbGlkZUJ5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NsaWRlQnk7XG4gIH1cblxuICAvLyB0YXJnZXRfZW50aXR5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RhcmdldEVudGl0eT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFyZ2V0RW50aXR5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGFyZ2V0X2VudGl0eScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGFyZ2V0RW50aXR5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YXJnZXRFbnRpdHkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUYXJnZXRFbnRpdHkoKSB7XG4gICAgdGhpcy5fdGFyZ2V0RW50aXR5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YXJnZXRFbnRpdHlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFyZ2V0RW50aXR5O1xuICB9XG5cbiAgLy8gdGl0bGVfdGVtcGxhdGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGl0bGVUZW1wbGF0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGl0bGVUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RpdGxlX3RlbXBsYXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZVRlbXBsYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aXRsZVRlbXBsYXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGl0bGVUZW1wbGF0ZSgpIHtcbiAgICB0aGlzLl90aXRsZVRlbXBsYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aXRsZVRlbXBsYXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpdGxlVGVtcGxhdGU7XG4gIH1cblxuICAvLyB0eXBlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3R5cGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCB0eXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90eXBlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VHlwZSgpIHtcbiAgICB0aGlzLl90eXBlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0eXBlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICAvLyB2aW9sYXRpb25fdGltZV9saW1pdCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Zpb2xhdGlvblRpbWVMaW1pdD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdmlvbGF0aW9uVGltZUxpbWl0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndmlvbGF0aW9uX3RpbWVfbGltaXQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpb2xhdGlvblRpbWVMaW1pdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmlvbGF0aW9uVGltZUxpbWl0ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VmlvbGF0aW9uVGltZUxpbWl0KCkge1xuICAgIHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdmlvbGF0aW9uVGltZUxpbWl0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdDtcbiAgfVxuXG4gIC8vIHZpb2xhdGlvbl90aW1lX2xpbWl0X3NlY29uZHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3Zpb2xhdGlvbl90aW1lX2xpbWl0X3NlY29uZHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpb2xhdGlvblRpbWVMaW1pdFNlY29uZHModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdFNlY29uZHMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRWaW9sYXRpb25UaW1lTGltaXRTZWNvbmRzKCkge1xuICAgIHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdFNlY29uZHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHZpb2xhdGlvblRpbWVMaW1pdFNlY29uZHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcztcbiAgfVxuXG4gIC8vIGNyaXRpY2FsIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NyaXRpY2FsID0gbmV3IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiY3JpdGljYWxcIik7XG4gIHB1YmxpYyBnZXQgY3JpdGljYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyaXRpY2FsO1xuICB9XG4gIHB1YmxpYyBwdXRDcml0aWNhbCh2YWx1ZTogTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWwpIHtcbiAgICB0aGlzLl9jcml0aWNhbC5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q3JpdGljYWwoKSB7XG4gICAgdGhpcy5fY3JpdGljYWwuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY3JpdGljYWxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JpdGljYWwuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIG5ycWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbnJxbCA9IG5ldyBOcnFsQWxlcnRDb25kaXRpb25OcnFsT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwibnJxbFwiKTtcbiAgcHVibGljIGdldCBucnFsKCkge1xuICAgIHJldHVybiB0aGlzLl9ucnFsO1xuICB9XG4gIHB1YmxpYyBwdXROcnFsKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25OcnFsKSB7XG4gICAgdGhpcy5fbnJxbC5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG5ycWxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbnJxbC5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gb3V0bGllcl9jb25maWd1cmF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX291dGxpZXJDb25maWd1cmF0aW9uID0gbmV3IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwib3V0bGllcl9jb25maWd1cmF0aW9uXCIpO1xuICBwdWJsaWMgZ2V0IG91dGxpZXJDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9vdXRsaWVyQ29uZmlndXJhdGlvbjtcbiAgfVxuICBwdWJsaWMgcHV0T3V0bGllckNvbmZpZ3VyYXRpb24odmFsdWU6IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fb3V0bGllckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE91dGxpZXJDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuX291dGxpZXJDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG91dGxpZXJDb25maWd1cmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX291dGxpZXJDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyB0ZXJtIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Rlcm0gPSBuZXcgTnJxbEFsZXJ0Q29uZGl0aW9uVGVybUxpc3QodGhpcywgXCJ0ZXJtXCIsIHRydWUpO1xuICBwdWJsaWMgZ2V0IHRlcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlcm07XG4gIH1cbiAgcHVibGljIHB1dFRlcm0odmFsdWU6IE5ycWxBbGVydENvbmRpdGlvblRlcm1bXSB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fdGVybS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGVybSgpIHtcbiAgICB0aGlzLl90ZXJtLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRlcm1JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVybS5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdGltZW91dHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGltZW91dHMgPSBuZXcgTnJxbEFsZXJ0Q29uZGl0aW9uVGltZW91dHNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJ0aW1lb3V0c1wiKTtcbiAgcHVibGljIGdldCB0aW1lb3V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dHM7XG4gIH1cbiAgcHVibGljIHB1dFRpbWVvdXRzKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25UaW1lb3V0cykge1xuICAgIHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lb3V0cygpIHtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lb3V0c0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gd2FybmluZyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF93YXJuaW5nID0gbmV3IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJ3YXJuaW5nXCIpO1xuICBwdWJsaWMgZ2V0IHdhcm5pbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhcm5pbmc7XG4gIH1cbiAgcHVibGljIHB1dFdhcm5pbmcodmFsdWU6IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmcpIHtcbiAgICB0aGlzLl93YXJuaW5nLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRXYXJuaW5nKCkge1xuICAgIHRoaXMuX3dhcm5pbmcuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgd2FybmluZ0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl93YXJuaW5nLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyA9PT09PT09PT1cbiAgLy8gU1lOVEhFU0lTXG4gIC8vID09PT09PT09PVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnRfaWQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX2FjY291bnRJZCksXG4gICAgICBhZ2dyZWdhdGlvbl9kZWxheTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25EZWxheSksXG4gICAgICBhZ2dyZWdhdGlvbl9tZXRob2Q6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2FnZ3JlZ2F0aW9uTWV0aG9kKSxcbiAgICAgIGFnZ3JlZ2F0aW9uX3RpbWVyOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9hZ2dyZWdhdGlvblRpbWVyKSxcbiAgICAgIGFnZ3JlZ2F0aW9uX3dpbmRvdzogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25XaW5kb3cpLFxuICAgICAgYmFzZWxpbmVfZGlyZWN0aW9uOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9iYXNlbGluZURpcmVjdGlvbiksXG4gICAgICBjbG9zZV92aW9sYXRpb25zX29uX2V4cGlyYXRpb246IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl9jbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb24pLFxuICAgICAgZGVzY3JpcHRpb246IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2Rlc2NyaXB0aW9uKSxcbiAgICAgIGVuYWJsZWQ6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl9lbmFibGVkKSxcbiAgICAgIGV2YWx1YXRpb25fZGVsYXk6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX2V2YWx1YXRpb25EZWxheSksXG4gICAgICBleHBpcmF0aW9uX2R1cmF0aW9uOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybSh0aGlzLl9leHBpcmF0aW9uRHVyYXRpb24pLFxuICAgICAgZmlsbF9vcHRpb246IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2ZpbGxPcHRpb24pLFxuICAgICAgZmlsbF92YWx1ZTogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0odGhpcy5fZmlsbFZhbHVlKSxcbiAgICAgIGlkOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9pZCksXG4gICAgICBpZ25vcmVfb25fZXhwZWN0ZWRfdGVybWluYXRpb246IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl9pZ25vcmVPbkV4cGVjdGVkVGVybWluYXRpb24pLFxuICAgICAgbmFtZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fbmFtZSksXG4gICAgICBvcGVuX3Zpb2xhdGlvbl9vbl9leHBpcmF0aW9uOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0odGhpcy5fb3BlblZpb2xhdGlvbk9uRXhwaXJhdGlvbiksXG4gICAgICBwb2xpY3lfaWQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX3BvbGljeUlkKSxcbiAgICAgIHJ1bmJvb2tfdXJsOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9ydW5ib29rVXJsKSxcbiAgICAgIHNpZ25hbF9zZWFzb25hbGl0eTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fc2lnbmFsU2Vhc29uYWxpdHkpLFxuICAgICAgc2xpZGVfYnk6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX3NsaWRlQnkpLFxuICAgICAgdGFyZ2V0X2VudGl0eTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fdGFyZ2V0RW50aXR5KSxcbiAgICAgIHRpdGxlX3RlbXBsYXRlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl90aXRsZVRlbXBsYXRlKSxcbiAgICAgIHR5cGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3R5cGUpLFxuICAgICAgdmlvbGF0aW9uX3RpbWVfbGltaXQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdCksXG4gICAgICB2aW9sYXRpb25fdGltZV9saW1pdF9zZWNvbmRzOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybSh0aGlzLl92aW9sYXRpb25UaW1lTGltaXRTZWNvbmRzKSxcbiAgICAgIGNyaXRpY2FsOiBucnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFRvVGVycmFmb3JtKHRoaXMuX2NyaXRpY2FsLmludGVybmFsVmFsdWUpLFxuICAgICAgbnJxbDogbnJxbEFsZXJ0Q29uZGl0aW9uTnJxbFRvVGVycmFmb3JtKHRoaXMuX25ycWwuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBvdXRsaWVyX2NvbmZpZ3VyYXRpb246IG5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0odGhpcy5fb3V0bGllckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSksXG4gICAgICB0ZXJtOiBjZGt0bi5saXN0TWFwcGVyKG5ycWxBbGVydENvbmRpdGlvblRlcm1Ub1RlcnJhZm9ybSwgdHJ1ZSkodGhpcy5fdGVybS5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHRpbWVvdXRzOiBucnFsQWxlcnRDb25kaXRpb25UaW1lb3V0c1RvVGVycmFmb3JtKHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUpLFxuICAgICAgd2FybmluZzogbnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1RvVGVycmFmb3JtKHRoaXMuX3dhcm5pbmcuaW50ZXJuYWxWYWx1ZSksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICBhY2NvdW50X2lkOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybSh0aGlzLl9hY2NvdW50SWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICAgIH0sXG4gICAgICBhZ2dyZWdhdGlvbl9kZWxheToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25EZWxheSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGFnZ3JlZ2F0aW9uX21ldGhvZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25NZXRob2QpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBhZ2dyZWdhdGlvbl90aW1lcjoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25UaW1lciksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGFnZ3JlZ2F0aW9uX3dpbmRvdzoge1xuICAgICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25XaW5kb3cpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICAgIH0sXG4gICAgICBiYXNlbGluZV9kaXJlY3Rpb246IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2Jhc2VsaW5lRGlyZWN0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgY2xvc2VfdmlvbGF0aW9uc19vbl9leHBpcmF0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0odGhpcy5fY2xvc2VWaW9sYXRpb25zT25FeHBpcmF0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9kZXNjcmlwdGlvbiksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGVuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9lbmFibGVkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIGV2YWx1YXRpb25fZGVsYXk6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX2V2YWx1YXRpb25EZWxheSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIGV4cGlyYXRpb25fZHVyYXRpb246IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX2V4cGlyYXRpb25EdXJhdGlvbiksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIGZpbGxfb3B0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9maWxsT3B0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgZmlsbF92YWx1ZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fZmlsbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2lkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgaWdub3JlX29uX2V4cGVjdGVkX3Rlcm1pbmF0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0odGhpcy5faWdub3JlT25FeHBlY3RlZFRlcm1pbmF0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX25hbWUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBvcGVuX3Zpb2xhdGlvbl9vbl9leHBpcmF0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0odGhpcy5fb3BlblZpb2xhdGlvbk9uRXhwaXJhdGlvbiksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICAgIH0sXG4gICAgICBwb2xpY3lfaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX3BvbGljeUlkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgcnVuYm9va191cmw6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3J1bmJvb2tVcmwpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBzaWduYWxfc2Vhc29uYWxpdHk6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3NpZ25hbFNlYXNvbmFsaXR5KSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgc2xpZGVfYnk6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX3NsaWRlQnkpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICAgIH0sXG4gICAgICB0YXJnZXRfZW50aXR5OiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl90YXJnZXRFbnRpdHkpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICB0aXRsZV90ZW1wbGF0ZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fdGl0bGVUZW1wbGF0ZSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3R5cGUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICB2aW9sYXRpb25fdGltZV9saW1pdDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fdmlvbGF0aW9uVGltZUxpbWl0KSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgdmlvbGF0aW9uX3RpbWVfbGltaXRfc2Vjb25kczoge1xuICAgICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIGNyaXRpY2FsOiB7XG4gICAgICAgIHZhbHVlOiBucnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFRvSGNsVGVycmFmb3JtKHRoaXMuX2NyaXRpY2FsLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbExpc3RcIixcbiAgICAgIH0sXG4gICAgICBucnFsOiB7XG4gICAgICAgIHZhbHVlOiBucnFsQWxlcnRDb25kaXRpb25OcnFsVG9IY2xUZXJyYWZvcm0odGhpcy5fbnJxbC5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiTnJxbEFsZXJ0Q29uZGl0aW9uTnJxbExpc3RcIixcbiAgICAgIH0sXG4gICAgICBvdXRsaWVyX2NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgdmFsdWU6IG5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0odGhpcy5fb3V0bGllckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIk5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHRlcm06IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2wobnJxbEFsZXJ0Q29uZGl0aW9uVGVybVRvSGNsVGVycmFmb3JtLCB0cnVlKSh0aGlzLl90ZXJtLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIk5ycWxBbGVydENvbmRpdGlvblRlcm1MaXN0XCIsXG4gICAgICB9LFxuICAgICAgdGltZW91dHM6IHtcbiAgICAgICAgdmFsdWU6IG5ycWxBbGVydENvbmRpdGlvblRpbWVvdXRzVG9IY2xUZXJyYWZvcm0odGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwic3RydWN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiTnJxbEFsZXJ0Q29uZGl0aW9uVGltZW91dHNcIixcbiAgICAgIH0sXG4gICAgICB3YXJuaW5nOiB7XG4gICAgICAgIHZhbHVlOiBucnFsQWxlcnRDb25kaXRpb25XYXJuaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fd2FybmluZy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ0xpc3RcIixcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkICkpXG4gIH1cbn1cbiJdfQ==