@microsoft/terraform-cdk-constructs 1.7.1 → 1.9.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 +46476 -27231
- package/API.md +68443 -28286
- package/lib/azure-actiongroup/lib/action-group.js +1 -1
- package/lib/azure-activitylogalert/lib/activity-log-alert.js +1 -1
- package/lib/azure-aks/lib/aks-cluster.js +1 -1
- package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +1 -1
- package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +1 -1
- package/lib/azure-dnsresolver/lib/dns-resolver.js +1 -1
- package/lib/azure-dnsresolver/lib/inbound-endpoint.js +1 -1
- package/lib/azure-dnsresolver/lib/outbound-endpoint.js +1 -1
- package/lib/azure-dnszone/lib/dns-zone.js +1 -1
- package/lib/azure-dnszone/lib/index.d.ts +1 -0
- package/lib/azure-dnszone/lib/index.js +2 -1
- package/lib/azure-dnszone/lib/records/dns-record-schemas.d.ts +68 -0
- package/lib/azure-dnszone/lib/records/dns-record-schemas.js +813 -0
- package/lib/azure-dnszone/lib/records/dns-records.d.ts +688 -0
- package/lib/azure-dnszone/lib/records/dns-records.js +924 -0
- package/lib/azure-dnszone/lib/records/index.d.ts +19 -0
- package/lib/azure-dnszone/lib/records/index.js +38 -0
- package/lib/azure-dnszone/test/dns-records.integ.d.ts +21 -0
- package/lib/azure-dnszone/test/dns-records.integ.js +321 -0
- package/lib/azure-dnszone/test/dns-records.spec.d.ts +20 -0
- package/lib/azure-dnszone/test/dns-records.spec.js +950 -0
- package/lib/azure-loganalyticsworkspace/index.d.ts +6 -0
- package/lib/azure-loganalyticsworkspace/index.js +23 -0
- package/lib/azure-loganalyticsworkspace/lib/index.d.ts +5 -0
- package/lib/azure-loganalyticsworkspace/lib/index.js +22 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.d.ts +51 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.js +255 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.d.ts +301 -0
- package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.js +213 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.d.ts +9 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.js +71 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.d.ts +8 -0
- package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.js +504 -0
- package/lib/azure-metricalert/lib/metric-alert.js +1 -1
- package/lib/azure-networkinterface/lib/network-interface.js +1 -1
- package/lib/azure-networksecuritygroup/lib/network-security-group.js +1 -1
- package/lib/azure-networkwatcher/index.d.ts +14 -0
- package/lib/azure-networkwatcher/index.js +31 -0
- package/lib/azure-networkwatcher/lib/index.d.ts +5 -0
- package/lib/azure-networkwatcher/lib/index.js +22 -0
- package/lib/azure-networkwatcher/lib/network-watcher-schemas.d.ts +47 -0
- package/lib/azure-networkwatcher/lib/network-watcher-schemas.js +167 -0
- package/lib/azure-networkwatcher/lib/network-watcher.d.ts +181 -0
- package/lib/azure-networkwatcher/lib/network-watcher.js +187 -0
- package/lib/azure-networkwatcher/test/network-watcher.integ.d.ts +12 -0
- package/lib/azure-networkwatcher/test/network-watcher.integ.js +84 -0
- package/lib/azure-networkwatcher/test/network-watcher.spec.d.ts +8 -0
- package/lib/azure-networkwatcher/test/network-watcher.spec.js +312 -0
- package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
- package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
- package/lib/azure-policysetdefinition/index.d.ts +10 -0
- package/lib/azure-policysetdefinition/index.js +27 -0
- package/lib/azure-policysetdefinition/lib/index.d.ts +5 -0
- package/lib/azure-policysetdefinition/lib/index.js +22 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.d.ts +50 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.js +255 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition.d.ts +426 -0
- package/lib/azure-policysetdefinition/lib/policy-set-definition.js +255 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.integ.d.ts +9 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.integ.js +56 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.spec.d.ts +8 -0
- package/lib/azure-policysetdefinition/test/policy-set-definition.spec.js +745 -0
- package/lib/azure-privatednszone/lib/index.d.ts +1 -0
- package/lib/azure-privatednszone/lib/index.js +2 -1
- package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +0 -2
- package/lib/azure-privatednszone/lib/private-dns-zone.js +6 -13
- package/lib/azure-privatednszone/lib/records/index.d.ts +7 -0
- package/lib/azure-privatednszone/lib/records/index.js +26 -0
- package/lib/azure-privatednszone/lib/records/private-dns-record-schemas.d.ts +52 -0
- package/lib/azure-privatednszone/lib/records/private-dns-record-schemas.js +683 -0
- package/lib/azure-privatednszone/lib/records/private-dns-records.d.ts +523 -0
- package/lib/azure-privatednszone/lib/records/private-dns-records.js +739 -0
- package/lib/azure-privatednszone/test/private-dns-records.integ.d.ts +19 -0
- package/lib/azure-privatednszone/test/private-dns-records.integ.js +245 -0
- package/lib/azure-privatednszone/test/private-dns-records.spec.d.ts +18 -0
- package/lib/azure-privatednszone/test/private-dns-records.spec.js +756 -0
- package/lib/azure-privatednszone/test/private-dns-zone.spec.js +5 -5
- package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
- package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
- package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
- package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
- package/lib/azure-roledefinition/lib/role-definition.js +1 -1
- package/lib/azure-storageaccount/lib/storage-account.js +1 -1
- package/lib/azure-subnet/lib/subnet.js +1 -1
- package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
- package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.js +2 -2
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.d.ts +4 -2
- package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +8 -5
- package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.js +109 -1
- package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
- package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +1 -1
- package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
- package/lib/core-azure/lib/azapi/azapi-resource.js +4 -4
- package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
- package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
- package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +1 -1
- package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
- package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
- package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
- package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +1 -1
- package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
- package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
- package/lib/index.d.ts +23 -0
- package/lib/index.js +25 -2
- package/lib/testing/index.js +2 -2
- package/lib/testing/lib/cleanup.js +1 -1
- package/lib/testing/lib/metadata.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,924 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.DnsTxtRecord = exports.DnsSrvRecord = exports.DnsSoaRecord = exports.DnsPtrRecord = exports.DnsNsRecord = exports.DnsMxRecord = exports.DnsCnameRecord = exports.DnsCaaRecord = exports.DnsAaaaRecord = exports.DnsARecord = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
/**
|
|
7
|
+
* Azure Public DNS Zone Record implementations using AzapiResource framework
|
|
8
|
+
*
|
|
9
|
+
* This file provides implementations for all Public DNS Zone record types:
|
|
10
|
+
* - DnsARecord (A records with IPv4 addresses)
|
|
11
|
+
* - DnsAaaaRecord (AAAA records with IPv6 addresses)
|
|
12
|
+
* - DnsCaaRecord (CAA records for Certificate Authority Authorization) - PUBLIC ONLY
|
|
13
|
+
* - DnsCnameRecord (CNAME records)
|
|
14
|
+
* - DnsMxRecord (MX records with exchange and preference)
|
|
15
|
+
* - DnsNsRecord (NS records for Name Servers) - PUBLIC ONLY
|
|
16
|
+
* - DnsPtrRecord (PTR records)
|
|
17
|
+
* - DnsSoaRecord (SOA records)
|
|
18
|
+
* - DnsSrvRecord (SRV records with priority, weight, port, target)
|
|
19
|
+
* - DnsTxtRecord (TXT records)
|
|
20
|
+
*
|
|
21
|
+
* API Version: 2018-05-01
|
|
22
|
+
*
|
|
23
|
+
* Key differences from Private DNS:
|
|
24
|
+
* - Property casing: Public DNS uses PascalCase (ARecords, TTL vs aRecords, ttl)
|
|
25
|
+
* - CAA records: Only available in public DNS
|
|
26
|
+
* - NS records: Only available in public DNS
|
|
27
|
+
* - targetResource: Public DNS A, AAAA, and CNAME records support alias records
|
|
28
|
+
*/
|
|
29
|
+
const cdktf = require("cdktf");
|
|
30
|
+
const dns_record_schemas_1 = require("./dns-record-schemas");
|
|
31
|
+
const azapi_resource_1 = require("../../../core-azure/lib/azapi/azapi-resource");
|
|
32
|
+
/**
|
|
33
|
+
* Azure Public DNS A Record implementation
|
|
34
|
+
*
|
|
35
|
+
* A records map a hostname to one or more IPv4 addresses.
|
|
36
|
+
* Supports alias records via targetResourceId for pointing to Azure resources.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* // Create an A record with IP addresses:
|
|
40
|
+
* const aRecord = new DnsARecord(this, "web-a-record", {
|
|
41
|
+
* name: "www",
|
|
42
|
+
* dnsZoneId: zone.id,
|
|
43
|
+
* ttl: 300,
|
|
44
|
+
* records: [
|
|
45
|
+
* { ipv4Address: "20.30.40.50" },
|
|
46
|
+
* ],
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* // Create an alias A record pointing to an Azure resource:
|
|
51
|
+
* const aliasRecord = new DnsARecord(this, "alias-a-record", {
|
|
52
|
+
* name: "www",
|
|
53
|
+
* dnsZoneId: zone.id,
|
|
54
|
+
* ttl: 300,
|
|
55
|
+
* targetResourceId: publicIp.id,
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* @stability stable
|
|
59
|
+
*/
|
|
60
|
+
class DnsARecord extends azapi_resource_1.AzapiResource {
|
|
61
|
+
constructor(scope, id, props) {
|
|
62
|
+
super(scope, id, props);
|
|
63
|
+
this.props = props;
|
|
64
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
65
|
+
value: this.id,
|
|
66
|
+
description: "The ID of the A Record",
|
|
67
|
+
});
|
|
68
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
69
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
70
|
+
description: "The name of the A Record",
|
|
71
|
+
});
|
|
72
|
+
this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
|
|
73
|
+
value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
|
|
74
|
+
description: "The FQDN of the A Record",
|
|
75
|
+
});
|
|
76
|
+
this.idOutput.overrideLogicalId("id");
|
|
77
|
+
this.nameOutput.overrideLogicalId("name");
|
|
78
|
+
this.fqdnOutput.overrideLogicalId("fqdn");
|
|
79
|
+
}
|
|
80
|
+
resolveParentId(props) {
|
|
81
|
+
const typedProps = props;
|
|
82
|
+
return typedProps.dnsZoneId;
|
|
83
|
+
}
|
|
84
|
+
defaultVersion() {
|
|
85
|
+
return "2018-05-01";
|
|
86
|
+
}
|
|
87
|
+
resourceType() {
|
|
88
|
+
return dns_record_schemas_1.DNS_A_RECORD_TYPE;
|
|
89
|
+
}
|
|
90
|
+
apiSchema() {
|
|
91
|
+
return this.resolveSchema();
|
|
92
|
+
}
|
|
93
|
+
requiresLocation() {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
supportsTags() {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
createResourceBody(props) {
|
|
100
|
+
const typedProps = props;
|
|
101
|
+
const properties = {
|
|
102
|
+
TTL: typedProps.ttl ?? 3600,
|
|
103
|
+
};
|
|
104
|
+
if (typedProps.records && typedProps.records.length > 0) {
|
|
105
|
+
properties.ARecords = typedProps.records.map((r) => ({
|
|
106
|
+
ipv4Address: r.ipv4Address,
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
if (typedProps.targetResourceId) {
|
|
110
|
+
properties.targetResource = { id: typedProps.targetResourceId };
|
|
111
|
+
}
|
|
112
|
+
if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
|
|
113
|
+
properties.metadata = typedProps.metadata;
|
|
114
|
+
}
|
|
115
|
+
return { properties };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get the FQDN of the record
|
|
119
|
+
*/
|
|
120
|
+
get fqdn() {
|
|
121
|
+
return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.DnsARecord = DnsARecord;
|
|
125
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
126
|
+
DnsARecord[_a] = { fqn: "@microsoft/terraform-cdk-constructs.DnsARecord", version: "1.9.0" };
|
|
127
|
+
(() => {
|
|
128
|
+
azapi_resource_1.AzapiResource.registerSchemas(dns_record_schemas_1.DNS_A_RECORD_TYPE, dns_record_schemas_1.ALL_DNS_A_RECORD_VERSIONS);
|
|
129
|
+
})();
|
|
130
|
+
/**
|
|
131
|
+
* Azure Public DNS AAAA Record implementation
|
|
132
|
+
*
|
|
133
|
+
* AAAA records map a hostname to one or more IPv6 addresses.
|
|
134
|
+
* Supports alias records via targetResourceId for pointing to Azure resources.
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* // Create an AAAA record:
|
|
138
|
+
* const aaaaRecord = new DnsAaaaRecord(this, "web-aaaa-record", {
|
|
139
|
+
* name: "www",
|
|
140
|
+
* dnsZoneId: zone.id,
|
|
141
|
+
* ttl: 300,
|
|
142
|
+
* records: [
|
|
143
|
+
* { ipv6Address: "2001:db8::1" },
|
|
144
|
+
* ],
|
|
145
|
+
* });
|
|
146
|
+
*
|
|
147
|
+
* @stability stable
|
|
148
|
+
*/
|
|
149
|
+
class DnsAaaaRecord extends azapi_resource_1.AzapiResource {
|
|
150
|
+
constructor(scope, id, props) {
|
|
151
|
+
super(scope, id, props);
|
|
152
|
+
this.props = props;
|
|
153
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
154
|
+
value: this.id,
|
|
155
|
+
description: "The ID of the AAAA Record",
|
|
156
|
+
});
|
|
157
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
158
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
159
|
+
description: "The name of the AAAA Record",
|
|
160
|
+
});
|
|
161
|
+
this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
|
|
162
|
+
value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
|
|
163
|
+
description: "The FQDN of the AAAA Record",
|
|
164
|
+
});
|
|
165
|
+
this.idOutput.overrideLogicalId("id");
|
|
166
|
+
this.nameOutput.overrideLogicalId("name");
|
|
167
|
+
this.fqdnOutput.overrideLogicalId("fqdn");
|
|
168
|
+
}
|
|
169
|
+
resolveParentId(props) {
|
|
170
|
+
const typedProps = props;
|
|
171
|
+
return typedProps.dnsZoneId;
|
|
172
|
+
}
|
|
173
|
+
defaultVersion() {
|
|
174
|
+
return "2018-05-01";
|
|
175
|
+
}
|
|
176
|
+
resourceType() {
|
|
177
|
+
return dns_record_schemas_1.DNS_AAAA_RECORD_TYPE;
|
|
178
|
+
}
|
|
179
|
+
apiSchema() {
|
|
180
|
+
return this.resolveSchema();
|
|
181
|
+
}
|
|
182
|
+
requiresLocation() {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
supportsTags() {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
createResourceBody(props) {
|
|
189
|
+
const typedProps = props;
|
|
190
|
+
const properties = {
|
|
191
|
+
TTL: typedProps.ttl ?? 3600,
|
|
192
|
+
};
|
|
193
|
+
if (typedProps.records && typedProps.records.length > 0) {
|
|
194
|
+
properties.AAAARecords = typedProps.records.map((r) => ({
|
|
195
|
+
ipv6Address: r.ipv6Address,
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
if (typedProps.targetResourceId) {
|
|
199
|
+
properties.targetResource = { id: typedProps.targetResourceId };
|
|
200
|
+
}
|
|
201
|
+
if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
|
|
202
|
+
properties.metadata = typedProps.metadata;
|
|
203
|
+
}
|
|
204
|
+
return { properties };
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get the FQDN of the record
|
|
208
|
+
*/
|
|
209
|
+
get fqdn() {
|
|
210
|
+
return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.DnsAaaaRecord = DnsAaaaRecord;
|
|
214
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
215
|
+
DnsAaaaRecord[_b] = { fqn: "@microsoft/terraform-cdk-constructs.DnsAaaaRecord", version: "1.9.0" };
|
|
216
|
+
(() => {
|
|
217
|
+
azapi_resource_1.AzapiResource.registerSchemas(dns_record_schemas_1.DNS_AAAA_RECORD_TYPE, dns_record_schemas_1.ALL_DNS_AAAA_RECORD_VERSIONS);
|
|
218
|
+
})();
|
|
219
|
+
/**
|
|
220
|
+
* Azure Public DNS CAA Record implementation
|
|
221
|
+
*
|
|
222
|
+
* CAA records specify which Certificate Authorities are authorized to issue
|
|
223
|
+
* certificates for a domain. This record type is only available in Public DNS Zones.
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* // Create a CAA record to authorize Let's Encrypt:
|
|
227
|
+
* const caaRecord = new DnsCaaRecord(this, "caa-record", {
|
|
228
|
+
* name: "@",
|
|
229
|
+
* dnsZoneId: zone.id,
|
|
230
|
+
* ttl: 3600,
|
|
231
|
+
* records: [
|
|
232
|
+
* { flags: 0, tag: "issue", value: "letsencrypt.org" },
|
|
233
|
+
* { flags: 0, tag: "issuewild", value: ";" }, // Disallow wildcard certs
|
|
234
|
+
* { flags: 0, tag: "iodef", value: "mailto:security@example.com" },
|
|
235
|
+
* ],
|
|
236
|
+
* });
|
|
237
|
+
*
|
|
238
|
+
* @stability stable
|
|
239
|
+
*/
|
|
240
|
+
class DnsCaaRecord extends azapi_resource_1.AzapiResource {
|
|
241
|
+
constructor(scope, id, props) {
|
|
242
|
+
super(scope, id, props);
|
|
243
|
+
this.props = props;
|
|
244
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
245
|
+
value: this.id,
|
|
246
|
+
description: "The ID of the CAA Record",
|
|
247
|
+
});
|
|
248
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
249
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
250
|
+
description: "The name of the CAA Record",
|
|
251
|
+
});
|
|
252
|
+
this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
|
|
253
|
+
value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
|
|
254
|
+
description: "The FQDN of the CAA Record",
|
|
255
|
+
});
|
|
256
|
+
this.idOutput.overrideLogicalId("id");
|
|
257
|
+
this.nameOutput.overrideLogicalId("name");
|
|
258
|
+
this.fqdnOutput.overrideLogicalId("fqdn");
|
|
259
|
+
}
|
|
260
|
+
resolveParentId(props) {
|
|
261
|
+
const typedProps = props;
|
|
262
|
+
return typedProps.dnsZoneId;
|
|
263
|
+
}
|
|
264
|
+
defaultVersion() {
|
|
265
|
+
return "2018-05-01";
|
|
266
|
+
}
|
|
267
|
+
resourceType() {
|
|
268
|
+
return dns_record_schemas_1.DNS_CAA_RECORD_TYPE;
|
|
269
|
+
}
|
|
270
|
+
apiSchema() {
|
|
271
|
+
return this.resolveSchema();
|
|
272
|
+
}
|
|
273
|
+
requiresLocation() {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
supportsTags() {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
createResourceBody(props) {
|
|
280
|
+
const typedProps = props;
|
|
281
|
+
const properties = {
|
|
282
|
+
TTL: typedProps.ttl ?? 3600,
|
|
283
|
+
caaRecords: typedProps.records.map((r) => ({
|
|
284
|
+
flags: r.flags,
|
|
285
|
+
tag: r.tag,
|
|
286
|
+
value: r.value,
|
|
287
|
+
})),
|
|
288
|
+
};
|
|
289
|
+
if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
|
|
290
|
+
properties.metadata = typedProps.metadata;
|
|
291
|
+
}
|
|
292
|
+
return { properties };
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get the FQDN of the record
|
|
296
|
+
*/
|
|
297
|
+
get fqdn() {
|
|
298
|
+
return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
exports.DnsCaaRecord = DnsCaaRecord;
|
|
302
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
303
|
+
DnsCaaRecord[_c] = { fqn: "@microsoft/terraform-cdk-constructs.DnsCaaRecord", version: "1.9.0" };
|
|
304
|
+
(() => {
|
|
305
|
+
azapi_resource_1.AzapiResource.registerSchemas(dns_record_schemas_1.DNS_CAA_RECORD_TYPE, dns_record_schemas_1.ALL_DNS_CAA_RECORD_VERSIONS);
|
|
306
|
+
})();
|
|
307
|
+
/**
|
|
308
|
+
* Azure Public DNS CNAME Record implementation
|
|
309
|
+
*
|
|
310
|
+
* CNAME records create an alias from one hostname to another.
|
|
311
|
+
* Supports alias records via targetResourceId for pointing to Azure resources.
|
|
312
|
+
* Note: CNAME records cannot coexist with other record types at the same name.
|
|
313
|
+
*
|
|
314
|
+
* @example
|
|
315
|
+
* // Create a CNAME record:
|
|
316
|
+
* const cnameRecord = new DnsCnameRecord(this, "alias-record", {
|
|
317
|
+
* name: "app",
|
|
318
|
+
* dnsZoneId: zone.id,
|
|
319
|
+
* ttl: 3600,
|
|
320
|
+
* cname: "www.example.com",
|
|
321
|
+
* });
|
|
322
|
+
*
|
|
323
|
+
* @stability stable
|
|
324
|
+
*/
|
|
325
|
+
class DnsCnameRecord extends azapi_resource_1.AzapiResource {
|
|
326
|
+
constructor(scope, id, props) {
|
|
327
|
+
super(scope, id, props);
|
|
328
|
+
this.props = props;
|
|
329
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
330
|
+
value: this.id,
|
|
331
|
+
description: "The ID of the CNAME Record",
|
|
332
|
+
});
|
|
333
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
334
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
335
|
+
description: "The name of the CNAME Record",
|
|
336
|
+
});
|
|
337
|
+
this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
|
|
338
|
+
value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
|
|
339
|
+
description: "The FQDN of the CNAME Record",
|
|
340
|
+
});
|
|
341
|
+
this.idOutput.overrideLogicalId("id");
|
|
342
|
+
this.nameOutput.overrideLogicalId("name");
|
|
343
|
+
this.fqdnOutput.overrideLogicalId("fqdn");
|
|
344
|
+
}
|
|
345
|
+
resolveParentId(props) {
|
|
346
|
+
const typedProps = props;
|
|
347
|
+
return typedProps.dnsZoneId;
|
|
348
|
+
}
|
|
349
|
+
defaultVersion() {
|
|
350
|
+
return "2018-05-01";
|
|
351
|
+
}
|
|
352
|
+
resourceType() {
|
|
353
|
+
return dns_record_schemas_1.DNS_CNAME_RECORD_TYPE;
|
|
354
|
+
}
|
|
355
|
+
apiSchema() {
|
|
356
|
+
return this.resolveSchema();
|
|
357
|
+
}
|
|
358
|
+
requiresLocation() {
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
supportsTags() {
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
createResourceBody(props) {
|
|
365
|
+
const typedProps = props;
|
|
366
|
+
const properties = {
|
|
367
|
+
TTL: typedProps.ttl ?? 3600,
|
|
368
|
+
};
|
|
369
|
+
if (typedProps.cname) {
|
|
370
|
+
properties.CNAMERecord = { cname: typedProps.cname };
|
|
371
|
+
}
|
|
372
|
+
if (typedProps.targetResourceId) {
|
|
373
|
+
properties.targetResource = { id: typedProps.targetResourceId };
|
|
374
|
+
}
|
|
375
|
+
if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
|
|
376
|
+
properties.metadata = typedProps.metadata;
|
|
377
|
+
}
|
|
378
|
+
return { properties };
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Get the FQDN of the record
|
|
382
|
+
*/
|
|
383
|
+
get fqdn() {
|
|
384
|
+
return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
exports.DnsCnameRecord = DnsCnameRecord;
|
|
388
|
+
_d = JSII_RTTI_SYMBOL_1;
|
|
389
|
+
DnsCnameRecord[_d] = { fqn: "@microsoft/terraform-cdk-constructs.DnsCnameRecord", version: "1.9.0" };
|
|
390
|
+
(() => {
|
|
391
|
+
azapi_resource_1.AzapiResource.registerSchemas(dns_record_schemas_1.DNS_CNAME_RECORD_TYPE, dns_record_schemas_1.ALL_DNS_CNAME_RECORD_VERSIONS);
|
|
392
|
+
})();
|
|
393
|
+
/**
|
|
394
|
+
* Azure Public DNS MX Record implementation
|
|
395
|
+
*
|
|
396
|
+
* MX records specify mail exchange servers for a domain.
|
|
397
|
+
*
|
|
398
|
+
* @example
|
|
399
|
+
* // Create an MX record:
|
|
400
|
+
* const mxRecord = new DnsMxRecord(this, "mail-record", {
|
|
401
|
+
* name: "@",
|
|
402
|
+
* dnsZoneId: zone.id,
|
|
403
|
+
* ttl: 3600,
|
|
404
|
+
* records: [
|
|
405
|
+
* { preference: 10, exchange: "mail1.example.com" },
|
|
406
|
+
* { preference: 20, exchange: "mail2.example.com" },
|
|
407
|
+
* ],
|
|
408
|
+
* });
|
|
409
|
+
*
|
|
410
|
+
* @stability stable
|
|
411
|
+
*/
|
|
412
|
+
class DnsMxRecord extends azapi_resource_1.AzapiResource {
|
|
413
|
+
constructor(scope, id, props) {
|
|
414
|
+
super(scope, id, props);
|
|
415
|
+
this.props = props;
|
|
416
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
417
|
+
value: this.id,
|
|
418
|
+
description: "The ID of the MX Record",
|
|
419
|
+
});
|
|
420
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
421
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
422
|
+
description: "The name of the MX Record",
|
|
423
|
+
});
|
|
424
|
+
this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
|
|
425
|
+
value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
|
|
426
|
+
description: "The FQDN of the MX Record",
|
|
427
|
+
});
|
|
428
|
+
this.idOutput.overrideLogicalId("id");
|
|
429
|
+
this.nameOutput.overrideLogicalId("name");
|
|
430
|
+
this.fqdnOutput.overrideLogicalId("fqdn");
|
|
431
|
+
}
|
|
432
|
+
resolveParentId(props) {
|
|
433
|
+
const typedProps = props;
|
|
434
|
+
return typedProps.dnsZoneId;
|
|
435
|
+
}
|
|
436
|
+
defaultVersion() {
|
|
437
|
+
return "2018-05-01";
|
|
438
|
+
}
|
|
439
|
+
resourceType() {
|
|
440
|
+
return dns_record_schemas_1.DNS_MX_RECORD_TYPE;
|
|
441
|
+
}
|
|
442
|
+
apiSchema() {
|
|
443
|
+
return this.resolveSchema();
|
|
444
|
+
}
|
|
445
|
+
requiresLocation() {
|
|
446
|
+
return false;
|
|
447
|
+
}
|
|
448
|
+
supportsTags() {
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
createResourceBody(props) {
|
|
452
|
+
const typedProps = props;
|
|
453
|
+
const properties = {
|
|
454
|
+
TTL: typedProps.ttl ?? 3600,
|
|
455
|
+
MXRecords: typedProps.records.map((r) => ({
|
|
456
|
+
preference: r.preference,
|
|
457
|
+
exchange: r.exchange,
|
|
458
|
+
})),
|
|
459
|
+
};
|
|
460
|
+
if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
|
|
461
|
+
properties.metadata = typedProps.metadata;
|
|
462
|
+
}
|
|
463
|
+
return { properties };
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Get the FQDN of the record
|
|
467
|
+
*/
|
|
468
|
+
get fqdn() {
|
|
469
|
+
return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
exports.DnsMxRecord = DnsMxRecord;
|
|
473
|
+
_e = JSII_RTTI_SYMBOL_1;
|
|
474
|
+
DnsMxRecord[_e] = { fqn: "@microsoft/terraform-cdk-constructs.DnsMxRecord", version: "1.9.0" };
|
|
475
|
+
(() => {
|
|
476
|
+
azapi_resource_1.AzapiResource.registerSchemas(dns_record_schemas_1.DNS_MX_RECORD_TYPE, dns_record_schemas_1.ALL_DNS_MX_RECORD_VERSIONS);
|
|
477
|
+
})();
|
|
478
|
+
/**
|
|
479
|
+
* Azure Public DNS NS Record implementation
|
|
480
|
+
*
|
|
481
|
+
* NS records specify the authoritative name servers for a domain or subdomain.
|
|
482
|
+
* This record type is only available in Public DNS Zones.
|
|
483
|
+
*
|
|
484
|
+
* @example
|
|
485
|
+
* // Create an NS record for a subdomain delegation:
|
|
486
|
+
* const nsRecord = new DnsNsRecord(this, "ns-record", {
|
|
487
|
+
* name: "subdomain",
|
|
488
|
+
* dnsZoneId: zone.id,
|
|
489
|
+
* ttl: 3600,
|
|
490
|
+
* records: [
|
|
491
|
+
* { nsdname: "ns1.subdomain.example.com" },
|
|
492
|
+
* { nsdname: "ns2.subdomain.example.com" },
|
|
493
|
+
* ],
|
|
494
|
+
* });
|
|
495
|
+
*
|
|
496
|
+
* @stability stable
|
|
497
|
+
*/
|
|
498
|
+
class DnsNsRecord extends azapi_resource_1.AzapiResource {
|
|
499
|
+
constructor(scope, id, props) {
|
|
500
|
+
super(scope, id, props);
|
|
501
|
+
this.props = props;
|
|
502
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
503
|
+
value: this.id,
|
|
504
|
+
description: "The ID of the NS Record",
|
|
505
|
+
});
|
|
506
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
507
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
508
|
+
description: "The name of the NS Record",
|
|
509
|
+
});
|
|
510
|
+
this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
|
|
511
|
+
value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
|
|
512
|
+
description: "The FQDN of the NS Record",
|
|
513
|
+
});
|
|
514
|
+
this.idOutput.overrideLogicalId("id");
|
|
515
|
+
this.nameOutput.overrideLogicalId("name");
|
|
516
|
+
this.fqdnOutput.overrideLogicalId("fqdn");
|
|
517
|
+
}
|
|
518
|
+
resolveParentId(props) {
|
|
519
|
+
const typedProps = props;
|
|
520
|
+
return typedProps.dnsZoneId;
|
|
521
|
+
}
|
|
522
|
+
defaultVersion() {
|
|
523
|
+
return "2018-05-01";
|
|
524
|
+
}
|
|
525
|
+
resourceType() {
|
|
526
|
+
return dns_record_schemas_1.DNS_NS_RECORD_TYPE;
|
|
527
|
+
}
|
|
528
|
+
apiSchema() {
|
|
529
|
+
return this.resolveSchema();
|
|
530
|
+
}
|
|
531
|
+
requiresLocation() {
|
|
532
|
+
return false;
|
|
533
|
+
}
|
|
534
|
+
supportsTags() {
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
createResourceBody(props) {
|
|
538
|
+
const typedProps = props;
|
|
539
|
+
const properties = {
|
|
540
|
+
TTL: typedProps.ttl ?? 3600,
|
|
541
|
+
NSRecords: typedProps.records.map((r) => ({
|
|
542
|
+
nsdname: r.nsdname,
|
|
543
|
+
})),
|
|
544
|
+
};
|
|
545
|
+
if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
|
|
546
|
+
properties.metadata = typedProps.metadata;
|
|
547
|
+
}
|
|
548
|
+
return { properties };
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Get the FQDN of the record
|
|
552
|
+
*/
|
|
553
|
+
get fqdn() {
|
|
554
|
+
return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
exports.DnsNsRecord = DnsNsRecord;
|
|
558
|
+
_f = JSII_RTTI_SYMBOL_1;
|
|
559
|
+
DnsNsRecord[_f] = { fqn: "@microsoft/terraform-cdk-constructs.DnsNsRecord", version: "1.9.0" };
|
|
560
|
+
(() => {
|
|
561
|
+
azapi_resource_1.AzapiResource.registerSchemas(dns_record_schemas_1.DNS_NS_RECORD_TYPE, dns_record_schemas_1.ALL_DNS_NS_RECORD_VERSIONS);
|
|
562
|
+
})();
|
|
563
|
+
/**
|
|
564
|
+
* Azure Public DNS PTR Record implementation
|
|
565
|
+
*
|
|
566
|
+
* PTR records are used for reverse DNS lookups, mapping IP addresses to hostnames.
|
|
567
|
+
*
|
|
568
|
+
* @example
|
|
569
|
+
* // Create a PTR record:
|
|
570
|
+
* const ptrRecord = new DnsPtrRecord(this, "ptr-record", {
|
|
571
|
+
* name: "50",
|
|
572
|
+
* dnsZoneId: reverseZone.id,
|
|
573
|
+
* ttl: 3600,
|
|
574
|
+
* records: [
|
|
575
|
+
* { ptrdname: "server1.example.com" },
|
|
576
|
+
* ],
|
|
577
|
+
* });
|
|
578
|
+
*
|
|
579
|
+
* @stability stable
|
|
580
|
+
*/
|
|
581
|
+
class DnsPtrRecord extends azapi_resource_1.AzapiResource {
|
|
582
|
+
constructor(scope, id, props) {
|
|
583
|
+
super(scope, id, props);
|
|
584
|
+
this.props = props;
|
|
585
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
586
|
+
value: this.id,
|
|
587
|
+
description: "The ID of the PTR Record",
|
|
588
|
+
});
|
|
589
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
590
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
591
|
+
description: "The name of the PTR Record",
|
|
592
|
+
});
|
|
593
|
+
this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
|
|
594
|
+
value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
|
|
595
|
+
description: "The FQDN of the PTR Record",
|
|
596
|
+
});
|
|
597
|
+
this.idOutput.overrideLogicalId("id");
|
|
598
|
+
this.nameOutput.overrideLogicalId("name");
|
|
599
|
+
this.fqdnOutput.overrideLogicalId("fqdn");
|
|
600
|
+
}
|
|
601
|
+
resolveParentId(props) {
|
|
602
|
+
const typedProps = props;
|
|
603
|
+
return typedProps.dnsZoneId;
|
|
604
|
+
}
|
|
605
|
+
defaultVersion() {
|
|
606
|
+
return "2018-05-01";
|
|
607
|
+
}
|
|
608
|
+
resourceType() {
|
|
609
|
+
return dns_record_schemas_1.DNS_PTR_RECORD_TYPE;
|
|
610
|
+
}
|
|
611
|
+
apiSchema() {
|
|
612
|
+
return this.resolveSchema();
|
|
613
|
+
}
|
|
614
|
+
requiresLocation() {
|
|
615
|
+
return false;
|
|
616
|
+
}
|
|
617
|
+
supportsTags() {
|
|
618
|
+
return false;
|
|
619
|
+
}
|
|
620
|
+
createResourceBody(props) {
|
|
621
|
+
const typedProps = props;
|
|
622
|
+
const properties = {
|
|
623
|
+
TTL: typedProps.ttl ?? 3600,
|
|
624
|
+
PTRRecords: typedProps.records.map((r) => ({
|
|
625
|
+
ptrdname: r.ptrdname,
|
|
626
|
+
})),
|
|
627
|
+
};
|
|
628
|
+
if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
|
|
629
|
+
properties.metadata = typedProps.metadata;
|
|
630
|
+
}
|
|
631
|
+
return { properties };
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Get the FQDN of the record
|
|
635
|
+
*/
|
|
636
|
+
get fqdn() {
|
|
637
|
+
return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
exports.DnsPtrRecord = DnsPtrRecord;
|
|
641
|
+
_g = JSII_RTTI_SYMBOL_1;
|
|
642
|
+
DnsPtrRecord[_g] = { fqn: "@microsoft/terraform-cdk-constructs.DnsPtrRecord", version: "1.9.0" };
|
|
643
|
+
(() => {
|
|
644
|
+
azapi_resource_1.AzapiResource.registerSchemas(dns_record_schemas_1.DNS_PTR_RECORD_TYPE, dns_record_schemas_1.ALL_DNS_PTR_RECORD_VERSIONS);
|
|
645
|
+
})();
|
|
646
|
+
/**
|
|
647
|
+
* Azure Public DNS SOA Record implementation
|
|
648
|
+
*
|
|
649
|
+
* SOA records contain administrative information about a DNS zone.
|
|
650
|
+
* Note: Each zone automatically has an SOA record; this is typically used to update it.
|
|
651
|
+
*
|
|
652
|
+
* @example
|
|
653
|
+
* // Update the SOA record:
|
|
654
|
+
* const soaRecord = new DnsSoaRecord(this, "soa-record", {
|
|
655
|
+
* name: "@",
|
|
656
|
+
* dnsZoneId: zone.id,
|
|
657
|
+
* ttl: 3600,
|
|
658
|
+
* soaRecord: {
|
|
659
|
+
* email: "admin.example.com",
|
|
660
|
+
* refreshTime: 3600,
|
|
661
|
+
* retryTime: 300,
|
|
662
|
+
* expireTime: 2419200,
|
|
663
|
+
* minimumTTL: 300,
|
|
664
|
+
* },
|
|
665
|
+
* });
|
|
666
|
+
*
|
|
667
|
+
* @stability stable
|
|
668
|
+
*/
|
|
669
|
+
class DnsSoaRecord extends azapi_resource_1.AzapiResource {
|
|
670
|
+
constructor(scope, id, props) {
|
|
671
|
+
super(scope, id, props);
|
|
672
|
+
this.props = props;
|
|
673
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
674
|
+
value: this.id,
|
|
675
|
+
description: "The ID of the SOA Record",
|
|
676
|
+
});
|
|
677
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
678
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
679
|
+
description: "The name of the SOA Record",
|
|
680
|
+
});
|
|
681
|
+
this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
|
|
682
|
+
value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
|
|
683
|
+
description: "The FQDN of the SOA Record",
|
|
684
|
+
});
|
|
685
|
+
this.idOutput.overrideLogicalId("id");
|
|
686
|
+
this.nameOutput.overrideLogicalId("name");
|
|
687
|
+
this.fqdnOutput.overrideLogicalId("fqdn");
|
|
688
|
+
}
|
|
689
|
+
resolveParentId(props) {
|
|
690
|
+
const typedProps = props;
|
|
691
|
+
return typedProps.dnsZoneId;
|
|
692
|
+
}
|
|
693
|
+
defaultVersion() {
|
|
694
|
+
return "2018-05-01";
|
|
695
|
+
}
|
|
696
|
+
resourceType() {
|
|
697
|
+
return dns_record_schemas_1.DNS_SOA_RECORD_TYPE;
|
|
698
|
+
}
|
|
699
|
+
apiSchema() {
|
|
700
|
+
return this.resolveSchema();
|
|
701
|
+
}
|
|
702
|
+
requiresLocation() {
|
|
703
|
+
return false;
|
|
704
|
+
}
|
|
705
|
+
supportsTags() {
|
|
706
|
+
return false;
|
|
707
|
+
}
|
|
708
|
+
createResourceBody(props) {
|
|
709
|
+
const typedProps = props;
|
|
710
|
+
const soaRecord = {};
|
|
711
|
+
if (typedProps.soaRecord.host !== undefined) {
|
|
712
|
+
soaRecord.host = typedProps.soaRecord.host;
|
|
713
|
+
}
|
|
714
|
+
if (typedProps.soaRecord.email !== undefined) {
|
|
715
|
+
soaRecord.email = typedProps.soaRecord.email;
|
|
716
|
+
}
|
|
717
|
+
if (typedProps.soaRecord.serialNumber !== undefined) {
|
|
718
|
+
soaRecord.serialNumber = typedProps.soaRecord.serialNumber;
|
|
719
|
+
}
|
|
720
|
+
if (typedProps.soaRecord.refreshTime !== undefined) {
|
|
721
|
+
soaRecord.refreshTime = typedProps.soaRecord.refreshTime;
|
|
722
|
+
}
|
|
723
|
+
if (typedProps.soaRecord.retryTime !== undefined) {
|
|
724
|
+
soaRecord.retryTime = typedProps.soaRecord.retryTime;
|
|
725
|
+
}
|
|
726
|
+
if (typedProps.soaRecord.expireTime !== undefined) {
|
|
727
|
+
soaRecord.expireTime = typedProps.soaRecord.expireTime;
|
|
728
|
+
}
|
|
729
|
+
if (typedProps.soaRecord.minimumTTL !== undefined) {
|
|
730
|
+
soaRecord.minimumTTL = typedProps.soaRecord.minimumTTL;
|
|
731
|
+
}
|
|
732
|
+
const properties = {
|
|
733
|
+
TTL: typedProps.ttl ?? 3600,
|
|
734
|
+
SOARecord: soaRecord,
|
|
735
|
+
};
|
|
736
|
+
if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
|
|
737
|
+
properties.metadata = typedProps.metadata;
|
|
738
|
+
}
|
|
739
|
+
return { properties };
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Get the FQDN of the record
|
|
743
|
+
*/
|
|
744
|
+
get fqdn() {
|
|
745
|
+
return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
exports.DnsSoaRecord = DnsSoaRecord;
|
|
749
|
+
_h = JSII_RTTI_SYMBOL_1;
|
|
750
|
+
DnsSoaRecord[_h] = { fqn: "@microsoft/terraform-cdk-constructs.DnsSoaRecord", version: "1.9.0" };
|
|
751
|
+
(() => {
|
|
752
|
+
azapi_resource_1.AzapiResource.registerSchemas(dns_record_schemas_1.DNS_SOA_RECORD_TYPE, dns_record_schemas_1.ALL_DNS_SOA_RECORD_VERSIONS);
|
|
753
|
+
})();
|
|
754
|
+
/**
|
|
755
|
+
* Azure Public DNS SRV Record implementation
|
|
756
|
+
*
|
|
757
|
+
* SRV records specify the location of services like SIP, XMPP, etc.
|
|
758
|
+
*
|
|
759
|
+
* @example
|
|
760
|
+
* // Create an SRV record for a SIP service:
|
|
761
|
+
* const srvRecord = new DnsSrvRecord(this, "sip-record", {
|
|
762
|
+
* name: "_sip._tcp",
|
|
763
|
+
* dnsZoneId: zone.id,
|
|
764
|
+
* ttl: 3600,
|
|
765
|
+
* records: [
|
|
766
|
+
* { priority: 10, weight: 60, port: 5060, target: "sipserver1.example.com" },
|
|
767
|
+
* { priority: 10, weight: 40, port: 5060, target: "sipserver2.example.com" },
|
|
768
|
+
* ],
|
|
769
|
+
* });
|
|
770
|
+
*
|
|
771
|
+
* @stability stable
|
|
772
|
+
*/
|
|
773
|
+
class DnsSrvRecord extends azapi_resource_1.AzapiResource {
|
|
774
|
+
constructor(scope, id, props) {
|
|
775
|
+
super(scope, id, props);
|
|
776
|
+
this.props = props;
|
|
777
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
778
|
+
value: this.id,
|
|
779
|
+
description: "The ID of the SRV Record",
|
|
780
|
+
});
|
|
781
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
782
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
783
|
+
description: "The name of the SRV Record",
|
|
784
|
+
});
|
|
785
|
+
this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
|
|
786
|
+
value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
|
|
787
|
+
description: "The FQDN of the SRV Record",
|
|
788
|
+
});
|
|
789
|
+
this.idOutput.overrideLogicalId("id");
|
|
790
|
+
this.nameOutput.overrideLogicalId("name");
|
|
791
|
+
this.fqdnOutput.overrideLogicalId("fqdn");
|
|
792
|
+
}
|
|
793
|
+
resolveParentId(props) {
|
|
794
|
+
const typedProps = props;
|
|
795
|
+
return typedProps.dnsZoneId;
|
|
796
|
+
}
|
|
797
|
+
defaultVersion() {
|
|
798
|
+
return "2018-05-01";
|
|
799
|
+
}
|
|
800
|
+
resourceType() {
|
|
801
|
+
return dns_record_schemas_1.DNS_SRV_RECORD_TYPE;
|
|
802
|
+
}
|
|
803
|
+
apiSchema() {
|
|
804
|
+
return this.resolveSchema();
|
|
805
|
+
}
|
|
806
|
+
requiresLocation() {
|
|
807
|
+
return false;
|
|
808
|
+
}
|
|
809
|
+
supportsTags() {
|
|
810
|
+
return false;
|
|
811
|
+
}
|
|
812
|
+
createResourceBody(props) {
|
|
813
|
+
const typedProps = props;
|
|
814
|
+
const properties = {
|
|
815
|
+
TTL: typedProps.ttl ?? 3600,
|
|
816
|
+
SRVRecords: typedProps.records.map((r) => ({
|
|
817
|
+
priority: r.priority,
|
|
818
|
+
weight: r.weight,
|
|
819
|
+
port: r.port,
|
|
820
|
+
target: r.target,
|
|
821
|
+
})),
|
|
822
|
+
};
|
|
823
|
+
if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
|
|
824
|
+
properties.metadata = typedProps.metadata;
|
|
825
|
+
}
|
|
826
|
+
return { properties };
|
|
827
|
+
}
|
|
828
|
+
/**
|
|
829
|
+
* Get the FQDN of the record
|
|
830
|
+
*/
|
|
831
|
+
get fqdn() {
|
|
832
|
+
return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
exports.DnsSrvRecord = DnsSrvRecord;
|
|
836
|
+
_j = JSII_RTTI_SYMBOL_1;
|
|
837
|
+
DnsSrvRecord[_j] = { fqn: "@microsoft/terraform-cdk-constructs.DnsSrvRecord", version: "1.9.0" };
|
|
838
|
+
(() => {
|
|
839
|
+
azapi_resource_1.AzapiResource.registerSchemas(dns_record_schemas_1.DNS_SRV_RECORD_TYPE, dns_record_schemas_1.ALL_DNS_SRV_RECORD_VERSIONS);
|
|
840
|
+
})();
|
|
841
|
+
/**
|
|
842
|
+
* Azure Public DNS TXT Record implementation
|
|
843
|
+
*
|
|
844
|
+
* TXT records store arbitrary text data, commonly used for SPF, DKIM, domain verification, etc.
|
|
845
|
+
*
|
|
846
|
+
* @example
|
|
847
|
+
* // Create a TXT record for SPF:
|
|
848
|
+
* const txtRecord = new DnsTxtRecord(this, "spf-record", {
|
|
849
|
+
* name: "@",
|
|
850
|
+
* dnsZoneId: zone.id,
|
|
851
|
+
* ttl: 3600,
|
|
852
|
+
* records: [
|
|
853
|
+
* { value: ["v=spf1 include:spf.protection.outlook.com -all"] },
|
|
854
|
+
* ],
|
|
855
|
+
* });
|
|
856
|
+
*
|
|
857
|
+
* @stability stable
|
|
858
|
+
*/
|
|
859
|
+
class DnsTxtRecord extends azapi_resource_1.AzapiResource {
|
|
860
|
+
constructor(scope, id, props) {
|
|
861
|
+
super(scope, id, props);
|
|
862
|
+
this.props = props;
|
|
863
|
+
this.idOutput = new cdktf.TerraformOutput(this, "id", {
|
|
864
|
+
value: this.id,
|
|
865
|
+
description: "The ID of the TXT Record",
|
|
866
|
+
});
|
|
867
|
+
this.nameOutput = new cdktf.TerraformOutput(this, "name", {
|
|
868
|
+
value: `\${${this.terraformResource.fqn}.name}`,
|
|
869
|
+
description: "The name of the TXT Record",
|
|
870
|
+
});
|
|
871
|
+
this.fqdnOutput = new cdktf.TerraformOutput(this, "fqdn", {
|
|
872
|
+
value: `\${${this.terraformResource.fqn}.output.properties.fqdn}`,
|
|
873
|
+
description: "The FQDN of the TXT Record",
|
|
874
|
+
});
|
|
875
|
+
this.idOutput.overrideLogicalId("id");
|
|
876
|
+
this.nameOutput.overrideLogicalId("name");
|
|
877
|
+
this.fqdnOutput.overrideLogicalId("fqdn");
|
|
878
|
+
}
|
|
879
|
+
resolveParentId(props) {
|
|
880
|
+
const typedProps = props;
|
|
881
|
+
return typedProps.dnsZoneId;
|
|
882
|
+
}
|
|
883
|
+
defaultVersion() {
|
|
884
|
+
return "2018-05-01";
|
|
885
|
+
}
|
|
886
|
+
resourceType() {
|
|
887
|
+
return dns_record_schemas_1.DNS_TXT_RECORD_TYPE;
|
|
888
|
+
}
|
|
889
|
+
apiSchema() {
|
|
890
|
+
return this.resolveSchema();
|
|
891
|
+
}
|
|
892
|
+
requiresLocation() {
|
|
893
|
+
return false;
|
|
894
|
+
}
|
|
895
|
+
supportsTags() {
|
|
896
|
+
return false;
|
|
897
|
+
}
|
|
898
|
+
createResourceBody(props) {
|
|
899
|
+
const typedProps = props;
|
|
900
|
+
const properties = {
|
|
901
|
+
TTL: typedProps.ttl ?? 3600,
|
|
902
|
+
TXTRecords: typedProps.records.map((r) => ({
|
|
903
|
+
value: r.value,
|
|
904
|
+
})),
|
|
905
|
+
};
|
|
906
|
+
if (typedProps.metadata && Object.keys(typedProps.metadata).length > 0) {
|
|
907
|
+
properties.metadata = typedProps.metadata;
|
|
908
|
+
}
|
|
909
|
+
return { properties };
|
|
910
|
+
}
|
|
911
|
+
/**
|
|
912
|
+
* Get the FQDN of the record
|
|
913
|
+
*/
|
|
914
|
+
get fqdn() {
|
|
915
|
+
return `\${${this.terraformResource.fqn}.output.properties.fqdn}`;
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
exports.DnsTxtRecord = DnsTxtRecord;
|
|
919
|
+
_k = JSII_RTTI_SYMBOL_1;
|
|
920
|
+
DnsTxtRecord[_k] = { fqn: "@microsoft/terraform-cdk-constructs.DnsTxtRecord", version: "1.9.0" };
|
|
921
|
+
(() => {
|
|
922
|
+
azapi_resource_1.AzapiResource.registerSchemas(dns_record_schemas_1.DNS_TXT_RECORD_TYPE, dns_record_schemas_1.ALL_DNS_TXT_RECORD_VERSIONS);
|
|
923
|
+
})();
|
|
924
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLXJlY29yZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXp1cmUtZG5zem9uZS9saWIvcmVjb3Jkcy9kbnMtcmVjb3Jkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsK0JBQStCO0FBRS9CLDZEQXFCOEI7QUFDOUIsaUZBR3NEO0FBaUV0RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsOEJBQWE7SUFVM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQ3BELEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNkLFdBQVcsRUFBRSx3QkFBd0I7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUN4RCxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxRQUFRO1lBQy9DLFdBQVcsRUFBRSwwQkFBMEI7U0FDeEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUN4RCxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRywwQkFBMEI7WUFDakUsV0FBVyxFQUFFLDBCQUEwQjtTQUN4QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxD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QUFVLEdBQUcsS0FBMEIsQ0FBQztRQUM5QyxNQUFNLFVBQVUsR0FBK0I7WUFDN0MsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLElBQUksSUFBSTtZQUMzQixVQUFVLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSzthQUNmLENBQUMsQ0FBQztTQUNKLENBQUM7UUFFRixJQUFJLFVBQVUsQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsSUFBSTtRQUNiLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRywwQkFBMEIsQ0FBQztJQUNwRSxDQUFDOztBQW5GSCxvQ0FvRkM7OztBQW5GQztJQUNFLDhCQUFhLENBQUMsZUFBZSxDQUMzQix3Q0FBbUIsRUFDbkIsZ0RBQTJCLENBQzVCLENBQUM7QUFDSixDQUFDLEdBQUEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXp1cmUgUHVibGljIEROUyBab25lIFJlY29yZCBpbXBsZW1lbnRhdGlvbnMgdXNpbmcgQXphcGlSZXNvdXJjZSBmcmFtZXdvcmtcbiAqXG4gKiBUaGlzIGZpbGUgcHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIGZvciBhbGwgUHVibGljIEROUyBab25lIHJlY29yZCB0eXBlczpcbiAqIC0gRG5zQVJlY29yZCAoQSByZWNvcmRzIHdpdGggSVB2NCBhZGRyZXNzZXMpXG4gKiAtIERuc0FhYWFSZWNvcmQgKEFBQUEgcmVjb3JkcyB3aXRoIElQdjYgYWRkcmVzc2VzKVxuICogLSBEbnNDYWFSZWNvcmQgKENBQSByZWNvcmRzIGZvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgQXV0aG9yaXphdGlvbikgLSBQVUJMSUMgT05MWVxuICogLSBEbnNDbmFtZVJlY29yZCAoQ05BTUUgcmVjb3JkcylcbiAqIC0gRG5zTXhSZWNvcmQgKE1YIHJlY29yZHMgd2l0aCBleGNoYW5nZSBhbmQgcHJlZmVyZW5jZSlcbiAqIC0gRG5zTnNSZWNvcmQgKE5TIHJlY29yZHMgZm9yIE5hbWUgU2VydmVycykgLSBQVUJMSUMgT05MWVxuICogLSBEbnNQdHJSZWNvcmQgKFBUUiByZWNvcmRzKVxuICogLSBEbnNTb2FSZWNvcmQgKFNPQSByZWNvcmRzKVxuICogLSBEbnNTcnZSZWNvcmQgKFNSViByZWNvcmRzIHdpdGggcHJpb3JpdHksIHdlaWdodCwgcG9ydCwgdGFyZ2V0KVxuICogLSBEbnNUeHRSZWNvcmQgKFRYVCByZWNvcmRzKVxuICpcbiAqIEFQSSBWZXJzaW9uOiAyMDE4LTA1LTAxXG4gKlxuICogS2V5IGRpZmZlcmVuY2VzIGZyb20gUHJpdmF0ZSBETlM6XG4gKiAtIFByb3BlcnR5IGNhc2luZzogUHVibGljIEROUyB1c2VzIFBhc2NhbENhc2UgKEFSZWNvcmRzLCBUVEwgdnMgYVJlY29yZHMsIHR0bClcbiAqIC0gQ0FBIHJlY29yZHM6IE9ubHkgYXZhaWxhYmxlIGluIHB1YmxpYyBETlNcbiAqIC0gTlMgcmVjb3JkczogT25seSBhdmFpbGFibGUgaW4gcHVibGljIEROU1xuICogLSB0YXJnZXRSZXNvdXJjZTogUHVibGljIEROUyBBLCBBQUFBLCBhbmQgQ05BTUUgcmVjb3JkcyBzdXBwb3J0IGFsaWFzIHJlY29yZHNcbiAqL1xuXG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBBTExfRE5TX0FfUkVDT1JEX1ZFUlNJT05TLFxuICBBTExfRE5TX0FBQUFfUkVDT1JEX1ZFUlNJT05TLFxuICBBTExfRE5TX0NBQV9SRUNPUkRfVkVSU0lPTlMsXG4gIEFMTF9ETlNfQ05BTUVfUkVDT1JEX1ZFUlNJT05TLFxuICBBTExfRE5TX01YX1JFQ09SRF9WRVJTSU9OUyxcbiAgQUxMX0ROU19OU19SRUNPUkRfVkVSU0lPTlMsXG4gIEFMTF9ETlNfUFRSX1JFQ09SRF9WRVJTSU9OUyxcbiAgQUxMX0ROU19TT0FfUkVDT1JEX1ZFUlNJT05TLFxuICBBTExfRE5TX1NSVl9SRUNPUkRfVkVSU0lPTlMsXG4gIEFMTF9ETlNfVFhUX1JFQ09SRF9WRVJTSU9OUyxcbiAgRE5TX0FfUkVDT1JEX1RZUEUsXG4gIEROU19BQUFBX1JFQ09SRF9UWVBFLFxuICBETlNfQ0FBX1JFQ09SRF9UWVBFLFxuICBETlNfQ05BTUVfUkVDT1JEX1RZUEUsXG4gIEROU19NWF9SRUNPUkRfVFlQRSxcbiAgRE5TX05TX1JFQ09SRF9UWVBFLFxuICBETlNfUFRSX1JFQ09SRF9UWVBFLFxuICBETlNfU09BX1JFQ09SRF9UWVBFLFxuICBETlNfU1JWX1JFQ09SRF9UWVBFLFxuICBETlNfVFhUX1JFQ09SRF9UWVBFLFxufSBmcm9tIFwiLi9kbnMtcmVjb3JkLXNjaGVtYXNcIjtcbmltcG9ydCB7XG4gIEF6YXBpUmVzb3VyY2UsXG4gIEF6YXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSBcIi4uLy4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlXCI7XG5pbXBvcnQgeyBBcGlTY2hlbWEgfSBmcm9tIFwiLi4vLi4vLi4vY29yZS1henVyZS9saWIvdmVyc2lvbi1tYW5hZ2VyL2ludGVyZmFjZXMvdmVyc2lvbi1pbnRlcmZhY2VzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDT01NT04gSU5URVJGQUNFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCYXNlIHByb3BlcnRpZXMgc2hhcmVkIGJ5IGFsbCBQdWJsaWMgRE5TIHJlY29yZCB0eXBlc1xuICpcbiAqIE5vdGU6IFRoZSBgbmFtZWAgcHJvcGVydHkgaXMgaW5oZXJpdGVkIGZyb20gQXphcGlSZXNvdXJjZVByb3BzLlxuICogRm9yIEROUyByZWNvcmRzLCB1c2UgQCBmb3IgYXBleCByZWNvcmRzIG9yIHByb3ZpZGUgYSByZWxhdGl2ZSBuYW1lIGxpa2UgXCJ3d3dcIiBvciBcIm1haWxcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEbnNSZWNvcmRCYXNlUHJvcHMgZXh0ZW5kcyBBemFwaVJlc291cmNlUHJvcHMge1xuICAvKipcbiAgICogUmVzb3VyY2UgSUQgb2YgdGhlIHBhcmVudCBETlMgWm9uZVxuICAgKiBAZXhhbXBsZSB6b25lLmlkIG9yIFwiL3N1YnNjcmlwdGlvbnMvLi4uL3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9kbnNab25lcy9leGFtcGxlLmNvbVwiXG4gICAqL1xuICByZWFkb25seSBkbnNab25lSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGltZSB0byBMaXZlIGluIHNlY29uZHNcbiAgICogQGRlZmF1bHQgMzYwMFxuICAgKi9cbiAgcmVhZG9ubHkgdHRsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSByZWNvcmQgc2V0XG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBIFJFQ09SRFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBFbnRyeSBmb3IgYW4gQSByZWNvcmQgd2l0aCBJUHY0IGFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEbnNBUmVjb3JkRW50cnkge1xuICAvKipcbiAgICogVGhlIElQdjQgYWRkcmVzcyBvZiB0aGlzIEEgcmVjb3JkXG4gICAqIEBleGFtcGxlIFwiMjAuMzAuNDAuNTBcIlxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NEFkZHJlc3M6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBQdWJsaWMgRE5TIEEgUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG5zQVJlY29yZFByb3BzIGV4dGVuZHMgRG5zUmVjb3JkQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIEFycmF5IG9mIEEgcmVjb3JkcyB3aXRoIElQdjQgYWRkcmVzc2VzXG4gICAqIEVpdGhlciByZWNvcmRzIG9yIHRhcmdldFJlc291cmNlSWQgbXVzdCBiZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlY29yZHM/OiBEbnNBUmVjb3JkRW50cnlbXTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIGFuIEF6dXJlIHJlc291cmNlIGZyb20gd2hlcmUgdGhlIElQIGNvbnRlbnQgaXMgdGFrZW4gKGFsaWFzIHJlY29yZClcbiAgICogRWl0aGVyIHJlY29yZHMgb3IgdGFyZ2V0UmVzb3VyY2VJZCBtdXN0IGJlIHNwZWNpZmllZFxuICAgKiBAZXhhbXBsZSBwdWJsaWNJcC5pZFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UmVzb3VyY2VJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBenVyZSBQdWJsaWMgRE5TIEEgUmVjb3JkIGltcGxlbWVudGF0aW9uXG4gKlxuICogQSByZWNvcmRzIG1hcCBhIGhvc3RuYW1lIHRvIG9uZSBvciBtb3JlIElQdjQgYWRkcmVzc2VzLlxuICogU3VwcG9ydHMgYWxpYXMgcmVjb3JkcyB2aWEgdGFyZ2V0UmVzb3VyY2VJZCBmb3IgcG9pbnRpbmcgdG8gQXp1cmUgcmVzb3VyY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYW4gQSByZWNvcmQgd2l0aCBJUCBhZGRyZXNzZXM6XG4gKiBjb25zdCBhUmVjb3JkID0gbmV3IERuc0FSZWNvcmQodGhpcywgXCJ3ZWItYS1yZWNvcmRcIiwge1xuICogICBuYW1lOiBcInd3d1wiLFxuICogICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gKiAgIHR0bDogMzAwLFxuICogICByZWNvcmRzOiBbXG4gKiAgICAgeyBpcHY0QWRkcmVzczogXCIyMC4zMC40MC41MFwiIH0sXG4gKiAgIF0sXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFuIGFsaWFzIEEgcmVjb3JkIHBvaW50aW5nIHRvIGFuIEF6dXJlIHJlc291cmNlOlxuICogY29uc3QgYWxpYXNSZWNvcmQgPSBuZXcgRG5zQVJlY29yZCh0aGlzLCBcImFsaWFzLWEtcmVjb3JkXCIsIHtcbiAqICAgbmFtZTogXCJ3d3dcIixcbiAqICAgZG5zWm9uZUlkOiB6b25lLmlkLFxuICogICB0dGw6IDMwMCxcbiAqICAgdGFyZ2V0UmVzb3VyY2VJZDogcHVibGljSXAuaWQsXG4gKiB9KTtcbiAqXG4gKiBAc3RhYmlsaXR5IHN0YWJsZVxuICovXG5leHBvcnQgY2xhc3MgRG5zQVJlY29yZCBleHRlbmRzIEF6YXBpUmVzb3VyY2Uge1xuICBzdGF0aWMge1xuICAgIEF6YXBpUmVzb3VyY2UucmVnaXN0ZXJTY2hlbWFzKEROU19BX1JFQ09SRF9UWVBFLCBBTExfRE5TX0FfUkVDT1JEX1ZFUlNJT05TKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogRG5zQVJlY29yZFByb3BzO1xuICBwdWJsaWMgcmVhZG9ubHkgaWRPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IGZxZG5PdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRG5zQVJlY29yZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgQSBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBBIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mcWRuT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImZxZG5cIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIEZRRE4gb2YgdGhlIEEgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmlkT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiaWRcIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLmZxZG5PdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJmcWRuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVQYXJlbnRJZChwcm9wczogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgRG5zQVJlY29yZFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLmRuc1pvbmVJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMTgtMDUtMDFcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRE5TX0FfUkVDT1JEX1RZUEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVzTG9jYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1cHBvcnRzVGFncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBEbnNBUmVjb3JkUHJvcHM7XG4gICAgY29uc3QgcHJvcGVydGllczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7XG4gICAgICBUVEw6IHR5cGVkUHJvcHMudHRsID8/IDM2MDAsXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLnJlY29yZHMgJiYgdHlwZWRQcm9wcy5yZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb3BlcnRpZXMuQVJlY29yZHMgPSB0eXBlZFByb3BzLnJlY29yZHMubWFwKChyKSA9PiAoe1xuICAgICAgICBpcHY0QWRkcmVzczogci5pcHY0QWRkcmVzcyxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZWRQcm9wcy50YXJnZXRSZXNvdXJjZUlkKSB7XG4gICAgICBwcm9wZXJ0aWVzLnRhcmdldFJlc291cmNlID0geyBpZDogdHlwZWRQcm9wcy50YXJnZXRSZXNvdXJjZUlkIH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVkUHJvcHMubWV0YWRhdGEgJiYgT2JqZWN0LmtleXModHlwZWRQcm9wcy5tZXRhZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgcHJvcGVydGllcy5tZXRhZGF0YSA9IHR5cGVkUHJvcHMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgRlFETiBvZiB0aGUgcmVjb3JkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZxZG4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWA7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFBQUEgUkVDT1JEXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEVudHJ5IGZvciBhbiBBQUFBIHJlY29yZCB3aXRoIElQdjYgYWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERuc0FhYWFSZWNvcmRFbnRyeSB7XG4gIC8qKlxuICAgKiBUaGUgSVB2NiBhZGRyZXNzIG9mIHRoaXMgQUFBQSByZWNvcmRcbiAgICogQGV4YW1wbGUgXCIyMDAxOmRiODo6MVwiXG4gICAqL1xuICByZWFkb25seSBpcHY2QWRkcmVzczogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIFB1YmxpYyBETlMgQUFBQSBSZWNvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEbnNBYWFhUmVjb3JkUHJvcHMgZXh0ZW5kcyBEbnNSZWNvcmRCYXNlUHJvcHMge1xuICAvKipcbiAgICogQXJyYXkgb2YgQUFBQSByZWNvcmRzIHdpdGggSVB2NiBhZGRyZXNzZXNcbiAgICogRWl0aGVyIHJlY29yZHMgb3IgdGFyZ2V0UmVzb3VyY2VJZCBtdXN0IGJlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb3Jkcz86IERuc0FhYWFSZWNvcmRFbnRyeVtdO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gYW4gQXp1cmUgcmVzb3VyY2UgZnJvbSB3aGVyZSB0aGUgSVAgY29udGVudCBpcyB0YWtlbiAoYWxpYXMgcmVjb3JkKVxuICAgKiBFaXRoZXIgcmVjb3JkcyBvciB0YXJnZXRSZXNvdXJjZUlkIG11c3QgYmUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRSZXNvdXJjZUlkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEF6dXJlIFB1YmxpYyBETlMgQUFBQSBSZWNvcmQgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBBQUFBIHJlY29yZHMgbWFwIGEgaG9zdG5hbWUgdG8gb25lIG9yIG1vcmUgSVB2NiBhZGRyZXNzZXMuXG4gKiBTdXBwb3J0cyBhbGlhcyByZWNvcmRzIHZpYSB0YXJnZXRSZXNvdXJjZUlkIGZvciBwb2ludGluZyB0byBBenVyZSByZXNvdXJjZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhbiBBQUFBIHJlY29yZDpcbiAqIGNvbnN0IGFhYWFSZWNvcmQgPSBuZXcgRG5zQWFhYVJlY29yZCh0aGlzLCBcIndlYi1hYWFhLXJlY29yZFwiLCB7XG4gKiAgIG5hbWU6IFwid3d3XCIsXG4gKiAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAqICAgdHRsOiAzMDAsXG4gKiAgIHJlY29yZHM6IFtcbiAqICAgICB7IGlwdjZBZGRyZXNzOiBcIjIwMDE6ZGI4OjoxXCIgfSxcbiAqICAgXSxcbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBEbnNBYWFhUmVjb3JkIGV4dGVuZHMgQXphcGlSZXNvdXJjZSB7XG4gIHN0YXRpYyB7XG4gICAgQXphcGlSZXNvdXJjZS5yZWdpc3RlclNjaGVtYXMoXG4gICAgICBETlNfQUFBQV9SRUNPUkRfVFlQRSxcbiAgICAgIEFMTF9ETlNfQUFBQV9SRUNPUkRfVkVSU0lPTlMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogRG5zQWFhYVJlY29yZFByb3BzO1xuICBwdWJsaWMgcmVhZG9ubHkgaWRPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IGZxZG5PdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRG5zQWFhYVJlY29yZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgQUFBQSBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBBQUFBIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mcWRuT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImZxZG5cIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIEZRRE4gb2YgdGhlIEFBQUEgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmlkT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiaWRcIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLmZxZG5PdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJmcWRuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVQYXJlbnRJZChwcm9wczogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgRG5zQWFhYVJlY29yZFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLmRuc1pvbmVJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMTgtMDUtMDFcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRE5TX0FBQUFfUkVDT1JEX1RZUEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVzTG9jYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1cHBvcnRzVGFncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBEbnNBYWFhUmVjb3JkUHJvcHM7XG4gICAgY29uc3QgcHJvcGVydGllczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7XG4gICAgICBUVEw6IHR5cGVkUHJvcHMudHRsID8/IDM2MDAsXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLnJlY29yZHMgJiYgdHlwZWRQcm9wcy5yZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb3BlcnRpZXMuQUFBQVJlY29yZHMgPSB0eXBlZFByb3BzLnJlY29yZHMubWFwKChyKSA9PiAoe1xuICAgICAgICBpcHY2QWRkcmVzczogci5pcHY2QWRkcmVzcyxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZWRQcm9wcy50YXJnZXRSZXNvdXJjZUlkKSB7XG4gICAgICBwcm9wZXJ0aWVzLnRhcmdldFJlc291cmNlID0geyBpZDogdHlwZWRQcm9wcy50YXJnZXRSZXNvdXJjZUlkIH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVkUHJvcHMubWV0YWRhdGEgJiYgT2JqZWN0LmtleXModHlwZWRQcm9wcy5tZXRhZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgcHJvcGVydGllcy5tZXRhZGF0YSA9IHR5cGVkUHJvcHMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgRlFETiBvZiB0aGUgcmVjb3JkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZxZG4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWA7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENBQSBSRUNPUkQgKFBVQkxJQyBETlMgT05MWSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRW50cnkgZm9yIGEgQ0FBIHJlY29yZCAoQ2VydGlmaWNhdGUgQXV0aG9yaXR5IEF1dGhvcml6YXRpb24pXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG5zQ2FhUmVjb3JkRW50cnkge1xuICAvKipcbiAgICogRmxhZ3MgZm9yIHRoaXMgQ0FBIHJlY29yZCAoMC0yNTUpXG4gICAqIDAgPSBub24tY3JpdGljYWwsIDEyOCA9IGNyaXRpY2FsXG4gICAqIEBleGFtcGxlIDBcbiAgICovXG4gIHJlYWRvbmx5IGZsYWdzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSB0YWcgZm9yIHRoaXMgQ0FBIHJlY29yZFxuICAgKiBDb21tb24gdmFsdWVzOiBcImlzc3VlXCIsIFwiaXNzdWV3aWxkXCIsIFwiaW9kZWZcIlxuICAgKiBAZXhhbXBsZSBcImlzc3VlXCJcbiAgICovXG4gIHJlYWRvbmx5IHRhZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWdcbiAgICogQGV4YW1wbGUgXCJsZXRzZW5jcnlwdC5vcmdcIlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBQdWJsaWMgRE5TIENBQSBSZWNvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEbnNDYWFSZWNvcmRQcm9wcyBleHRlbmRzIERuc1JlY29yZEJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBDQUEgcmVjb3JkcyB3aXRoIGZsYWdzLCB0YWcsIGFuZCB2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb3JkczogRG5zQ2FhUmVjb3JkRW50cnlbXTtcbn1cblxuLyoqXG4gKiBBenVyZSBQdWJsaWMgRE5TIENBQSBSZWNvcmQgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBDQUEgcmVjb3JkcyBzcGVjaWZ5IHdoaWNoIENlcnRpZmljYXRlIEF1dGhvcml0aWVzIGFyZSBhdXRob3JpemVkIHRvIGlzc3VlXG4gKiBjZXJ0aWZpY2F0ZXMgZm9yIGEgZG9tYWluLiBUaGlzIHJlY29yZCB0eXBlIGlzIG9ubHkgYXZhaWxhYmxlIGluIFB1YmxpYyBETlMgWm9uZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIENBQSByZWNvcmQgdG8gYXV0aG9yaXplIExldCdzIEVuY3J5cHQ6XG4gKiBjb25zdCBjYWFSZWNvcmQgPSBuZXcgRG5zQ2FhUmVjb3JkKHRoaXMsIFwiY2FhLXJlY29yZFwiLCB7XG4gKiAgIG5hbWU6IFwiQFwiLFxuICogICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gKiAgIHR0bDogMzYwMCxcbiAqICAgcmVjb3JkczogW1xuICogICAgIHsgZmxhZ3M6IDAsIHRhZzogXCJpc3N1ZVwiLCB2YWx1ZTogXCJsZXRzZW5jcnlwdC5vcmdcIiB9LFxuICogICAgIHsgZmxhZ3M6IDAsIHRhZzogXCJpc3N1ZXdpbGRcIiwgdmFsdWU6IFwiO1wiIH0sIC8vIERpc2FsbG93IHdpbGRjYXJkIGNlcnRzXG4gKiAgICAgeyBmbGFnczogMCwgdGFnOiBcImlvZGVmXCIsIHZhbHVlOiBcIm1haWx0bzpzZWN1cml0eUBleGFtcGxlLmNvbVwiIH0sXG4gKiAgIF0sXG4gKiB9KTtcbiAqXG4gKiBAc3RhYmlsaXR5IHN0YWJsZVxuICovXG5leHBvcnQgY2xhc3MgRG5zQ2FhUmVjb3JkIGV4dGVuZHMgQXphcGlSZXNvdXJjZSB7XG4gIHN0YXRpYyB7XG4gICAgQXphcGlSZXNvdXJjZS5yZWdpc3RlclNjaGVtYXMoXG4gICAgICBETlNfQ0FBX1JFQ09SRF9UWVBFLFxuICAgICAgQUxMX0ROU19DQUFfUkVDT1JEX1ZFUlNJT05TLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgcHJvcHM6IERuc0NhYVJlY29yZFByb3BzO1xuICBwdWJsaWMgcmVhZG9ubHkgaWRPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IGZxZG5PdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRG5zQ2FhUmVjb3JkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICB0aGlzLmlkT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImlkXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmlkLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIElEIG9mIHRoZSBDQUEgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5hbWVPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5uYW1lfWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbmFtZSBvZiB0aGUgQ0FBIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mcWRuT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImZxZG5cIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIEZRRE4gb2YgdGhlIENBQSBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuaWRPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJpZFwiKTtcbiAgICB0aGlzLm5hbWVPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJuYW1lXCIpO1xuICAgIHRoaXMuZnFkbk91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImZxZG5cIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBEbnNDYWFSZWNvcmRQcm9wcztcbiAgICByZXR1cm4gdHlwZWRQcm9wcy5kbnNab25lSWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCIyMDE4LTA1LTAxXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEROU19DQUFfUkVDT1JEX1RZUEU7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBpU2NoZW1hKCk6IEFwaVNjaGVtYSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlcXVpcmVzTG9jYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1cHBvcnRzVGFncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBEbnNDYWFSZWNvcmRQcm9wcztcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHtcbiAgICAgIFRUTDogdHlwZWRQcm9wcy50dGwgPz8gMzYwMCxcbiAgICAgIGNhYVJlY29yZHM6IHR5cGVkUHJvcHMucmVjb3Jkcy5tYXAoKHIpID0+ICh7XG4gICAgICAgIGZsYWdzOiByLmZsYWdzLFxuICAgICAgICB0YWc6IHIudGFnLFxuICAgICAgICB2YWx1ZTogci52YWx1ZSxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVkUHJvcHMubWV0YWRhdGEgJiYgT2JqZWN0LmtleXModHlwZWRQcm9wcy5tZXRhZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgcHJvcGVydGllcy5tZXRhZGF0YSA9IHR5cGVkUHJvcHMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgRlFETiBvZiB0aGUgcmVjb3JkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZxZG4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWA7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENOQU1FIFJFQ09SRFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBQdWJsaWMgRE5TIENOQU1FIFJlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERuc0NuYW1lUmVjb3JkUHJvcHMgZXh0ZW5kcyBEbnNSZWNvcmRCYXNlUHJvcHMge1xuICAvKipcbiAgICogVGhlIGNhbm9uaWNhbCBuYW1lIGZvciB0aGlzIENOQU1FIHJlY29yZFxuICAgKiBFaXRoZXIgY25hbWUgb3IgdGFyZ2V0UmVzb3VyY2VJZCBtdXN0IGJlIHNwZWNpZmllZFxuICAgKiBAZXhhbXBsZSBcInd3dy5jb250b3NvLmNvbVwiXG4gICAqL1xuICByZWFkb25seSBjbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIGFuIEF6dXJlIHJlc291cmNlIGZyb20gd2hlcmUgdGhlIEROUyBjb250ZW50IGlzIHRha2VuIChhbGlhcyByZWNvcmQpXG4gICAqIEVpdGhlciBjbmFtZSBvciB0YXJnZXRSZXNvdXJjZUlkIG11c3QgYmUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRSZXNvdXJjZUlkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEF6dXJlIFB1YmxpYyBETlMgQ05BTUUgUmVjb3JkIGltcGxlbWVudGF0aW9uXG4gKlxuICogQ05BTUUgcmVjb3JkcyBjcmVhdGUgYW4gYWxpYXMgZnJvbSBvbmUgaG9zdG5hbWUgdG8gYW5vdGhlci5cbiAqIFN1cHBvcnRzIGFsaWFzIHJlY29yZHMgdmlhIHRhcmdldFJlc291cmNlSWQgZm9yIHBvaW50aW5nIHRvIEF6dXJlIHJlc291cmNlcy5cbiAqIE5vdGU6IENOQU1FIHJlY29yZHMgY2Fubm90IGNvZXhpc3Qgd2l0aCBvdGhlciByZWNvcmQgdHlwZXMgYXQgdGhlIHNhbWUgbmFtZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgQ05BTUUgcmVjb3JkOlxuICogY29uc3QgY25hbWVSZWNvcmQgPSBuZXcgRG5zQ25hbWVSZWNvcmQodGhpcywgXCJhbGlhcy1yZWNvcmRcIiwge1xuICogICBuYW1lOiBcImFwcFwiLFxuICogICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gKiAgIHR0bDogMzYwMCxcbiAqICAgY25hbWU6IFwid3d3LmV4YW1wbGUuY29tXCIsXG4gKiB9KTtcbiAqXG4gKiBAc3RhYmlsaXR5IHN0YWJsZVxuICovXG5leHBvcnQgY2xhc3MgRG5zQ25hbWVSZWNvcmQgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAgc3RhdGljIHtcbiAgICBBemFwaVJlc291cmNlLnJlZ2lzdGVyU2NoZW1hcyhcbiAgICAgIEROU19DTkFNRV9SRUNPUkRfVFlQRSxcbiAgICAgIEFMTF9ETlNfQ05BTUVfUkVDT1JEX1ZFUlNJT05TLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgcHJvcHM6IERuc0NuYW1lUmVjb3JkUHJvcHM7XG4gIHB1YmxpYyByZWFkb25seSBpZE91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZU91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgZnFkbk91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEbnNDbmFtZVJlY29yZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgQ05BTUUgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5hbWVPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5uYW1lfWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbmFtZSBvZiB0aGUgQ05BTUUgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZxZG5PdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiZnFkblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRlFETiBvZiB0aGUgQ05BTUUgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmlkT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiaWRcIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLmZxZG5PdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJmcWRuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVQYXJlbnRJZChwcm9wczogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgRG5zQ25hbWVSZWNvcmRQcm9wcztcbiAgICByZXR1cm4gdHlwZWRQcm9wcy5kbnNab25lSWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCIyMDE4LTA1LTAxXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEROU19DTkFNRV9SRUNPUkRfVFlQRTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVxdWlyZXNMb2NhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3VwcG9ydHNUYWdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIERuc0NuYW1lUmVjb3JkUHJvcHM7XG4gICAgY29uc3QgcHJvcGVydGllczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7XG4gICAgICBUVEw6IHR5cGVkUHJvcHMudHRsID8/IDM2MDAsXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLmNuYW1lKSB7XG4gICAgICBwcm9wZXJ0aWVzLkNOQU1FUmVjb3JkID0geyBjbmFtZTogdHlwZWRQcm9wcy5jbmFtZSB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlZFByb3BzLnRhcmdldFJlc291cmNlSWQpIHtcbiAgICAgIHByb3BlcnRpZXMudGFyZ2V0UmVzb3VyY2UgPSB7IGlkOiB0eXBlZFByb3BzLnRhcmdldFJlc291cmNlSWQgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZWRQcm9wcy5tZXRhZGF0YSAmJiBPYmplY3Qua2V5cyh0eXBlZFByb3BzLm1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICBwcm9wZXJ0aWVzLm1ldGFkYXRhID0gdHlwZWRQcm9wcy5tZXRhZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBwcm9wZXJ0aWVzIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBGUUROIG9mIHRoZSByZWNvcmRcbiAgICovXG4gIHB1YmxpYyBnZXQgZnFkbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm91dHB1dC5wcm9wZXJ0aWVzLmZxZG59YDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTVggUkVDT1JEXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEVudHJ5IGZvciBhbiBNWCByZWNvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEbnNNeFJlY29yZEVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBwcmVmZXJlbmNlIHZhbHVlIGZvciB0aGlzIE1YIHJlY29yZCAobG93ZXIgdmFsdWVzIGhhdmUgaGlnaGVyIHByaW9yaXR5KVxuICAgKiBAZXhhbXBsZSAxMFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZmVyZW5jZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWFpbCBleGNoYW5nZSBzZXJ2ZXIgaG9zdG5hbWVcbiAgICogQGV4YW1wbGUgXCJtYWlsMS5leGFtcGxlLmNvbVwiXG4gICAqL1xuICByZWFkb25seSBleGNoYW5nZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIFB1YmxpYyBETlMgTVggUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG5zTXhSZWNvcmRQcm9wcyBleHRlbmRzIERuc1JlY29yZEJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBNWCByZWNvcmRzIHdpdGggZXhjaGFuZ2UgYW5kIHByZWZlcmVuY2VcbiAgICovXG4gIHJlYWRvbmx5IHJlY29yZHM6IERuc014UmVjb3JkRW50cnlbXTtcbn1cblxuLyoqXG4gKiBBenVyZSBQdWJsaWMgRE5TIE1YIFJlY29yZCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIE1YIHJlY29yZHMgc3BlY2lmeSBtYWlsIGV4Y2hhbmdlIHNlcnZlcnMgZm9yIGEgZG9tYWluLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYW4gTVggcmVjb3JkOlxuICogY29uc3QgbXhSZWNvcmQgPSBuZXcgRG5zTXhSZWNvcmQodGhpcywgXCJtYWlsLXJlY29yZFwiLCB7XG4gKiAgIG5hbWU6IFwiQFwiLFxuICogICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gKiAgIHR0bDogMzYwMCxcbiAqICAgcmVjb3JkczogW1xuICogICAgIHsgcHJlZmVyZW5jZTogMTAsIGV4Y2hhbmdlOiBcIm1haWwxLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgICB7IHByZWZlcmVuY2U6IDIwLCBleGNoYW5nZTogXCJtYWlsMi5leGFtcGxlLmNvbVwiIH0sXG4gKiAgIF0sXG4gKiB9KTtcbiAqXG4gKiBAc3RhYmlsaXR5IHN0YWJsZVxuICovXG5leHBvcnQgY2xhc3MgRG5zTXhSZWNvcmQgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAgc3RhdGljIHtcbiAgICBBemFwaVJlc291cmNlLnJlZ2lzdGVyU2NoZW1hcyhcbiAgICAgIEROU19NWF9SRUNPUkRfVFlQRSxcbiAgICAgIEFMTF9ETlNfTVhfUkVDT1JEX1ZFUlNJT05TLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgcHJvcHM6IERuc014UmVjb3JkUHJvcHM7XG4gIHB1YmxpYyByZWFkb25seSBpZE91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZU91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgZnFkbk91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEbnNNeFJlY29yZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgTVggUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5hbWVPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5uYW1lfWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbmFtZSBvZiB0aGUgTVggUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZxZG5PdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiZnFkblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRlFETiBvZiB0aGUgTVggUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmlkT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiaWRcIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLmZxZG5PdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJmcWRuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVQYXJlbnRJZChwcm9wczogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgRG5zTXhSZWNvcmRQcm9wcztcbiAgICByZXR1cm4gdHlwZWRQcm9wcy5kbnNab25lSWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCIyMDE4LTA1LTAxXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEROU19NWF9SRUNPUkRfVFlQRTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVxdWlyZXNMb2NhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3VwcG9ydHNUYWdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIERuc014UmVjb3JkUHJvcHM7XG4gICAgY29uc3QgcHJvcGVydGllczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7XG4gICAgICBUVEw6IHR5cGVkUHJvcHMudHRsID8/IDM2MDAsXG4gICAgICBNWFJlY29yZHM6IHR5cGVkUHJvcHMucmVjb3Jkcy5tYXAoKHIpID0+ICh7XG4gICAgICAgIHByZWZlcmVuY2U6IHIucHJlZmVyZW5jZSxcbiAgICAgICAgZXhjaGFuZ2U6IHIuZXhjaGFuZ2UsXG4gICAgICB9KSksXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLm1ldGFkYXRhICYmIE9iamVjdC5rZXlzKHR5cGVkUHJvcHMubWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb3BlcnRpZXMubWV0YWRhdGEgPSB0eXBlZFByb3BzLm1ldGFkYXRhO1xuICAgIH1cblxuICAgIHJldHVybiB7IHByb3BlcnRpZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEZRRE4gb2YgdGhlIHJlY29yZFxuICAgKi9cbiAgcHVibGljIGdldCBmcWRuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBOUyBSRUNPUkQgKFBVQkxJQyBETlMgT05MWSlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRW50cnkgZm9yIGFuIE5TIHJlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERuc05zUmVjb3JkRW50cnkge1xuICAvKipcbiAgICogVGhlIG5hbWUgc2VydmVyIGRvbWFpbiBuYW1lXG4gICAqIEBleGFtcGxlIFwibnMxLmV4YW1wbGUuY29tXCJcbiAgICovXG4gIHJlYWRvbmx5IG5zZG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBQdWJsaWMgRE5TIE5TIFJlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERuc05zUmVjb3JkUHJvcHMgZXh0ZW5kcyBEbnNSZWNvcmRCYXNlUHJvcHMge1xuICAvKipcbiAgICogQXJyYXkgb2YgTlMgcmVjb3JkcyB3aXRoIG5zZG5hbWUgdmFsdWVzXG4gICAqL1xuICByZWFkb25seSByZWNvcmRzOiBEbnNOc1JlY29yZEVudHJ5W107XG59XG5cbi8qKlxuICogQXp1cmUgUHVibGljIEROUyBOUyBSZWNvcmQgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBOUyByZWNvcmRzIHNwZWNpZnkgdGhlIGF1dGhvcml0YXRpdmUgbmFtZSBzZXJ2ZXJzIGZvciBhIGRvbWFpbiBvciBzdWJkb21haW4uXG4gKiBUaGlzIHJlY29yZCB0eXBlIGlzIG9ubHkgYXZhaWxhYmxlIGluIFB1YmxpYyBETlMgWm9uZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhbiBOUyByZWNvcmQgZm9yIGEgc3ViZG9tYWluIGRlbGVnYXRpb246XG4gKiBjb25zdCBuc1JlY29yZCA9IG5ldyBEbnNOc1JlY29yZCh0aGlzLCBcIm5zLXJlY29yZFwiLCB7XG4gKiAgIG5hbWU6IFwic3ViZG9tYWluXCIsXG4gKiAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAqICAgdHRsOiAzNjAwLFxuICogICByZWNvcmRzOiBbXG4gKiAgICAgeyBuc2RuYW1lOiBcIm5zMS5zdWJkb21haW4uZXhhbXBsZS5jb21cIiB9LFxuICogICAgIHsgbnNkbmFtZTogXCJuczIuc3ViZG9tYWluLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgXSxcbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBEbnNOc1JlY29yZCBleHRlbmRzIEF6YXBpUmVzb3VyY2Uge1xuICBzdGF0aWMge1xuICAgIEF6YXBpUmVzb3VyY2UucmVnaXN0ZXJTY2hlbWFzKFxuICAgICAgRE5TX05TX1JFQ09SRF9UWVBFLFxuICAgICAgQUxMX0ROU19OU19SRUNPUkRfVkVSU0lPTlMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogRG5zTnNSZWNvcmRQcm9wcztcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBmcWRuT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERuc05zUmVjb3JkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICB0aGlzLmlkT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImlkXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmlkLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIElEIG9mIHRoZSBOUyBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBOUyBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuZnFkbk91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJmcWRuXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm91dHB1dC5wcm9wZXJ0aWVzLmZxZG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBGUUROIG9mIHRoZSBOUyBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuaWRPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJpZFwiKTtcbiAgICB0aGlzLm5hbWVPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJuYW1lXCIpO1xuICAgIHRoaXMuZnFkbk91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImZxZG5cIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBEbnNOc1JlY29yZFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLmRuc1pvbmVJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMTgtMDUtMDFcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRE5TX05TX1JFQ09SRF9UWVBFO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFwaVNjaGVtYSgpOiBBcGlTY2hlbWEge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVTY2hlbWEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXF1aXJlc0xvY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdXBwb3J0c1RhZ3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc291cmNlQm9keShwcm9wczogYW55KTogYW55IHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgRG5zTnNSZWNvcmRQcm9wcztcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHtcbiAgICAgIFRUTDogdHlwZWRQcm9wcy50dGwgPz8gMzYwMCxcbiAgICAgIE5TUmVjb3JkczogdHlwZWRQcm9wcy5yZWNvcmRzLm1hcCgocikgPT4gKHtcbiAgICAgICAgbnNkbmFtZTogci5uc2RuYW1lLFxuICAgICAgfSkpLFxuICAgIH07XG5cbiAgICBpZiAodHlwZWRQcm9wcy5tZXRhZGF0YSAmJiBPYmplY3Qua2V5cyh0eXBlZFByb3BzLm1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICBwcm9wZXJ0aWVzLm1ldGFkYXRhID0gdHlwZWRQcm9wcy5tZXRhZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBwcm9wZXJ0aWVzIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBGUUROIG9mIHRoZSByZWNvcmRcbiAgICovXG4gIHB1YmxpYyBnZXQgZnFkbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm91dHB1dC5wcm9wZXJ0aWVzLmZxZG59YDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUFRSIFJFQ09SRFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBFbnRyeSBmb3IgYSBQVFIgcmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG5zUHRyUmVjb3JkRW50cnkge1xuICAvKipcbiAgICogVGhlIFBUUiB0YXJnZXQgZG9tYWluIG5hbWVcbiAgICogQGV4YW1wbGUgXCJzZXJ2ZXIxLmV4YW1wbGUuY29tXCJcbiAgICovXG4gIHJlYWRvbmx5IHB0cmRuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgUHVibGljIEROUyBQVFIgUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG5zUHRyUmVjb3JkUHJvcHMgZXh0ZW5kcyBEbnNSZWNvcmRCYXNlUHJvcHMge1xuICAvKipcbiAgICogQXJyYXkgb2YgUFRSIHJlY29yZHMgd2l0aCBwdHJkbmFtZSB2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHJlY29yZHM6IERuc1B0clJlY29yZEVudHJ5W107XG59XG5cbi8qKlxuICogQXp1cmUgUHVibGljIEROUyBQVFIgUmVjb3JkIGltcGxlbWVudGF0aW9uXG4gKlxuICogUFRSIHJlY29yZHMgYXJlIHVzZWQgZm9yIHJldmVyc2UgRE5TIGxvb2t1cHMsIG1hcHBpbmcgSVAgYWRkcmVzc2VzIHRvIGhvc3RuYW1lcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgUFRSIHJlY29yZDpcbiAqIGNvbnN0IHB0clJlY29yZCA9IG5ldyBEbnNQdHJSZWNvcmQodGhpcywgXCJwdHItcmVjb3JkXCIsIHtcbiAqICAgbmFtZTogXCI1MFwiLFxuICogICBkbnNab25lSWQ6IHJldmVyc2Vab25lLmlkLFxuICogICB0dGw6IDM2MDAsXG4gKiAgIHJlY29yZHM6IFtcbiAqICAgICB7IHB0cmRuYW1lOiBcInNlcnZlcjEuZXhhbXBsZS5jb21cIiB9LFxuICogICBdLFxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGNsYXNzIERuc1B0clJlY29yZCBleHRlbmRzIEF6YXBpUmVzb3VyY2Uge1xuICBzdGF0aWMge1xuICAgIEF6YXBpUmVzb3VyY2UucmVnaXN0ZXJTY2hlbWFzKFxuICAgICAgRE5TX1BUUl9SRUNPUkRfVFlQRSxcbiAgICAgIEFMTF9ETlNfUFRSX1JFQ09SRF9WRVJTSU9OUyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHByb3BzOiBEbnNQdHJSZWNvcmRQcm9wcztcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBmcWRuT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERuc1B0clJlY29yZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgUFRSIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uYW1lT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ubmFtZX1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5hbWUgb2YgdGhlIFBUUiBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuZnFkbk91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJmcWRuXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm91dHB1dC5wcm9wZXJ0aWVzLmZxZG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBGUUROIG9mIHRoZSBQVFIgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmlkT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiaWRcIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLmZxZG5PdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJmcWRuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVQYXJlbnRJZChwcm9wczogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgRG5zUHRyUmVjb3JkUHJvcHM7XG4gICAgcmV0dXJuIHR5cGVkUHJvcHMuZG5zWm9uZUlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiMjAxOC0wNS0wMVwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc291cmNlVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBETlNfUFRSX1JFQ09SRF9UWVBFO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFwaVNjaGVtYSgpOiBBcGlTY2hlbWEge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVTY2hlbWEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXF1aXJlc0xvY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdXBwb3J0c1RhZ3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc291cmNlQm9keShwcm9wczogYW55KTogYW55IHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgRG5zUHRyUmVjb3JkUHJvcHM7XG4gICAgY29uc3QgcHJvcGVydGllczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gPSB7XG4gICAgICBUVEw6IHR5cGVkUHJvcHMudHRsID8/IDM2MDAsXG4gICAgICBQVFJSZWNvcmRzOiB0eXBlZFByb3BzLnJlY29yZHMubWFwKChyKSA9PiAoe1xuICAgICAgICBwdHJkbmFtZTogci5wdHJkbmFtZSxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVkUHJvcHMubWV0YWRhdGEgJiYgT2JqZWN0LmtleXModHlwZWRQcm9wcy5tZXRhZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgcHJvcGVydGllcy5tZXRhZGF0YSA9IHR5cGVkUHJvcHMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgRlFETiBvZiB0aGUgcmVjb3JkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZxZG4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWA7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNPQSBSRUNPUkRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU09BIHJlY29yZCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG5zU29hUmVjb3JkQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBkb21haW4gbmFtZSBvZiB0aGUgYXV0aG9yaXRhdGl2ZSBuYW1lIHNlcnZlclxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVtYWlsIGNvbnRhY3QgZm9yIHRoaXMgem9uZSAod2l0aCBAIHJlcGxhY2VkIGJ5IC4pXG4gICAqIEBleGFtcGxlIFwiYWRtaW4uZXhhbXBsZS5jb21cIiAoZm9yIGFkbWluQGV4YW1wbGUuY29tKVxuICAgKi9cbiAgcmVhZG9ubHkgZW1haWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJpYWwgbnVtYmVyIGZvciB0aGlzIHpvbmVcbiAgICovXG4gIHJlYWRvbmx5IHNlcmlhbE51bWJlcj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlZnJlc2ggdGltZSBpbiBzZWNvbmRzXG4gICAqL1xuICByZWFkb25seSByZWZyZXNoVGltZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJldHJ5IHRpbWUgaW4gc2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnlUaW1lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwaXJlIHRpbWUgaW4gc2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgZXhwaXJlVGltZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gVFRMIGluIHNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1UVEw/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgUHVibGljIEROUyBTT0EgUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG5zU29hUmVjb3JkUHJvcHMgZXh0ZW5kcyBEbnNSZWNvcmRCYXNlUHJvcHMge1xuICAvKipcbiAgICogU09BIHJlY29yZCBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBzb2FSZWNvcmQ6IERuc1NvYVJlY29yZENvbmZpZztcbn1cblxuLyoqXG4gKiBBenVyZSBQdWJsaWMgRE5TIFNPQSBSZWNvcmQgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBTT0EgcmVjb3JkcyBjb250YWluIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uIGFib3V0IGEgRE5TIHpvbmUuXG4gKiBOb3RlOiBFYWNoIHpvbmUgYXV0b21hdGljYWxseSBoYXMgYW4gU09BIHJlY29yZDsgdGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB0byB1cGRhdGUgaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFVwZGF0ZSB0aGUgU09BIHJlY29yZDpcbiAqIGNvbnN0IHNvYVJlY29yZCA9IG5ldyBEbnNTb2FSZWNvcmQodGhpcywgXCJzb2EtcmVjb3JkXCIsIHtcbiAqICAgbmFtZTogXCJAXCIsXG4gKiAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAqICAgdHRsOiAzNjAwLFxuICogICBzb2FSZWNvcmQ6IHtcbiAqICAgICBlbWFpbDogXCJhZG1pbi5leGFtcGxlLmNvbVwiLFxuICogICAgIHJlZnJlc2hUaW1lOiAzNjAwLFxuICogICAgIHJldHJ5VGltZTogMzAwLFxuICogICAgIGV4cGlyZVRpbWU6IDI0MTkyMDAsXG4gKiAgICAgbWluaW11bVRUTDogMzAwLFxuICogICB9LFxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGNsYXNzIERuc1NvYVJlY29yZCBleHRlbmRzIEF6YXBpUmVzb3VyY2Uge1xuICBzdGF0aWMge1xuICAgIEF6YXBpUmVzb3VyY2UucmVnaXN0ZXJTY2hlbWFzKFxuICAgICAgRE5TX1NPQV9SRUNPUkRfVFlQRSxcbiAgICAgIEFMTF9ETlNfU09BX1JFQ09SRF9WRVJTSU9OUyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHByb3BzOiBEbnNTb2FSZWNvcmRQcm9wcztcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBmcWRuT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERuc1NvYVJlY29yZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5pZE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJpZFwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBJRCBvZiB0aGUgU09BIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uYW1lT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ubmFtZX1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5hbWUgb2YgdGhlIFNPQSBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMuZnFkbk91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJmcWRuXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm91dHB1dC5wcm9wZXJ0aWVzLmZxZG59YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBGUUROIG9mIHRoZSBTT0EgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmlkT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiaWRcIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLmZxZG5PdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJmcWRuXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVQYXJlbnRJZChwcm9wczogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgRG5zU29hUmVjb3JkUHJvcHM7XG4gICAgcmV0dXJuIHR5cGVkUHJvcHMuZG5zWm9uZUlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiMjAxOC0wNS0wMVwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc291cmNlVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBETlNfU09BX1JFQ09SRF9UWVBFO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFwaVNjaGVtYSgpOiBBcGlTY2hlbWEge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVTY2hlbWEoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXF1aXJlc0xvY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdXBwb3J0c1RhZ3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc291cmNlQm9keShwcm9wczogYW55KTogYW55IHtcbiAgICBjb25zdCB0eXBlZFByb3BzID0gcHJvcHMgYXMgRG5zU29hUmVjb3JkUHJvcHM7XG4gICAgY29uc3Qgc29hUmVjb3JkOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSA9IHt9O1xuXG4gICAgaWYgKHR5cGVkUHJvcHMuc29hUmVjb3JkLmhvc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc29hUmVjb3JkLmhvc3QgPSB0eXBlZFByb3BzLnNvYVJlY29yZC5ob3N0O1xuICAgIH1cbiAgICBpZiAodHlwZWRQcm9wcy5zb2FSZWNvcmQuZW1haWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc29hUmVjb3JkLmVtYWlsID0gdHlwZWRQcm9wcy5zb2FSZWNvcmQuZW1haWw7XG4gICAgfVxuICAgIGlmICh0eXBlZFByb3BzLnNvYVJlY29yZC5zZXJpYWxOdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc29hUmVjb3JkLnNlcmlhbE51bWJlciA9IHR5cGVkUHJvcHMuc29hUmVjb3JkLnNlcmlhbE51bWJlcjtcbiAgICB9XG4gICAgaWYgKHR5cGVkUHJvcHMuc29hUmVjb3JkLnJlZnJlc2hUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNvYVJlY29yZC5yZWZyZXNoVGltZSA9IHR5cGVkUHJvcHMuc29hUmVjb3JkLnJlZnJlc2hUaW1lO1xuICAgIH1cbiAgICBpZiAodHlwZWRQcm9wcy5zb2FSZWNvcmQucmV0cnlUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNvYVJlY29yZC5yZXRyeVRpbWUgPSB0eXBlZFByb3BzLnNvYVJlY29yZC5yZXRyeVRpbWU7XG4gICAgfVxuICAgIGlmICh0eXBlZFByb3BzLnNvYVJlY29yZC5leHBpcmVUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNvYVJlY29yZC5leHBpcmVUaW1lID0gdHlwZWRQcm9wcy5zb2FSZWNvcmQuZXhwaXJlVGltZTtcbiAgICB9XG4gICAgaWYgKHR5cGVkUHJvcHMuc29hUmVjb3JkLm1pbmltdW1UVEwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc29hUmVjb3JkLm1pbmltdW1UVEwgPSB0eXBlZFByb3BzLnNvYVJlY29yZC5taW5pbXVtVFRMO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge1xuICAgICAgVFRMOiB0eXBlZFByb3BzLnR0bCA/PyAzNjAwLFxuICAgICAgU09BUmVjb3JkOiBzb2FSZWNvcmQsXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLm1ldGFkYXRhICYmIE9iamVjdC5rZXlzKHR5cGVkUHJvcHMubWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb3BlcnRpZXMubWV0YWRhdGEgPSB0eXBlZFByb3BzLm1ldGFkYXRhO1xuICAgIH1cblxuICAgIHJldHVybiB7IHByb3BlcnRpZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEZRRE4gb2YgdGhlIHJlY29yZFxuICAgKi9cbiAgcHVibGljIGdldCBmcWRuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTUlYgUkVDT1JEXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEVudHJ5IGZvciBhbiBTUlYgcmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG5zU3J2UmVjb3JkRW50cnkge1xuICAvKipcbiAgICogVGhlIHByaW9yaXR5IG9mIHRoaXMgU1JWIHJlY29yZCAobG93ZXIgdmFsdWVzIGhhdmUgaGlnaGVyIHByaW9yaXR5KVxuICAgKi9cbiAgcmVhZG9ubHkgcHJpb3JpdHk6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHdlaWdodCBvZiB0aGlzIFNSViByZWNvcmQgKHVzZWQgZm9yIGxvYWQgYmFsYW5jaW5nIGFtb25nIHJlY29yZHMgd2l0aCBzYW1lIHByaW9yaXR5KVxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3J0IG51bWJlciBmb3IgdGhlIHNlcnZpY2VcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBob3N0bmFtZSBwcm92aWRpbmcgdGhlIHNlcnZpY2VcbiAgICogQGV4YW1wbGUgXCJzaXBzZXJ2ZXIuZXhhbXBsZS5jb21cIlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgUHVibGljIEROUyBTUlYgUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG5zU3J2UmVjb3JkUHJvcHMgZXh0ZW5kcyBEbnNSZWNvcmRCYXNlUHJvcHMge1xuICAvKipcbiAgICogQXJyYXkgb2YgU1JWIHJlY29yZHMgd2l0aCBwcmlvcml0eSwgd2VpZ2h0LCBwb3J0LCBhbmQgdGFyZ2V0XG4gICAqL1xuICByZWFkb25seSByZWNvcmRzOiBEbnNTcnZSZWNvcmRFbnRyeVtdO1xufVxuXG4vKipcbiAqIEF6dXJlIFB1YmxpYyBETlMgU1JWIFJlY29yZCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIFNSViByZWNvcmRzIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHNlcnZpY2VzIGxpa2UgU0lQLCBYTVBQLCBldGMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhbiBTUlYgcmVjb3JkIGZvciBhIFNJUCBzZXJ2aWNlOlxuICogY29uc3Qgc3J2UmVjb3JkID0gbmV3IERuc1NydlJlY29yZCh0aGlzLCBcInNpcC1yZWNvcmRcIiwge1xuICogICBuYW1lOiBcIl9zaXAuX3RjcFwiLFxuICogICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gKiAgIHR0bDogMzYwMCxcbiAqICAgcmVjb3JkczogW1xuICogICAgIHsgcHJpb3JpdHk6IDEwLCB3ZWlnaHQ6IDYwLCBwb3J0OiA1MDYwLCB0YXJnZXQ6IFwic2lwc2VydmVyMS5leGFtcGxlLmNvbVwiIH0sXG4gKiAgICAgeyBwcmlvcml0eTogMTAsIHdlaWdodDogNDAsIHBvcnQ6IDUwNjAsIHRhcmdldDogXCJzaXBzZXJ2ZXIyLmV4YW1wbGUuY29tXCIgfSxcbiAqICAgXSxcbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBEbnNTcnZSZWNvcmQgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAgc3RhdGljIHtcbiAgICBBemFwaVJlc291cmNlLnJlZ2lzdGVyU2NoZW1hcyhcbiAgICAgIEROU19TUlZfUkVDT1JEX1RZUEUsXG4gICAgICBBTExfRE5TX1NSVl9SRUNPUkRfVkVSU0lPTlMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogRG5zU3J2UmVjb3JkUHJvcHM7XG4gIHB1YmxpYyByZWFkb25seSBpZE91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZU91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgZnFkbk91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEbnNTcnZSZWNvcmRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMuaWRPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiaWRcIiwge1xuICAgICAgdmFsdWU6IHRoaXMuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgSUQgb2YgdGhlIFNSViBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBTUlYgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZxZG5PdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiZnFkblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRlFETiBvZiB0aGUgU1JWIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pZE91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImlkXCIpO1xuICAgIHRoaXMubmFtZU91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcIm5hbWVcIik7XG4gICAgdGhpcy5mcWRuT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiZnFkblwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlUGFyZW50SWQocHJvcHM6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIERuc1NydlJlY29yZFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLmRuc1pvbmVJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMTgtMDUtMDFcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRE5TX1NSVl9SRUNPUkRfVFlQRTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVxdWlyZXNMb2NhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3VwcG9ydHNUYWdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIERuc1NydlJlY29yZFByb3BzO1xuICAgIGNvbnN0IHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge1xuICAgICAgVFRMOiB0eXBlZFByb3BzLnR0bCA/PyAzNjAwLFxuICAgICAgU1JWUmVjb3JkczogdHlwZWRQcm9wcy5yZWNvcmRzLm1hcCgocikgPT4gKHtcbiAgICAgICAgcHJpb3JpdHk6IHIucHJpb3JpdHksXG4gICAgICAgIHdlaWdodDogci53ZWlnaHQsXG4gICAgICAgIHBvcnQ6IHIucG9ydCxcbiAgICAgICAgdGFyZ2V0OiByLnRhcmdldCxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVkUHJvcHMubWV0YWRhdGEgJiYgT2JqZWN0LmtleXModHlwZWRQcm9wcy5tZXRhZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgcHJvcGVydGllcy5tZXRhZGF0YSA9IHR5cGVkUHJvcHMubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJvcGVydGllcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgRlFETiBvZiB0aGUgcmVjb3JkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZxZG4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWA7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRYVCBSRUNPUkRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRW50cnkgZm9yIGEgVFhUIHJlY29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERuc1R4dFJlY29yZEVudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoaXMgVFhUIHJlY29yZCAoYXJyYXkgb2Ygc3RyaW5ncywgZWFjaCB1cCB0byAyNTUgY2hhcnMpXG4gICAqIExvbmcgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IHNwbGl0IGludG8gbXVsdGlwbGUgc3RyaW5nc1xuICAgKiBAZXhhbXBsZSBbXCJ2PXNwZjEgaW5jbHVkZTpzcGYucHJvdGVjdGlvbi5vdXRsb29rLmNvbSAtYWxsXCJdXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nW107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgUHVibGljIEROUyBUWFQgUmVjb3JkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG5zVHh0UmVjb3JkUHJvcHMgZXh0ZW5kcyBEbnNSZWNvcmRCYXNlUHJvcHMge1xuICAvKipcbiAgICogQXJyYXkgb2YgVFhUIHJlY29yZHMgd2l0aCBzdHJpbmcgdmFsdWVzXG4gICAqL1xuICByZWFkb25seSByZWNvcmRzOiBEbnNUeHRSZWNvcmRFbnRyeVtdO1xufVxuXG4vKipcbiAqIEF6dXJlIFB1YmxpYyBETlMgVFhUIFJlY29yZCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIFRYVCByZWNvcmRzIHN0b3JlIGFyYml0cmFyeSB0ZXh0IGRhdGEsIGNvbW1vbmx5IHVzZWQgZm9yIFNQRiwgREtJTSwgZG9tYWluIHZlcmlmaWNhdGlvbiwgZXRjLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBUWFQgcmVjb3JkIGZvciBTUEY6XG4gKiBjb25zdCB0eHRSZWNvcmQgPSBuZXcgRG5zVHh0UmVjb3JkKHRoaXMsIFwic3BmLXJlY29yZFwiLCB7XG4gKiAgIG5hbWU6IFwiQFwiLFxuICogICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gKiAgIHR0bDogMzYwMCxcbiAqICAgcmVjb3JkczogW1xuICogICAgIHsgdmFsdWU6IFtcInY9c3BmMSBpbmNsdWRlOnNwZi5wcm90ZWN0aW9uLm91dGxvb2suY29tIC1hbGxcIl0gfSxcbiAqICAgXSxcbiAqIH0pO1xuICpcbiAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gKi9cbmV4cG9ydCBjbGFzcyBEbnNUeHRSZWNvcmQgZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAgc3RhdGljIHtcbiAgICBBemFwaVJlc291cmNlLnJlZ2lzdGVyU2NoZW1hcyhcbiAgICAgIEROU19UWFRfUkVDT1JEX1RZUEUsXG4gICAgICBBTExfRE5TX1RYVF9SRUNPUkRfVkVSU0lPTlMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwcm9wczogRG5zVHh0UmVjb3JkUHJvcHM7XG4gIHB1YmxpYyByZWFkb25seSBpZE91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZU91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgZnFkbk91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEbnNUeHRSZWNvcmRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMuaWRPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiaWRcIiwge1xuICAgICAgdmFsdWU6IHRoaXMuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgSUQgb2YgdGhlIFRYVCBSZWNvcmRcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZU91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHZhbHVlOiBgXFwkeyR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5mcW59Lm5hbWV9YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBuYW1lIG9mIHRoZSBUWFQgUmVjb3JkXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZxZG5PdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiZnFkblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5vdXRwdXQucHJvcGVydGllcy5mcWRufWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRlFETiBvZiB0aGUgVFhUIFJlY29yZFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pZE91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImlkXCIpO1xuICAgIHRoaXMubmFtZU91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcIm5hbWVcIik7XG4gICAgdGhpcy5mcWRuT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiZnFkblwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlUGFyZW50SWQocHJvcHM6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIERuc1R4dFJlY29yZFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLmRuc1pvbmVJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMTgtMDUtMDFcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRE5TX1RYVF9SRUNPUkRfVFlQRTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVxdWlyZXNMb2NhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3VwcG9ydHNUYWdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIERuc1R4dFJlY29yZFByb3BzO1xuICAgIGNvbnN0IHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge1xuICAgICAgVFRMOiB0eXBlZFByb3BzLnR0bCA/PyAzNjAwLFxuICAgICAgVFhUUmVjb3JkczogdHlwZWRQcm9wcy5yZWNvcmRzLm1hcCgocikgPT4gKHtcbiAgICAgICAgdmFsdWU6IHIudmFsdWUsXG4gICAgICB9KSksXG4gICAgfTtcblxuICAgIGlmICh0eXBlZFByb3BzLm1ldGFkYXRhICYmIE9iamVjdC5rZXlzKHR5cGVkUHJvcHMubWV0YWRhdGEpLmxlbmd0aCA+IDApIHtcbiAgICAgIHByb3BlcnRpZXMubWV0YWRhdGEgPSB0eXBlZFByb3BzLm1ldGFkYXRhO1xuICAgIH1cblxuICAgIHJldHVybiB7IHByb3BlcnRpZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIEZRRE4gb2YgdGhlIHJlY29yZFxuICAgKi9cbiAgcHVibGljIGdldCBmcWRuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMuZnFkbn1gO1xuICB9XG59XG4iXX0=
|