@cdktn/provider-newrelic 15.0.5 → 15.2.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 (174) hide show
  1. package/.jsii +32021 -24172
  2. package/README.md +3 -3
  3. package/lib/account-management/index.d.ts +10 -10
  4. package/lib/account-management/index.js +9 -9
  5. package/lib/alert-channel/index.d.ts +30 -30
  6. package/lib/alert-channel/index.js +9 -9
  7. package/lib/alert-compound-condition/index.d.ts +17 -17
  8. package/lib/alert-compound-condition/index.js +13 -13
  9. package/lib/alert-condition/index.d.ts +23 -23
  10. package/lib/alert-condition/index.js +10 -10
  11. package/lib/alert-muting-rule/index.d.ts +23 -23
  12. package/lib/alert-muting-rule/index.js +16 -16
  13. package/lib/alert-policy/index.d.ts +8 -8
  14. package/lib/alert-policy/index.js +6 -6
  15. package/lib/alert-policy-channel/index.d.ts +9 -9
  16. package/lib/alert-policy-channel/index.js +9 -9
  17. package/lib/api-access-key/index.d.ts +10 -10
  18. package/lib/api-access-key/index.js +6 -6
  19. package/lib/application-settings/index.d.ts +27 -27
  20. package/lib/application-settings/index.js +21 -21
  21. package/lib/aws-connection/index.d.ts +326 -0
  22. package/lib/aws-connection/index.js +750 -0
  23. package/lib/browser-application/index.d.ts +12 -12
  24. package/lib/browser-application/index.js +9 -9
  25. package/lib/cardinality-management/index.d.ts +9 -9
  26. package/lib/cardinality-management/index.js +10 -10
  27. package/lib/cloud-aws-eu-sovereign-integrations/index.d.ts +14 -14
  28. package/lib/cloud-aws-eu-sovereign-integrations/index.js +15 -15
  29. package/lib/cloud-aws-eu-sovereign-link-account/index.d.ts +8 -8
  30. package/lib/cloud-aws-eu-sovereign-link-account/index.js +6 -6
  31. package/lib/cloud-aws-govcloud-integrations/index.d.ts +110 -110
  32. package/lib/cloud-aws-govcloud-integrations/index.js +66 -66
  33. package/lib/cloud-aws-govcloud-link-account/index.d.ts +8 -8
  34. package/lib/cloud-aws-govcloud-link-account/index.js +6 -6
  35. package/lib/cloud-aws-integrations/index.d.ts +234 -234
  36. package/lib/cloud-aws-integrations/index.js +168 -168
  37. package/lib/cloud-aws-link-account/index.d.ts +8 -8
  38. package/lib/cloud-aws-link-account/index.js +6 -6
  39. package/lib/cloud-azure-integrations/index.d.ts +109 -109
  40. package/lib/cloud-azure-integrations/index.js +105 -105
  41. package/lib/cloud-azure-link-account/index.d.ts +10 -10
  42. package/lib/cloud-azure-link-account/index.js +6 -6
  43. package/lib/cloud-gcp-integrations/index.d.ts +62 -62
  44. package/lib/cloud-gcp-integrations/index.js +84 -84
  45. package/lib/cloud-gcp-link-account/index.d.ts +7 -7
  46. package/lib/cloud-gcp-link-account/index.js +6 -6
  47. package/lib/cloud-oci-link-account/index.d.ts +40 -18
  48. package/lib/cloud-oci-link-account/index.js +48 -6
  49. package/lib/data-newrelic-account/index.d.ts +7 -7
  50. package/lib/data-newrelic-account/index.js +6 -6
  51. package/lib/data-newrelic-alert-channel/index.d.ts +6 -6
  52. package/lib/data-newrelic-alert-channel/index.js +10 -10
  53. package/lib/data-newrelic-alert-policy/index.d.ts +7 -7
  54. package/lib/data-newrelic-alert-policy/index.js +6 -6
  55. package/lib/data-newrelic-application/index.d.ts +5 -5
  56. package/lib/data-newrelic-application/index.js +6 -6
  57. package/lib/data-newrelic-authentication-domain/index.d.ts +4 -4
  58. package/lib/data-newrelic-authentication-domain/index.js +6 -6
  59. package/lib/data-newrelic-cloud-account/index.d.ts +7 -7
  60. package/lib/data-newrelic-cloud-account/index.js +6 -6
  61. package/lib/data-newrelic-entity/index.d.ts +14 -14
  62. package/lib/data-newrelic-entity/index.js +10 -10
  63. package/lib/data-newrelic-fleet-configuration/index.d.ts +8 -8
  64. package/lib/data-newrelic-fleet-configuration/index.js +6 -6
  65. package/lib/data-newrelic-fleet-members/index.d.ts +6 -6
  66. package/lib/data-newrelic-fleet-members/index.js +10 -10
  67. package/lib/data-newrelic-group/index.d.ts +5 -5
  68. package/lib/data-newrelic-group/index.js +6 -6
  69. package/lib/data-newrelic-key-transaction/index.d.ts +7 -7
  70. package/lib/data-newrelic-key-transaction/index.js +6 -6
  71. package/lib/data-newrelic-notification-destination/index.d.ts +12 -12
  72. package/lib/data-newrelic-notification-destination/index.js +17 -17
  73. package/lib/data-newrelic-obfuscation-expression/index.d.ts +6 -6
  74. package/lib/data-newrelic-obfuscation-expression/index.js +6 -6
  75. package/lib/data-newrelic-service-level-alert-helper/index.d.ts +11 -11
  76. package/lib/data-newrelic-service-level-alert-helper/index.js +6 -6
  77. package/lib/data-newrelic-synthetics-private-location/index.d.ts +7 -7
  78. package/lib/data-newrelic-synthetics-private-location/index.js +6 -6
  79. package/lib/data-newrelic-synthetics-secure-credential/index.d.ts +6 -6
  80. package/lib/data-newrelic-synthetics-secure-credential/index.js +6 -6
  81. package/lib/data-newrelic-test-grok-pattern/index.d.ts +7 -7
  82. package/lib/data-newrelic-test-grok-pattern/index.js +14 -14
  83. package/lib/data-newrelic-user/index.d.ts +6 -6
  84. package/lib/data-newrelic-user/index.js +6 -6
  85. package/lib/data-partition-rule/index.d.ts +12 -12
  86. package/lib/data-partition-rule/index.js +9 -9
  87. package/lib/entity-tags/index.d.ts +10 -10
  88. package/lib/entity-tags/index.js +13 -13
  89. package/lib/events-to-metrics-rule/index.d.ts +9 -9
  90. package/lib/events-to-metrics-rule/index.js +6 -6
  91. package/lib/federated-logs-partition/index.d.ts +418 -0
  92. package/lib/federated-logs-partition/index.js +1046 -0
  93. package/lib/federated-logs-setup/index.d.ts +550 -0
  94. package/lib/federated-logs-setup/index.js +1414 -0
  95. package/lib/fleet/index.d.ts +10 -10
  96. package/lib/fleet/index.js +6 -6
  97. package/lib/fleet-configuration/index.d.ts +11 -11
  98. package/lib/fleet-configuration/index.js +10 -10
  99. package/lib/fleet-deployment/index.d.ts +13 -13
  100. package/lib/fleet-deployment/index.js +10 -10
  101. package/lib/fleet-members/index.d.ts +8 -8
  102. package/lib/fleet-members/index.js +10 -10
  103. package/lib/group/index.d.ts +7 -7
  104. package/lib/group/index.js +6 -6
  105. package/lib/index.d.ts +3 -0
  106. package/lib/index.js +6 -3
  107. package/lib/infra-alert-condition/index.d.ts +25 -25
  108. package/lib/infra-alert-condition/index.js +12 -12
  109. package/lib/insights-event/index.d.ts +11 -11
  110. package/lib/insights-event/index.js +14 -14
  111. package/lib/key-transaction/index.d.ts +9 -9
  112. package/lib/key-transaction/index.js +6 -6
  113. package/lib/lazy-index.js +4 -1
  114. package/lib/log-parsing-rule/index.d.ts +12 -12
  115. package/lib/log-parsing-rule/index.js +6 -6
  116. package/lib/metric-pruning-rule/index.d.ts +7 -7
  117. package/lib/metric-pruning-rule/index.js +6 -6
  118. package/lib/monitor-downtime/index.d.ts +20 -20
  119. package/lib/monitor-downtime/index.js +15 -15
  120. package/lib/notification-channel/index.d.ts +18 -18
  121. package/lib/notification-channel/index.js +13 -13
  122. package/lib/notification-destination/index.d.ts +31 -31
  123. package/lib/notification-destination/index.js +29 -29
  124. package/lib/nrql-alert-condition/index.d.ts +75 -75
  125. package/lib/nrql-alert-condition/index.js +37 -37
  126. package/lib/nrql-drop-rule/index.d.ts +10 -10
  127. package/lib/nrql-drop-rule/index.js +9 -9
  128. package/lib/obfuscation-expression/index.d.ts +8 -8
  129. package/lib/obfuscation-expression/index.js +6 -6
  130. package/lib/obfuscation-rule/index.d.ts +13 -13
  131. package/lib/obfuscation-rule/index.js +10 -10
  132. package/lib/one-dashboard/index-structs/structs0.d.ts +364 -364
  133. package/lib/one-dashboard/index-structs/structs0.js +401 -401
  134. package/lib/one-dashboard/index-structs/structs400.d.ts +286 -286
  135. package/lib/one-dashboard/index-structs/structs400.js +278 -278
  136. package/lib/one-dashboard/index.d.ts +10 -10
  137. package/lib/one-dashboard/index.js +6 -6
  138. package/lib/one-dashboard-json/index.d.ts +9 -9
  139. package/lib/one-dashboard-json/index.js +9 -9
  140. package/lib/one-dashboard-raw/index.d.ts +20 -20
  141. package/lib/one-dashboard-raw/index.js +14 -14
  142. package/lib/pipeline-cloud-rule/index.d.ts +8 -8
  143. package/lib/pipeline-cloud-rule/index.js +6 -6
  144. package/lib/provider/index.d.ts +17 -17
  145. package/lib/provider/index.js +6 -6
  146. package/lib/service-level/index.d.ts +38 -38
  147. package/lib/service-level/index.js +36 -36
  148. package/lib/synthetics-alert-condition/index.d.ts +9 -9
  149. package/lib/synthetics-alert-condition/index.js +6 -6
  150. package/lib/synthetics-broken-links-monitor/index.d.ts +17 -17
  151. package/lib/synthetics-broken-links-monitor/index.js +10 -10
  152. package/lib/synthetics-cert-check-monitor/index.d.ts +18 -18
  153. package/lib/synthetics-cert-check-monitor/index.js +10 -10
  154. package/lib/synthetics-monitor/index.d.ts +31 -31
  155. package/lib/synthetics-monitor/index.js +14 -14
  156. package/lib/synthetics-multilocation-alert-condition/index.d.ts +14 -14
  157. package/lib/synthetics-multilocation-alert-condition/index.js +12 -12
  158. package/lib/synthetics-private-location/index.d.ts +9 -9
  159. package/lib/synthetics-private-location/index.js +6 -6
  160. package/lib/synthetics-script-monitor/index.d.ts +26 -26
  161. package/lib/synthetics-script-monitor/index.js +14 -14
  162. package/lib/synthetics-secure-credential/index.d.ts +11 -11
  163. package/lib/synthetics-secure-credential/index.js +9 -9
  164. package/lib/synthetics-step-monitor/index.d.ts +25 -25
  165. package/lib/synthetics-step-monitor/index.js +18 -18
  166. package/lib/user/index.d.ts +8 -8
  167. package/lib/user/index.js +6 -6
  168. package/lib/workflow/index.d.ts +26 -26
  169. package/lib/workflow/index.js +28 -28
  170. package/lib/workflow-automation/index.d.ts +8 -8
  171. package/lib/workflow-automation/index.js +6 -6
  172. package/lib/workload/index.d.ts +32 -32
  173. package/lib/workload/index.js +33 -33
  174. package/package.json +6 -6
