@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.
- package/.jsii +32021 -24172
- package/README.md +3 -3
- package/lib/account-management/index.d.ts +10 -10
- package/lib/account-management/index.js +9 -9
- package/lib/alert-channel/index.d.ts +30 -30
- package/lib/alert-channel/index.js +9 -9
- package/lib/alert-compound-condition/index.d.ts +17 -17
- package/lib/alert-compound-condition/index.js +13 -13
- package/lib/alert-condition/index.d.ts +23 -23
- package/lib/alert-condition/index.js +10 -10
- package/lib/alert-muting-rule/index.d.ts +23 -23
- package/lib/alert-muting-rule/index.js +16 -16
- package/lib/alert-policy/index.d.ts +8 -8
- package/lib/alert-policy/index.js +6 -6
- package/lib/alert-policy-channel/index.d.ts +9 -9
- package/lib/alert-policy-channel/index.js +9 -9
- package/lib/api-access-key/index.d.ts +10 -10
- package/lib/api-access-key/index.js +6 -6
- package/lib/application-settings/index.d.ts +27 -27
- package/lib/application-settings/index.js +21 -21
- package/lib/aws-connection/index.d.ts +326 -0
- package/lib/aws-connection/index.js +750 -0
- package/lib/browser-application/index.d.ts +12 -12
- package/lib/browser-application/index.js +9 -9
- package/lib/cardinality-management/index.d.ts +9 -9
- package/lib/cardinality-management/index.js +10 -10
- package/lib/cloud-aws-eu-sovereign-integrations/index.d.ts +14 -14
- package/lib/cloud-aws-eu-sovereign-integrations/index.js +15 -15
- package/lib/cloud-aws-eu-sovereign-link-account/index.d.ts +8 -8
- package/lib/cloud-aws-eu-sovereign-link-account/index.js +6 -6
- package/lib/cloud-aws-govcloud-integrations/index.d.ts +110 -110
- package/lib/cloud-aws-govcloud-integrations/index.js +66 -66
- package/lib/cloud-aws-govcloud-link-account/index.d.ts +8 -8
- package/lib/cloud-aws-govcloud-link-account/index.js +6 -6
- package/lib/cloud-aws-integrations/index.d.ts +234 -234
- package/lib/cloud-aws-integrations/index.js +168 -168
- package/lib/cloud-aws-link-account/index.d.ts +8 -8
- package/lib/cloud-aws-link-account/index.js +6 -6
- package/lib/cloud-azure-integrations/index.d.ts +109 -109
- package/lib/cloud-azure-integrations/index.js +105 -105
- package/lib/cloud-azure-link-account/index.d.ts +10 -10
- package/lib/cloud-azure-link-account/index.js +6 -6
- package/lib/cloud-gcp-integrations/index.d.ts +62 -62
- package/lib/cloud-gcp-integrations/index.js +84 -84
- package/lib/cloud-gcp-link-account/index.d.ts +7 -7
- package/lib/cloud-gcp-link-account/index.js +6 -6
- package/lib/cloud-oci-link-account/index.d.ts +40 -18
- package/lib/cloud-oci-link-account/index.js +48 -6
- package/lib/data-newrelic-account/index.d.ts +7 -7
- package/lib/data-newrelic-account/index.js +6 -6
- package/lib/data-newrelic-alert-channel/index.d.ts +6 -6
- package/lib/data-newrelic-alert-channel/index.js +10 -10
- package/lib/data-newrelic-alert-policy/index.d.ts +7 -7
- package/lib/data-newrelic-alert-policy/index.js +6 -6
- package/lib/data-newrelic-application/index.d.ts +5 -5
- package/lib/data-newrelic-application/index.js +6 -6
- package/lib/data-newrelic-authentication-domain/index.d.ts +4 -4
- package/lib/data-newrelic-authentication-domain/index.js +6 -6
- package/lib/data-newrelic-cloud-account/index.d.ts +7 -7
- package/lib/data-newrelic-cloud-account/index.js +6 -6
- package/lib/data-newrelic-entity/index.d.ts +14 -14
- package/lib/data-newrelic-entity/index.js +10 -10
- package/lib/data-newrelic-fleet-configuration/index.d.ts +8 -8
- package/lib/data-newrelic-fleet-configuration/index.js +6 -6
- package/lib/data-newrelic-fleet-members/index.d.ts +6 -6
- package/lib/data-newrelic-fleet-members/index.js +10 -10
- package/lib/data-newrelic-group/index.d.ts +5 -5
- package/lib/data-newrelic-group/index.js +6 -6
- package/lib/data-newrelic-key-transaction/index.d.ts +7 -7
- package/lib/data-newrelic-key-transaction/index.js +6 -6
- package/lib/data-newrelic-notification-destination/index.d.ts +12 -12
- package/lib/data-newrelic-notification-destination/index.js +17 -17
- package/lib/data-newrelic-obfuscation-expression/index.d.ts +6 -6
- package/lib/data-newrelic-obfuscation-expression/index.js +6 -6
- package/lib/data-newrelic-service-level-alert-helper/index.d.ts +11 -11
- package/lib/data-newrelic-service-level-alert-helper/index.js +6 -6
- package/lib/data-newrelic-synthetics-private-location/index.d.ts +7 -7
- package/lib/data-newrelic-synthetics-private-location/index.js +6 -6
- package/lib/data-newrelic-synthetics-secure-credential/index.d.ts +6 -6
- package/lib/data-newrelic-synthetics-secure-credential/index.js +6 -6
- package/lib/data-newrelic-test-grok-pattern/index.d.ts +7 -7
- package/lib/data-newrelic-test-grok-pattern/index.js +14 -14
- package/lib/data-newrelic-user/index.d.ts +6 -6
- package/lib/data-newrelic-user/index.js +6 -6
- package/lib/data-partition-rule/index.d.ts +12 -12
- package/lib/data-partition-rule/index.js +9 -9
- package/lib/entity-tags/index.d.ts +10 -10
- package/lib/entity-tags/index.js +13 -13
- package/lib/events-to-metrics-rule/index.d.ts +9 -9
- package/lib/events-to-metrics-rule/index.js +6 -6
- package/lib/federated-logs-partition/index.d.ts +418 -0
- package/lib/federated-logs-partition/index.js +1046 -0
- package/lib/federated-logs-setup/index.d.ts +550 -0
- package/lib/federated-logs-setup/index.js +1414 -0
- package/lib/fleet/index.d.ts +10 -10
- package/lib/fleet/index.js +6 -6
- package/lib/fleet-configuration/index.d.ts +11 -11
- package/lib/fleet-configuration/index.js +10 -10
- package/lib/fleet-deployment/index.d.ts +13 -13
- package/lib/fleet-deployment/index.js +10 -10
- package/lib/fleet-members/index.d.ts +8 -8
- package/lib/fleet-members/index.js +10 -10
- package/lib/group/index.d.ts +7 -7
- package/lib/group/index.js +6 -6
- package/lib/index.d.ts +3 -0
- package/lib/index.js +6 -3
- package/lib/infra-alert-condition/index.d.ts +25 -25
- package/lib/infra-alert-condition/index.js +12 -12
- package/lib/insights-event/index.d.ts +11 -11
- package/lib/insights-event/index.js +14 -14
- package/lib/key-transaction/index.d.ts +9 -9
- package/lib/key-transaction/index.js +6 -6
- package/lib/lazy-index.js +4 -1
- package/lib/log-parsing-rule/index.d.ts +12 -12
- package/lib/log-parsing-rule/index.js +6 -6
- package/lib/metric-pruning-rule/index.d.ts +7 -7
- package/lib/metric-pruning-rule/index.js +6 -6
- package/lib/monitor-downtime/index.d.ts +20 -20
- package/lib/monitor-downtime/index.js +15 -15
- package/lib/notification-channel/index.d.ts +18 -18
- package/lib/notification-channel/index.js +13 -13
- package/lib/notification-destination/index.d.ts +31 -31
- package/lib/notification-destination/index.js +29 -29
- package/lib/nrql-alert-condition/index.d.ts +75 -75
- package/lib/nrql-alert-condition/index.js +37 -37
- package/lib/nrql-drop-rule/index.d.ts +10 -10
- package/lib/nrql-drop-rule/index.js +9 -9
- package/lib/obfuscation-expression/index.d.ts +8 -8
- package/lib/obfuscation-expression/index.js +6 -6
- package/lib/obfuscation-rule/index.d.ts +13 -13
- package/lib/obfuscation-rule/index.js +10 -10
- package/lib/one-dashboard/index-structs/structs0.d.ts +364 -364
- package/lib/one-dashboard/index-structs/structs0.js +401 -401
- package/lib/one-dashboard/index-structs/structs400.d.ts +286 -286
- package/lib/one-dashboard/index-structs/structs400.js +278 -278
- package/lib/one-dashboard/index.d.ts +10 -10
- package/lib/one-dashboard/index.js +6 -6
- package/lib/one-dashboard-json/index.d.ts +9 -9
- package/lib/one-dashboard-json/index.js +9 -9
- package/lib/one-dashboard-raw/index.d.ts +20 -20
- package/lib/one-dashboard-raw/index.js +14 -14
- package/lib/pipeline-cloud-rule/index.d.ts +8 -8
- package/lib/pipeline-cloud-rule/index.js +6 -6
- package/lib/provider/index.d.ts +17 -17
- package/lib/provider/index.js +6 -6
- package/lib/service-level/index.d.ts +38 -38
- package/lib/service-level/index.js +36 -36
- package/lib/synthetics-alert-condition/index.d.ts +9 -9
- package/lib/synthetics-alert-condition/index.js +6 -6
- package/lib/synthetics-broken-links-monitor/index.d.ts +17 -17
- package/lib/synthetics-broken-links-monitor/index.js +10 -10
- package/lib/synthetics-cert-check-monitor/index.d.ts +18 -18
- package/lib/synthetics-cert-check-monitor/index.js +10 -10
- package/lib/synthetics-monitor/index.d.ts +31 -31
- package/lib/synthetics-monitor/index.js +14 -14
- package/lib/synthetics-multilocation-alert-condition/index.d.ts +14 -14
- package/lib/synthetics-multilocation-alert-condition/index.js +12 -12
- package/lib/synthetics-private-location/index.d.ts +9 -9
- package/lib/synthetics-private-location/index.js +6 -6
- package/lib/synthetics-script-monitor/index.d.ts +26 -26
- package/lib/synthetics-script-monitor/index.js +14 -14
- package/lib/synthetics-secure-credential/index.d.ts +11 -11
- package/lib/synthetics-secure-credential/index.js +9 -9
- package/lib/synthetics-step-monitor/index.d.ts +25 -25
- package/lib/synthetics-step-monitor/index.js +18 -18
- package/lib/user/index.d.ts +8 -8
- package/lib/user/index.js +6 -6
- package/lib/workflow/index.d.ts +26 -26
- package/lib/workflow/index.js +28 -28
- package/lib/workflow-automation/index.d.ts +8 -8
- package/lib/workflow-automation/index.js +6 -6
- package/lib/workload/index.d.ts +32 -32
- package/lib/workload/index.js +33 -33
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmVkZXJhdGVkLWxvZ3Mtc2V0dXAvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQW1FQSwwSEFPQztBQUdELGdJQVFDO0FBbUVELDBIQU9DO0FBR0QsZ0lBUUM7QUFtRUQsNEZBT0M7QUFHRCxrR0FRQztBQXFFRCxvR0FPQztBQUdELDBHQVFDO0FBK0VELDRJQVNDO0FBR0Qsa0pBc0JDO0FBaUZELG9IQVNDO0FBR0QsMEhBc0JDO0FBaUZELHNHQVNDO0FBR0QsNEdBc0JDO0FBOEVELDRJQVFDO0FBR0Qsa0pBZ0JDO0FBOERELHNIQVNDO0FBR0QsNEhBc0JDO0FBb0ZELHdGQVNDO0FBR0QsOEZBc0JDO0FBb0ZELHdJQVNDO0FBR0QsOElBc0JDO0FBbUdELG9GQVlDO0FBR0QsMEZBd0NDOztBQW52Q0QsK0JBQStCO0FBMEQvQixTQUFnQix1REFBdUQsQ0FBQyxNQUFxRDtJQUMzSCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPLEVBQ04sQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQiwwREFBMEQsQ0FBQyxNQUFxRDtJQUM5SCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxFQUNiLENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFhLDJEQUE0RCxTQUFRLEtBQUssQ0FBQyxhQUFhO0lBR2xHOzs7OztNQUtFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCLEVBQUUsa0JBQTBCLEVBQUUsc0JBQStCO1FBQ3ZKLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBVG5GLGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBVTlCLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxNQUFNLG1CQUFtQixHQUFRLEVBQUUsQ0FBQztRQUNwQyxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBK0Q7UUFDdEYsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDN0IsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsNERBQTREO0lBQzVELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7O0FBekNILGtJQTBDQzs7O0FBRUQsTUFBYSxnREFBaUQsU0FBUSxLQUFLLENBQUMsV0FBVztJQUVyRjs7OztNQUlFO0lBQ0YsWUFBWSxpQkFBNkMsRUFBRSxrQkFBMEIsRUFBRSxRQUFpQjtRQUN0RyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztNQUVFO0lBQ0ssR0FBRyxDQUFDLEtBQWE7UUFDdEIsT0FBTyxJQUFJLDJEQUEyRCxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoSixDQUFDOztBQWhCSCw0R0FpQkM7OztBQUlELFNBQWdCLHVEQUF1RCxDQUFDLE1BQXFEO0lBQzNILElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHlIQUF5SCxDQUFDLENBQUM7SUFDN0ksQ0FBQztJQUNELE9BQU8sRUFDTixDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLDBEQUEwRCxDQUFDLE1BQXFEO0lBQzlILElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHlIQUF5SCxDQUFDLENBQUM7SUFDN0ksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLEVBQ2IsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQWEsMkRBQTRELFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHbEc7Ozs7O01BS0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEIsRUFBRSxrQkFBMEIsRUFBRSxzQkFBK0I7UUFDdkosS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFUbkYsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFVOUIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUErRDtRQUN0RixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7QUF6Q0gsa0lBMENDOzs7QUFFRCxNQUFhLGdEQUFpRCxTQUFRLEtBQUssQ0FBQyxXQUFXO0lBRXJGOzs7O01BSUU7SUFDRixZQUFZLGlCQUE2QyxFQUFFLGtCQUEwQixFQUFFLFFBQWlCO1FBQ3RHLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O01BRUU7SUFDSyxHQUFHLENBQUMsS0FBYTtRQUN0QixPQUFPLElBQUksMkRBQTJELENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hKLENBQUM7O0FBaEJILDRHQWlCQzs7O0FBSUQsU0FBZ0Isd0NBQXdDLENBQUMsTUFBc0M7SUFDN0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMseUhBQXlILENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBQ0QsT0FBTyxFQUNOLENBQUE7QUFDSCxDQUFDO0FBR0QsU0FBZ0IsMkNBQTJDLENBQUMsTUFBc0M7SUFDaEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMseUhBQXlILENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsRUFDYixDQUFDO0lBQ0YsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBYSw0Q0FBNkMsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUduRjs7Ozs7TUFLRTtJQUNGLFlBQW1CLGlCQUE2QyxFQUFFLGtCQUEwQixFQUFFLGtCQUEwQixFQUFFLHNCQUErQjtRQUN2SixLQUFLLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQVRuRixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQTJCOUIsdUVBQXVFO1FBQy9ELHFCQUFnQixHQUFHLElBQUksZ0RBQWdELENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBVWxILHNFQUFzRTtRQUM5RCxxQkFBZ0IsR0FBRyxJQUFJLGdEQUFnRCxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQTdCakgsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUFnRDtRQUN2RSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxxRUFBcUU7SUFDckUsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUlELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDOztBQTNDSCxvR0E0Q0M7OztBQUVELE1BQWEsaUNBQWtDLFNBQVEsS0FBSyxDQUFDLFdBQVc7SUFFdEU7Ozs7TUFJRTtJQUNGLFlBQVksaUJBQTZDLEVBQUUsa0JBQTBCLEVBQUUsUUFBaUI7UUFDdEcsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7TUFFRTtJQUNLLEdBQUcsQ0FBQyxLQUFhO1FBQ3RCLE9BQU8sSUFBSSw0Q0FBNEMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakksQ0FBQzs7QUFoQkgsOEVBaUJDOzs7QUFJRCxTQUFnQiw0Q0FBNEMsQ0FBQyxNQUEwQztJQUNyRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPLEVBQ04sQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQiwrQ0FBK0MsQ0FBQyxNQUEwQztJQUN4RyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxFQUNiLENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFhLGdEQUFpRCxTQUFRLEtBQUssQ0FBQyxhQUFhO0lBR3ZGOzs7OztNQUtFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCLEVBQUUsa0JBQTBCLEVBQUUsc0JBQStCO1FBQ3ZKLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBVG5GLGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBVTlCLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxNQUFNLG1CQUFtQixHQUFRLEVBQUUsQ0FBQztRQUNwQyxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBb0Q7UUFDM0UsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDN0IsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsNkRBQTZEO0lBQzdELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsNERBQTREO0lBQzVELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7O0FBekNILDRHQTBDQzs7O0FBRUQsTUFBYSxxQ0FBc0MsU0FBUSxLQUFLLENBQUMsV0FBVztJQUUxRTs7OztNQUlFO0lBQ0YsWUFBWSxpQkFBNkMsRUFBRSxrQkFBMEIsRUFBRSxRQUFpQjtRQUN0RyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztNQUVFO0lBQ0ssR0FBRyxDQUFDLEtBQWE7UUFDdEIsT0FBTyxJQUFJLGdEQUFnRCxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNySSxDQUFDOztBQWhCSCxzRkFpQkM7OztBQWdCRCxTQUFnQixnRUFBZ0UsQ0FBQyxNQUFxSTtJQUNwTixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPO1FBQ0wsUUFBUSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1FBQ25ELElBQUksRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLElBQUksQ0FBQztLQUM1QyxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLG1FQUFtRSxDQUFDLE1BQXFJO0lBQ3ZOLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHlIQUF5SCxDQUFDLENBQUM7SUFDN0ksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osUUFBUSxFQUFFO1lBQ1IsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1lBQ25ELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsSUFBSSxDQUFDO1lBQy9DLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO0tBQ0YsQ0FBQztJQUVGLDhCQUE4QjtJQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQWEsb0VBQXFFLFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHM0c7OztNQUdFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCO1FBQzFGLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFQakQsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFROUIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QyxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYSxDQUFDLEtBQXdFO1FBQy9GLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUlELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFXLElBQUksQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDOztBQTlESCxvSkErREM7OztBQWdCRCxTQUFnQixvREFBb0QsQ0FBQyxNQUE2RztJQUNoTCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPO1FBQ0wsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxlQUFlLENBQUM7UUFDbkUsS0FBSyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsS0FBSyxDQUFDO0tBQzlDLENBQUE7QUFDSCxDQUFDO0FBR0QsU0FBZ0IsdURBQXVELENBQUMsTUFBNkc7SUFDbkwsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMseUhBQXlILENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUc7UUFDWixpQkFBaUIsRUFBRTtZQUNqQixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxlQUFlLENBQUM7WUFDMUQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxLQUFLLEVBQUU7WUFDTCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxLQUFLLENBQUM7WUFDaEQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSx3REFBeUQsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUcvRjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzlELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMxQyxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYSxDQUFDLEtBQTREO1FBQ25GLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7WUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDMUIsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztZQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFJRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBVyxlQUFlLENBQUMsS0FBYTtRQUN0QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxvQkFBb0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUlELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxJQUFXLEtBQUssQ0FBQyxLQUFhO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOztBQTlESCw0SEErREM7OztBQWdCRCxTQUFnQiw2Q0FBNkMsQ0FBQyxNQUErRjtJQUMzSixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPO1FBQ0wscUJBQXFCLEVBQUUsZ0VBQWdFLENBQUMsTUFBTyxDQUFDLG1CQUFtQixDQUFDO1FBQ3BILE9BQU8sRUFBRSxvREFBb0QsQ0FBQyxNQUFPLENBQUMsT0FBTyxDQUFDO0tBQy9FLENBQUE7QUFDSCxDQUFDO0FBR0QsU0FBZ0IsZ0RBQWdELENBQUMsTUFBK0Y7SUFDOUosSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMseUhBQXlILENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUc7UUFDWixxQkFBcUIsRUFBRTtZQUNyQixLQUFLLEVBQUUsbUVBQW1FLENBQUMsTUFBTyxDQUFDLG1CQUFtQixDQUFDO1lBQ3ZHLE9BQU8sRUFBRSxJQUFJO1lBQ2IsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSwyREFBMkQ7U0FDOUU7UUFDRCxPQUFPLEVBQUU7WUFDUCxLQUFLLEVBQUUsdURBQXVELENBQUMsTUFBTyxDQUFDLE9BQU8sQ0FBQztZQUMvRSxPQUFPLEVBQUUsSUFBSTtZQUNiLElBQUksRUFBRSxNQUFNO1lBQ1osZ0JBQWdCLEVBQUUsK0NBQStDO1NBQ2xFO0tBQ0YsQ0FBQztJQUVGLDhCQUE4QjtJQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQWEsaURBQWtELFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHeEY7OztNQUdFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCO1FBQzFGLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFQakQsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFxQzlCLDJFQUEyRTtRQUNuRSx5QkFBb0IsR0FBRyxJQUFJLG9FQUFvRSxDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBZXZJLDZEQUE2RDtRQUNyRCxhQUFRLEdBQUcsSUFBSSx3REFBd0QsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUE5Q2pHLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxNQUFNLG1CQUFtQixHQUFRLEVBQUUsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0QsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsYUFBYSxDQUFDO1FBQ3JGLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDO1FBQzdELENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBcUQ7UUFDNUUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7WUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQzFDLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUM7WUFDcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsbUJBQW1CO1FBQzVCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7SUFDTSxzQkFBc0IsQ0FBQyxLQUE0RDtRQUN4RixJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUNsRCxDQUFDO0lBQ00sd0JBQXdCO1FBQzdCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ3RELENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyx3QkFBd0I7UUFDakMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDO0lBQ2pELENBQUM7SUFJRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFDTSxVQUFVLENBQUMsS0FBZ0Q7UUFDaEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDckMsQ0FBQzs7QUFqRUgsOEdBa0VDOzs7QUFVRCxTQUFnQixnRUFBZ0UsQ0FBQyxNQUFxSTtJQUNwTixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPO1FBQ0wsVUFBVSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO0tBQ3hELENBQUE7QUFDSCxDQUFDO0FBR0QsU0FBZ0IsbUVBQW1FLENBQUMsTUFBcUk7SUFDdk4sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMseUhBQXlILENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUc7UUFDWixVQUFVLEVBQUU7WUFDVixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUM7WUFDckQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSxvRUFBcUUsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUczRzs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUF3RTtRQUMvRixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUMvQixDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsSUFBVyxVQUFVLENBQUMsS0FBYTtRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQzs7QUEzQ0gsb0pBNENDOzs7QUFnQkQsU0FBZ0IscURBQXFELENBQUMsTUFBK0c7SUFDbkwsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMseUhBQXlILENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBQ0QsT0FBTztRQUNMLFFBQVEsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLE9BQU8sQ0FBQztRQUNsRCxZQUFZLEVBQUUsZ0VBQWdFLENBQUMsTUFBTyxDQUFDLFdBQVcsQ0FBQztLQUNwRyxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLHdEQUF3RCxDQUFDLE1BQStHO0lBQ3RMLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHlIQUF5SCxDQUFDLENBQUM7SUFDN0ksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osUUFBUSxFQUFFO1lBQ1IsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsT0FBTyxDQUFDO1lBQ2xELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsWUFBWSxFQUFFO1lBQ1osS0FBSyxFQUFFLG1FQUFtRSxDQUFDLE1BQU8sQ0FBQyxXQUFXLENBQUM7WUFDL0YsT0FBTyxFQUFFLElBQUk7WUFDYixJQUFJLEVBQUUsTUFBTTtZQUNaLGdCQUFnQixFQUFFLDJEQUEyRDtTQUM5RTtLQUNGLENBQUM7SUFFRiw4QkFBOEI7SUFDOUIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzVILENBQUM7QUFFRCxNQUFhLHlEQUEwRCxTQUFRLEtBQUssQ0FBQyxhQUFhO0lBR2hHOzs7TUFHRTtJQUNGLFlBQW1CLGlCQUE2QyxFQUFFLGtCQUEwQjtRQUMxRixLQUFLLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBUGpELGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBa0Q5QixrRUFBa0U7UUFDMUQsaUJBQVksR0FBRyxJQUFJLG9FQUFvRSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztJQTNDdEgsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25ELFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBNkQ7UUFDcEYsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQzlDLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFJRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQVcsT0FBTyxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFJRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFDTSxjQUFjLENBQUMsS0FBNEQ7UUFDaEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzFDLENBQUM7SUFDTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztJQUN6QyxDQUFDOztBQWpFSCw4SEFrRUM7OztBQWdCRCxTQUFnQixzQ0FBc0MsQ0FBQyxNQUFpRjtJQUN0SSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsSUFBSSxDQUFDO1FBQzNDLGdCQUFnQixFQUFFLHFEQUFxRCxDQUFDLE1BQU8sQ0FBQyxlQUFlLENBQUM7S0FDakcsQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQix5Q0FBeUMsQ0FBQyxNQUFpRjtJQUN6SSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLElBQUksRUFBRTtZQUNKLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLElBQUksQ0FBQztZQUMvQyxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtRQUNELGdCQUFnQixFQUFFO1lBQ2hCLEtBQUssRUFBRSx3REFBd0QsQ0FBQyxNQUFPLENBQUMsZUFBZSxDQUFDO1lBQ3hGLE9BQU8sRUFBRSxJQUFJO1lBQ2IsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSxnREFBZ0Q7U0FDbkU7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSwwQ0FBMkMsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUdqRjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQWtEOUIsc0VBQXNFO1FBQzlELHFCQUFnQixHQUFHLElBQUkseURBQXlELENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUEzQ25ILENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxNQUFNLG1CQUFtQixHQUFRLEVBQUUsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZELFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUM7UUFDN0UsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUE4QztRQUNyRSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUNsRCxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFJRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBVyxJQUFJLENBQUMsS0FBYTtRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUlELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBQ00sa0JBQWtCLENBQUMsS0FBaUQ7UUFDekUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDOUMsQ0FBQztJQUNNLG9CQUFvQjtRQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUNsRCxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQztJQUM3QyxDQUFDOztBQWpFSCxnR0FrRUM7OztBQWdCRCxTQUFnQiw4REFBOEQsQ0FBQyxNQUFpSTtJQUM5TSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPO1FBQ0wsUUFBUSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1FBQ25ELE1BQU0sRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLE1BQU0sQ0FBQztLQUNoRCxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLGlFQUFpRSxDQUFDLE1BQWlJO0lBQ2pOLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHlIQUF5SCxDQUFDLENBQUM7SUFDN0ksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osUUFBUSxFQUFFO1lBQ1IsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1lBQ25ELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsTUFBTSxFQUFFO1lBQ04sS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2pELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO0tBQ0YsQ0FBQztJQUVGLDhCQUE4QjtJQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQWEsa0VBQW1FLFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHekc7OztNQUdFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCO1FBQzFGLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFQakQsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFROUIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM1QyxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYSxDQUFDLEtBQXNFO1FBQzdGLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQzNCLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUlELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxJQUFXLE1BQU0sQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDOztBQTlESCxnSkErREM7OztBQWtDRCxTQUFnQixvQ0FBb0MsQ0FBQyxNQUE2RTtJQUNoSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPO1FBQ0wseUJBQXlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUNsRixvQkFBb0IsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLGtCQUFrQixDQUFDO1FBQ3pFLFFBQVEsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLFFBQVEsQ0FBQztRQUNuRCxtQkFBbUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLGlCQUFpQixDQUFDO1FBQ3ZFLDRCQUE0QixFQUFFLDhEQUE4RCxDQUFDLE1BQU8sQ0FBQywwQkFBMEIsQ0FBQztLQUNqSSxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLHVDQUF1QyxDQUFDLE1BQTZFO0lBQ25JLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLHlIQUF5SCxDQUFDLENBQUM7SUFDN0ksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1oseUJBQXlCLEVBQUU7WUFDekIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxvQkFBb0IsRUFBRTtZQUNwQixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxrQkFBa0IsQ0FBQztZQUM3RCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtRQUNELFFBQVEsRUFBRTtZQUNSLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLFFBQVEsQ0FBQztZQUNuRCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtRQUNELG1CQUFtQixFQUFFO1lBQ25CLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLGlCQUFpQixDQUFDO1lBQzVELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsNEJBQTRCLEVBQUU7WUFDNUIsS0FBSyxFQUFFLGlFQUFpRSxDQUFDLE1BQU8sQ0FBQywwQkFBMEIsQ0FBQztZQUM1RyxPQUFPLEVBQUUsSUFBSTtZQUNiLElBQUksRUFBRSxNQUFNO1lBQ1osZ0JBQWdCLEVBQUUseURBQXlEO1NBQzVFO0tBQ0YsQ0FBQztJQUVGLDhCQUE4QjtJQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQWEsd0NBQXlDLFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHL0U7OztNQUdFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCO1FBQzFGLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFQakQsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUEyRzlCLGtGQUFrRjtRQUMxRSxnQ0FBMkIsR0FBRyxJQUFJLGtFQUFrRSxDQUFDLElBQUksRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0lBcEduSixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ3BFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbEUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsRSxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQywyQkFBMkIsRUFBRSxhQUFhLENBQUM7UUFDbkcsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUE0QztRQUNuRSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7WUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztZQUNwQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUM3RCxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7WUFDNUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztZQUNwRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztZQUNsRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQywwQkFBMEIsQ0FBQztRQUNwRixDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQVcsc0JBQXNCLENBQUMsS0FBYTtRQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQztJQUlELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNELElBQVcsa0JBQWtCLENBQUMsS0FBYTtRQUN6QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyx1QkFBdUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUlELElBQVcsaUJBQWlCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUNELElBQVcsaUJBQWlCLENBQUMsS0FBYTtRQUN4QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUlELElBQVcsMEJBQTBCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDO0lBQzFDLENBQUM7SUFDTSw2QkFBNkIsQ0FBQyxLQUEwRDtRQUM3RixJQUFJLENBQUMsMkJBQTJCLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN6RCxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsK0JBQStCO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQztJQUN4RCxDQUFDOztBQXZISCw0RkF3SEM7OztBQUVEOztFQUVFO0FBQ0YsTUFBYSxrQkFBbUIsU0FBUSxLQUFLLENBQUMsaUJBQWlCO0lBTzdELGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCOzs7Ozs7TUFNRTtJQUNLLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFnQixFQUFFLFVBQWtCLEVBQUUsWUFBb0IsRUFBRSxRQUFrQztRQUM5SCxPQUFPLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdkosQ0FBQztJQUVMLGNBQWM7SUFDZCxjQUFjO0lBQ2QsY0FBYztJQUVkOzs7Ozs7TUFNRTtJQUNGLFlBQW1CLEtBQWdCLEVBQUUsRUFBVSxFQUFFLE1BQWdDO1FBQy9FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YscUJBQXFCLEVBQUUsK0JBQStCO1lBQ3RELDBCQUEwQixFQUFFO2dCQUMxQixZQUFZLEVBQUUsVUFBVTtnQkFDeEIsZUFBZSxFQUFFLFFBQVE7Z0JBQ3pCLHlCQUF5QixFQUFFLFFBQVE7YUFDcEM7WUFDRCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ2pDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87U0FDeEIsQ0FBQyxDQUFDO1FBeUVMLGtFQUFrRTtRQUMxRCxpQkFBWSxHQUFHLElBQUksaUNBQWlDLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQXFCMUYsc0VBQXNFO1FBQzlELHFCQUFnQixHQUFHLElBQUkscUNBQXFDLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBdUJ0Ryx1RUFBdUU7UUFDL0Qsc0JBQWlCLEdBQUcsSUFBSSxpREFBaUQsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQVk3RywrREFBK0Q7UUFDdkQsZUFBVSxHQUFHLElBQUksMENBQTBDLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBZXZGLDZEQUE2RDtRQUNyRCxhQUFRLEdBQUcsSUFBSSx3Q0FBd0MsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFwSi9FLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDL0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQy9DLENBQUM7SUFRRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELElBQVcsU0FBUyxDQUFDLEtBQWE7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUNNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFJRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBVyxNQUFNLENBQUMsS0FBa0M7UUFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUNNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsSUFBVyxrQkFBa0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBSUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFXLFdBQVcsQ0FBQyxLQUFhO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFDTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUlELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUlELElBQVcsRUFBRTtRQUNYLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFXLEVBQUUsQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ25CLENBQUM7SUFDTSxPQUFPO1FBQ1osSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7SUFDdkIsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFJRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUlELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFXLElBQUksQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBSUQsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUNNLG1CQUFtQixDQUFDLEtBQXlDO1FBQ2xFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxxQkFBcUI7UUFDOUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDO0lBQzlDLENBQUM7SUFJRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFDTSxZQUFZLENBQUMsS0FBa0M7UUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3hDLENBQUM7SUFDTSxjQUFjO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUM1QyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFJRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFDTSxVQUFVLENBQUMsS0FBZ0M7UUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDckMsQ0FBQztJQUVELFlBQVk7SUFDWixZQUFZO0lBQ1osWUFBWTtJQUVGLG9CQUFvQjtRQUM1QixPQUFPO1lBQ0wsVUFBVSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3BELE1BQU0sRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM5QyxXQUFXLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDdkQsRUFBRSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3JDLElBQUksRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN6QyxpQkFBaUIsRUFBRSw2Q0FBNkMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDO1lBQ3RHLFNBQVMsRUFBRSxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztZQUNoRixPQUFPLEVBQUUsb0NBQW9DLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7U0FDM0UsQ0FBQztJQUNKLENBQUM7SUFFUyx1QkFBdUI7UUFDL0IsTUFBTSxLQUFLLEdBQUc7WUFDWixVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNsRCxPQUFPLEVBQUUsS0FBSztnQkFDZCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxnQkFBZ0IsRUFBRSxRQUFRO2FBQzNCO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLEtBQUssRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDaEQsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsZ0JBQWdCLEVBQUUsU0FBUzthQUM1QjtZQUNELFdBQVcsRUFBRTtnQkFDWCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3BELE9BQU8sRUFBRSxLQUFLO2dCQUNkLElBQUksRUFBRSxRQUFRO2dCQUNkLGdCQUFnQixFQUFFLFFBQVE7YUFDM0I7WUFDRCxFQUFFLEVBQUU7Z0JBQ0YsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUMzQyxPQUFPLEVBQUUsS0FBSztnQkFDZCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxnQkFBZ0IsRUFBRSxRQUFRO2FBQzNCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDN0MsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsZ0JBQWdCLEVBQUUsUUFBUTthQUMzQjtZQUNELGlCQUFpQixFQUFFO2dCQUNqQixLQUFLLEVBQUUsZ0RBQWdELENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztnQkFDN0YsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsSUFBSSxFQUFFLE1BQU07Z0JBQ1osZ0JBQWdCLEVBQUUsd0NBQXdDO2FBQzNEO1lBQ0QsU0FBUyxFQUFFO2dCQUNULEtBQUssRUFBRSx5Q0FBeUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztnQkFDL0UsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsSUFBSSxFQUFFLE1BQU07Z0JBQ1osZ0JBQWdCLEVBQUUsaUNBQWlDO2FBQ3BEO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLEtBQUssRUFBRSx1Q0FBdUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztnQkFDM0UsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsSUFBSSxFQUFFLE1BQU07Z0JBQ1osZ0JBQWdCLEVBQUUsK0JBQStCO2FBQ2xEO1NBQ0YsQ0FBQztRQUVGLDhCQUE4QjtRQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBRSxDQUFDLENBQUE7SUFDNUgsQ0FBQzs7QUF2UkgsZ0RBd1JDOzs7QUF0UkMsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDRyxpQ0FBYyxHQUFHLCtCQUErQixBQUFsQyxDQUFtQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDIxLCAyMDI2XG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuICovXG5cbi8vIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjkyLjAvZG9jcy9yZXNvdXJjZXMvZmVkZXJhdGVkX2xvZ3Nfc2V0dXBcbi8vIGdlbmVyYXRlZCBmcm9tIHRlcnJhZm9ybSByZXNvdXJjZSBzY2hlbWFcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBjZGt0biBmcm9tICdjZGt0bic7XG5cbi8vIENvbmZpZ3VyYXRpb25cblxuZXhwb3J0IGludGVyZmFjZSBGZWRlcmF0ZWRMb2dzU2V0dXBDb25maWcgZXh0ZW5kcyBjZGt0bi5UZXJyYWZvcm1NZXRhQXJndW1lbnRzIHtcbiAgLyoqXG4gICogVGhlIE5ldyBSZWxpYyBhY2NvdW50IElEIHdoZXJlIHRoZSBmZWRlcmF0ZWQgbG9ncyBzZXR1cCB3aWxsIGxpdmUuIERlZmF1bHRzIHRvIHRoZSBwcm92aWRlcidzIGFjY291bnRfaWQuIENoYW5naW5nIHRoaXMgYWZ0ZXIgY3JlYXRpb24gaXMgcmVqZWN0ZWQgYnkgdGhlIEFQSS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTIuMC9kb2NzL3Jlc291cmNlcy9mZWRlcmF0ZWRfbG9nc19zZXR1cCNhY2NvdW50X2lkIEZlZGVyYXRlZExvZ3NTZXR1cCNhY2NvdW50X2lkfVxuICAqL1xuICByZWFkb25seSBhY2NvdW50SWQ/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=
|