@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.
Files changed (121) hide show
  1. package/.jsii +46476 -27231
  2. package/API.md +68443 -28286
  3. package/lib/azure-actiongroup/lib/action-group.js +1 -1
  4. package/lib/azure-activitylogalert/lib/activity-log-alert.js +1 -1
  5. package/lib/azure-aks/lib/aks-cluster.js +1 -1
  6. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +1 -1
  7. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +1 -1
  8. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +1 -1
  9. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +1 -1
  10. package/lib/azure-dnsresolver/lib/dns-resolver.js +1 -1
  11. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +1 -1
  12. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +1 -1
  13. package/lib/azure-dnszone/lib/dns-zone.js +1 -1
  14. package/lib/azure-dnszone/lib/index.d.ts +1 -0
  15. package/lib/azure-dnszone/lib/index.js +2 -1
  16. package/lib/azure-dnszone/lib/records/dns-record-schemas.d.ts +68 -0
  17. package/lib/azure-dnszone/lib/records/dns-record-schemas.js +813 -0
  18. package/lib/azure-dnszone/lib/records/dns-records.d.ts +688 -0
  19. package/lib/azure-dnszone/lib/records/dns-records.js +924 -0
  20. package/lib/azure-dnszone/lib/records/index.d.ts +19 -0
  21. package/lib/azure-dnszone/lib/records/index.js +38 -0
  22. package/lib/azure-dnszone/test/dns-records.integ.d.ts +21 -0
  23. package/lib/azure-dnszone/test/dns-records.integ.js +321 -0
  24. package/lib/azure-dnszone/test/dns-records.spec.d.ts +20 -0
  25. package/lib/azure-dnszone/test/dns-records.spec.js +950 -0
  26. package/lib/azure-loganalyticsworkspace/index.d.ts +6 -0
  27. package/lib/azure-loganalyticsworkspace/index.js +23 -0
  28. package/lib/azure-loganalyticsworkspace/lib/index.d.ts +5 -0
  29. package/lib/azure-loganalyticsworkspace/lib/index.js +22 -0
  30. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.d.ts +51 -0
  31. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.js +255 -0
  32. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.d.ts +301 -0
  33. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.js +213 -0
  34. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.d.ts +9 -0
  35. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.js +71 -0
  36. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.d.ts +8 -0
  37. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.js +504 -0
  38. package/lib/azure-metricalert/lib/metric-alert.js +1 -1
  39. package/lib/azure-networkinterface/lib/network-interface.js +1 -1
  40. package/lib/azure-networksecuritygroup/lib/network-security-group.js +1 -1
  41. package/lib/azure-networkwatcher/index.d.ts +14 -0
  42. package/lib/azure-networkwatcher/index.js +31 -0
  43. package/lib/azure-networkwatcher/lib/index.d.ts +5 -0
  44. package/lib/azure-networkwatcher/lib/index.js +22 -0
  45. package/lib/azure-networkwatcher/lib/network-watcher-schemas.d.ts +47 -0
  46. package/lib/azure-networkwatcher/lib/network-watcher-schemas.js +167 -0
  47. package/lib/azure-networkwatcher/lib/network-watcher.d.ts +181 -0
  48. package/lib/azure-networkwatcher/lib/network-watcher.js +187 -0
  49. package/lib/azure-networkwatcher/test/network-watcher.integ.d.ts +12 -0
  50. package/lib/azure-networkwatcher/test/network-watcher.integ.js +84 -0
  51. package/lib/azure-networkwatcher/test/network-watcher.spec.d.ts +8 -0
  52. package/lib/azure-networkwatcher/test/network-watcher.spec.js +312 -0
  53. package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
  54. package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
  55. package/lib/azure-policysetdefinition/index.d.ts +10 -0
  56. package/lib/azure-policysetdefinition/index.js +27 -0
  57. package/lib/azure-policysetdefinition/lib/index.d.ts +5 -0
  58. package/lib/azure-policysetdefinition/lib/index.js +22 -0
  59. package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.d.ts +50 -0
  60. package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.js +255 -0
  61. package/lib/azure-policysetdefinition/lib/policy-set-definition.d.ts +426 -0
  62. package/lib/azure-policysetdefinition/lib/policy-set-definition.js +255 -0
  63. package/lib/azure-policysetdefinition/test/policy-set-definition.integ.d.ts +9 -0
  64. package/lib/azure-policysetdefinition/test/policy-set-definition.integ.js +56 -0
  65. package/lib/azure-policysetdefinition/test/policy-set-definition.spec.d.ts +8 -0
  66. package/lib/azure-policysetdefinition/test/policy-set-definition.spec.js +745 -0
  67. package/lib/azure-privatednszone/lib/index.d.ts +1 -0
  68. package/lib/azure-privatednszone/lib/index.js +2 -1
  69. package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +0 -2
  70. package/lib/azure-privatednszone/lib/private-dns-zone.js +6 -13
  71. package/lib/azure-privatednszone/lib/records/index.d.ts +7 -0
  72. package/lib/azure-privatednszone/lib/records/index.js +26 -0
  73. package/lib/azure-privatednszone/lib/records/private-dns-record-schemas.d.ts +52 -0
  74. package/lib/azure-privatednszone/lib/records/private-dns-record-schemas.js +683 -0
  75. package/lib/azure-privatednszone/lib/records/private-dns-records.d.ts +523 -0
  76. package/lib/azure-privatednszone/lib/records/private-dns-records.js +739 -0
  77. package/lib/azure-privatednszone/test/private-dns-records.integ.d.ts +19 -0
  78. package/lib/azure-privatednszone/test/private-dns-records.integ.js +245 -0
  79. package/lib/azure-privatednszone/test/private-dns-records.spec.d.ts +18 -0
  80. package/lib/azure-privatednszone/test/private-dns-records.spec.js +756 -0
  81. package/lib/azure-privatednszone/test/private-dns-zone.spec.js +5 -5
  82. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
  83. package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
  84. package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
  85. package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
  86. package/lib/azure-roledefinition/lib/role-definition.js +1 -1
  87. package/lib/azure-storageaccount/lib/storage-account.js +1 -1
  88. package/lib/azure-subnet/lib/subnet.js +1 -1
  89. package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
  90. package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
  91. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.js +2 -2
  92. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.d.ts +4 -2
  93. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +8 -5
  94. package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.js +109 -1
  95. package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection.js +1 -1
  96. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
  97. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +1 -1
  98. package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +1 -1
  99. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
  100. package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
  101. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
  102. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
  103. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
  104. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +1 -1
  105. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
  106. package/lib/core-azure/lib/azapi/azapi-resource.js +4 -4
  107. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  108. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  109. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +1 -1
  110. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  111. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  112. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  113. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +1 -1
  114. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  115. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  116. package/lib/index.d.ts +23 -0
  117. package/lib/index.js +25 -2
  118. package/lib/testing/index.js +2 -2
  119. package/lib/testing/lib/cleanup.js +1 -1
  120. package/lib/testing/lib/metadata.js +1 -1
  121. 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=