@@ -0,0 +1,1414 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.FederatedLogsSetup = exports.FederatedLogsSetupStorageOutputReference = exports.FederatedLogsSetupStorageCloudProviderConfigurationOutputReference = exports.FederatedLogsSetupForwarderOutputReference = exports.FederatedLogsSetupForwarderPipelineControlOutputReference = exports.FederatedLogsSetupForwarderPipelineControlRoutingRuleOutputReference = exports.FederatedLogsSetupDefaultPartitionOutputReference = exports.FederatedLogsSetupDefaultPartitionStorageOutputReference = exports.FederatedLogsSetupDefaultPartitionDataRetentionPolicyOutputReference = exports.FederatedLogsSetupLifecycleStatusList = exports.FederatedLogsSetupLifecycleStatusOutputReference = exports.FederatedLogsSetupHealthCheckList = exports.FederatedLogsSetupHealthCheckOutputReference = exports.FederatedLogsSetupHealthCheckQueryConnectionList = exports.FederatedLogsSetupHealthCheckQueryConnectionOutputReference = exports.FederatedLogsSetupHealthCheckEnd2EndDataFlowList = exports.FederatedLogsSetupHealthCheckEnd2EndDataFlowOutputReference = void 0;
5
+ exports.federatedLogsSetupHealthCheckEnd2EndDataFlowToTerraform = federatedLogsSetupHealthCheckEnd2EndDataFlowToTerraform;
6
+ exports.federatedLogsSetupHealthCheckEnd2EndDataFlowToHclTerraform = federatedLogsSetupHealthCheckEnd2EndDataFlowToHclTerraform;
7
+ exports.federatedLogsSetupHealthCheckQueryConnectionToTerraform = federatedLogsSetupHealthCheckQueryConnectionToTerraform;
8
+ exports.federatedLogsSetupHealthCheckQueryConnectionToHclTerraform = federatedLogsSetupHealthCheckQueryConnectionToHclTerraform;
9
+ exports.federatedLogsSetupHealthCheckToTerraform = federatedLogsSetupHealthCheckToTerraform;
10
+ exports.federatedLogsSetupHealthCheckToHclTerraform = federatedLogsSetupHealthCheckToHclTerraform;
11
+ exports.federatedLogsSetupLifecycleStatusToTerraform = federatedLogsSetupLifecycleStatusToTerraform;
12
+ exports.federatedLogsSetupLifecycleStatusToHclTerraform = federatedLogsSetupLifecycleStatusToHclTerraform;
13
+ exports.federatedLogsSetupDefaultPartitionDataRetentionPolicyToTerraform = federatedLogsSetupDefaultPartitionDataRetentionPolicyToTerraform;
14
+ exports.federatedLogsSetupDefaultPartitionDataRetentionPolicyToHclTerraform = federatedLogsSetupDefaultPartitionDataRetentionPolicyToHclTerraform;
15
+ exports.federatedLogsSetupDefaultPartitionStorageToTerraform = federatedLogsSetupDefaultPartitionStorageToTerraform;
16
+ exports.federatedLogsSetupDefaultPartitionStorageToHclTerraform = federatedLogsSetupDefaultPartitionStorageToHclTerraform;
17
+ exports.federatedLogsSetupDefaultPartitionToTerraform = federatedLogsSetupDefaultPartitionToTerraform;
18
+ exports.federatedLogsSetupDefaultPartitionToHclTerraform = federatedLogsSetupDefaultPartitionToHclTerraform;
19
+ exports.federatedLogsSetupForwarderPipelineControlRoutingRuleToTerraform = federatedLogsSetupForwarderPipelineControlRoutingRuleToTerraform;
20
+ exports.federatedLogsSetupForwarderPipelineControlRoutingRuleToHclTerraform = federatedLogsSetupForwarderPipelineControlRoutingRuleToHclTerraform;
21
+ exports.federatedLogsSetupForwarderPipelineControlToTerraform = federatedLogsSetupForwarderPipelineControlToTerraform;
22
+ exports.federatedLogsSetupForwarderPipelineControlToHclTerraform = federatedLogsSetupForwarderPipelineControlToHclTerraform;
23
+ exports.federatedLogsSetupForwarderToTerraform = federatedLogsSetupForwarderToTerraform;
24
+ exports.federatedLogsSetupForwarderToHclTerraform = federatedLogsSetupForwarderToHclTerraform;
25
+ exports.federatedLogsSetupStorageCloudProviderConfigurationToTerraform = federatedLogsSetupStorageCloudProviderConfigurationToTerraform;
26
+ exports.federatedLogsSetupStorageCloudProviderConfigurationToHclTerraform = federatedLogsSetupStorageCloudProviderConfigurationToHclTerraform;
27
+ exports.federatedLogsSetupStorageToTerraform = federatedLogsSetupStorageToTerraform;
28
+ exports.federatedLogsSetupStorageToHclTerraform = federatedLogsSetupStorageToHclTerraform;
29
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
30
+ const cdktn = require("cdktn");
31
+ function federatedLogsSetupHealthCheckEnd2EndDataFlowToTerraform(struct) {
32
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
33
+ return struct;
34
+ }
35
+ if (cdktn.isComplexElement(struct)) {
36
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
37
+ }
38
+ return {};
39
+ }
40
+ function federatedLogsSetupHealthCheckEnd2EndDataFlowToHclTerraform(struct) {
41
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
42
+ return struct;
43
+ }
44
+ if (cdktn.isComplexElement(struct)) {
45
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
46
+ }
47
+ const attrs = {};
48
+ return attrs;
49
+ }
50
+ class FederatedLogsSetupHealthCheckEnd2EndDataFlowOutputReference extends cdktn.ComplexObject {
51
+ /**
52
+ * @param terraformResource The parent resource
53
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
54
+ * @param complexObjectIndex the index of this item in the list
55
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
56
+ */
57
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
58
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
59
+ this.isEmptyObject = false;
60
+ }
61
+ get internalValue() {
62
+ let hasAnyValues = this.isEmptyObject;
63
+ const internalValueResult = {};
64
+ return hasAnyValues ? internalValueResult : undefined;
65
+ }
66
+ set internalValue(value) {
67
+ if (value === undefined) {
68
+ this.isEmptyObject = false;
69
+ }
70
+ else {
71
+ this.isEmptyObject = Object.keys(value).length === 0;
72
+ }
73
+ }
74
+ // last_updated_at - computed: true, optional: false, required: false
75
+ get lastUpdatedAt() {
76
+ return this.getStringAttribute('last_updated_at');
77
+ }
78
+ // message - computed: true, optional: false, required: false
79
+ get message() {
80
+ return this.getStringAttribute('message');
81
+ }
82
+ // status - computed: true, optional: false, required: false
83
+ get status() {
84
+ return this.getStringAttribute('status');
85
+ }
86
+ }
87
+ exports.FederatedLogsSetupHealthCheckEnd2EndDataFlowOutputReference = FederatedLogsSetupHealthCheckEnd2EndDataFlowOutputReference;
88
+ _a = JSII_RTTI_SYMBOL_1;
89
+ FederatedLogsSetupHealthCheckEnd2EndDataFlowOutputReference[_a] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupHealthCheckEnd2EndDataFlowOutputReference", version: "15.2.0" };
90
+ class FederatedLogsSetupHealthCheckEnd2EndDataFlowList extends cdktn.ComplexList {
91
+ /**
92
+ * @param terraformResource The parent resource
93
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
94
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
95
+ */
96
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
97
+ super(terraformResource, terraformAttribute, wrapsSet);
98
+ }
99
+ /**
100
+ * @param index the index of the item to return
101
+ */
102
+ get(index) {
103
+ return new FederatedLogsSetupHealthCheckEnd2EndDataFlowOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
104
+ }
105
+ }
106
+ exports.FederatedLogsSetupHealthCheckEnd2EndDataFlowList = FederatedLogsSetupHealthCheckEnd2EndDataFlowList;
107
+ _b = JSII_RTTI_SYMBOL_1;
108
+ FederatedLogsSetupHealthCheckEnd2EndDataFlowList[_b] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupHealthCheckEnd2EndDataFlowList", version: "15.2.0" };
109
+ function federatedLogsSetupHealthCheckQueryConnectionToTerraform(struct) {
110
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
111
+ return struct;
112
+ }
113
+ if (cdktn.isComplexElement(struct)) {
114
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
115
+ }
116
+ return {};
117
+ }
118
+ function federatedLogsSetupHealthCheckQueryConnectionToHclTerraform(struct) {
119
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
120
+ return struct;
121
+ }
122
+ if (cdktn.isComplexElement(struct)) {
123
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
124
+ }
125
+ const attrs = {};
126
+ return attrs;
127
+ }
128
+ class FederatedLogsSetupHealthCheckQueryConnectionOutputReference extends cdktn.ComplexObject {
129
+ /**
130
+ * @param terraformResource The parent resource
131
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
132
+ * @param complexObjectIndex the index of this item in the list
133
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
134
+ */
135
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
136
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
137
+ this.isEmptyObject = false;
138
+ }
139
+ get internalValue() {
140
+ let hasAnyValues = this.isEmptyObject;
141
+ const internalValueResult = {};
142
+ return hasAnyValues ? internalValueResult : undefined;
143
+ }
144
+ set internalValue(value) {
145
+ if (value === undefined) {
146
+ this.isEmptyObject = false;
147
+ }
148
+ else {
149
+ this.isEmptyObject = Object.keys(value).length === 0;
150
+ }
151
+ }
152
+ // last_updated_at - computed: true, optional: false, required: false
153
+ get lastUpdatedAt() {
154
+ return this.getStringAttribute('last_updated_at');
155
+ }
156
+ // message - computed: true, optional: false, required: false
157
+ get message() {
158
+ return this.getStringAttribute('message');
159
+ }
160
+ // status - computed: true, optional: false, required: false
161
+ get status() {
162
+ return this.getStringAttribute('status');
163
+ }
164
+ }
165
+ exports.FederatedLogsSetupHealthCheckQueryConnectionOutputReference = FederatedLogsSetupHealthCheckQueryConnectionOutputReference;
166
+ _c = JSII_RTTI_SYMBOL_1;
167
+ FederatedLogsSetupHealthCheckQueryConnectionOutputReference[_c] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupHealthCheckQueryConnectionOutputReference", version: "15.2.0" };
168
+ class FederatedLogsSetupHealthCheckQueryConnectionList extends cdktn.ComplexList {
169
+ /**
170
+ * @param terraformResource The parent resource
171
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
172
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
173
+ */
174
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
175
+ super(terraformResource, terraformAttribute, wrapsSet);
176
+ }
177
+ /**
178
+ * @param index the index of the item to return
179
+ */
180
+ get(index) {
181
+ return new FederatedLogsSetupHealthCheckQueryConnectionOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
182
+ }
183
+ }
184
+ exports.FederatedLogsSetupHealthCheckQueryConnectionList = FederatedLogsSetupHealthCheckQueryConnectionList;
185
+ _d = JSII_RTTI_SYMBOL_1;
186
+ FederatedLogsSetupHealthCheckQueryConnectionList[_d] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupHealthCheckQueryConnectionList", version: "15.2.0" };
187
+ function federatedLogsSetupHealthCheckToTerraform(struct) {
188
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
189
+ return struct;
190
+ }
191
+ if (cdktn.isComplexElement(struct)) {
192
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
193
+ }
194
+ return {};
195
+ }
196
+ function federatedLogsSetupHealthCheckToHclTerraform(struct) {
197
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
198
+ return struct;
199
+ }
200
+ if (cdktn.isComplexElement(struct)) {
201
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
202
+ }
203
+ const attrs = {};
204
+ return attrs;
205
+ }
206
+ class FederatedLogsSetupHealthCheckOutputReference extends cdktn.ComplexObject {
207
+ /**
208
+ * @param terraformResource The parent resource
209
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
210
+ * @param complexObjectIndex the index of this item in the list
211
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
212
+ */
213
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
214
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
215
+ this.isEmptyObject = false;
216
+ // end2end_data_flow - computed: true, optional: false, required: false
217
+ this._end2EndDataFlow = new FederatedLogsSetupHealthCheckEnd2EndDataFlowList(this, "end2end_data_flow", false);
218
+ // query_connection - computed: true, optional: false, required: false
219
+ this._queryConnection = new FederatedLogsSetupHealthCheckQueryConnectionList(this, "query_connection", false);
220
+ }
221
+ get internalValue() {
222
+ let hasAnyValues = this.isEmptyObject;
223
+ const internalValueResult = {};
224
+ return hasAnyValues ? internalValueResult : undefined;
225
+ }
226
+ set internalValue(value) {
227
+ if (value === undefined) {
228
+ this.isEmptyObject = false;
229
+ }
230
+ else {
231
+ this.isEmptyObject = Object.keys(value).length === 0;
232
+ }
233
+ }
234
+ get end2EndDataFlow() {
235
+ return this._end2EndDataFlow;
236
+ }
237
+ // last_updated_at - computed: true, optional: false, required: false
238
+ get lastUpdatedAt() {
239
+ return this.getStringAttribute('last_updated_at');
240
+ }
241
+ get queryConnection() {
242
+ return this._queryConnection;
243
+ }
244
+ }
245
+ exports.FederatedLogsSetupHealthCheckOutputReference = FederatedLogsSetupHealthCheckOutputReference;
246
+ _e = JSII_RTTI_SYMBOL_1;
247
+ FederatedLogsSetupHealthCheckOutputReference[_e] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupHealthCheckOutputReference", version: "15.2.0" };
248
+ class FederatedLogsSetupHealthCheckList extends cdktn.ComplexList {
249
+ /**
250
+ * @param terraformResource The parent resource
251
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
252
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
253
+ */
254
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
255
+ super(terraformResource, terraformAttribute, wrapsSet);
256
+ }
257
+ /**
258
+ * @param index the index of the item to return
259
+ */
260
+ get(index) {
261
+ return new FederatedLogsSetupHealthCheckOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
262
+ }
263
+ }
264
+ exports.FederatedLogsSetupHealthCheckList = FederatedLogsSetupHealthCheckList;
265
+ _f = JSII_RTTI_SYMBOL_1;
266
+ FederatedLogsSetupHealthCheckList[_f] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupHealthCheckList", version: "15.2.0" };
267
+ function federatedLogsSetupLifecycleStatusToTerraform(struct) {
268
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
269
+ return struct;
270
+ }
271
+ if (cdktn.isComplexElement(struct)) {
272
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
273
+ }
274
+ return {};
275
+ }
276
+ function federatedLogsSetupLifecycleStatusToHclTerraform(struct) {
277
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
278
+ return struct;
279
+ }
280
+ if (cdktn.isComplexElement(struct)) {
281
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
282
+ }
283
+ const attrs = {};
284
+ return attrs;
285
+ }
286
+ class FederatedLogsSetupLifecycleStatusOutputReference extends cdktn.ComplexObject {
287
+ /**
288
+ * @param terraformResource The parent resource
289
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
290
+ * @param complexObjectIndex the index of this item in the list
291
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
292
+ */
293
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
294
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
295
+ this.isEmptyObject = false;
296
+ }
297
+ get internalValue() {
298
+ let hasAnyValues = this.isEmptyObject;
299
+ const internalValueResult = {};
300
+ return hasAnyValues ? internalValueResult : undefined;
301
+ }
302
+ set internalValue(value) {
303
+ if (value === undefined) {
304
+ this.isEmptyObject = false;
305
+ }
306
+ else {
307
+ this.isEmptyObject = Object.keys(value).length === 0;
308
+ }
309
+ }
310
+ // last_updated_at - computed: true, optional: false, required: false
311
+ get lastUpdatedAt() {
312
+ return this.getStringAttribute('last_updated_at');
313
+ }
314
+ // message - computed: true, optional: false, required: false
315
+ get message() {
316
+ return this.getStringAttribute('message');
317
+ }
318
+ // status - computed: true, optional: false, required: false
319
+ get status() {
320
+ return this.getStringAttribute('status');
321
+ }
322
+ }
323
+ exports.FederatedLogsSetupLifecycleStatusOutputReference = FederatedLogsSetupLifecycleStatusOutputReference;
324
+ _g = JSII_RTTI_SYMBOL_1;
325
+ FederatedLogsSetupLifecycleStatusOutputReference[_g] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupLifecycleStatusOutputReference", version: "15.2.0" };
326
+ class FederatedLogsSetupLifecycleStatusList extends cdktn.ComplexList {
327
+ /**
328
+ * @param terraformResource The parent resource
329
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
330
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
331
+ */
332
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
333
+ super(terraformResource, terraformAttribute, wrapsSet);
334
+ }
335
+ /**
336
+ * @param index the index of the item to return
337
+ */
338
+ get(index) {
339
+ return new FederatedLogsSetupLifecycleStatusOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
340
+ }
341
+ }
342
+ exports.FederatedLogsSetupLifecycleStatusList = FederatedLogsSetupLifecycleStatusList;
343
+ _h = JSII_RTTI_SYMBOL_1;
344
+ FederatedLogsSetupLifecycleStatusList[_h] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupLifecycleStatusList", version: "15.2.0" };
345
+ function federatedLogsSetupDefaultPartitionDataRetentionPolicyToTerraform(struct) {
346
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
347
+ return struct;
348
+ }
349
+ if (cdktn.isComplexElement(struct)) {
350
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
351
+ }
352
+ return {
353
+ duration: cdktn.numberToTerraform(struct.duration),
354
+ unit: cdktn.stringToTerraform(struct.unit),
355
+ };
356
+ }
357
+ function federatedLogsSetupDefaultPartitionDataRetentionPolicyToHclTerraform(struct) {
358
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
359
+ return struct;
360
+ }
361
+ if (cdktn.isComplexElement(struct)) {
362
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
363
+ }
364
+ const attrs = {
365
+ duration: {
366
+ value: cdktn.numberToHclTerraform(struct.duration),
367
+ isBlock: false,
368
+ type: "simple",
369
+ storageClassType: "number",
370
+ },
371
+ unit: {
372
+ value: cdktn.stringToHclTerraform(struct.unit),
373
+ isBlock: false,
374
+ type: "simple",
375
+ storageClassType: "string",
376
+ },
377
+ };
378
+ // remove undefined attributes
379
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
380
+ }
381
+ class FederatedLogsSetupDefaultPartitionDataRetentionPolicyOutputReference extends cdktn.ComplexObject {
382
+ /**
383
+ * @param terraformResource The parent resource
384
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
385
+ */
386
+ constructor(terraformResource, terraformAttribute) {
387
+ super(terraformResource, terraformAttribute, false, 0);
388
+ this.isEmptyObject = false;
389
+ }
390
+ get internalValue() {
391
+ let hasAnyValues = this.isEmptyObject;
392
+ const internalValueResult = {};
393
+ if (this._duration !== undefined) {
394
+ hasAnyValues = true;
395
+ internalValueResult.duration = this._duration;
396
+ }
397
+ if (this._unit !== undefined) {
398
+ hasAnyValues = true;
399
+ internalValueResult.unit = this._unit;
400
+ }
401
+ return hasAnyValues ? internalValueResult : undefined;
402
+ }
403
+ set internalValue(value) {
404
+ if (value === undefined) {
405
+ this.isEmptyObject = false;
406
+ this._duration = undefined;
407
+ this._unit = undefined;
408
+ }
409
+ else {
410
+ this.isEmptyObject = Object.keys(value).length === 0;
411
+ this._duration = value.duration;
412
+ this._unit = value.unit;
413
+ }
414
+ }
415
+ get duration() {
416
+ return this.getNumberAttribute('duration');
417
+ }
418
+ set duration(value) {
419
+ this._duration = value;
420
+ }
421
+ // Temporarily expose input value. Use with caution.
422
+ get durationInput() {
423
+ return this._duration;
424
+ }
425
+ get unit() {
426
+ return this.getStringAttribute('unit');
427
+ }
428
+ set unit(value) {
429
+ this._unit = value;
430
+ }
431
+ // Temporarily expose input value. Use with caution.
432
+ get unitInput() {
433
+ return this._unit;
434
+ }
435
+ }
436
+ exports.FederatedLogsSetupDefaultPartitionDataRetentionPolicyOutputReference = FederatedLogsSetupDefaultPartitionDataRetentionPolicyOutputReference;
437
+ _j = JSII_RTTI_SYMBOL_1;
438
+ FederatedLogsSetupDefaultPartitionDataRetentionPolicyOutputReference[_j] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupDefaultPartitionDataRetentionPolicyOutputReference", version: "15.2.0" };
439
+ function federatedLogsSetupDefaultPartitionStorageToTerraform(struct) {
440
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
441
+ return struct;
442
+ }
443
+ if (cdktn.isComplexElement(struct)) {
444
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
445
+ }
446
+ return {
447
+ data_location_uri: cdktn.stringToTerraform(struct.dataLocationUri),
448
+ table: cdktn.stringToTerraform(struct.table),
449
+ };
450
+ }
451
+ function federatedLogsSetupDefaultPartitionStorageToHclTerraform(struct) {
452
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
453
+ return struct;
454
+ }
455
+ if (cdktn.isComplexElement(struct)) {
456
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
457
+ }
458
+ const attrs = {
459
+ data_location_uri: {
460
+ value: cdktn.stringToHclTerraform(struct.dataLocationUri),
461
+ isBlock: false,
462
+ type: "simple",
463
+ storageClassType: "string",
464
+ },
465
+ table: {
466
+ value: cdktn.stringToHclTerraform(struct.table),
467
+ isBlock: false,
468
+ type: "simple",
469
+ storageClassType: "string",
470
+ },
471
+ };
472
+ // remove undefined attributes
473
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
474
+ }
475
+ class FederatedLogsSetupDefaultPartitionStorageOutputReference extends cdktn.ComplexObject {
476
+ /**
477
+ * @param terraformResource The parent resource
478
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
479
+ */
480
+ constructor(terraformResource, terraformAttribute) {
481
+ super(terraformResource, terraformAttribute, false, 0);
482
+ this.isEmptyObject = false;
483
+ }
484
+ get internalValue() {
485
+ let hasAnyValues = this.isEmptyObject;
486
+ const internalValueResult = {};
487
+ if (this._dataLocationUri !== undefined) {
488
+ hasAnyValues = true;
489
+ internalValueResult.dataLocationUri = this._dataLocationUri;
490
+ }
491
+ if (this._table !== undefined) {
492
+ hasAnyValues = true;
493
+ internalValueResult.table = this._table;
494
+ }
495
+ return hasAnyValues ? internalValueResult : undefined;
496
+ }
497
+ set internalValue(value) {
498
+ if (value === undefined) {
499
+ this.isEmptyObject = false;
500
+ this._dataLocationUri = undefined;
501
+ this._table = undefined;
502
+ }
503
+ else {
504
+ this.isEmptyObject = Object.keys(value).length === 0;
505
+ this._dataLocationUri = value.dataLocationUri;
506
+ this._table = value.table;
507
+ }
508
+ }
509
+ get dataLocationUri() {
510
+ return this.getStringAttribute('data_location_uri');
511
+ }
512
+ set dataLocationUri(value) {
513
+ this._dataLocationUri = value;
514
+ }
515
+ // Temporarily expose input value. Use with caution.
516
+ get dataLocationUriInput() {
517
+ return this._dataLocationUri;
518
+ }
519
+ get table() {
520
+ return this.getStringAttribute('table');
521
+ }
522
+ set table(value) {
523
+ this._table = value;
524
+ }
525
+ // Temporarily expose input value. Use with caution.
526
+ get tableInput() {
527
+ return this._table;
528
+ }
529
+ }
530
+ exports.FederatedLogsSetupDefaultPartitionStorageOutputReference = FederatedLogsSetupDefaultPartitionStorageOutputReference;
531
+ _k = JSII_RTTI_SYMBOL_1;
532
+ FederatedLogsSetupDefaultPartitionStorageOutputReference[_k] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupDefaultPartitionStorageOutputReference", version: "15.2.0" };
533
+ function federatedLogsSetupDefaultPartitionToTerraform(struct) {
534
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
535
+ return struct;
536
+ }
537
+ if (cdktn.isComplexElement(struct)) {
538
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
539
+ }
540
+ return {
541
+ data_retention_policy: federatedLogsSetupDefaultPartitionDataRetentionPolicyToTerraform(struct.dataRetentionPolicy),
542
+ storage: federatedLogsSetupDefaultPartitionStorageToTerraform(struct.storage),
543
+ };
544
+ }
545
+ function federatedLogsSetupDefaultPartitionToHclTerraform(struct) {
546
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
547
+ return struct;
548
+ }
549
+ if (cdktn.isComplexElement(struct)) {
550
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
551
+ }
552
+ const attrs = {
553
+ data_retention_policy: {
554
+ value: federatedLogsSetupDefaultPartitionDataRetentionPolicyToHclTerraform(struct.dataRetentionPolicy),
555
+ isBlock: true,
556
+ type: "list",
557
+ storageClassType: "FederatedLogsSetupDefaultPartitionDataRetentionPolicyList",
558
+ },
559
+ storage: {
560
+ value: federatedLogsSetupDefaultPartitionStorageToHclTerraform(struct.storage),
561
+ isBlock: true,
562
+ type: "list",
563
+ storageClassType: "FederatedLogsSetupDefaultPartitionStorageList",
564
+ },
565
+ };
566
+ // remove undefined attributes
567
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
568
+ }
569
+ class FederatedLogsSetupDefaultPartitionOutputReference extends cdktn.ComplexObject {
570
+ /**
571
+ * @param terraformResource The parent resource
572
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
573
+ */
574
+ constructor(terraformResource, terraformAttribute) {
575
+ super(terraformResource, terraformAttribute, false, 0);
576
+ this.isEmptyObject = false;
577
+ // data_retention_policy - computed: false, optional: true, required: false
578
+ this._dataRetentionPolicy = new FederatedLogsSetupDefaultPartitionDataRetentionPolicyOutputReference(this, "data_retention_policy");
579
+ // storage - computed: false, optional: false, required: true
580
+ this._storage = new FederatedLogsSetupDefaultPartitionStorageOutputReference(this, "storage");
581
+ }
582
+ get internalValue() {
583
+ let hasAnyValues = this.isEmptyObject;
584
+ const internalValueResult = {};
585
+ if (this._dataRetentionPolicy?.internalValue !== undefined) {
586
+ hasAnyValues = true;
587
+ internalValueResult.dataRetentionPolicy = this._dataRetentionPolicy?.internalValue;
588
+ }
589
+ if (this._storage?.internalValue !== undefined) {
590
+ hasAnyValues = true;
591
+ internalValueResult.storage = this._storage?.internalValue;
592
+ }
593
+ return hasAnyValues ? internalValueResult : undefined;
594
+ }
595
+ set internalValue(value) {
596
+ if (value === undefined) {
597
+ this.isEmptyObject = false;
598
+ this._dataRetentionPolicy.internalValue = undefined;
599
+ this._storage.internalValue = undefined;
600
+ }
601
+ else {
602
+ this.isEmptyObject = Object.keys(value).length === 0;
603
+ this._dataRetentionPolicy.internalValue = value.dataRetentionPolicy;
604
+ this._storage.internalValue = value.storage;
605
+ }
606
+ }
607
+ get dataRetentionPolicy() {
608
+ return this._dataRetentionPolicy;
609
+ }
610
+ putDataRetentionPolicy(value) {
611
+ this._dataRetentionPolicy.internalValue = value;
612
+ }
613
+ resetDataRetentionPolicy() {
614
+ this._dataRetentionPolicy.internalValue = undefined;
615
+ }
616
+ // Temporarily expose input value. Use with caution.
617
+ get dataRetentionPolicyInput() {
618
+ return this._dataRetentionPolicy.internalValue;
619
+ }
620
+ get storage() {
621
+ return this._storage;
622
+ }
623
+ putStorage(value) {
624
+ this._storage.internalValue = value;
625
+ }
626
+ // Temporarily expose input value. Use with caution.
627
+ get storageInput() {
628
+ return this._storage.internalValue;
629
+ }
630
+ }
631
+ exports.FederatedLogsSetupDefaultPartitionOutputReference = FederatedLogsSetupDefaultPartitionOutputReference;
632
+ _l = JSII_RTTI_SYMBOL_1;
633
+ FederatedLogsSetupDefaultPartitionOutputReference[_l] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupDefaultPartitionOutputReference", version: "15.2.0" };
634
+ function federatedLogsSetupForwarderPipelineControlRoutingRuleToTerraform(struct) {
635
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
636
+ return struct;
637
+ }
638
+ if (cdktn.isComplexElement(struct)) {
639
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
640
+ }
641
+ return {
642
+ expression: cdktn.stringToTerraform(struct.expression),
643
+ };
644
+ }
645
+ function federatedLogsSetupForwarderPipelineControlRoutingRuleToHclTerraform(struct) {
646
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
647
+ return struct;
648
+ }
649
+ if (cdktn.isComplexElement(struct)) {
650
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
651
+ }
652
+ const attrs = {
653
+ expression: {
654
+ value: cdktn.stringToHclTerraform(struct.expression),
655
+ isBlock: false,
656
+ type: "simple",
657
+ storageClassType: "string",
658
+ },
659
+ };
660
+ // remove undefined attributes
661
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
662
+ }
663
+ class FederatedLogsSetupForwarderPipelineControlRoutingRuleOutputReference extends cdktn.ComplexObject {
664
+ /**
665
+ * @param terraformResource The parent resource
666
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
667
+ */
668
+ constructor(terraformResource, terraformAttribute) {
669
+ super(terraformResource, terraformAttribute, false, 0);
670
+ this.isEmptyObject = false;
671
+ }
672
+ get internalValue() {
673
+ let hasAnyValues = this.isEmptyObject;
674
+ const internalValueResult = {};
675
+ if (this._expression !== undefined) {
676
+ hasAnyValues = true;
677
+ internalValueResult.expression = this._expression;
678
+ }
679
+ return hasAnyValues ? internalValueResult : undefined;
680
+ }
681
+ set internalValue(value) {
682
+ if (value === undefined) {
683
+ this.isEmptyObject = false;
684
+ this._expression = undefined;
685
+ }
686
+ else {
687
+ this.isEmptyObject = Object.keys(value).length === 0;
688
+ this._expression = value.expression;
689
+ }
690
+ }
691
+ get expression() {
692
+ return this.getStringAttribute('expression');
693
+ }
694
+ set expression(value) {
695
+ this._expression = value;
696
+ }
697
+ // Temporarily expose input value. Use with caution.
698
+ get expressionInput() {
699
+ return this._expression;
700
+ }
701
+ }
702
+ exports.FederatedLogsSetupForwarderPipelineControlRoutingRuleOutputReference = FederatedLogsSetupForwarderPipelineControlRoutingRuleOutputReference;
703
+ _m = JSII_RTTI_SYMBOL_1;
704
+ FederatedLogsSetupForwarderPipelineControlRoutingRuleOutputReference[_m] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupForwarderPipelineControlRoutingRuleOutputReference", version: "15.2.0" };
705
+ function federatedLogsSetupForwarderPipelineControlToTerraform(struct) {
706
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
707
+ return struct;
708
+ }
709
+ if (cdktn.isComplexElement(struct)) {
710
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
711
+ }
712
+ return {
713
+ fleet_id: cdktn.stringToTerraform(struct.fleetId),
714
+ routing_rule: federatedLogsSetupForwarderPipelineControlRoutingRuleToTerraform(struct.routingRule),
715
+ };
716
+ }
717
+ function federatedLogsSetupForwarderPipelineControlToHclTerraform(struct) {
718
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
719
+ return struct;
720
+ }
721
+ if (cdktn.isComplexElement(struct)) {
722
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
723
+ }
724
+ const attrs = {
725
+ fleet_id: {
726
+ value: cdktn.stringToHclTerraform(struct.fleetId),
727
+ isBlock: false,
728
+ type: "simple",
729
+ storageClassType: "string",
730
+ },
731
+ routing_rule: {
732
+ value: federatedLogsSetupForwarderPipelineControlRoutingRuleToHclTerraform(struct.routingRule),
733
+ isBlock: true,
734
+ type: "list",
735
+ storageClassType: "FederatedLogsSetupForwarderPipelineControlRoutingRuleList",
736
+ },
737
+ };
738
+ // remove undefined attributes
739
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
740
+ }
741
+ class FederatedLogsSetupForwarderPipelineControlOutputReference extends cdktn.ComplexObject {
742
+ /**
743
+ * @param terraformResource The parent resource
744
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
745
+ */
746
+ constructor(terraformResource, terraformAttribute) {
747
+ super(terraformResource, terraformAttribute, false, 0);
748
+ this.isEmptyObject = false;
749
+ // routing_rule - computed: false, optional: true, required: false
750
+ this._routingRule = new FederatedLogsSetupForwarderPipelineControlRoutingRuleOutputReference(this, "routing_rule");
751
+ }
752
+ get internalValue() {
753
+ let hasAnyValues = this.isEmptyObject;
754
+ const internalValueResult = {};
755
+ if (this._fleetId !== undefined) {
756
+ hasAnyValues = true;
757
+ internalValueResult.fleetId = this._fleetId;
758
+ }
759
+ if (this._routingRule?.internalValue !== undefined) {
760
+ hasAnyValues = true;
761
+ internalValueResult.routingRule = this._routingRule?.internalValue;
762
+ }
763
+ return hasAnyValues ? internalValueResult : undefined;
764
+ }
765
+ set internalValue(value) {
766
+ if (value === undefined) {
767
+ this.isEmptyObject = false;
768
+ this._fleetId = undefined;
769
+ this._routingRule.internalValue = undefined;
770
+ }
771
+ else {
772
+ this.isEmptyObject = Object.keys(value).length === 0;
773
+ this._fleetId = value.fleetId;
774
+ this._routingRule.internalValue = value.routingRule;
775
+ }
776
+ }
777
+ get fleetId() {
778
+ return this.getStringAttribute('fleet_id');
779
+ }
780
+ set fleetId(value) {
781
+ this._fleetId = value;
782
+ }
783
+ // Temporarily expose input value. Use with caution.
784
+ get fleetIdInput() {
785
+ return this._fleetId;
786
+ }
787
+ get routingRule() {
788
+ return this._routingRule;
789
+ }
790
+ putRoutingRule(value) {
791
+ this._routingRule.internalValue = value;
792
+ }
793
+ resetRoutingRule() {
794
+ this._routingRule.internalValue = undefined;
795
+ }
796
+ // Temporarily expose input value. Use with caution.
797
+ get routingRuleInput() {
798
+ return this._routingRule.internalValue;
799
+ }
800
+ }
801
+ exports.FederatedLogsSetupForwarderPipelineControlOutputReference = FederatedLogsSetupForwarderPipelineControlOutputReference;
802
+ _o = JSII_RTTI_SYMBOL_1;
803
+ FederatedLogsSetupForwarderPipelineControlOutputReference[_o] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupForwarderPipelineControlOutputReference", version: "15.2.0" };
804
+ function federatedLogsSetupForwarderToTerraform(struct) {
805
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
806
+ return struct;
807
+ }
808
+ if (cdktn.isComplexElement(struct)) {
809
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
810
+ }
811
+ return {
812
+ type: cdktn.stringToTerraform(struct.type),
813
+ pipeline_control: federatedLogsSetupForwarderPipelineControlToTerraform(struct.pipelineControl),
814
+ };
815
+ }
816
+ function federatedLogsSetupForwarderToHclTerraform(struct) {
817
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
818
+ return struct;
819
+ }
820
+ if (cdktn.isComplexElement(struct)) {
821
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
822
+ }
823
+ const attrs = {
824
+ type: {
825
+ value: cdktn.stringToHclTerraform(struct.type),
826
+ isBlock: false,
827
+ type: "simple",
828
+ storageClassType: "string",
829
+ },
830
+ pipeline_control: {
831
+ value: federatedLogsSetupForwarderPipelineControlToHclTerraform(struct.pipelineControl),
832
+ isBlock: true,
833
+ type: "list",
834
+ storageClassType: "FederatedLogsSetupForwarderPipelineControlList",
835
+ },
836
+ };
837
+ // remove undefined attributes
838
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
839
+ }
840
+ class FederatedLogsSetupForwarderOutputReference extends cdktn.ComplexObject {
841
+ /**
842
+ * @param terraformResource The parent resource
843
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
844
+ */
845
+ constructor(terraformResource, terraformAttribute) {
846
+ super(terraformResource, terraformAttribute, false, 0);
847
+ this.isEmptyObject = false;
848
+ // pipeline_control - computed: false, optional: true, required: false
849
+ this._pipelineControl = new FederatedLogsSetupForwarderPipelineControlOutputReference(this, "pipeline_control");
850
+ }
851
+ get internalValue() {
852
+ let hasAnyValues = this.isEmptyObject;
853
+ const internalValueResult = {};
854
+ if (this._type !== undefined) {
855
+ hasAnyValues = true;
856
+ internalValueResult.type = this._type;
857
+ }
858
+ if (this._pipelineControl?.internalValue !== undefined) {
859
+ hasAnyValues = true;
860
+ internalValueResult.pipelineControl = this._pipelineControl?.internalValue;
861
+ }
862
+ return hasAnyValues ? internalValueResult : undefined;
863
+ }
864
+ set internalValue(value) {
865
+ if (value === undefined) {
866
+ this.isEmptyObject = false;
867
+ this._type = undefined;
868
+ this._pipelineControl.internalValue = undefined;
869
+ }
870
+ else {
871
+ this.isEmptyObject = Object.keys(value).length === 0;
872
+ this._type = value.type;
873
+ this._pipelineControl.internalValue = value.pipelineControl;
874
+ }
875
+ }
876
+ get type() {
877
+ return this.getStringAttribute('type');
878
+ }
879
+ set type(value) {
880
+ this._type = value;
881
+ }
882
+ // Temporarily expose input value. Use with caution.
883
+ get typeInput() {
884
+ return this._type;
885
+ }
886
+ get pipelineControl() {
887
+ return this._pipelineControl;
888
+ }
889
+ putPipelineControl(value) {
890
+ this._pipelineControl.internalValue = value;
891
+ }
892
+ resetPipelineControl() {
893
+ this._pipelineControl.internalValue = undefined;
894
+ }
895
+ // Temporarily expose input value. Use with caution.
896
+ get pipelineControlInput() {
897
+ return this._pipelineControl.internalValue;
898
+ }
899
+ }
900
+ exports.FederatedLogsSetupForwarderOutputReference = FederatedLogsSetupForwarderOutputReference;
901
+ _p = JSII_RTTI_SYMBOL_1;
902
+ FederatedLogsSetupForwarderOutputReference[_p] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupForwarderOutputReference", version: "15.2.0" };
903
+ function federatedLogsSetupStorageCloudProviderConfigurationToTerraform(struct) {
904
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
905
+ return struct;
906
+ }
907
+ if (cdktn.isComplexElement(struct)) {
908
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
909
+ }
910
+ return {
911
+ provider: cdktn.stringToTerraform(struct.provider),
912
+ region: cdktn.stringToTerraform(struct.region),
913
+ };
914
+ }
915
+ function federatedLogsSetupStorageCloudProviderConfigurationToHclTerraform(struct) {
916
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
917
+ return struct;
918
+ }
919
+ if (cdktn.isComplexElement(struct)) {
920
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
921
+ }
922
+ const attrs = {
923
+ provider: {
924
+ value: cdktn.stringToHclTerraform(struct.provider),
925
+ isBlock: false,
926
+ type: "simple",
927
+ storageClassType: "string",
928
+ },
929
+ region: {
930
+ value: cdktn.stringToHclTerraform(struct.region),
931
+ isBlock: false,
932
+ type: "simple",
933
+ storageClassType: "string",
934
+ },
935
+ };
936
+ // remove undefined attributes
937
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
938
+ }
939
+ class FederatedLogsSetupStorageCloudProviderConfigurationOutputReference extends cdktn.ComplexObject {
940
+ /**
941
+ * @param terraformResource The parent resource
942
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
943
+ */
944
+ constructor(terraformResource, terraformAttribute) {
945
+ super(terraformResource, terraformAttribute, false, 0);
946
+ this.isEmptyObject = false;
947
+ }
948
+ get internalValue() {
949
+ let hasAnyValues = this.isEmptyObject;
950
+ const internalValueResult = {};
951
+ if (this._provider !== undefined) {
952
+ hasAnyValues = true;
953
+ internalValueResult.provider = this._provider;
954
+ }
955
+ if (this._region !== undefined) {
956
+ hasAnyValues = true;
957
+ internalValueResult.region = this._region;
958
+ }
959
+ return hasAnyValues ? internalValueResult : undefined;
960
+ }
961
+ set internalValue(value) {
962
+ if (value === undefined) {
963
+ this.isEmptyObject = false;
964
+ this._provider = undefined;
965
+ this._region = undefined;
966
+ }
967
+ else {
968
+ this.isEmptyObject = Object.keys(value).length === 0;
969
+ this._provider = value.provider;
970
+ this._region = value.region;
971
+ }
972
+ }
973
+ get provider() {
974
+ return this.getStringAttribute('provider');
975
+ }
976
+ set provider(value) {
977
+ this._provider = value;
978
+ }
979
+ // Temporarily expose input value. Use with caution.
980
+ get providerInput() {
981
+ return this._provider;
982
+ }
983
+ get region() {
984
+ return this.getStringAttribute('region');
985
+ }
986
+ set region(value) {
987
+ this._region = value;
988
+ }
989
+ // Temporarily expose input value. Use with caution.
990
+ get regionInput() {
991
+ return this._region;
992
+ }
993
+ }
994
+ exports.FederatedLogsSetupStorageCloudProviderConfigurationOutputReference = FederatedLogsSetupStorageCloudProviderConfigurationOutputReference;
995
+ _q = JSII_RTTI_SYMBOL_1;
996
+ FederatedLogsSetupStorageCloudProviderConfigurationOutputReference[_q] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupStorageCloudProviderConfigurationOutputReference", version: "15.2.0" };
997
+ function federatedLogsSetupStorageToTerraform(struct) {
998
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
999
+ return struct;
1000
+ }
1001
+ if (cdktn.isComplexElement(struct)) {
1002
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1003
+ }
1004
+ return {
1005
+ data_ingest_connection_id: cdktn.stringToTerraform(struct.dataIngestConnectionId),
1006
+ data_location_bucket: cdktn.stringToTerraform(struct.dataLocationBucket),
1007
+ database: cdktn.stringToTerraform(struct.database),
1008
+ query_connection_id: cdktn.stringToTerraform(struct.queryConnectionId),
1009
+ cloud_provider_configuration: federatedLogsSetupStorageCloudProviderConfigurationToTerraform(struct.cloudProviderConfiguration),
1010
+ };
1011
+ }
1012
+ function federatedLogsSetupStorageToHclTerraform(struct) {
1013
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1014
+ return struct;
1015
+ }
1016
+ if (cdktn.isComplexElement(struct)) {
1017
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1018
+ }
1019
+ const attrs = {
1020
+ data_ingest_connection_id: {
1021
+ value: cdktn.stringToHclTerraform(struct.dataIngestConnectionId),
1022
+ isBlock: false,
1023
+ type: "simple",
1024
+ storageClassType: "string",
1025
+ },
1026
+ data_location_bucket: {
1027
+ value: cdktn.stringToHclTerraform(struct.dataLocationBucket),
1028
+ isBlock: false,
1029
+ type: "simple",
1030
+ storageClassType: "string",
1031
+ },
1032
+ database: {
1033
+ value: cdktn.stringToHclTerraform(struct.database),
1034
+ isBlock: false,
1035
+ type: "simple",
1036
+ storageClassType: "string",
1037
+ },
1038
+ query_connection_id: {
1039
+ value: cdktn.stringToHclTerraform(struct.queryConnectionId),
1040
+ isBlock: false,
1041
+ type: "simple",
1042
+ storageClassType: "string",
1043
+ },
1044
+ cloud_provider_configuration: {
1045
+ value: federatedLogsSetupStorageCloudProviderConfigurationToHclTerraform(struct.cloudProviderConfiguration),
1046
+ isBlock: true,
1047
+ type: "list",
1048
+ storageClassType: "FederatedLogsSetupStorageCloudProviderConfigurationList",
1049
+ },
1050
+ };
1051
+ // remove undefined attributes
1052
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1053
+ }
1054
+ class FederatedLogsSetupStorageOutputReference extends cdktn.ComplexObject {
1055
+ /**
1056
+ * @param terraformResource The parent resource
1057
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1058
+ */
1059
+ constructor(terraformResource, terraformAttribute) {
1060
+ super(terraformResource, terraformAttribute, false, 0);
1061
+ this.isEmptyObject = false;
1062
+ // cloud_provider_configuration - computed: false, optional: false, required: true
1063
+ this._cloudProviderConfiguration = new FederatedLogsSetupStorageCloudProviderConfigurationOutputReference(this, "cloud_provider_configuration");
1064
+ }
1065
+ get internalValue() {
1066
+ let hasAnyValues = this.isEmptyObject;
1067
+ const internalValueResult = {};
1068
+ if (this._dataIngestConnectionId !== undefined) {
1069
+ hasAnyValues = true;
1070
+ internalValueResult.dataIngestConnectionId = this._dataIngestConnectionId;
1071
+ }
1072
+ if (this._dataLocationBucket !== undefined) {
1073
+ hasAnyValues = true;
1074
+ internalValueResult.dataLocationBucket = this._dataLocationBucket;
1075
+ }
1076
+ if (this._database !== undefined) {
1077
+ hasAnyValues = true;
1078
+ internalValueResult.database = this._database;
1079
+ }
1080
+ if (this._queryConnectionId !== undefined) {
1081
+ hasAnyValues = true;
1082
+ internalValueResult.queryConnectionId = this._queryConnectionId;
1083
+ }
1084
+ if (this._cloudProviderConfiguration?.internalValue !== undefined) {
1085
+ hasAnyValues = true;
1086
+ internalValueResult.cloudProviderConfiguration = this._cloudProviderConfiguration?.internalValue;
1087
+ }
1088
+ return hasAnyValues ? internalValueResult : undefined;
1089
+ }
1090
+ set internalValue(value) {
1091
+ if (value === undefined) {
1092
+ this.isEmptyObject = false;
1093
+ this._dataIngestConnectionId = undefined;
1094
+ this._dataLocationBucket = undefined;
1095
+ this._database = undefined;
1096
+ this._queryConnectionId = undefined;
1097
+ this._cloudProviderConfiguration.internalValue = undefined;
1098
+ }
1099
+ else {
1100
+ this.isEmptyObject = Object.keys(value).length === 0;
1101
+ this._dataIngestConnectionId = value.dataIngestConnectionId;
1102
+ this._dataLocationBucket = value.dataLocationBucket;
1103
+ this._database = value.database;
1104
+ this._queryConnectionId = value.queryConnectionId;
1105
+ this._cloudProviderConfiguration.internalValue = value.cloudProviderConfiguration;
1106
+ }
1107
+ }
1108
+ get dataIngestConnectionId() {
1109
+ return this.getStringAttribute('data_ingest_connection_id');
1110
+ }
1111
+ set dataIngestConnectionId(value) {
1112
+ this._dataIngestConnectionId = value;
1113
+ }
1114
+ // Temporarily expose input value. Use with caution.
1115
+ get dataIngestConnectionIdInput() {
1116
+ return this._dataIngestConnectionId;
1117
+ }
1118
+ get dataLocationBucket() {
1119
+ return this.getStringAttribute('data_location_bucket');
1120
+ }
1121
+ set dataLocationBucket(value) {
1122
+ this._dataLocationBucket = value;
1123
+ }
1124
+ // Temporarily expose input value. Use with caution.
1125
+ get dataLocationBucketInput() {
1126
+ return this._dataLocationBucket;
1127
+ }
1128
+ get database() {
1129
+ return this.getStringAttribute('database');
1130
+ }
1131
+ set database(value) {
1132
+ this._database = value;
1133
+ }
1134
+ // Temporarily expose input value. Use with caution.
1135
+ get databaseInput() {
1136
+ return this._database;
1137
+ }
1138
+ get queryConnectionId() {
1139
+ return this.getStringAttribute('query_connection_id');
1140
+ }
1141
+ set queryConnectionId(value) {
1142
+ this._queryConnectionId = value;
1143
+ }
1144
+ // Temporarily expose input value. Use with caution.
1145
+ get queryConnectionIdInput() {
1146
+ return this._queryConnectionId;
1147
+ }
1148
+ get cloudProviderConfiguration() {
1149
+ return this._cloudProviderConfiguration;
1150
+ }
1151
+ putCloudProviderConfiguration(value) {
1152
+ this._cloudProviderConfiguration.internalValue = value;
1153
+ }
1154
+ // Temporarily expose input value. Use with caution.
1155
+ get cloudProviderConfigurationInput() {
1156
+ return this._cloudProviderConfiguration.internalValue;
1157
+ }
1158
+ }
1159
+ exports.FederatedLogsSetupStorageOutputReference = FederatedLogsSetupStorageOutputReference;
1160
+ _r = JSII_RTTI_SYMBOL_1;
1161
+ FederatedLogsSetupStorageOutputReference[_r] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetupStorageOutputReference", version: "15.2.0" };
1162
+ /**
1163
+ * Represents a {@link https://registry.terraform.io/providers/newrelic/newrelic/3.92.0/docs/resources/federated_logs_setup newrelic_federated_logs_setup}
1164
+ */
1165
+ class FederatedLogsSetup extends cdktn.TerraformResource {
1166
+ // ==============
1167
+ // STATIC Methods
1168
+ // ==============
1169
+ /**
1170
+ * Generates CDKTN code for importing a FederatedLogsSetup resource upon running "cdktn plan <stack-name>"
1171
+ * @param scope The scope in which to define this construct
1172
+ * @param importToId The construct id used in the generated config for the FederatedLogsSetup to import
1173
+ * @param importFromId The id of the existing FederatedLogsSetup that should be imported. Refer to the {@link https://registry.terraform.io/providers/newrelic/newrelic/3.92.0/docs/resources/federated_logs_setup#import import section} in the documentation of this resource for the id to use
1174
+ * @param provider? Optional instance of the provider where the FederatedLogsSetup to import is found
1175
+ */
1176
+ static generateConfigForImport(scope, importToId, importFromId, provider) {
1177
+ return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "newrelic_federated_logs_setup", importId: importFromId, provider });
1178
+ }
1179
+ // ===========
1180
+ // INITIALIZER
1181
+ // ===========
1182
+ /**
1183
+ * Create a new {@link https://registry.terraform.io/providers/newrelic/newrelic/3.92.0/docs/resources/federated_logs_setup newrelic_federated_logs_setup} Resource
1184
+ *
1185
+ * @param scope The scope in which to define this construct
1186
+ * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
1187
+ * @param options FederatedLogsSetupConfig
1188
+ */
1189
+ constructor(scope, id, config) {
1190
+ super(scope, id, {
1191
+ terraformResourceType: 'newrelic_federated_logs_setup',
1192
+ terraformGeneratorMetadata: {
1193
+ providerName: 'newrelic',
1194
+ providerVersion: '3.92.0',
1195
+ providerVersionConstraint: '~> 3.7'
1196
+ },
1197
+ provider: config.provider,
1198
+ dependsOn: config.dependsOn,
1199
+ count: config.count,
1200
+ lifecycle: config.lifecycle,
1201
+ provisioners: config.provisioners,
1202
+ connection: config.connection,
1203
+ forEach: config.forEach
1204
+ });
1205
+ // health_check - computed: true, optional: false, required: false
1206
+ this._healthCheck = new FederatedLogsSetupHealthCheckList(this, "health_check", false);
1207
+ // lifecycle_status - computed: true, optional: false, required: false
1208
+ this._lifecycleStatus = new FederatedLogsSetupLifecycleStatusList(this, "lifecycle_status", false);
1209
+ // default_partition - computed: false, optional: false, required: true
1210
+ this._defaultPartition = new FederatedLogsSetupDefaultPartitionOutputReference(this, "default_partition");
1211
+ // forwarder - computed: false, optional: true, required: false
1212
+ this._forwarder = new FederatedLogsSetupForwarderOutputReference(this, "forwarder");
1213
+ // storage - computed: false, optional: false, required: true
1214
+ this._storage = new FederatedLogsSetupStorageOutputReference(this, "storage");
1215
+ this._accountId = config.accountId;
1216
+ this._active = config.active;
1217
+ this._description = config.description;
1218
+ this._id = config.id;
1219
+ this._name = config.name;
1220
+ this._defaultPartition.internalValue = config.defaultPartition;
1221
+ this._forwarder.internalValue = config.forwarder;
1222
+ this._storage.internalValue = config.storage;
1223
+ }
1224
+ get accountId() {
1225
+ return this.getNumberAttribute('account_id');
1226
+ }
1227
+ set accountId(value) {
1228
+ this._accountId = value;
1229
+ }
1230
+ resetAccountId() {
1231
+ this._accountId = undefined;
1232
+ }
1233
+ // Temporarily expose input value. Use with caution.
1234
+ get accountIdInput() {
1235
+ return this._accountId;
1236
+ }
1237
+ get active() {
1238
+ return this.getBooleanAttribute('active');
1239
+ }
1240
+ set active(value) {
1241
+ this._active = value;
1242
+ }
1243
+ resetActive() {
1244
+ this._active = undefined;
1245
+ }
1246
+ // Temporarily expose input value. Use with caution.
1247
+ get activeInput() {
1248
+ return this._active;
1249
+ }
1250
+ // created_at - computed: true, optional: false, required: false
1251
+ get createdAt() {
1252
+ return this.getStringAttribute('created_at');
1253
+ }
1254
+ // default_partition_id - computed: true, optional: false, required: false
1255
+ get defaultPartitionId() {
1256
+ return this.getStringAttribute('default_partition_id');
1257
+ }
1258
+ get description() {
1259
+ return this.getStringAttribute('description');
1260
+ }
1261
+ set description(value) {
1262
+ this._description = value;
1263
+ }
1264
+ resetDescription() {
1265
+ this._description = undefined;
1266
+ }
1267
+ // Temporarily expose input value. Use with caution.
1268
+ get descriptionInput() {
1269
+ return this._description;
1270
+ }
1271
+ get healthCheck() {
1272
+ return this._healthCheck;
1273
+ }
1274
+ get id() {
1275
+ return this.getStringAttribute('id');
1276
+ }
1277
+ set id(value) {
1278
+ this._id = value;
1279
+ }
1280
+ resetId() {
1281
+ this._id = undefined;
1282
+ }
1283
+ // Temporarily expose input value. Use with caution.
1284
+ get idInput() {
1285
+ return this._id;
1286
+ }
1287
+ get lifecycleStatus() {
1288
+ return this._lifecycleStatus;
1289
+ }
1290
+ get name() {
1291
+ return this.getStringAttribute('name');
1292
+ }
1293
+ set name(value) {
1294
+ this._name = value;
1295
+ }
1296
+ // Temporarily expose input value. Use with caution.
1297
+ get nameInput() {
1298
+ return this._name;
1299
+ }
1300
+ // updated_at - computed: true, optional: false, required: false
1301
+ get updatedAt() {
1302
+ return this.getStringAttribute('updated_at');
1303
+ }
1304
+ get defaultPartition() {
1305
+ return this._defaultPartition;
1306
+ }
1307
+ putDefaultPartition(value) {
1308
+ this._defaultPartition.internalValue = value;
1309
+ }
1310
+ // Temporarily expose input value. Use with caution.
1311
+ get defaultPartitionInput() {
1312
+ return this._defaultPartition.internalValue;
1313
+ }
1314
+ get forwarder() {
1315
+ return this._forwarder;
1316
+ }
1317
+ putForwarder(value) {
1318
+ this._forwarder.internalValue = value;
1319
+ }
1320
+ resetForwarder() {
1321
+ this._forwarder.internalValue = undefined;
1322
+ }
1323
+ // Temporarily expose input value. Use with caution.
1324
+ get forwarderInput() {
1325
+ return this._forwarder.internalValue;
1326
+ }
1327
+ get storage() {
1328
+ return this._storage;
1329
+ }
1330
+ putStorage(value) {
1331
+ this._storage.internalValue = value;
1332
+ }
1333
+ // Temporarily expose input value. Use with caution.
1334
+ get storageInput() {
1335
+ return this._storage.internalValue;
1336
+ }
1337
+ // =========
1338
+ // SYNTHESIS
1339
+ // =========
1340
+ synthesizeAttributes() {
1341
+ return {
1342
+ account_id: cdktn.numberToTerraform(this._accountId),
1343
+ active: cdktn.booleanToTerraform(this._active),
1344
+ description: cdktn.stringToTerraform(this._description),
1345
+ id: cdktn.stringToTerraform(this._id),
1346
+ name: cdktn.stringToTerraform(this._name),
1347
+ default_partition: federatedLogsSetupDefaultPartitionToTerraform(this._defaultPartition.internalValue),
1348
+ forwarder: federatedLogsSetupForwarderToTerraform(this._forwarder.internalValue),
1349
+ storage: federatedLogsSetupStorageToTerraform(this._storage.internalValue),
1350
+ };
1351
+ }
1352
+ synthesizeHclAttributes() {
1353
+ const attrs = {
1354
+ account_id: {
1355
+ value: cdktn.numberToHclTerraform(this._accountId),
1356
+ isBlock: false,
1357
+ type: "simple",
1358
+ storageClassType: "number",
1359
+ },
1360
+ active: {
1361
+ value: cdktn.booleanToHclTerraform(this._active),
1362
+ isBlock: false,
1363
+ type: "simple",
1364
+ storageClassType: "boolean",
1365
+ },
1366
+ description: {
1367
+ value: cdktn.stringToHclTerraform(this._description),
1368
+ isBlock: false,
1369
+ type: "simple",
1370
+ storageClassType: "string",
1371
+ },
1372
+ id: {
1373
+ value: cdktn.stringToHclTerraform(this._id),
1374
+ isBlock: false,
1375
+ type: "simple",
1376
+ storageClassType: "string",
1377
+ },
1378
+ name: {
1379
+ value: cdktn.stringToHclTerraform(this._name),
1380
+ isBlock: false,
1381
+ type: "simple",
1382
+ storageClassType: "string",
1383
+ },
1384
+ default_partition: {
1385
+ value: federatedLogsSetupDefaultPartitionToHclTerraform(this._defaultPartition.internalValue),
1386
+ isBlock: true,
1387
+ type: "list",
1388
+ storageClassType: "FederatedLogsSetupDefaultPartitionList",
1389
+ },
1390
+ forwarder: {
1391
+ value: federatedLogsSetupForwarderToHclTerraform(this._forwarder.internalValue),
1392
+ isBlock: true,
1393
+ type: "list",
1394
+ storageClassType: "FederatedLogsSetupForwarderList",
1395
+ },
1396
+ storage: {
1397
+ value: federatedLogsSetupStorageToHclTerraform(this._storage.internalValue),
1398
+ isBlock: true,
1399
+ type: "list",
1400
+ storageClassType: "FederatedLogsSetupStorageList",
1401
+ },
1402
+ };
1403
+ // remove undefined attributes
1404
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1405
+ }
1406
+ }
1407
+ exports.FederatedLogsSetup = FederatedLogsSetup;
1408
+ _s = JSII_RTTI_SYMBOL_1;
1409
+ FederatedLogsSetup[_s] = { fqn: "@cdktn/provider-newrelic.federatedLogsSetup.FederatedLogsSetup", version: "15.2.0" };
1410
+ // =================
1411
+ // STATIC PROPERTIES
1412
+ // =================
1413
+ FederatedLogsSetup.tfResourceType = "newrelic_federated_logs_setup";
1414
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmVkZXJhdGVkLWxvZ3Mtc2V0dXAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQW1FQSwwSEFPQztBQUdELGdJQVFDO0FBbUVELDBIQU9DO0FBR0QsZ0lBUUM7QUFtRUQsNEZBT0M7QUFHRCxrR0FRQztBQXFFRCxvR0FPQztBQUdELDBHQVFDO0FBK0VELDRJQVNDO0FBR0Qsa0pBc0JDO0FBaUZELG9IQVNDO0FBR0QsMEhBc0JDO0FBaUZELHNHQVNDO0FBR0QsNEdBc0JDO0FBOEVELDRJQVFDO0FBR0Qsa0pBZ0JDO0FBOERELHNIQVNDO0FBR0QsNEhBc0JDO0FBb0ZELHdGQVNDO0FBR0QsOEZBc0JDO0FBb0ZELHdJQVNDO0FBR0QsOElBc0JDO0FBbUdELG9GQVlDO0FBR0QsMEZBd0NDOztBQW52Q0QsK0JBQStCO0FBMEQvQixTQUFnQix1REFBdUQsQ0FBQyxNQUFxRDtJQUMzSCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPLEVBQ04sQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQiwwREFBMEQsQ0FBQyxNQUFxRDtJQUM5SCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FB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LENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBRSxDQUFDLENBQUE7SUFDNUgsQ0FBQzs7QUF2UkgsZ0RBd1JDOzs7QUF0UkMsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDRyxpQ0FBYyxHQUFHLCtCQUErQixBQUFsQyxDQUFtQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDIxLCAyMDI2XG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuICovXG5cbi8vIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXBcbi8vIGdlbmVyYXRlZCBmcm9tIHRlcnJhZm9ybSByZXNvdXJjZSBzY2hlbWFcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBjZGt0biBmcm9tICdjZGt0bic7XG5cbi8vIENvbmZpZ3VyYXRpb25cblxuZXhwb3J0IGludGVyZmFjZSBGZWRlcmF0ZWRMb2dzU2V0dXBDb25maWcgZXh0ZW5kcyBjZGt0bi5UZXJyYWZvcm1NZXRhQXJndW1lbnRzIHtcbiAgLyoqXG4gICogVGhlIE5ldyBSZWxpYyBhY2NvdW50IElEIHdoZXJlIHRoZSBmZWRlcmF0ZWQgbG9ncyBzZXR1cCB3aWxsIGxpdmUuIERlZmF1bHRzIHRvIHRoZSBwcm92aWRlcidzIGFjY291bnRfaWQuIENoYW5naW5nIHRoaXMgYWZ0ZXIgY3JlYXRpb24gaXMgcmVqZWN0ZWQgYnkgdGhlIEFQSS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCNhY2NvdW50X2lkIEZlZGVyYXRlZExvZ3NTZXR1cCNhY2NvdW50X2lkfVxuICAqL1xuICByZWFkb25seSBhY2NvdW50SWQ/OiBudW1iZXI7XG4gIC8qKlxuICAqIFdoZXRoZXIgdGhlIHNldHVwIGlzIGFjdGl2ZS4gV2hlbiBmYWxzZSwgbG9nIHJvdXRpbmcgdG8gdGhpcyBzZXR1cCBpcyB0dXJuZWQgb2ZmLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45Mi4wL2RvY3MvcmVzb3VyY2VzL2ZlZGVyYXRlZF9sb2dzX3NldHVwI2FjdGl2ZSBGZWRlcmF0ZWRMb2dzU2V0dXAjYWN0aXZlfVxuICAqL1xuICByZWFkb25seSBhY3RpdmU/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVkZXJhdGVkIGxvZyBzZXR1cC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCNkZXNjcmlwdGlvbiBGZWRlcmF0ZWRMb2dzU2V0dXAjZGVzY3JpcHRpb259XG4gICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjaWQgRmVkZXJhdGVkTG9nc1NldHVwI2lkfVxuICAqXG4gICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIGlkIGZpZWxkIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIHJlc291cmNlcyBpbiBUZXJyYWZvcm0gcHJvdmlkZXJzIHVzaW5nIGEgVGVycmFmb3JtIHByb3ZpZGVyIFNESyB2ZXJzaW9uIGJlbG93IDIuXG4gICogSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgc2V0dGluZyB0aGlzIHZhbHVlIGl0IG1pZ2h0IG5vdCBiZSBzZXR0YWJsZS4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHRoZSBwcm92aWRlciBkb2N1bWVudGF0aW9uIHRvIGVuc3VyZSBpdCBzaG91bGQgYmUgc2V0dGFibGUuXG4gICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAvKipcbiAgKiBUaGUgbmFtZSBvZiB0aGUgZmVkZXJhdGVkIGxvZyBzZXR1cC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCNuYW1lIEZlZGVyYXRlZExvZ3NTZXR1cCNuYW1lfVxuICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAqIGRlZmF1bHRfcGFydGl0aW9uIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjZGVmYXVsdF9wYXJ0aXRpb24gRmVkZXJhdGVkTG9nc1NldHVwI2RlZmF1bHRfcGFydGl0aW9ufVxuICAqL1xuICByZWFkb25seSBkZWZhdWx0UGFydGl0aW9uOiBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uO1xuICAvKipcbiAgKiBmb3J3YXJkZXIgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCNmb3J3YXJkZXIgRmVkZXJhdGVkTG9nc1NldHVwI2ZvcndhcmRlcn1cbiAgKi9cbiAgcmVhZG9ubHkgZm9yd2FyZGVyPzogRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyO1xuICAvKipcbiAgKiBzdG9yYWdlIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjc3RvcmFnZSBGZWRlcmF0ZWRMb2dzU2V0dXAjc3RvcmFnZX1cbiAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZTogRmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tFbmQyRW5kRGF0YUZsb3cge1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tFbmQyRW5kRGF0YUZsb3dUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBGZWRlcmF0ZWRMb2dzU2V0dXBIZWFsdGhDaGVja0VuZDJFbmREYXRhRmxvdyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICByZXR1cm4ge1xuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrRW5kMkVuZERhdGFGbG93VG9IY2xUZXJyYWZvcm0oc3RydWN0PzogRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tFbmQyRW5kRGF0YUZsb3cpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gIH07XG4gIHJldHVybiBhdHRycztcbn1cblxuZXhwb3J0IGNsYXNzIEZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrRW5kMkVuZERhdGFGbG93T3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgaXRlbSBpbiB0aGUgbGlzdFxuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SXNGcm9tU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgY29tcGxleE9iamVjdEluZGV4OiBudW1iZXIsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0LCBjb21wbGV4T2JqZWN0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IEZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrRW5kMkVuZERhdGFGbG93IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBGZWRlcmF0ZWRMb2dzU2V0dXBIZWFsdGhDaGVja0VuZDJFbmREYXRhRmxvdyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxhc3RfdXBkYXRlZF9hdCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGxhc3RVcGRhdGVkQXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdsYXN0X3VwZGF0ZWRfYXQnKTtcbiAgfVxuXG4gIC8vIG1lc3NhZ2UgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBtZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbWVzc2FnZScpO1xuICB9XG5cbiAgLy8gc3RhdHVzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc3RhdHVzJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrRW5kMkVuZERhdGFGbG93TGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpO1xuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tFbmQyRW5kRGF0YUZsb3dPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tFbmQyRW5kRGF0YUZsb3dPdXRwdXRSZWZlcmVuY2UodGhpcy50ZXJyYWZvcm1SZXNvdXJjZSwgdGhpcy50ZXJyYWZvcm1BdHRyaWJ1dGUsIGluZGV4LCB0aGlzLndyYXBzU2V0KTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBGZWRlcmF0ZWRMb2dzU2V0dXBIZWFsdGhDaGVja1F1ZXJ5Q29ubmVjdGlvbiB7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZWRlcmF0ZWRMb2dzU2V0dXBIZWFsdGhDaGVja1F1ZXJ5Q29ubmVjdGlvblRvVGVycmFmb3JtKHN0cnVjdD86IEZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrUXVlcnlDb25uZWN0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tRdWVyeUNvbm5lY3Rpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBGZWRlcmF0ZWRMb2dzU2V0dXBIZWFsdGhDaGVja1F1ZXJ5Q29ubmVjdGlvbik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgfTtcbiAgcmV0dXJuIGF0dHJzO1xufVxuXG5leHBvcnQgY2xhc3MgRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tRdWVyeUNvbm5lY3Rpb25PdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tRdWVyeUNvbm5lY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IEZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrUXVlcnlDb25uZWN0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gbGFzdF91cGRhdGVkX2F0IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgbGFzdFVwZGF0ZWRBdCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2xhc3RfdXBkYXRlZF9hdCcpO1xuICB9XG5cbiAgLy8gbWVzc2FnZSAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdtZXNzYWdlJyk7XG4gIH1cblxuICAvLyBzdGF0dXMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzdGF0dXMnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tRdWVyeUNvbm5lY3Rpb25MaXN0IGV4dGVuZHMgY2RrdG4uQ29tcGxleExpc3Qge1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldCk7XG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBGZWRlcmF0ZWRMb2dzU2V0dXBIZWFsdGhDaGVja1F1ZXJ5Q29ubmVjdGlvbk91dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBGZWRlcmF0ZWRMb2dzU2V0dXBIZWFsdGhDaGVja1F1ZXJ5Q29ubmVjdGlvbk91dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIEZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrIHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrVG9UZXJyYWZvcm0oc3RydWN0PzogRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2spOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmZWRlcmF0ZWRMb2dzU2V0dXBIZWFsdGhDaGVja1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IEZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICB9O1xuICByZXR1cm4gYXR0cnM7XG59XG5cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRMb2dzU2V0dXBIZWFsdGhDaGVja091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBGZWRlcmF0ZWRMb2dzU2V0dXBIZWFsdGhDaGVjayB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2sgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gIH1cblxuICAvLyBlbmQyZW5kX2RhdGFfZmxvdyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9lbmQyRW5kRGF0YUZsb3cgPSBuZXcgRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tFbmQyRW5kRGF0YUZsb3dMaXN0KHRoaXMsIFwiZW5kMmVuZF9kYXRhX2Zsb3dcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGVuZDJFbmREYXRhRmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5kMkVuZERhdGFGbG93O1xuICB9XG5cbiAgLy8gbGFzdF91cGRhdGVkX2F0IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgbGFzdFVwZGF0ZWRBdCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2xhc3RfdXBkYXRlZF9hdCcpO1xuICB9XG5cbiAgLy8gcXVlcnlfY29ubmVjdGlvbiAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9xdWVyeUNvbm5lY3Rpb24gPSBuZXcgRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tRdWVyeUNvbm5lY3Rpb25MaXN0KHRoaXMsIFwicXVlcnlfY29ubmVjdGlvblwiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgcXVlcnlDb25uZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeUNvbm5lY3Rpb247XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrTGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpO1xuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgRmVkZXJhdGVkTG9nc1NldHVwSGVhbHRoQ2hlY2tPdXRwdXRSZWZlcmVuY2UodGhpcy50ZXJyYWZvcm1SZXNvdXJjZSwgdGhpcy50ZXJyYWZvcm1BdHRyaWJ1dGUsIGluZGV4LCB0aGlzLndyYXBzU2V0KTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBGZWRlcmF0ZWRMb2dzU2V0dXBMaWZlY3ljbGVTdGF0dXMge1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwTGlmZWN5Y2xlU3RhdHVzVG9UZXJyYWZvcm0oc3RydWN0PzogRmVkZXJhdGVkTG9nc1NldHVwTGlmZWN5Y2xlU3RhdHVzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwTGlmZWN5Y2xlU3RhdHVzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogRmVkZXJhdGVkTG9nc1NldHVwTGlmZWN5Y2xlU3RhdHVzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICB9O1xuICByZXR1cm4gYXR0cnM7XG59XG5cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRMb2dzU2V0dXBMaWZlY3ljbGVTdGF0dXNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogRmVkZXJhdGVkTG9nc1NldHVwTGlmZWN5Y2xlU3RhdHVzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBGZWRlcmF0ZWRMb2dzU2V0dXBMaWZlY3ljbGVTdGF0dXMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gIH1cblxuICAvLyBsYXN0X3VwZGF0ZWRfYXQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBsYXN0VXBkYXRlZEF0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbGFzdF91cGRhdGVkX2F0Jyk7XG4gIH1cblxuICAvLyBtZXNzYWdlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgbWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ21lc3NhZ2UnKTtcbiAgfVxuXG4gIC8vIHN0YXR1cyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IHN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3N0YXR1cycpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRMb2dzU2V0dXBMaWZlY3ljbGVTdGF0dXNMaXN0IGV4dGVuZHMgY2RrdG4uQ29tcGxleExpc3Qge1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldCk7XG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBGZWRlcmF0ZWRMb2dzU2V0dXBMaWZlY3ljbGVTdGF0dXNPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgRmVkZXJhdGVkTG9nc1NldHVwTGlmZWN5Y2xlU3RhdHVzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvbkRhdGFSZXRlbnRpb25Qb2xpY3kge1xuICAvKipcbiAgKiBUaGUgZHVyYXRpb24gdmFsdWUgZm9yIHJldGVudGlvbi5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCNkdXJhdGlvbiBGZWRlcmF0ZWRMb2dzU2V0dXAjZHVyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSB0aW1lIHVuaXQgZm9yIHRoZSByZXRlbnRpb24gZHVyYXRpb24uXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjdW5pdCBGZWRlcmF0ZWRMb2dzU2V0dXAjdW5pdH1cbiAgKi9cbiAgcmVhZG9ubHkgdW5pdDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvbkRhdGFSZXRlbnRpb25Qb2xpY3lUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uRGF0YVJldGVudGlvblBvbGljeU91dHB1dFJlZmVyZW5jZSB8IEZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25EYXRhUmV0ZW50aW9uUG9saWN5KTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZHVyYXRpb246IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuZHVyYXRpb24pLFxuICAgIHVuaXQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudW5pdCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvbkRhdGFSZXRlbnRpb25Qb2xpY3lUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uRGF0YVJldGVudGlvblBvbGljeU91dHB1dFJlZmVyZW5jZSB8IEZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25EYXRhUmV0ZW50aW9uUG9saWN5KTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGR1cmF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kdXJhdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdW5pdDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudW5pdCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uRGF0YVJldGVudGlvblBvbGljeU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvbkRhdGFSZXRlbnRpb25Qb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2R1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmR1cmF0aW9uID0gdGhpcy5fZHVyYXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl91bml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnVuaXQgPSB0aGlzLl91bml0O1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvbkRhdGFSZXRlbnRpb25Qb2xpY3kgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3VuaXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2R1cmF0aW9uID0gdmFsdWUuZHVyYXRpb247XG4gICAgICB0aGlzLl91bml0ID0gdmFsdWUudW5pdDtcbiAgICB9XG4gIH1cblxuICAvLyBkdXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9kdXJhdGlvbj86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgZHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdkdXJhdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZHVyYXRpb24odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2R1cmF0aW9uID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGR1cmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xuICB9XG5cbiAgLy8gdW5pdCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF91bml0Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB1bml0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndW5pdCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgdW5pdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdW5pdCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB1bml0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VuaXQ7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvblN0b3JhZ2Uge1xuICAvKipcbiAgKiBUaGUgVVJJIGxvY2F0aW9uIG9mIHRoZSBwYXJ0aXRpb24gaW4gb2JqZWN0IHN0b3JhZ2UuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjZGF0YV9sb2NhdGlvbl91cmkgRmVkZXJhdGVkTG9nc1NldHVwI2RhdGFfbG9jYXRpb25fdXJpfVxuICAqL1xuICByZWFkb25seSBkYXRhTG9jYXRpb25Vcmk6IHN0cmluZztcbiAgLyoqXG4gICogVGhlIHRhYmxlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCN0YWJsZSBGZWRlcmF0ZWRMb2dzU2V0dXAjdGFibGV9XG4gICovXG4gIHJlYWRvbmx5IHRhYmxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uU3RvcmFnZVRvVGVycmFmb3JtKHN0cnVjdD86IEZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25TdG9yYWdlT3V0cHV0UmVmZXJlbmNlIHwgRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvblN0b3JhZ2UpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkYXRhX2xvY2F0aW9uX3VyaTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kYXRhTG9jYXRpb25VcmkpLFxuICAgIHRhYmxlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnRhYmxlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uU3RvcmFnZVRvSGNsVGVycmFmb3JtKHN0cnVjdD86IEZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25TdG9yYWdlT3V0cHV0UmVmZXJlbmNlIHwgRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvblN0b3JhZ2UpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZGF0YV9sb2NhdGlvbl91cmk6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRhdGFMb2NhdGlvblVyaSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGFibGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhYmxlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIEZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25TdG9yYWdlT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uU3RvcmFnZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGF0YUxvY2F0aW9uVXJpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRhdGFMb2NhdGlvblVyaSA9IHRoaXMuX2RhdGFMb2NhdGlvblVyaTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRhYmxlID0gdGhpcy5fdGFibGU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uU3RvcmFnZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2RhdGFMb2NhdGlvblVyaSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhYmxlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9kYXRhTG9jYXRpb25VcmkgPSB2YWx1ZS5kYXRhTG9jYXRpb25Vcmk7XG4gICAgICB0aGlzLl90YWJsZSA9IHZhbHVlLnRhYmxlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRhdGFfbG9jYXRpb25fdXJpIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2RhdGFMb2NhdGlvblVyaT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGF0YUxvY2F0aW9uVXJpKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGF0YV9sb2NhdGlvbl91cmknKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRhdGFMb2NhdGlvblVyaSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGF0YUxvY2F0aW9uVXJpID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRhdGFMb2NhdGlvblVyaUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhTG9jYXRpb25Vcmk7XG4gIH1cblxuICAvLyB0YWJsZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF90YWJsZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWJsZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGFibGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3RhYmxlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRhYmxlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIEZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb24ge1xuICAvKipcbiAgKiBkYXRhX3JldGVudGlvbl9wb2xpY3kgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCNkYXRhX3JldGVudGlvbl9wb2xpY3kgRmVkZXJhdGVkTG9nc1NldHVwI2RhdGFfcmV0ZW50aW9uX3BvbGljeX1cbiAgKi9cbiAgcmVhZG9ubHkgZGF0YVJldGVudGlvblBvbGljeT86IEZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25EYXRhUmV0ZW50aW9uUG9saWN5O1xuICAvKipcbiAgKiBzdG9yYWdlIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjc3RvcmFnZSBGZWRlcmF0ZWRMb2dzU2V0dXAjc3RvcmFnZX1cbiAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZTogRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvblN0b3JhZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvbk91dHB1dFJlZmVyZW5jZSB8IEZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb24pOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkYXRhX3JldGVudGlvbl9wb2xpY3k6IGZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25EYXRhUmV0ZW50aW9uUG9saWN5VG9UZXJyYWZvcm0oc3RydWN0IS5kYXRhUmV0ZW50aW9uUG9saWN5KSxcbiAgICBzdG9yYWdlOiBmZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uU3RvcmFnZVRvVGVycmFmb3JtKHN0cnVjdCEuc3RvcmFnZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdD86IEZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25PdXRwdXRSZWZlcmVuY2UgfCBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRhdGFfcmV0ZW50aW9uX3BvbGljeToge1xuICAgICAgdmFsdWU6IGZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25EYXRhUmV0ZW50aW9uUG9saWN5VG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kYXRhUmV0ZW50aW9uUG9saWN5KSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvbkRhdGFSZXRlbnRpb25Qb2xpY3lMaXN0XCIsXG4gICAgfSxcbiAgICBzdG9yYWdlOiB7XG4gICAgICB2YWx1ZTogZmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvblN0b3JhZ2VUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnN0b3JhZ2UpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uU3RvcmFnZUxpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvbk91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGF0YVJldGVudGlvblBvbGljeT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kYXRhUmV0ZW50aW9uUG9saWN5ID0gdGhpcy5fZGF0YVJldGVudGlvblBvbGljeT8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0b3JhZ2U/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc3RvcmFnZSA9IHRoaXMuX3N0b3JhZ2U/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZGF0YVJldGVudGlvblBvbGljeS5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3RvcmFnZS5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9kYXRhUmV0ZW50aW9uUG9saWN5LmludGVybmFsVmFsdWUgPSB2YWx1ZS5kYXRhUmV0ZW50aW9uUG9saWN5O1xuICAgICAgdGhpcy5fc3RvcmFnZS5pbnRlcm5hbFZhbHVlID0gdmFsdWUuc3RvcmFnZTtcbiAgICB9XG4gIH1cblxuICAvLyBkYXRhX3JldGVudGlvbl9wb2xpY3kgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGF0YVJldGVudGlvblBvbGljeSA9IG5ldyBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uRGF0YVJldGVudGlvblBvbGljeU91dHB1dFJlZmVyZW5jZSh0aGlzLCBcImRhdGFfcmV0ZW50aW9uX3BvbGljeVwiKTtcbiAgcHVibGljIGdldCBkYXRhUmV0ZW50aW9uUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhUmV0ZW50aW9uUG9saWN5O1xuICB9XG4gIHB1YmxpYyBwdXREYXRhUmV0ZW50aW9uUG9saWN5KHZhbHVlOiBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uRGF0YVJldGVudGlvblBvbGljeSkge1xuICAgIHRoaXMuX2RhdGFSZXRlbnRpb25Qb2xpY3kuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERhdGFSZXRlbnRpb25Qb2xpY3koKSB7XG4gICAgdGhpcy5fZGF0YVJldGVudGlvblBvbGljeS5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkYXRhUmV0ZW50aW9uUG9saWN5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFSZXRlbnRpb25Qb2xpY3kuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHN0b3JhZ2UgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfc3RvcmFnZSA9IG5ldyBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uU3RvcmFnZU91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInN0b3JhZ2VcIik7XG4gIHB1YmxpYyBnZXQgc3RvcmFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgfVxuICBwdWJsaWMgcHV0U3RvcmFnZSh2YWx1ZTogRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvblN0b3JhZ2UpIHtcbiAgICB0aGlzLl9zdG9yYWdlLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc3RvcmFnZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlLmludGVybmFsVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyUGlwZWxpbmVDb250cm9sUm91dGluZ1J1bGUge1xuICAvKipcbiAgKiBPVFRMIGV4cHJlc3Npb24gZm9yIHJvdXRpbmcgbG9ncyB0byB0aGlzIHNldHVwLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45Mi4wL2RvY3MvcmVzb3VyY2VzL2ZlZGVyYXRlZF9sb2dzX3NldHVwI2V4cHJlc3Npb24gRmVkZXJhdGVkTG9nc1NldHVwI2V4cHJlc3Npb259XG4gICovXG4gIHJlYWRvbmx5IGV4cHJlc3Npb246IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlclBpcGVsaW5lQ29udHJvbFJvdXRpbmdSdWxlVG9UZXJyYWZvcm0oc3RydWN0PzogRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyUGlwZWxpbmVDb250cm9sUm91dGluZ1J1bGVPdXRwdXRSZWZlcmVuY2UgfCBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2xSb3V0aW5nUnVsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGV4cHJlc3Npb246IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZXhwcmVzc2lvbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyUGlwZWxpbmVDb250cm9sUm91dGluZ1J1bGVUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2xSb3V0aW5nUnVsZU91dHB1dFJlZmVyZW5jZSB8IEZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlclBpcGVsaW5lQ29udHJvbFJvdXRpbmdSdWxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGV4cHJlc3Npb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmV4cHJlc3Npb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyUGlwZWxpbmVDb250cm9sUm91dGluZ1J1bGVPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IEZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlclBpcGVsaW5lQ29udHJvbFJvdXRpbmdSdWxlIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9leHByZXNzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV4cHJlc3Npb24gPSB0aGlzLl9leHByZXNzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyUGlwZWxpbmVDb250cm9sUm91dGluZ1J1bGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9leHByZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9leHByZXNzaW9uID0gdmFsdWUuZXhwcmVzc2lvbjtcbiAgICB9XG4gIH1cblxuICAvLyBleHByZXNzaW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2V4cHJlc3Npb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdleHByZXNzaW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9leHByZXNzaW9uID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwcmVzc2lvbjtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2wge1xuICAvKipcbiAgKiBUaGUgZmxlZXQgZW50aXR5IEdVSUQgdXNlZCBmb3IgZGVwbG95aW5nIHRoZSBwaXBlbGluZSBjb25maWd1cmF0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45Mi4wL2RvY3MvcmVzb3VyY2VzL2ZlZGVyYXRlZF9sb2dzX3NldHVwI2ZsZWV0X2lkIEZlZGVyYXRlZExvZ3NTZXR1cCNmbGVldF9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgZmxlZXRJZDogc3RyaW5nO1xuICAvKipcbiAgKiByb3V0aW5nX3J1bGUgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCNyb3V0aW5nX3J1bGUgRmVkZXJhdGVkTG9nc1NldHVwI3JvdXRpbmdfcnVsZX1cbiAgKi9cbiAgcmVhZG9ubHkgcm91dGluZ1J1bGU/OiBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2xSb3V0aW5nUnVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlclBpcGVsaW5lQ29udHJvbFRvVGVycmFmb3JtKHN0cnVjdD86IEZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlclBpcGVsaW5lQ29udHJvbE91dHB1dFJlZmVyZW5jZSB8IEZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlclBpcGVsaW5lQ29udHJvbCk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGZsZWV0X2lkOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmZsZWV0SWQpLFxuICAgIHJvdXRpbmdfcnVsZTogZmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyUGlwZWxpbmVDb250cm9sUm91dGluZ1J1bGVUb1RlcnJhZm9ybShzdHJ1Y3QhLnJvdXRpbmdSdWxlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBmZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2xUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2xPdXRwdXRSZWZlcmVuY2UgfCBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2wpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZmxlZXRfaWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmZsZWV0SWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHJvdXRpbmdfcnVsZToge1xuICAgICAgdmFsdWU6IGZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlclBpcGVsaW5lQ29udHJvbFJvdXRpbmdSdWxlVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5yb3V0aW5nUnVsZSksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlclBpcGVsaW5lQ29udHJvbFJvdXRpbmdSdWxlTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2xPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IEZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlclBpcGVsaW5lQ29udHJvbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZmxlZXRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5mbGVldElkID0gdGhpcy5fZmxlZXRJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JvdXRpbmdSdWxlPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnJvdXRpbmdSdWxlID0gdGhpcy5fcm91dGluZ1J1bGU/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2wgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9mbGVldElkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcm91dGluZ1J1bGUuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZmxlZXRJZCA9IHZhbHVlLmZsZWV0SWQ7XG4gICAgICB0aGlzLl9yb3V0aW5nUnVsZS5pbnRlcm5hbFZhbHVlID0gdmFsdWUucm91dGluZ1J1bGU7XG4gICAgfVxuICB9XG5cbiAgLy8gZmxlZXRfaWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZmxlZXRJZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZmxlZXRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2ZsZWV0X2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBmbGVldElkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9mbGVldElkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZsZWV0SWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmxlZXRJZDtcbiAgfVxuXG4gIC8vIHJvdXRpbmdfcnVsZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9yb3V0aW5nUnVsZSA9IG5ldyBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2xSb3V0aW5nUnVsZU91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInJvdXRpbmdfcnVsZVwiKTtcbiAgcHVibGljIGdldCByb3V0aW5nUnVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm91dGluZ1J1bGU7XG4gIH1cbiAgcHVibGljIHB1dFJvdXRpbmdSdWxlKHZhbHVlOiBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2xSb3V0aW5nUnVsZSkge1xuICAgIHRoaXMuX3JvdXRpbmdSdWxlLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRSb3V0aW5nUnVsZSgpIHtcbiAgICB0aGlzLl9yb3V0aW5nUnVsZS5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByb3V0aW5nUnVsZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9yb3V0aW5nUnVsZS5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIEZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlciB7XG4gIC8qKlxuICAqIFRoZSB0eXBlIG9mIGZvcndhcmRlci4gQ3VycmVudGx5IG9ubHkgUElQRUxJTkVfQ09OVFJPTCBpcyBzdXBwb3J0ZWQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjdHlwZSBGZWRlcmF0ZWRMb2dzU2V0dXAjdHlwZX1cbiAgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuICAvKipcbiAgKiBwaXBlbGluZV9jb250cm9sIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjcGlwZWxpbmVfY29udHJvbCBGZWRlcmF0ZWRMb2dzU2V0dXAjcGlwZWxpbmVfY29udHJvbH1cbiAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVDb250cm9sPzogRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyUGlwZWxpbmVDb250cm9sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyVG9UZXJyYWZvcm0oc3RydWN0PzogRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyT3V0cHV0UmVmZXJlbmNlIHwgRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50eXBlKSxcbiAgICBwaXBlbGluZV9jb250cm9sOiBmZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2xUb1RlcnJhZm9ybShzdHJ1Y3QhLnBpcGVsaW5lQ29udHJvbCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyT3V0cHV0UmVmZXJlbmNlIHwgRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIHR5cGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnR5cGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHBpcGVsaW5lX2NvbnRyb2w6IHtcbiAgICAgIHZhbHVlOiBmZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2xUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnBpcGVsaW5lQ29udHJvbCksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlclBpcGVsaW5lQ29udHJvbExpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXIgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX3R5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudHlwZSA9IHRoaXMuX3R5cGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9waXBlbGluZUNvbnRyb2w/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucGlwZWxpbmVDb250cm9sID0gdGhpcy5fcGlwZWxpbmVDb250cm9sPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fdHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3BpcGVsaW5lQ29udHJvbC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl90eXBlID0gdmFsdWUudHlwZTtcbiAgICAgIHRoaXMuX3BpcGVsaW5lQ29udHJvbC5pbnRlcm5hbFZhbHVlID0gdmFsdWUucGlwZWxpbmVDb250cm9sO1xuICAgIH1cbiAgfVxuXG4gIC8vIHR5cGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdHlwZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3R5cGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3R5cGUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgLy8gcGlwZWxpbmVfY29udHJvbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9waXBlbGluZUNvbnRyb2wgPSBuZXcgRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyUGlwZWxpbmVDb250cm9sT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicGlwZWxpbmVfY29udHJvbFwiKTtcbiAgcHVibGljIGdldCBwaXBlbGluZUNvbnRyb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BpcGVsaW5lQ29udHJvbDtcbiAgfVxuICBwdWJsaWMgcHV0UGlwZWxpbmVDb250cm9sKHZhbHVlOiBGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJQaXBlbGluZUNvbnRyb2wpIHtcbiAgICB0aGlzLl9waXBlbGluZUNvbnRyb2wuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFBpcGVsaW5lQ29udHJvbCgpIHtcbiAgICB0aGlzLl9waXBlbGluZUNvbnRyb2wuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcGlwZWxpbmVDb250cm9sSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BpcGVsaW5lQ29udHJvbC5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIEZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VDbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAqIFRoZSBjbG91ZCBwcm92aWRlci4gQ3VycmVudGx5IG9ubHkgQVdTIGlzIHN1cHBvcnRlZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCNwcm92aWRlciBGZWRlcmF0ZWRMb2dzU2V0dXAjcHJvdmlkZXJ9XG4gICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSBjbG91ZCBwcm92aWRlciByZWdpb24uXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjcmVnaW9uIEZlZGVyYXRlZExvZ3NTZXR1cCNyZWdpb259XG4gICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZUNsb3VkUHJvdmlkZXJDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogRmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZUNsb3VkUHJvdmlkZXJDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIHwgRmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZUNsb3VkUHJvdmlkZXJDb25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXI6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucHJvdmlkZXIpLFxuICAgIHJlZ2lvbjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5yZWdpb24pLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VDbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdD86IEZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VDbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IEZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VDbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBwcm92aWRlcjoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucHJvdmlkZXIpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHJlZ2lvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucmVnaW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIEZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VDbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogRmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZUNsb3VkUHJvdmlkZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9wcm92aWRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5wcm92aWRlciA9IHRoaXMuX3Byb3ZpZGVyO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnJlZ2lvbiA9IHRoaXMuX3JlZ2lvbjtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IEZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VDbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3Byb3ZpZGVyID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcmVnaW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9wcm92aWRlciA9IHZhbHVlLnByb3ZpZGVyO1xuICAgICAgdGhpcy5fcmVnaW9uID0gdmFsdWUucmVnaW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3ZpZGVyIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3Byb3ZpZGVyPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwcm92aWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3Byb3ZpZGVyJyk7XG4gIH1cbiAgcHVibGljIHNldCBwcm92aWRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcHJvdmlkZXIgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcHJvdmlkZXJJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvdmlkZXI7XG4gIH1cblxuICAvLyByZWdpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcmVnaW9uPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCByZWdpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdyZWdpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlZ2lvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVnaW9uID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJlZ2lvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWdpb247XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZSB7XG4gIC8qKlxuICAqIFRoZSBjb25uZWN0aW9uIG1hbmFnZXIgZW50aXR5IEdVSUQgdXNlZCBmb3Igd3JpdGluZyBkYXRhLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45Mi4wL2RvY3MvcmVzb3VyY2VzL2ZlZGVyYXRlZF9sb2dzX3NldHVwI2RhdGFfaW5nZXN0X2Nvbm5lY3Rpb25faWQgRmVkZXJhdGVkTG9nc1NldHVwI2RhdGFfaW5nZXN0X2Nvbm5lY3Rpb25faWR9XG4gICovXG4gIHJlYWRvbmx5IGRhdGFJbmdlc3RDb25uZWN0aW9uSWQ6IHN0cmluZztcbiAgLyoqXG4gICogVGhlIG9iamVjdCBzdG9yYWdlIGJ1Y2tldCB3aGVyZSBsb2cgZGF0YSBpcyBzdG9yZWQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjZGF0YV9sb2NhdGlvbl9idWNrZXQgRmVkZXJhdGVkTG9nc1NldHVwI2RhdGFfbG9jYXRpb25fYnVja2V0fVxuICAqL1xuICByZWFkb25seSBkYXRhTG9jYXRpb25CdWNrZXQ6IHN0cmluZztcbiAgLyoqXG4gICogVGhlIGRhdGFiYXNlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmZWRlcmF0ZWQgbG9nIHNldHVwLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45Mi4wL2RvY3MvcmVzb3VyY2VzL2ZlZGVyYXRlZF9sb2dzX3NldHVwI2RhdGFiYXNlIEZlZGVyYXRlZExvZ3NTZXR1cCNkYXRhYmFzZX1cbiAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U6IHN0cmluZztcbiAgLyoqXG4gICogVGhlIGNvbm5lY3Rpb24gbWFuYWdlciBlbnRpdHkgR1VJRCB1c2VkIGJ5IHF1ZXJ5IHdvcmtlcnMgZm9yIHJlYWRpbmcgZGF0YS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCNxdWVyeV9jb25uZWN0aW9uX2lkIEZlZGVyYXRlZExvZ3NTZXR1cCNxdWVyeV9jb25uZWN0aW9uX2lkfVxuICAqL1xuICByZWFkb25seSBxdWVyeUNvbm5lY3Rpb25JZDogc3RyaW5nO1xuICAvKipcbiAgKiBjbG91ZF9wcm92aWRlcl9jb25maWd1cmF0aW9uIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjY2xvdWRfcHJvdmlkZXJfY29uZmlndXJhdGlvbiBGZWRlcmF0ZWRMb2dzU2V0dXAjY2xvdWRfcHJvdmlkZXJfY29uZmlndXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgY2xvdWRQcm92aWRlckNvbmZpZ3VyYXRpb246IEZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VDbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBGZWRlcmF0ZWRMb2dzU2V0dXBTdG9yYWdlT3V0cHV0UmVmZXJlbmNlIHwgRmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRhdGFfaW5nZXN0X2Nvbm5lY3Rpb25faWQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZGF0YUluZ2VzdENvbm5lY3Rpb25JZCksXG4gICAgZGF0YV9sb2NhdGlvbl9idWNrZXQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZGF0YUxvY2F0aW9uQnVja2V0KSxcbiAgICBkYXRhYmFzZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kYXRhYmFzZSksXG4gICAgcXVlcnlfY29ubmVjdGlvbl9pZDogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5xdWVyeUNvbm5lY3Rpb25JZCksXG4gICAgY2xvdWRfcHJvdmlkZXJfY29uZmlndXJhdGlvbjogZmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZUNsb3VkUHJvdmlkZXJDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0oc3RydWN0IS5jbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZVRvSGNsVGVycmFmb3JtKHN0cnVjdD86IEZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VPdXRwdXRSZWZlcmVuY2UgfCBGZWRlcmF0ZWRMb2dzU2V0dXBTdG9yYWdlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRhdGFfaW5nZXN0X2Nvbm5lY3Rpb25faWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRhdGFJbmdlc3RDb25uZWN0aW9uSWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGRhdGFfbG9jYXRpb25fYnVja2V0OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kYXRhTG9jYXRpb25CdWNrZXQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGRhdGFiYXNlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kYXRhYmFzZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcXVlcnlfY29ubmVjdGlvbl9pZDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucXVlcnlDb25uZWN0aW9uSWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGNsb3VkX3Byb3ZpZGVyX2NvbmZpZ3VyYXRpb246IHtcbiAgICAgIHZhbHVlOiBmZWRlcmF0ZWRMb2dzU2V0dXBTdG9yYWdlQ2xvdWRQcm92aWRlckNvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNsb3VkUHJvdmlkZXJDb25maWd1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiRmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZUNsb3VkUHJvdmlkZXJDb25maWd1cmF0aW9uTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRMb2dzU2V0dXBTdG9yYWdlT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBGZWRlcmF0ZWRMb2dzU2V0dXBTdG9yYWdlIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9kYXRhSW5nZXN0Q29ubmVjdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRhdGFJbmdlc3RDb25uZWN0aW9uSWQgPSB0aGlzLl9kYXRhSW5nZXN0Q29ubmVjdGlvbklkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGF0YUxvY2F0aW9uQnVja2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRhdGFMb2NhdGlvbkJ1Y2tldCA9IHRoaXMuX2RhdGFMb2NhdGlvbkJ1Y2tldDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RhdGFiYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRhdGFiYXNlID0gdGhpcy5fZGF0YWJhc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLl9xdWVyeUNvbm5lY3Rpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5xdWVyeUNvbm5lY3Rpb25JZCA9IHRoaXMuX3F1ZXJ5Q29ubmVjdGlvbklkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2xvdWRQcm92aWRlckNvbmZpZ3VyYXRpb24/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY2xvdWRQcm92aWRlckNvbmZpZ3VyYXRpb24gPSB0aGlzLl9jbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbj8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IEZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2UgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9kYXRhSW5nZXN0Q29ubmVjdGlvbklkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGF0YUxvY2F0aW9uQnVja2V0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGF0YWJhc2UgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9xdWVyeUNvbm5lY3Rpb25JZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Nsb3VkUHJvdmlkZXJDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2RhdGFJbmdlc3RDb25uZWN0aW9uSWQgPSB2YWx1ZS5kYXRhSW5nZXN0Q29ubmVjdGlvbklkO1xuICAgICAgdGhpcy5fZGF0YUxvY2F0aW9uQnVja2V0ID0gdmFsdWUuZGF0YUxvY2F0aW9uQnVja2V0O1xuICAgICAgdGhpcy5fZGF0YWJhc2UgPSB2YWx1ZS5kYXRhYmFzZTtcbiAgICAgIHRoaXMuX3F1ZXJ5Q29ubmVjdGlvbklkID0gdmFsdWUucXVlcnlDb25uZWN0aW9uSWQ7XG4gICAgICB0aGlzLl9jbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWUuY2xvdWRQcm92aWRlckNvbmZpZ3VyYXRpb247XG4gICAgfVxuICB9XG5cbiAgLy8gZGF0YV9pbmdlc3RfY29ubmVjdGlvbl9pZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9kYXRhSW5nZXN0Q29ubmVjdGlvbklkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBkYXRhSW5nZXN0Q29ubmVjdGlvbklkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGF0YV9pbmdlc3RfY29ubmVjdGlvbl9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGF0YUluZ2VzdENvbm5lY3Rpb25JZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGF0YUluZ2VzdENvbm5lY3Rpb25JZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkYXRhSW5nZXN0Q29ubmVjdGlvbklkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFJbmdlc3RDb25uZWN0aW9uSWQ7XG4gIH1cblxuICAvLyBkYXRhX2xvY2F0aW9uX2J1Y2tldCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9kYXRhTG9jYXRpb25CdWNrZXQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRhdGFMb2NhdGlvbkJ1Y2tldCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2RhdGFfbG9jYXRpb25fYnVja2V0Jyk7XG4gIH1cbiAgcHVibGljIHNldCBkYXRhTG9jYXRpb25CdWNrZXQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RhdGFMb2NhdGlvbkJ1Y2tldCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkYXRhTG9jYXRpb25CdWNrZXRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YUxvY2F0aW9uQnVja2V0O1xuICB9XG5cbiAgLy8gZGF0YWJhc2UgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZGF0YWJhc2U/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRhdGFiYXNlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGF0YWJhc2UnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRhdGFiYXNlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kYXRhYmFzZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkYXRhYmFzZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhYmFzZTtcbiAgfVxuXG4gIC8vIHF1ZXJ5X2Nvbm5lY3Rpb25faWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcXVlcnlDb25uZWN0aW9uSWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHF1ZXJ5Q29ubmVjdGlvbklkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncXVlcnlfY29ubmVjdGlvbl9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlcnlDb25uZWN0aW9uSWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3F1ZXJ5Q29ubmVjdGlvbklkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHF1ZXJ5Q29ubmVjdGlvbklkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5Q29ubmVjdGlvbklkO1xuICB9XG5cbiAgLy8gY2xvdWRfcHJvdmlkZXJfY29uZmlndXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9jbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbiA9IG5ldyBGZWRlcmF0ZWRMb2dzU2V0dXBTdG9yYWdlQ2xvdWRQcm92aWRlckNvbmZpZ3VyYXRpb25PdXRwdXRSZWZlcmVuY2UodGhpcywgXCJjbG91ZF9wcm92aWRlcl9jb25maWd1cmF0aW9uXCIpO1xuICBwdWJsaWMgZ2V0IGNsb3VkUHJvdmlkZXJDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbjtcbiAgfVxuICBwdWJsaWMgcHV0Q2xvdWRQcm92aWRlckNvbmZpZ3VyYXRpb24odmFsdWU6IEZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VDbG91ZFByb3ZpZGVyQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuX2Nsb3VkUHJvdmlkZXJDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY2xvdWRQcm92aWRlckNvbmZpZ3VyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xvdWRQcm92aWRlckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiogUmVwcmVzZW50cyBhIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45Mi4wL2RvY3MvcmVzb3VyY2VzL2ZlZGVyYXRlZF9sb2dzX3NldHVwIG5ld3JlbGljX2ZlZGVyYXRlZF9sb2dzX3NldHVwfVxuKi9cbmV4cG9ydCBjbGFzcyBGZWRlcmF0ZWRMb2dzU2V0dXAgZXh0ZW5kcyBjZGt0bi5UZXJyYWZvcm1SZXNvdXJjZSB7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIFBST1BFUlRJRVNcbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZlJlc291cmNlVHlwZSA9IFwibmV3cmVsaWNfZmVkZXJhdGVkX2xvZ3Nfc2V0dXBcIjtcblxuICAvLyA9PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PVxuICAvKipcbiAgKiBHZW5lcmF0ZXMgQ0RLVE4gY29kZSBmb3IgaW1wb3J0aW5nIGEgRmVkZXJhdGVkTG9nc1NldHVwIHJlc291cmNlIHVwb24gcnVubmluZyBcImNka3RuIHBsYW4gPHN0YWNrLW5hbWU+XCJcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpbXBvcnRUb0lkIFRoZSBjb25zdHJ1Y3QgaWQgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBmb3IgdGhlIEZlZGVyYXRlZExvZ3NTZXR1cCB0byBpbXBvcnRcbiAgKiBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgRmVkZXJhdGVkTG9nc1NldHVwIHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBSZWZlciB0byB0aGUge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXAjaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlXG4gICogQHBhcmFtIHByb3ZpZGVyPyBPcHRpb25hbCBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgd2hlcmUgdGhlIEZlZGVyYXRlZExvZ3NTZXR1cCB0byBpbXBvcnQgaXMgZm91bmRcbiAgKi9cbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNvbmZpZ0ZvckltcG9ydChzY29wZTogQ29uc3RydWN0LCBpbXBvcnRUb0lkOiBzdHJpbmcsIGltcG9ydEZyb21JZDogc3RyaW5nLCBwcm92aWRlcj86IGNka3RuLlRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2RrdG4uSW1wb3J0YWJsZVJlc291cmNlKHNjb3BlLCBpbXBvcnRUb0lkLCB7IHRlcnJhZm9ybVJlc291cmNlVHlwZTogXCJuZXdyZWxpY19mZWRlcmF0ZWRfbG9nc19zZXR1cFwiLCBpbXBvcnRJZDogaW1wb3J0RnJvbUlkLCBwcm92aWRlciB9KTtcbiAgICAgIH1cblxuICAvLyA9PT09PT09PT09PVxuICAvLyBJTklUSUFMSVpFUlxuICAvLyA9PT09PT09PT09PVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCBuZXdyZWxpY19mZWRlcmF0ZWRfbG9nc19zZXR1cH0gUmVzb3VyY2VcbiAgKlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGlkIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSBhbW9uZ3N0IHNpYmxpbmdzIGluIHRoZSBzYW1lIHNjb3BlXG4gICogQHBhcmFtIG9wdGlvbnMgRmVkZXJhdGVkTG9nc1NldHVwQ29uZmlnXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IEZlZGVyYXRlZExvZ3NTZXR1cENvbmZpZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiAnbmV3cmVsaWNfZmVkZXJhdGVkX2xvZ3Nfc2V0dXAnLFxuICAgICAgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXJOYW1lOiAnbmV3cmVsaWMnLFxuICAgICAgICBwcm92aWRlclZlcnNpb246ICczLjkyLjAnLFxuICAgICAgICBwcm92aWRlclZlcnNpb25Db25zdHJhaW50OiAnfj4gMy43J1xuICAgICAgfSxcbiAgICAgIHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIsXG4gICAgICBkZXBlbmRzT246IGNvbmZpZy5kZXBlbmRzT24sXG4gICAgICBjb3VudDogY29uZmlnLmNvdW50LFxuICAgICAgbGlmZWN5Y2xlOiBjb25maWcubGlmZWN5Y2xlLFxuICAgICAgcHJvdmlzaW9uZXJzOiBjb25maWcucHJvdmlzaW9uZXJzLFxuICAgICAgY29ubmVjdGlvbjogY29uZmlnLmNvbm5lY3Rpb24sXG4gICAgICBmb3JFYWNoOiBjb25maWcuZm9yRWFjaFxuICAgIH0pO1xuICAgIHRoaXMuX2FjY291bnRJZCA9IGNvbmZpZy5hY2NvdW50SWQ7XG4gICAgdGhpcy5fYWN0aXZlID0gY29uZmlnLmFjdGl2ZTtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IGNvbmZpZy5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9pZCA9IGNvbmZpZy5pZDtcbiAgICB0aGlzLl9uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5fZGVmYXVsdFBhcnRpdGlvbi5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmRlZmF1bHRQYXJ0aXRpb247XG4gICAgdGhpcy5fZm9yd2FyZGVyLmludGVybmFsVmFsdWUgPSBjb25maWcuZm9yd2FyZGVyO1xuICAgIHRoaXMuX3N0b3JhZ2UuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5zdG9yYWdlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PVxuICAvLyBBVFRSSUJVVEVTXG4gIC8vID09PT09PT09PT1cblxuICAvLyBhY2NvdW50X2lkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYWNjb3VudElkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBhY2NvdW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdhY2NvdW50X2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBhY2NvdW50SWQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2FjY291bnRJZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFjY291bnRJZCgpIHtcbiAgICB0aGlzLl9hY2NvdW50SWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFjY291bnRJZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hY2NvdW50SWQ7XG4gIH1cblxuICAvLyBhY3RpdmUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hY3RpdmU/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdhY3RpdmUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFjdGl2ZSh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fYWN0aXZlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QWN0aXZlKCkge1xuICAgIHRoaXMuX2FjdGl2ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYWN0aXZlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuXG4gIC8vIGNyZWF0ZWRfYXQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBjcmVhdGVkQXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdjcmVhdGVkX2F0Jyk7XG4gIH1cblxuICAvLyBkZWZhdWx0X3BhcnRpdGlvbl9pZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGRlZmF1bHRQYXJ0aXRpb25JZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2RlZmF1bHRfcGFydGl0aW9uX2lkJyk7XG4gIH1cblxuICAvLyBkZXNjcmlwdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kZXNjcmlwdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkZXNjcmlwdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgLy8gaGVhbHRoX2NoZWNrIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2hlYWx0aENoZWNrID0gbmV3IEZlZGVyYXRlZExvZ3NTZXR1cEhlYWx0aENoZWNrTGlzdCh0aGlzLCBcImhlYWx0aF9jaGVja1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgaGVhbHRoQ2hlY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWx0aENoZWNrO1xuICB9XG5cbiAgLy8gaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2lkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SWQoKSB7XG4gICAgdGhpcy5faWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGlkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLy8gbGlmZWN5Y2xlX3N0YXR1cyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9saWZlY3ljbGVTdGF0dXMgPSBuZXcgRmVkZXJhdGVkTG9nc1NldHVwTGlmZWN5Y2xlU3RhdHVzTGlzdCh0aGlzLCBcImxpZmVjeWNsZV9zdGF0dXNcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IGxpZmVjeWNsZVN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGlmZWN5Y2xlU3RhdHVzO1xuICB9XG5cbiAgLy8gbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9uYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBuYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICAvLyB1cGRhdGVkX2F0IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgdXBkYXRlZEF0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndXBkYXRlZF9hdCcpO1xuICB9XG5cbiAgLy8gZGVmYXVsdF9wYXJ0aXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZGVmYXVsdFBhcnRpdGlvbiA9IG5ldyBGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiZGVmYXVsdF9wYXJ0aXRpb25cIik7XG4gIHB1YmxpYyBnZXQgZGVmYXVsdFBhcnRpdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFBhcnRpdGlvbjtcbiAgfVxuICBwdWJsaWMgcHV0RGVmYXVsdFBhcnRpdGlvbih2YWx1ZTogRmVkZXJhdGVkTG9nc1NldHVwRGVmYXVsdFBhcnRpdGlvbikge1xuICAgIHRoaXMuX2RlZmF1bHRQYXJ0aXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZWZhdWx0UGFydGl0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRQYXJ0aXRpb24uaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGZvcndhcmRlciAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mb3J3YXJkZXIgPSBuZXcgRmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiZm9yd2FyZGVyXCIpO1xuICBwdWJsaWMgZ2V0IGZvcndhcmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9yd2FyZGVyO1xuICB9XG4gIHB1YmxpYyBwdXRGb3J3YXJkZXIodmFsdWU6IEZlZGVyYXRlZExvZ3NTZXR1cEZvcndhcmRlcikge1xuICAgIHRoaXMuX2ZvcndhcmRlci5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Rm9yd2FyZGVyKCkge1xuICAgIHRoaXMuX2ZvcndhcmRlci5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBmb3J3YXJkZXJJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9yd2FyZGVyLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBzdG9yYWdlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3N0b3JhZ2UgPSBuZXcgRmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZU91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInN0b3JhZ2VcIik7XG4gIHB1YmxpYyBnZXQgc3RvcmFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgfVxuICBwdWJsaWMgcHV0U3RvcmFnZSh2YWx1ZTogRmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZSkge1xuICAgIHRoaXMuX3N0b3JhZ2UuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzdG9yYWdlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PVxuICAvLyBTWU5USEVTSVNcbiAgLy8gPT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudF9pZDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0odGhpcy5fYWNjb3VudElkKSxcbiAgICAgIGFjdGl2ZTogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHRoaXMuX2FjdGl2ZSksXG4gICAgICBkZXNjcmlwdGlvbjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fZGVzY3JpcHRpb24pLFxuICAgICAgaWQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2lkKSxcbiAgICAgIG5hbWU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX25hbWUpLFxuICAgICAgZGVmYXVsdF9wYXJ0aXRpb246IGZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25Ub1RlcnJhZm9ybSh0aGlzLl9kZWZhdWx0UGFydGl0aW9uLmludGVybmFsVmFsdWUpLFxuICAgICAgZm9yd2FyZGVyOiBmZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJUb1RlcnJhZm9ybSh0aGlzLl9mb3J3YXJkZXIuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBzdG9yYWdlOiBmZWRlcmF0ZWRMb2dzU2V0dXBTdG9yYWdlVG9UZXJyYWZvcm0odGhpcy5fc3RvcmFnZS5pbnRlcm5hbFZhbHVlKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgIGFjY291bnRfaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX2FjY291bnRJZCksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIGFjdGl2ZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHRoaXMuX2FjdGl2ZSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICAgIH0sXG4gICAgICBkZXNjcmlwdGlvbjoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fZGVzY3JpcHRpb24pLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBpZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBuYW1lOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9uYW1lKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgZGVmYXVsdF9wYXJ0aXRpb246IHtcbiAgICAgICAgdmFsdWU6IGZlZGVyYXRlZExvZ3NTZXR1cERlZmF1bHRQYXJ0aXRpb25Ub0hjbFRlcnJhZm9ybSh0aGlzLl9kZWZhdWx0UGFydGl0aW9uLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJGZWRlcmF0ZWRMb2dzU2V0dXBEZWZhdWx0UGFydGl0aW9uTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGZvcndhcmRlcjoge1xuICAgICAgICB2YWx1ZTogZmVkZXJhdGVkTG9nc1NldHVwRm9yd2FyZGVyVG9IY2xUZXJyYWZvcm0odGhpcy5fZm9yd2FyZGVyLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJGZWRlcmF0ZWRMb2dzU2V0dXBGb3J3YXJkZXJMaXN0XCIsXG4gICAgICB9LFxuICAgICAgc3RvcmFnZToge1xuICAgICAgICB2YWx1ZTogZmVkZXJhdGVkTG9nc1NldHVwU3RvcmFnZVRvSGNsVGVycmFmb3JtKHRoaXMuX3N0b3JhZ2UuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkZlZGVyYXRlZExvZ3NTZXR1cFN0b3JhZ2VMaXN0XCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCApKVxuICB9XG59XG4iXX0=