@microsoft/terraform-cdk-constructs 1.4.0 → 1.6.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 (78) hide show
  1. package/.jsii +12910 -8935
  2. package/API.md +31954 -26602
  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-metricalert/lib/metric-alert.js +1 -1
  15. package/lib/azure-networkinterface/lib/network-interface.js +1 -1
  16. package/lib/azure-networksecuritygroup/lib/network-security-group.js +1 -1
  17. package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
  18. package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
  19. package/lib/azure-privatednszone/lib/private-dns-zone.js +1 -1
  20. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
  21. package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
  22. package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
  23. package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
  24. package/lib/azure-roledefinition/lib/role-definition.js +1 -1
  25. package/lib/azure-storageaccount/lib/storage-account.js +1 -1
  26. package/lib/azure-subnet/lib/subnet.js +1 -1
  27. package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
  28. package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
  29. package/lib/azure-virtualnetworkgateway/index.d.ts +4 -0
  30. package/lib/azure-virtualnetworkgateway/index.js +21 -0
  31. package/lib/azure-virtualnetworkgateway/lib/index.d.ts +5 -0
  32. package/lib/azure-virtualnetworkgateway/lib/index.js +22 -0
  33. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.d.ts +32 -0
  34. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.js +298 -0
  35. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.d.ts +368 -0
  36. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +285 -0
  37. package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.integ.d.ts +12 -0
  38. package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.integ.js +129 -0
  39. package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.d.ts +8 -0
  40. package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.js +691 -0
  41. package/lib/azure-virtualnetworkgatewayconnection/index.d.ts +6 -0
  42. package/lib/azure-virtualnetworkgatewayconnection/index.js +23 -0
  43. package/lib/azure-virtualnetworkgatewayconnection/lib/index.d.ts +8 -0
  44. package/lib/azure-virtualnetworkgatewayconnection/lib/index.js +25 -0
  45. package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection-schemas.d.ts +32 -0
  46. package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection-schemas.js +322 -0
  47. package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection.d.ts +333 -0
  48. package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection.js +310 -0
  49. package/lib/azure-virtualnetworkgatewayconnection/test/virtual-network-gateway-connection.integ.d.ts +12 -0
  50. package/lib/azure-virtualnetworkgatewayconnection/test/virtual-network-gateway-connection.integ.js +216 -0
  51. package/lib/azure-virtualnetworkgatewayconnection/test/virtual-network-gateway-connection.spec.d.ts +8 -0
  52. package/lib/azure-virtualnetworkgatewayconnection/test/virtual-network-gateway-connection.spec.js +706 -0
  53. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
  54. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +1 -1
  55. package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +1 -1
  56. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
  57. package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
  58. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
  59. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
  60. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
  61. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +1 -1
  62. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
  63. package/lib/core-azure/lib/azapi/azapi-resource.js +2 -2
  64. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  65. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  66. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +1 -1
  67. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  68. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  69. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  70. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +1 -1
  71. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  72. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  73. package/lib/index.d.ts +4 -0
  74. package/lib/index.js +6 -2
  75. package/lib/testing/index.js +2 -2
  76. package/lib/testing/lib/cleanup.js +1 -1
  77. package/lib/testing/lib/metadata.js +1 -1
  78. package/package.json +1 -1
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.VirtualNetworkGatewayConnection = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ /**
7
+ * Azure Virtual Network Gateway Connection implementation using AzapiResource framework
8
+ *
9
+ * This class provides a unified implementation for Azure Virtual Network Gateway Connections that
10
+ * automatically handles version management, schema validation, and property
11
+ * transformation across all supported API versions.
12
+ *
13
+ * Supported API Versions:
14
+ * - 2024-01-01 (Active)
15
+ * - 2024-05-01 (Active, Latest)
16
+ *
17
+ * Features:
18
+ * - Automatic latest version resolution when no version is specified
19
+ * - Explicit version pinning for stability requirements
20
+ * - Schema-driven validation and transformation
21
+ * - Type-safe connection type handling using discriminated unions
22
+ * - Full backward compatibility
23
+ * - JSII compliance for multi-language support
24
+ */
25
+ const cdktf = require("cdktf");
26
+ const virtual_network_gateway_connection_schemas_1 = require("./virtual-network-gateway-connection-schemas");
27
+ const azapi_resource_1 = require("../../core-azure/lib/azapi/azapi-resource");
28
+ /**
29
+ * Azure Virtual Network Gateway Connection implementation
30
+ *
31
+ * This class provides a single, version-aware implementation that replaces
32
+ * version-specific Virtual Network Gateway Connection classes. It automatically handles version
33
+ * resolution, schema validation, and property transformation while maintaining
34
+ * full backward compatibility.
35
+ *
36
+ * Virtual Network Gateway Connections establish connectivity between Virtual Network Gateways
37
+ * and other networking endpoints:
38
+ * - IPsec: Site-to-Site VPN connections to on-premises networks
39
+ * - Vnet2Vnet: VNet-to-VNet connections between Azure virtual networks
40
+ * - ExpressRoute: Private connections to Azure via ExpressRoute circuits
41
+ *
42
+ * @example
43
+ * // IPsec (Site-to-Site VPN) Connection:
44
+ * const s2sConnection = new VirtualNetworkGatewayConnection(this, "s2sConnection", {
45
+ * name: "my-s2s-connection",
46
+ * location: "eastus",
47
+ * resourceGroupId: resourceGroup.id,
48
+ * connectionType: "IPsec",
49
+ * virtualNetworkGateway1: { id: vpnGateway.id },
50
+ * localNetworkGateway2: { id: localGateway.id },
51
+ * sharedKey: "mySecureSharedKey123!"
52
+ * });
53
+ *
54
+ * @example
55
+ * // VNet-to-VNet Connection:
56
+ * const vnetConnection = new VirtualNetworkGatewayConnection(this, "vnetConnection", {
57
+ * name: "my-vnet-connection",
58
+ * location: "eastus",
59
+ * resourceGroupId: resourceGroup.id,
60
+ * connectionType: "Vnet2Vnet",
61
+ * virtualNetworkGateway1: { id: vpnGateway1.id },
62
+ * virtualNetworkGateway2: { id: vpnGateway2.id },
63
+ * sharedKey: "mySecureSharedKey123!",
64
+ * enableBgp: true
65
+ * });
66
+ *
67
+ * @example
68
+ * // ExpressRoute Connection:
69
+ * const erConnection = new VirtualNetworkGatewayConnection(this, "erConnection", {
70
+ * name: "my-er-connection",
71
+ * location: "eastus",
72
+ * resourceGroupId: resourceGroup.id,
73
+ * connectionType: "ExpressRoute",
74
+ * virtualNetworkGateway1: { id: erGateway.id },
75
+ * peer: { id: expressRouteCircuit.id },
76
+ * authorizationKey: "optional-auth-key-if-cross-subscription"
77
+ * });
78
+ *
79
+ * @example
80
+ * // IPsec Connection with Custom IPsec Policies:
81
+ * const customConnection = new VirtualNetworkGatewayConnection(this, "customConnection", {
82
+ * name: "my-custom-connection",
83
+ * location: "eastus",
84
+ * resourceGroupId: resourceGroup.id,
85
+ * connectionType: "IPsec",
86
+ * virtualNetworkGateway1: { id: vpnGateway.id },
87
+ * localNetworkGateway2: { id: localGateway.id },
88
+ * sharedKey: "mySecureSharedKey123!",
89
+ * connectionProtocol: "IKEv2",
90
+ * ipsecPolicies: [{
91
+ * dhGroup: "DHGroup14",
92
+ * ikeEncryption: "AES256",
93
+ * ikeIntegrity: "SHA256",
94
+ * ipsecEncryption: "AES256",
95
+ * ipsecIntegrity: "SHA256",
96
+ * pfsGroup: "PFS2048",
97
+ * saLifeTimeSeconds: 3600,
98
+ * saDataSizeKilobytes: 102400000
99
+ * }],
100
+ * usePolicyBasedTrafficSelectors: true
101
+ * });
102
+ *
103
+ * @stability stable
104
+ */
105
+ class VirtualNetworkGatewayConnection extends azapi_resource_1.AzapiResource {
106
+ /**
107
+ * Creates a new Azure Virtual Network Gateway Connection using the AzapiResource framework
108
+ *
109
+ * The constructor automatically handles version resolution, schema registration,
110
+ * validation, and resource creation. It maintains full backward compatibility
111
+ * with existing Virtual Network Gateway Connection implementations.
112
+ *
113
+ * @param scope - The scope in which to define this construct
114
+ * @param id - The unique identifier for this instance
115
+ * @param props - Configuration properties for the Virtual Network Gateway Connection
116
+ */
117
+ constructor(scope, id, props) {
118
+ super(scope, id, props);
119
+ this.props = props;
120
+ // Add timeouts for connection provisioning (typically 30 minutes)
121
+ this.terraformResource.addOverride("timeouts", {
122
+ create: "30m",
123
+ update: "30m",
124
+ delete: "30m",
125
+ });
126
+ // Create Terraform outputs for easy access and referencing from other resources
127
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
128
+ value: this.id,
129
+ description: "The ID of the Virtual Network Gateway Connection",
130
+ });
131
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
132
+ value: `\${${this.terraformResource.fqn}.name}`,
133
+ description: "The name of the Virtual Network Gateway Connection",
134
+ });
135
+ this.locationOutput = new cdktf.TerraformOutput(this, "location", {
136
+ value: `\${${this.terraformResource.fqn}.location}`,
137
+ description: "The location of the Virtual Network Gateway Connection",
138
+ });
139
+ this.tagsOutput = new cdktf.TerraformOutput(this, "tags", {
140
+ value: `\${${this.terraformResource.fqn}.tags}`,
141
+ description: "The tags assigned to the Virtual Network Gateway Connection",
142
+ });
143
+ // Override logical IDs to match original naming convention
144
+ this.idOutput.overrideLogicalId("id");
145
+ this.nameOutput.overrideLogicalId("name");
146
+ this.locationOutput.overrideLogicalId("location");
147
+ this.tagsOutput.overrideLogicalId("tags");
148
+ // Apply ignore changes if specified
149
+ this._applyIgnoreChanges();
150
+ }
151
+ // =============================================================================
152
+ // REQUIRED ABSTRACT METHODS FROM VersionedAzapiResource
153
+ // =============================================================================
154
+ /**
155
+ * Gets the default API version to use when no explicit version is specified
156
+ * Returns the most recent stable version as the default
157
+ */
158
+ defaultVersion() {
159
+ return "2024-05-01";
160
+ }
161
+ /**
162
+ * Gets the Azure resource type for Virtual Network Gateway Connections
163
+ */
164
+ resourceType() {
165
+ return virtual_network_gateway_connection_schemas_1.VIRTUAL_NETWORK_GATEWAY_CONNECTION_TYPE;
166
+ }
167
+ /**
168
+ * Gets the API schema for the resolved version
169
+ * Uses the framework's schema resolution to get the appropriate schema
170
+ */
171
+ apiSchema() {
172
+ return this.resolveSchema();
173
+ }
174
+ /**
175
+ * Indicates that location is required for Virtual Network Gateway Connections
176
+ */
177
+ requiresLocation() {
178
+ return true;
179
+ }
180
+ /**
181
+ * Creates the resource body for the Azure API call
182
+ * Transforms the input properties into the JSON format expected by Azure REST API
183
+ * Handles type-specific properties based on connectionType
184
+ */
185
+ createResourceBody(props) {
186
+ const typedProps = props;
187
+ // Build the properties object based on connection type
188
+ const properties = {
189
+ connectionType: typedProps.connectionType,
190
+ virtualNetworkGateway1: {
191
+ id: typedProps.virtualNetworkGateway1.id,
192
+ properties: {},
193
+ },
194
+ connectionProtocol: typedProps.connectionProtocol || "IKEv2",
195
+ enableBgp: typedProps.enableBgp || false,
196
+ };
197
+ // Add optional common properties
198
+ if (typedProps.routingWeight !== undefined) {
199
+ properties.routingWeight = typedProps.routingWeight;
200
+ }
201
+ if (typedProps.dpdTimeoutSeconds !== undefined) {
202
+ properties.dpdTimeoutSeconds = typedProps.dpdTimeoutSeconds;
203
+ }
204
+ if (typedProps.ipsecPolicies !== undefined) {
205
+ properties.ipsecPolicies = typedProps.ipsecPolicies;
206
+ }
207
+ if (typedProps.usePolicyBasedTrafficSelectors !== undefined) {
208
+ properties.usePolicyBasedTrafficSelectors =
209
+ typedProps.usePolicyBasedTrafficSelectors;
210
+ }
211
+ if (typedProps.connectionMode !== undefined) {
212
+ properties.connectionMode = typedProps.connectionMode;
213
+ }
214
+ if (typedProps.egressNatRules !== undefined) {
215
+ properties.egressNatRules = typedProps.egressNatRules;
216
+ }
217
+ if (typedProps.ingressNatRules !== undefined) {
218
+ properties.ingressNatRules = typedProps.ingressNatRules;
219
+ }
220
+ // Add connection type-specific properties
221
+ switch (typedProps.connectionType) {
222
+ case "IPsec":
223
+ properties.localNetworkGateway2 = {
224
+ id: typedProps.localNetworkGateway2.id,
225
+ properties: {},
226
+ };
227
+ properties.sharedKey = typedProps.sharedKey;
228
+ break;
229
+ case "Vnet2Vnet":
230
+ properties.virtualNetworkGateway2 = {
231
+ id: typedProps.virtualNetworkGateway2.id,
232
+ properties: {},
233
+ };
234
+ properties.sharedKey = typedProps.sharedKey;
235
+ break;
236
+ case "ExpressRoute":
237
+ properties.peer = typedProps.peer;
238
+ if (typedProps.authorizationKey !== undefined) {
239
+ properties.authorizationKey = typedProps.authorizationKey;
240
+ }
241
+ break;
242
+ }
243
+ return {
244
+ location: this.location,
245
+ tags: this.allTags(),
246
+ properties: properties,
247
+ };
248
+ }
249
+ // =============================================================================
250
+ // PUBLIC METHODS FOR VIRTUAL NETWORK GATEWAY CONNECTION OPERATIONS
251
+ // =============================================================================
252
+ /**
253
+ * Get the subscription ID from the Virtual Network Gateway Connection ID
254
+ * Extracts the subscription ID from the Azure resource ID format
255
+ */
256
+ get subscriptionId() {
257
+ const idParts = this.id.split("/");
258
+ const subscriptionIndex = idParts.indexOf("subscriptions");
259
+ if (subscriptionIndex !== -1 && subscriptionIndex + 1 < idParts.length) {
260
+ return idParts[subscriptionIndex + 1];
261
+ }
262
+ throw new Error("Unable to extract subscription ID from Virtual Network Gateway Connection ID");
263
+ }
264
+ /**
265
+ * Get the full resource identifier for use in other Azure resources
266
+ * Alias for the id property to match original interface
267
+ */
268
+ get resourceId() {
269
+ return this.id;
270
+ }
271
+ /**
272
+ * Add a tag to the Virtual Network Gateway Connection
273
+ * Note: This modifies the construct props but requires a new deployment to take effect
274
+ */
275
+ addTag(key, value) {
276
+ if (!this.props.tags) {
277
+ this.props.tags = {};
278
+ }
279
+ this.props.tags[key] = value;
280
+ }
281
+ /**
282
+ * Remove a tag from the Virtual Network Gateway Connection
283
+ * Note: This modifies the construct props but requires a new deployment to take effect
284
+ */
285
+ removeTag(key) {
286
+ if (this.props.tags && this.props.tags[key]) {
287
+ delete this.props.tags[key];
288
+ }
289
+ }
290
+ // =============================================================================
291
+ // PRIVATE HELPER METHODS
292
+ // =============================================================================
293
+ /**
294
+ * Applies ignore changes lifecycle rules if specified in props
295
+ */
296
+ _applyIgnoreChanges() {
297
+ if (this.props.ignoreChanges && this.props.ignoreChanges.length > 0) {
298
+ this.terraformResource.addOverride("lifecycle", {
299
+ ignore_changes: this.props.ignoreChanges,
300
+ });
301
+ }
302
+ }
303
+ }
304
+ exports.VirtualNetworkGatewayConnection = VirtualNetworkGatewayConnection;
305
+ _a = JSII_RTTI_SYMBOL_1;
306
+ VirtualNetworkGatewayConnection[_a] = { fqn: "@microsoft/terraform-cdk-constructs.VirtualNetworkGatewayConnection", version: "1.6.0" };
307
+ (() => {
308
+ azapi_resource_1.AzapiResource.registerSchemas(virtual_network_gateway_connection_schemas_1.VIRTUAL_NETWORK_GATEWAY_CONNECTION_TYPE, virtual_network_gateway_connection_schemas_1.ALL_VIRTUAL_NETWORK_GATEWAY_CONNECTION_VERSIONS);
309
+ })();
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1uZXR3b3JrLWdhdGV3YXktY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9henVyZS12aXJ0dWFsbmV0d29ya2dhdGV3YXljb25uZWN0aW9uL2xpYi92aXJ0dWFsLW5ldHdvcmstZ2F0ZXdheS1jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILCtCQUErQjtBQUUvQiw2R0FHc0Q7QUFDdEQsOEVBR21EO0FBb01uRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRFRztBQUNILE1BQWEsK0JBQWdDLFNBQVEsOEJBQWE7SUFtQmhFOzs7Ozs7Ozs7O09BVUc7SUFDSCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUEyQztRQUUzQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDN0MsTUFBTSxFQUFFLEtBQUs7WUFDYixNQUFNLEVBQUUsS0FBSztZQUNiLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsZ0ZBQWdGO1FBQ2hGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDcEQsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2QsV0FBVyxFQUFFLGtEQUFrRDtTQUNoRSxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO1lB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QzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLHlCQUF5QjtJQUN6QixnRkFBZ0Y7SUFFaEY7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzlDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7O0FBelBILDBFQTBQQzs7O0FBelBDO0lBQ0UsOEJBQWEsQ0FBQyxlQUFlLENBQzNCLG9GQUF1QyxFQUN2Qyw0RkFBK0MsQ0FDaEQsQ0FBQztBQUNKLENBQUMsR0FBQSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBenVyZSBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheSBDb25uZWN0aW9uIGltcGxlbWVudGF0aW9uIHVzaW5nIEF6YXBpUmVzb3VyY2UgZnJhbWV3b3JrXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHVuaWZpZWQgaW1wbGVtZW50YXRpb24gZm9yIEF6dXJlIFZpcnR1YWwgTmV0d29yayBHYXRld2F5IENvbm5lY3Rpb25zIHRoYXRcbiAqIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB2ZXJzaW9uIG1hbmFnZW1lbnQsIHNjaGVtYSB2YWxpZGF0aW9uLCBhbmQgcHJvcGVydHlcbiAqIHRyYW5zZm9ybWF0aW9uIGFjcm9zcyBhbGwgc3VwcG9ydGVkIEFQSSB2ZXJzaW9ucy5cbiAqXG4gKiBTdXBwb3J0ZWQgQVBJIFZlcnNpb25zOlxuICogLSAyMDI0LTAxLTAxIChBY3RpdmUpXG4gKiAtIDIwMjQtMDUtMDEgKEFjdGl2ZSwgTGF0ZXN0KVxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgbGF0ZXN0IHZlcnNpb24gcmVzb2x1dGlvbiB3aGVuIG5vIHZlcnNpb24gaXMgc3BlY2lmaWVkXG4gKiAtIEV4cGxpY2l0IHZlcnNpb24gcGlubmluZyBmb3Igc3RhYmlsaXR5IHJlcXVpcmVtZW50c1xuICogLSBTY2hlbWEtZHJpdmVuIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uXG4gKiAtIFR5cGUtc2FmZSBjb25uZWN0aW9uIHR5cGUgaGFuZGxpbmcgdXNpbmcgZGlzY3JpbWluYXRlZCB1bmlvbnNcbiAqIC0gRnVsbCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gKiAtIEpTSUkgY29tcGxpYW5jZSBmb3IgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydFxuICovXG5cbmltcG9ydCAqIGFzIGNka3RmIGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIEFMTF9WSVJUVUFMX05FVFdPUktfR0FURVdBWV9DT05ORUNUSU9OX1ZFUlNJT05TLFxuICBWSVJUVUFMX05FVFdPUktfR0FURVdBWV9DT05ORUNUSU9OX1RZUEUsXG59IGZyb20gXCIuL3ZpcnR1YWwtbmV0d29yay1nYXRld2F5LWNvbm5lY3Rpb24tc2NoZW1hc1wiO1xuaW1wb3J0IHtcbiAgQXphcGlSZXNvdXJjZSxcbiAgQXphcGlSZXNvdXJjZVByb3BzLFxufSBmcm9tIFwiLi4vLi4vY29yZS1henVyZS9saWIvYXphcGkvYXphcGktcmVzb3VyY2VcIjtcbmltcG9ydCB7IEFwaVNjaGVtYSB9IGZyb20gXCIuLi8uLi9jb3JlLWF6dXJlL2xpYi92ZXJzaW9uLW1hbmFnZXIvaW50ZXJmYWNlcy92ZXJzaW9uLWludGVyZmFjZXNcIjtcblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gYSBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdhdGV3YXlSZWZlcmVuY2Uge1xuICAvKipcbiAgICogUmVzb3VyY2UgSUQgb2YgdGhlIHZpcnR1YWwgbmV0d29yayBnYXRld2F5XG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmVyZW5jZSB0byBhbiBFeHByZXNzUm91dGUgY2lyY3VpdCBwZWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVlclJlZmVyZW5jZSB7XG4gIC8qKlxuICAgKiBSZXNvdXJjZSBJRCBvZiB0aGUgRXhwcmVzc1JvdXRlIGNpcmN1aXRcbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSVBzZWMgcG9saWN5IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcHNlY1BvbGljeSB7XG4gIC8qKlxuICAgKiBESCBHcm91cCBmb3IgSUtFIFBoYXNlIDFcbiAgICogQGV4YW1wbGUgXCJESEdyb3VwMTRcIiwgXCJESEdyb3VwMjA0OFwiLCBcIkVDUDI1NlwiLCBcIkVDUDM4NFwiXG4gICAqL1xuICByZWFkb25seSBkaEdyb3VwOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElLRSBlbmNyeXB0aW9uIGFsZ29yaXRobVxuICAgKiBAZXhhbXBsZSBcIkFFUzEyOFwiLCBcIkFFUzE5MlwiLCBcIkFFUzI1NlwiLCBcIkdDTUFFUzEyOFwiLCBcIkdDTUFFUzI1NlwiXG4gICAqL1xuICByZWFkb25seSBpa2VFbmNyeXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElLRSBpbnRlZ3JpdHkgYWxnb3JpdGhtXG4gICAqIEBleGFtcGxlIFwiU0hBMjU2XCIsIFwiU0hBMzg0XCIsIFwiR0NNQUVTMTI4XCIsIFwiR0NNQUVTMjU2XCJcbiAgICovXG4gIHJlYWRvbmx5IGlrZUludGVncml0eTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJUHNlYyBlbmNyeXB0aW9uIGFsZ29yaXRobVxuICAgKiBAZXhhbXBsZSBcIkFFUzEyOFwiLCBcIkFFUzE5MlwiLCBcIkFFUzI1NlwiLCBcIkdDTUFFUzEyOFwiLCBcIkdDTUFFUzE5MlwiLCBcIkdDTUFFUzI1NlwiXG4gICAqL1xuICByZWFkb25seSBpcHNlY0VuY3J5cHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogSVBzZWMgaW50ZWdyaXR5IGFsZ29yaXRobVxuICAgKiBAZXhhbXBsZSBcIlNIQTI1NlwiLCBcIkdDTUFFUzEyOFwiLCBcIkdDTUFFUzE5MlwiLCBcIkdDTUFFUzI1NlwiXG4gICAqL1xuICByZWFkb25seSBpcHNlY0ludGVncml0eTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQRlMgR3JvdXAgZm9yIElLRSBQaGFzZSAyXG4gICAqIEBleGFtcGxlIFwiTm9uZVwiLCBcIlBGUzFcIiwgXCJQRlMyXCIsIFwiUEZTMjA0OFwiLCBcIkVDUDI1NlwiLCBcIkVDUDM4NFwiLCBcIlBGUzI0XCIsIFwiUEZTMTRcIiwgXCJQRlNNTVwiXG4gICAqL1xuICByZWFkb25seSBwZnNHcm91cDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTQSBsaWZldGltZSBpbiBzZWNvbmRzXG4gICAqIEBleGFtcGxlIDM2MDBcbiAgICovXG4gIHJlYWRvbmx5IHNhTGlmZVRpbWVTZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNBIGRhdGEgc2l6ZSBpbiBraWxvYnl0ZXNcbiAgICogQGV4YW1wbGUgMTAyNDAwMDAwXG4gICAqL1xuICByZWFkb25seSBzYURhdGFTaXplS2lsb2J5dGVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogTkFUIHJ1bGUgcmVmZXJlbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmF0UnVsZVJlZmVyZW5jZSB7XG4gIC8qKlxuICAgKiBSZXNvdXJjZSBJRCBvZiB0aGUgTkFUIHJ1bGVcbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIEF6dXJlIFZpcnR1YWwgTmV0d29yayBHYXRld2F5IENvbm5lY3Rpb25cbiAqXG4gKiBTdXBwb3J0cyB0aHJlZSBjb25uZWN0aW9uIHR5cGVzOiBJUHNlYyAoU2l0ZS10by1TaXRlKSwgVk5ldC10by1WTmV0LCBhbmQgRXhwcmVzc1JvdXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbE5ldHdvcmtHYXRld2F5Q29ubmVjdGlvblByb3BzXG4gIGV4dGVuZHMgQXphcGlSZXNvdXJjZVByb3BzIHtcbiAgLyoqXG4gICAqIENvbm5lY3Rpb24gdHlwZVxuICAgKiBNdXN0IGJlIFwiSVBzZWNcIiwgXCJWbmV0MlZuZXRcIiwgb3IgXCJFeHByZXNzUm91dGVcIlxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvblR5cGU6IFwiSVBzZWNcIiB8IFwiVm5ldDJWbmV0XCIgfCBcIkV4cHJlc3NSb3V0ZVwiO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSBncm91cCBJRCB3aGVyZSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlR3JvdXBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIGZpcnN0IHZpcnR1YWwgbmV0d29yayBnYXRld2F5XG4gICAqIFJlcXVpcmVkIGZvciBhbGwgY29ubmVjdGlvbiB0eXBlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmlydHVhbE5ldHdvcmtHYXRld2F5MTogR2F0ZXdheVJlZmVyZW5jZTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBsb2NhbCBuZXR3b3JrIGdhdGV3YXlcbiAgICogUmVxdWlyZWQgZm9yIElQc2VjIGNvbm5lY3Rpb25zIG9ubHlcbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsTmV0d29ya0dhdGV3YXkyPzogR2F0ZXdheVJlZmVyZW5jZTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBzZWNvbmQgdmlydHVhbCBuZXR3b3JrIGdhdGV3YXlcbiAgICogUmVxdWlyZWQgZm9yIFZuZXQyVm5ldCBjb25uZWN0aW9ucyBvbmx5XG4gICAqL1xuICByZWFkb25seSB2aXJ0dWFsTmV0d29ya0dhdGV3YXkyPzogR2F0ZXdheVJlZmVyZW5jZTtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBFeHByZXNzUm91dGUgY2lyY3VpdFxuICAgKiBSZXF1aXJlZCBmb3IgRXhwcmVzc1JvdXRlIGNvbm5lY3Rpb25zIG9ubHlcbiAgICovXG4gIHJlYWRvbmx5IHBlZXI/OiBQZWVyUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBTaGFyZWQga2V5IGZvciB0aGUgY29ubmVjdGlvblxuICAgKiBSZXF1aXJlZCBmb3IgSVBzZWMgYW5kIFZuZXQyVm5ldCBjb25uZWN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmVkS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBdXRob3JpemF0aW9uIGtleSBmb3IgdGhlIEV4cHJlc3NSb3V0ZSBjaXJjdWl0XG4gICAqIE9wdGlvbmFsIC0gZm9yIGNyb3NzLXN1YnNjcmlwdGlvbiBFeHByZXNzUm91dGUgY29ubmVjdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcml6YXRpb25LZXk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbm5lY3Rpb24gcHJvdG9jb2wgdG8gdXNlXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJJS0V2MlwiXG4gICAqL1xuICByZWFkb25seSBjb25uZWN0aW9uUHJvdG9jb2w/OiBcIklLRXYyXCIgfCBcIklLRXYxXCI7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBCR1AgZm9yIHRoZSBjb25uZWN0aW9uXG4gICAqIEBkZWZhdWx0VmFsdWUgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUJncD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJvdXRpbmcgd2VpZ2h0IGZvciB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGluZ1dlaWdodD86IG51bWJlcjtcblxuICAvKipcbiAgICogRFBEIHRpbWVvdXQgaW4gc2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgZHBkVGltZW91dFNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBJUHNlYyBwb2xpY2llc1xuICAgKi9cbiAgcmVhZG9ubHkgaXBzZWNQb2xpY2llcz86IElwc2VjUG9saWN5W107XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBwb2xpY3ktYmFzZWQgdHJhZmZpYyBzZWxlY3RvcnNcbiAgICogQGRlZmF1bHRWYWx1ZSBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlUG9saWN5QmFzZWRUcmFmZmljU2VsZWN0b3JzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29ubmVjdGlvbiBtb2RlXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJEZWZhdWx0XCJcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25Nb2RlPzogXCJEZWZhdWx0XCIgfCBcIlJlc3BvbmRlck9ubHlcIiB8IFwiSW5pdGlhdG9yT25seVwiO1xuXG4gIC8qKlxuICAgKiBFZ3Jlc3MgTkFUIHJ1bGVzXG4gICAqL1xuICByZWFkb25seSBlZ3Jlc3NOYXRSdWxlcz86IE5hdFJ1bGVSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogSW5ncmVzcyBOQVQgcnVsZXNcbiAgICovXG4gIHJlYWRvbmx5IGluZ3Jlc3NOYXRSdWxlcz86IE5hdFJ1bGVSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIGxpZmVjeWNsZSBydWxlcyB0byBpZ25vcmUgY2hhbmdlc1xuICAgKiBAZXhhbXBsZSBbXCJ0YWdzXCJdXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVDaGFuZ2VzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQXp1cmUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvbiBpbXBsZW1lbnRhdGlvblxuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzaW5nbGUsIHZlcnNpb24tYXdhcmUgaW1wbGVtZW50YXRpb24gdGhhdCByZXBsYWNlc1xuICogdmVyc2lvbi1zcGVjaWZpYyBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheSBDb25uZWN0aW9uIGNsYXNzZXMuIEl0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB2ZXJzaW9uXG4gKiByZXNvbHV0aW9uLCBzY2hlbWEgdmFsaWRhdGlvbiwgYW5kIHByb3BlcnR5IHRyYW5zZm9ybWF0aW9uIHdoaWxlIG1haW50YWluaW5nXG4gKiBmdWxsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKlxuICogVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvbnMgZXN0YWJsaXNoIGNvbm5lY3Rpdml0eSBiZXR3ZWVuIFZpcnR1YWwgTmV0d29yayBHYXRld2F5c1xuICogYW5kIG90aGVyIG5ldHdvcmtpbmcgZW5kcG9pbnRzOlxuICogLSBJUHNlYzogU2l0ZS10by1TaXRlIFZQTiBjb25uZWN0aW9ucyB0byBvbi1wcmVtaXNlcyBuZXR3b3Jrc1xuICogLSBWbmV0MlZuZXQ6IFZOZXQtdG8tVk5ldCBjb25uZWN0aW9ucyBiZXR3ZWVuIEF6dXJlIHZpcnR1YWwgbmV0d29ya3NcbiAqIC0gRXhwcmVzc1JvdXRlOiBQcml2YXRlIGNvbm5lY3Rpb25zIHRvIEF6dXJlIHZpYSBFeHByZXNzUm91dGUgY2lyY3VpdHNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSVBzZWMgKFNpdGUtdG8tU2l0ZSBWUE4pIENvbm5lY3Rpb246XG4gKiBjb25zdCBzMnNDb25uZWN0aW9uID0gbmV3IFZpcnR1YWxOZXR3b3JrR2F0ZXdheUNvbm5lY3Rpb24odGhpcywgXCJzMnNDb25uZWN0aW9uXCIsIHtcbiAqICAgbmFtZTogXCJteS1zMnMtY29ubmVjdGlvblwiLFxuICogICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAqICAgcmVzb3VyY2VHcm91cElkOiByZXNvdXJjZUdyb3VwLmlkLFxuICogICBjb25uZWN0aW9uVHlwZTogXCJJUHNlY1wiLFxuICogICB2aXJ0dWFsTmV0d29ya0dhdGV3YXkxOiB7IGlkOiB2cG5HYXRld2F5LmlkIH0sXG4gKiAgIGxvY2FsTmV0d29ya0dhdGV3YXkyOiB7IGlkOiBsb2NhbEdhdGV3YXkuaWQgfSxcbiAqICAgc2hhcmVkS2V5OiBcIm15U2VjdXJlU2hhcmVkS2V5MTIzIVwiXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVk5ldC10by1WTmV0IENvbm5lY3Rpb246XG4gKiBjb25zdCB2bmV0Q29ubmVjdGlvbiA9IG5ldyBWaXJ0dWFsTmV0d29ya0dhdGV3YXlDb25uZWN0aW9uKHRoaXMsIFwidm5ldENvbm5lY3Rpb25cIiwge1xuICogICBuYW1lOiBcIm15LXZuZXQtY29ubmVjdGlvblwiLFxuICogICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAqICAgcmVzb3VyY2VHcm91cElkOiByZXNvdXJjZUdyb3VwLmlkLFxuICogICBjb25uZWN0aW9uVHlwZTogXCJWbmV0MlZuZXRcIixcbiAqICAgdmlydHVhbE5ldHdvcmtHYXRld2F5MTogeyBpZDogdnBuR2F0ZXdheTEuaWQgfSxcbiAqICAgdmlydHVhbE5ldHdvcmtHYXRld2F5MjogeyBpZDogdnBuR2F0ZXdheTIuaWQgfSxcbiAqICAgc2hhcmVkS2V5OiBcIm15U2VjdXJlU2hhcmVkS2V5MTIzIVwiLFxuICogICBlbmFibGVCZ3A6IHRydWVcbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeHByZXNzUm91dGUgQ29ubmVjdGlvbjpcbiAqIGNvbnN0IGVyQ29ubmVjdGlvbiA9IG5ldyBWaXJ0dWFsTmV0d29ya0dhdGV3YXlDb25uZWN0aW9uKHRoaXMsIFwiZXJDb25uZWN0aW9uXCIsIHtcbiAqICAgbmFtZTogXCJteS1lci1jb25uZWN0aW9uXCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gKiAgIGNvbm5lY3Rpb25UeXBlOiBcIkV4cHJlc3NSb3V0ZVwiLFxuICogICB2aXJ0dWFsTmV0d29ya0dhdGV3YXkxOiB7IGlkOiBlckdhdGV3YXkuaWQgfSxcbiAqICAgcGVlcjogeyBpZDogZXhwcmVzc1JvdXRlQ2lyY3VpdC5pZCB9LFxuICogICBhdXRob3JpemF0aW9uS2V5OiBcIm9wdGlvbmFsLWF1dGgta2V5LWlmLWNyb3NzLXN1YnNjcmlwdGlvblwiXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSVBzZWMgQ29ubmVjdGlvbiB3aXRoIEN1c3RvbSBJUHNlYyBQb2xpY2llczpcbiAqIGNvbnN0IGN1c3RvbUNvbm5lY3Rpb24gPSBuZXcgVmlydHVhbE5ldHdvcmtHYXRld2F5Q29ubmVjdGlvbih0aGlzLCBcImN1c3RvbUNvbm5lY3Rpb25cIiwge1xuICogICBuYW1lOiBcIm15LWN1c3RvbS1jb25uZWN0aW9uXCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gKiAgIGNvbm5lY3Rpb25UeXBlOiBcIklQc2VjXCIsXG4gKiAgIHZpcnR1YWxOZXR3b3JrR2F0ZXdheTE6IHsgaWQ6IHZwbkdhdGV3YXkuaWQgfSxcbiAqICAgbG9jYWxOZXR3b3JrR2F0ZXdheTI6IHsgaWQ6IGxvY2FsR2F0ZXdheS5pZCB9LFxuICogICBzaGFyZWRLZXk6IFwibXlTZWN1cmVTaGFyZWRLZXkxMjMhXCIsXG4gKiAgIGNvbm5lY3Rpb25Qcm90b2NvbDogXCJJS0V2MlwiLFxuICogICBpcHNlY1BvbGljaWVzOiBbe1xuICogICAgIGRoR3JvdXA6IFwiREhHcm91cDE0XCIsXG4gKiAgICAgaWtlRW5jcnlwdGlvbjogXCJBRVMyNTZcIixcbiAqICAgICBpa2VJbnRlZ3JpdHk6IFwiU0hBMjU2XCIsXG4gKiAgICAgaXBzZWNFbmNyeXB0aW9uOiBcIkFFUzI1NlwiLFxuICogICAgIGlwc2VjSW50ZWdyaXR5OiBcIlNIQTI1NlwiLFxuICogICAgIHBmc0dyb3VwOiBcIlBGUzIwNDhcIixcbiAqICAgICBzYUxpZmVUaW1lU2Vjb25kczogMzYwMCxcbiAqICAgICBzYURhdGFTaXplS2lsb2J5dGVzOiAxMDI0MDAwMDBcbiAqICAgfV0sXG4gKiAgIHVzZVBvbGljeUJhc2VkVHJhZmZpY1NlbGVjdG9yczogdHJ1ZVxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGNsYXNzIFZpcnR1YWxOZXR3b3JrR2F0ZXdheUNvbm5lY3Rpb24gZXh0ZW5kcyBBemFwaVJlc291cmNlIHtcbiAgc3RhdGljIHtcbiAgICBBemFwaVJlc291cmNlLnJlZ2lzdGVyU2NoZW1hcyhcbiAgICAgIFZJUlRVQUxfTkVUV09SS19HQVRFV0FZX0NPTk5FQ1RJT05fVFlQRSxcbiAgICAgIEFMTF9WSVJUVUFMX05FVFdPUktfR0FURVdBWV9DT05ORUNUSU9OX1ZFUlNJT05TLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlucHV0IHByb3BlcnRpZXMgZm9yIHRoaXMgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvbiBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BzOiBWaXJ0dWFsTmV0d29ya0dhdGV3YXlDb25uZWN0aW9uUHJvcHM7XG5cbiAgLy8gT3V0cHV0IHByb3BlcnRpZXMgZm9yIGVhc3kgYWNjZXNzIGFuZCByZWZlcmVuY2luZ1xuICBwdWJsaWMgcmVhZG9ubHkgaWRPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWVPdXRwdXQ6IGNka3RmLlRlcnJhZm9ybU91dHB1dDtcbiAgcHVibGljIHJlYWRvbmx5IGxvY2F0aW9uT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSB0YWdzT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQXp1cmUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvbiB1c2luZyB0aGUgQXphcGlSZXNvdXJjZSBmcmFtZXdvcmtcbiAgICpcbiAgICogVGhlIGNvbnN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB2ZXJzaW9uIHJlc29sdXRpb24sIHNjaGVtYSByZWdpc3RyYXRpb24sXG4gICAqIHZhbGlkYXRpb24sIGFuZCByZXNvdXJjZSBjcmVhdGlvbi4gSXQgbWFpbnRhaW5zIGZ1bGwgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgKiB3aXRoIGV4aXN0aW5nIFZpcnR1YWwgTmV0d29yayBHYXRld2F5IENvbm5lY3Rpb24gaW1wbGVtZW50YXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBpbnN0YW5jZVxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheSBDb25uZWN0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFZpcnR1YWxOZXR3b3JrR2F0ZXdheUNvbm5lY3Rpb25Qcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICAvLyBBZGQgdGltZW91dHMgZm9yIGNvbm5lY3Rpb24gcHJvdmlzaW9uaW5nICh0eXBpY2FsbHkgMzAgbWludXRlcylcbiAgICB0aGlzLnRlcnJhZm9ybVJlc291cmNlLmFkZE92ZXJyaWRlKFwidGltZW91dHNcIiwge1xuICAgICAgY3JlYXRlOiBcIjMwbVwiLFxuICAgICAgdXBkYXRlOiBcIjMwbVwiLFxuICAgICAgZGVsZXRlOiBcIjMwbVwiLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIFRlcnJhZm9ybSBvdXRwdXRzIGZvciBlYXN5IGFjY2VzcyBhbmQgcmVmZXJlbmNpbmcgZnJvbSBvdGhlciByZXNvdXJjZXNcbiAgICB0aGlzLmlkT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcImlkXCIsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmlkLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIElEIG9mIHRoZSBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheSBDb25uZWN0aW9uXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5hbWVPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5uYW1lfWAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbmFtZSBvZiB0aGUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvblwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2NhdGlvbk91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJsb2NhdGlvblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5sb2NhdGlvbn1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGxvY2F0aW9uIG9mIHRoZSBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheSBDb25uZWN0aW9uXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhZ3NPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwidGFnc1wiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS50YWdzfWAsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJUaGUgdGFncyBhc3NpZ25lZCB0byB0aGUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvblwiLFxuICAgIH0pO1xuXG4gICAgLy8gT3ZlcnJpZGUgbG9naWNhbCBJRHMgdG8gbWF0Y2ggb3JpZ2luYWwgbmFtaW5nIGNvbnZlbnRpb25cbiAgICB0aGlzLmlkT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiaWRcIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLmxvY2F0aW9uT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibG9jYXRpb25cIik7XG4gICAgdGhpcy50YWdzT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwidGFnc1wiKTtcblxuICAgIC8vIEFwcGx5IGlnbm9yZSBjaGFuZ2VzIGlmIHNwZWNpZmllZFxuICAgIHRoaXMuX2FwcGx5SWdub3JlQ2hhbmdlcygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUkVRVUlSRUQgQUJTVFJBQ1QgTUVUSE9EUyBGUk9NIFZlcnNpb25lZEF6YXBpUmVzb3VyY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZGVmYXVsdCBBUEkgdmVyc2lvbiB0byB1c2Ugd2hlbiBubyBleHBsaWNpdCB2ZXJzaW9uIGlzIHNwZWNpZmllZFxuICAgKiBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBzdGFibGUgdmVyc2lvbiBhcyB0aGUgZGVmYXVsdFxuICAgKi9cbiAgcHJvdGVjdGVkIGRlZmF1bHRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiMjAyNC0wNS0wMVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEF6dXJlIHJlc291cmNlIHR5cGUgZm9yIFZpcnR1YWwgTmV0d29yayBHYXRld2F5IENvbm5lY3Rpb25zXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb3VyY2VUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFZJUlRVQUxfTkVUV09SS19HQVRFV0FZX0NPTk5FQ1RJT05fVFlQRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBUEkgc2NoZW1hIGZvciB0aGUgcmVzb2x2ZWQgdmVyc2lvblxuICAgKiBVc2VzIHRoZSBmcmFtZXdvcmsncyBzY2hlbWEgcmVzb2x1dGlvbiB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIHNjaGVtYVxuICAgKi9cbiAgcHJvdGVjdGVkIGFwaVNjaGVtYSgpOiBBcGlTY2hlbWEge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVTY2hlbWEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCBsb2NhdGlvbiBpcyByZXF1aXJlZCBmb3IgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvbnNcbiAgICovXG4gIHByb3RlY3RlZCByZXF1aXJlc0xvY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHJlc291cmNlIGJvZHkgZm9yIHRoZSBBenVyZSBBUEkgY2FsbFxuICAgKiBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBwcm9wZXJ0aWVzIGludG8gdGhlIEpTT04gZm9ybWF0IGV4cGVjdGVkIGJ5IEF6dXJlIFJFU1QgQVBJXG4gICAqIEhhbmRsZXMgdHlwZS1zcGVjaWZpYyBwcm9wZXJ0aWVzIGJhc2VkIG9uIGNvbm5lY3Rpb25UeXBlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBWaXJ0dWFsTmV0d29ya0dhdGV3YXlDb25uZWN0aW9uUHJvcHM7XG5cbiAgICAvLyBCdWlsZCB0aGUgcHJvcGVydGllcyBvYmplY3QgYmFzZWQgb24gY29ubmVjdGlvbiB0eXBlXG4gICAgY29uc3QgcHJvcGVydGllczogYW55ID0ge1xuICAgICAgY29ubmVjdGlvblR5cGU6IHR5cGVkUHJvcHMuY29ubmVjdGlvblR5cGUsXG4gICAgICB2aXJ0dWFsTmV0d29ya0dhdGV3YXkxOiB7XG4gICAgICAgIGlkOiB0eXBlZFByb3BzLnZpcnR1YWxOZXR3b3JrR2F0ZXdheTEuaWQsXG4gICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgfSxcbiAgICAgIGNvbm5lY3Rpb25Qcm90b2NvbDogdHlwZWRQcm9wcy5jb25uZWN0aW9uUHJvdG9jb2wgfHwgXCJJS0V2MlwiLFxuICAgICAgZW5hYmxlQmdwOiB0eXBlZFByb3BzLmVuYWJsZUJncCB8fCBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIG9wdGlvbmFsIGNvbW1vbiBwcm9wZXJ0aWVzXG4gICAgaWYgKHR5cGVkUHJvcHMucm91dGluZ1dlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wZXJ0aWVzLnJvdXRpbmdXZWlnaHQgPSB0eXBlZFByb3BzLnJvdXRpbmdXZWlnaHQ7XG4gICAgfVxuICAgIGlmICh0eXBlZFByb3BzLmRwZFRpbWVvdXRTZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BlcnRpZXMuZHBkVGltZW91dFNlY29uZHMgPSB0eXBlZFByb3BzLmRwZFRpbWVvdXRTZWNvbmRzO1xuICAgIH1cbiAgICBpZiAodHlwZWRQcm9wcy5pcHNlY1BvbGljaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BlcnRpZXMuaXBzZWNQb2xpY2llcyA9IHR5cGVkUHJvcHMuaXBzZWNQb2xpY2llcztcbiAgICB9XG4gICAgaWYgKHR5cGVkUHJvcHMudXNlUG9saWN5QmFzZWRUcmFmZmljU2VsZWN0b3JzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BlcnRpZXMudXNlUG9saWN5QmFzZWRUcmFmZmljU2VsZWN0b3JzID1cbiAgICAgICAgdHlwZWRQcm9wcy51c2VQb2xpY3lCYXNlZFRyYWZmaWNTZWxlY3RvcnM7XG4gICAgfVxuICAgIGlmICh0eXBlZFByb3BzLmNvbm5lY3Rpb25Nb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BlcnRpZXMuY29ubmVjdGlvbk1vZGUgPSB0eXBlZFByb3BzLmNvbm5lY3Rpb25Nb2RlO1xuICAgIH1cbiAgICBpZiAodHlwZWRQcm9wcy5lZ3Jlc3NOYXRSdWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wZXJ0aWVzLmVncmVzc05hdFJ1bGVzID0gdHlwZWRQcm9wcy5lZ3Jlc3NOYXRSdWxlcztcbiAgICB9XG4gICAgaWYgKHR5cGVkUHJvcHMuaW5ncmVzc05hdFJ1bGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BlcnRpZXMuaW5ncmVzc05hdFJ1bGVzID0gdHlwZWRQcm9wcy5pbmdyZXNzTmF0UnVsZXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNvbm5lY3Rpb24gdHlwZS1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgc3dpdGNoICh0eXBlZFByb3BzLmNvbm5lY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlIFwiSVBzZWNcIjpcbiAgICAgICAgcHJvcGVydGllcy5sb2NhbE5ldHdvcmtHYXRld2F5MiA9IHtcbiAgICAgICAgICBpZDogdHlwZWRQcm9wcy5sb2NhbE5ldHdvcmtHYXRld2F5MiEuaWQsXG4gICAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIH07XG4gICAgICAgIHByb3BlcnRpZXMuc2hhcmVkS2V5ID0gdHlwZWRQcm9wcy5zaGFyZWRLZXk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiVm5ldDJWbmV0XCI6XG4gICAgICAgIHByb3BlcnRpZXMudmlydHVhbE5ldHdvcmtHYXRld2F5MiA9IHtcbiAgICAgICAgICBpZDogdHlwZWRQcm9wcy52aXJ0dWFsTmV0d29ya0dhdGV3YXkyIS5pZCxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgcHJvcGVydGllcy5zaGFyZWRLZXkgPSB0eXBlZFByb3BzLnNoYXJlZEtleTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJFeHByZXNzUm91dGVcIjpcbiAgICAgICAgcHJvcGVydGllcy5wZWVyID0gdHlwZWRQcm9wcy5wZWVyO1xuICAgICAgICBpZiAodHlwZWRQcm9wcy5hdXRob3JpemF0aW9uS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwcm9wZXJ0aWVzLmF1dGhvcml6YXRpb25LZXkgPSB0eXBlZFByb3BzLmF1dGhvcml6YXRpb25LZXk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiB0aGlzLmxvY2F0aW9uLFxuICAgICAgdGFnczogdGhpcy5hbGxUYWdzKCksXG4gICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQVUJMSUMgTUVUSE9EUyBGT1IgVklSVFVBTCBORVRXT1JLIEdBVEVXQVkgQ09OTkVDVElPTiBPUEVSQVRJT05TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3Vic2NyaXB0aW9uIElEIGZyb20gdGhlIFZpcnR1YWwgTmV0d29yayBHYXRld2F5IENvbm5lY3Rpb24gSURcbiAgICogRXh0cmFjdHMgdGhlIHN1YnNjcmlwdGlvbiBJRCBmcm9tIHRoZSBBenVyZSByZXNvdXJjZSBJRCBmb3JtYXRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3Vic2NyaXB0aW9uSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZFBhcnRzID0gdGhpcy5pZC5zcGxpdChcIi9cIik7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uSW5kZXggPSBpZFBhcnRzLmluZGV4T2YoXCJzdWJzY3JpcHRpb25zXCIpO1xuICAgIGlmIChzdWJzY3JpcHRpb25JbmRleCAhPT0gLTEgJiYgc3Vic2NyaXB0aW9uSW5kZXggKyAxIDwgaWRQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBpZFBhcnRzW3N1YnNjcmlwdGlvbkluZGV4ICsgMV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiVW5hYmxlIHRvIGV4dHJhY3Qgc3Vic2NyaXB0aW9uIElEIGZyb20gVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvbiBJRFwiLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmdWxsIHJlc291cmNlIGlkZW50aWZpZXIgZm9yIHVzZSBpbiBvdGhlciBBenVyZSByZXNvdXJjZXNcbiAgICogQWxpYXMgZm9yIHRoZSBpZCBwcm9wZXJ0eSB0byBtYXRjaCBvcmlnaW5hbCBpbnRlcmZhY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHRhZyB0byB0aGUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvblxuICAgKiBOb3RlOiBUaGlzIG1vZGlmaWVzIHRoZSBjb25zdHJ1Y3QgcHJvcHMgYnV0IHJlcXVpcmVzIGEgbmV3IGRlcGxveW1lbnQgdG8gdGFrZSBlZmZlY3RcbiAgICovXG4gIHB1YmxpYyBhZGRUYWcoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJvcHMudGFncykge1xuICAgICAgKHRoaXMucHJvcHMgYXMgYW55KS50YWdzID0ge307XG4gICAgfVxuICAgIHRoaXMucHJvcHMudGFncyFba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhZyBmcm9tIHRoZSBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheSBDb25uZWN0aW9uXG4gICAqIE5vdGU6IFRoaXMgbW9kaWZpZXMgdGhlIGNvbnN0cnVjdCBwcm9wcyBidXQgcmVxdWlyZXMgYSBuZXcgZGVwbG95bWVudCB0byB0YWtlIGVmZmVjdFxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRhZyhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzLnRhZ3MgJiYgdGhpcy5wcm9wcy50YWdzW2tleV0pIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnByb3BzLnRhZ3Nba2V5XTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIEhFTFBFUiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgaWdub3JlIGNoYW5nZXMgbGlmZWN5Y2xlIHJ1bGVzIGlmIHNwZWNpZmllZCBpbiBwcm9wc1xuICAgKi9cbiAgcHJpdmF0ZSBfYXBwbHlJZ25vcmVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzLmlnbm9yZUNoYW5nZXMgJiYgdGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVycmFmb3JtUmVzb3VyY2UuYWRkT3ZlcnJpZGUoXCJsaWZlY3ljbGVcIiwge1xuICAgICAgICBpZ25vcmVfY2hhbmdlczogdGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Integration test for Azure Virtual Network Gateway Connection
3
+ *
4
+ * This test demonstrates basic usage of the VirtualNetworkGatewayConnection construct
5
+ * by creating a VNet-to-VNet connection between two virtual network gateways.
6
+ *
7
+ * Note: Virtual Network Gateways take 30-45 minutes each to provision,
8
+ * so this test has an extended timeout (~120 minutes total).
9
+ *
10
+ * Run with: npm run integration:nostream
11
+ */
12
+ import "cdktf/lib/testing/adapters/jest";
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /**
3
+ * Integration test for Azure Virtual Network Gateway Connection
4
+ *
5
+ * This test demonstrates basic usage of the VirtualNetworkGatewayConnection construct
6
+ * by creating a VNet-to-VNet connection between two virtual network gateways.
7
+ *
8
+ * Note: Virtual Network Gateways take 30-45 minutes each to provision,
9
+ * so this test has an extended timeout (~120 minutes total).
10
+ *
11
+ * Run with: npm run integration:nostream
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ const cdktf_1 = require("cdktf");
15
+ require("cdktf/lib/testing/adapters/jest");
16
+ const azure_publicipaddress_1 = require("../../azure-publicipaddress");
17
+ const azure_resourcegroup_1 = require("../../azure-resourcegroup");
18
+ const azure_subnet_1 = require("../../azure-subnet");
19
+ const azure_virtualnetwork_1 = require("../../azure-virtualnetwork");
20
+ const azure_virtualnetworkgateway_1 = require("../../azure-virtualnetworkgateway");
21
+ const provider_1 = require("../../core-azure/lib/azapi/providers-azapi/provider");
22
+ const testing_1 = require("../../testing");
23
+ const metadata_1 = require("../../testing/lib/metadata");
24
+ const virtual_network_gateway_connection_1 = require("../lib/virtual-network-gateway-connection");
25
+ // Generate unique test run metadata for this test suite
26
+ const testMetadata = new metadata_1.TestRunMetadata("virtual-network-gateway-connection-integration", {
27
+ maxAgeHours: 4,
28
+ });
29
+ /**
30
+ * Example stack demonstrating Virtual Network Gateway Connection usage
31
+ * Creates two gateways and a VNet-to-VNet connection between them
32
+ */
33
+ class VirtualNetworkGatewayConnectionExampleStack extends testing_1.BaseTestStack {
34
+ constructor(scope, id) {
35
+ super(scope, id, {
36
+ testRunOptions: {
37
+ maxAgeHours: testMetadata.maxAgeHours,
38
+ autoCleanup: testMetadata.autoCleanup,
39
+ cleanupPolicy: testMetadata.cleanupPolicy,
40
+ },
41
+ });
42
+ // Configure AZAPI provider
43
+ new provider_1.AzapiProvider(this, "azapi", {});
44
+ // Generate unique names
45
+ const rgName = this.generateResourceName("Microsoft.Resources/resourceGroups", "conn");
46
+ // Create resource group
47
+ const resourceGroup = new azure_resourcegroup_1.ResourceGroup(this, "rg", {
48
+ name: rgName,
49
+ location: "eastus",
50
+ tags: {
51
+ ...this.systemTags(),
52
+ },
53
+ });
54
+ // ===== First Virtual Network and Gateway =====
55
+ const vnet1 = new azure_virtualnetwork_1.VirtualNetwork(this, "vnet1", {
56
+ name: "vnet1-conn-example",
57
+ location: "eastus",
58
+ resourceGroupId: resourceGroup.id,
59
+ addressSpace: {
60
+ addressPrefixes: ["10.1.0.0/16"],
61
+ },
62
+ tags: {
63
+ ...this.systemTags(),
64
+ },
65
+ });
66
+ const gatewaySubnet1 = new azure_subnet_1.Subnet(this, "gateway-subnet1", {
67
+ name: "GatewaySubnet",
68
+ virtualNetworkName: "vnet1-conn-example",
69
+ virtualNetworkId: vnet1.id,
70
+ resourceGroupId: resourceGroup.id,
71
+ addressPrefix: "10.1.1.0/24",
72
+ });
73
+ const publicIp1 = new azure_publicipaddress_1.PublicIPAddress(this, "public-ip1", {
74
+ name: "pip-gateway1-example",
75
+ location: "eastus",
76
+ resourceGroupId: resourceGroup.id,
77
+ sku: {
78
+ name: "Standard",
79
+ tier: "Regional",
80
+ },
81
+ publicIPAllocationMethod: "Static",
82
+ tags: {
83
+ ...this.systemTags(),
84
+ },
85
+ });
86
+ const gateway1 = new azure_virtualnetworkgateway_1.VirtualNetworkGateway(this, "vpn-gateway1", {
87
+ name: "vng1-conn-example",
88
+ location: "eastus",
89
+ resourceGroupId: resourceGroup.id,
90
+ gatewayType: "Vpn",
91
+ vpnType: "RouteBased",
92
+ sku: {
93
+ name: "VpnGw1",
94
+ tier: "VpnGw1",
95
+ },
96
+ ipConfigurations: [
97
+ {
98
+ name: "default",
99
+ subnetId: gatewaySubnet1.id,
100
+ publicIPAddressId: publicIp1.id,
101
+ },
102
+ ],
103
+ tags: {
104
+ ...this.systemTags(),
105
+ },
106
+ });
107
+ // ===== Second Virtual Network and Gateway =====
108
+ const vnet2 = new azure_virtualnetwork_1.VirtualNetwork(this, "vnet2", {
109
+ name: "vnet2-conn-example",
110
+ location: "eastus",
111
+ resourceGroupId: resourceGroup.id,
112
+ addressSpace: {
113
+ addressPrefixes: ["10.2.0.0/16"],
114
+ },
115
+ tags: {
116
+ ...this.systemTags(),
117
+ },
118
+ });
119
+ const gatewaySubnet2 = new azure_subnet_1.Subnet(this, "gateway-subnet2", {
120
+ name: "GatewaySubnet",
121
+ virtualNetworkName: "vnet2-conn-example",
122
+ virtualNetworkId: vnet2.id,
123
+ resourceGroupId: resourceGroup.id,
124
+ addressPrefix: "10.2.1.0/24",
125
+ });
126
+ const publicIp2 = new azure_publicipaddress_1.PublicIPAddress(this, "public-ip2", {
127
+ name: "pip-gateway2-example",
128
+ location: "eastus",
129
+ resourceGroupId: resourceGroup.id,
130
+ sku: {
131
+ name: "Standard",
132
+ tier: "Regional",
133
+ },
134
+ publicIPAllocationMethod: "Static",
135
+ tags: {
136
+ ...this.systemTags(),
137
+ },
138
+ });
139
+ const gateway2 = new azure_virtualnetworkgateway_1.VirtualNetworkGateway(this, "vpn-gateway2", {
140
+ name: "vng2-conn-example",
141
+ location: "eastus",
142
+ resourceGroupId: resourceGroup.id,
143
+ gatewayType: "Vpn",
144
+ vpnType: "RouteBased",
145
+ sku: {
146
+ name: "VpnGw1",
147
+ tier: "VpnGw1",
148
+ },
149
+ ipConfigurations: [
150
+ {
151
+ name: "default",
152
+ subnetId: gatewaySubnet2.id,
153
+ publicIPAddressId: publicIp2.id,
154
+ },
155
+ ],
156
+ tags: {
157
+ ...this.systemTags(),
158
+ },
159
+ });
160
+ // ===== VNet-to-VNet Connections =====
161
+ // Connection from gateway1 to gateway2
162
+ new virtual_network_gateway_connection_1.VirtualNetworkGatewayConnection(this, "vnet-to-vnet-conn1", {
163
+ name: "conn1to2-example",
164
+ location: "eastus",
165
+ resourceGroupId: resourceGroup.id,
166
+ connectionType: "Vnet2Vnet",
167
+ virtualNetworkGateway1: {
168
+ id: gateway1.id,
169
+ },
170
+ virtualNetworkGateway2: {
171
+ id: gateway2.id,
172
+ },
173
+ sharedKey: "SecureSharedKey123!",
174
+ tags: {
175
+ ...this.systemTags(),
176
+ example: "vnet-to-vnet",
177
+ direction: "1-to-2",
178
+ },
179
+ });
180
+ // Connection from gateway2 to gateway1 (bidirectional)
181
+ new virtual_network_gateway_connection_1.VirtualNetworkGatewayConnection(this, "vnet-to-vnet-conn2", {
182
+ name: "conn2to1-example",
183
+ location: "eastus",
184
+ resourceGroupId: resourceGroup.id,
185
+ connectionType: "Vnet2Vnet",
186
+ virtualNetworkGateway1: {
187
+ id: gateway2.id,
188
+ },
189
+ virtualNetworkGateway2: {
190
+ id: gateway1.id,
191
+ },
192
+ sharedKey: "SecureSharedKey123!",
193
+ tags: {
194
+ ...this.systemTags(),
195
+ example: "vnet-to-vnet",
196
+ direction: "2-to-1",
197
+ },
198
+ });
199
+ }
200
+ }
201
+ describe.skip("Virtual Network Gateway Connection Integration Test", () => {
202
+ // NOTE: This test takes 60-90 minutes due to gateway provisioning time (2 gateways).
203
+ // This test provisions two complete VPN gateways and tests VNet-to-VNet connections.
204
+ // SKIPPED BY DEFAULT: Run explicitly with: jest --testNamePattern="Virtual Network Gateway Connection"
205
+ it("should deploy gateways and connections, validate idempotency, and cleanup", () => {
206
+ const app = cdktf_1.Testing.app();
207
+ const stack = new VirtualNetworkGatewayConnectionExampleStack(app, "test-virtual-network-gateway-connection");
208
+ const synthesized = cdktf_1.Testing.fullSynth(stack);
209
+ // This will:
210
+ // 1. Run terraform apply to deploy resources (2 gateways + 2 connections)
211
+ // 2. Run terraform plan to check idempotency (no changes expected)
212
+ // 3. Run terraform destroy to cleanup resources
213
+ (0, testing_1.TerraformApplyCheckAndDestroy)(synthesized, { verifyCleanup: true });
214
+ }, 7200000); // 120 minutes timeout (2 hours) for dual gateway provisioning
215
+ });
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1uZXR3b3JrLWdhdGV3YXktY29ubmVjdGlvbi5pbnRlZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9henVyZS12aXJ0dWFsbmV0d29ya2dhdGV3YXljb25uZWN0aW9uL3Rlc3QvdmlydHVhbC1uZXR3b3JrLWdhdGV3YXktY29ubmVjdGlvbi5pbnRlZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7QUFFSCxpQ0FBZ0M7QUFFaEMsMkNBQXlDO0FBQ3pDLHVFQUE4RDtBQUM5RCxtRUFBMEQ7QUFDMUQscURBQTRDO0FBQzVDLHFFQUE0RDtBQUM1RCxtRkFBMEU7QUFDMUUsa0ZBQW9GO0FBQ3BGLDJDQUE2RTtBQUM3RSx5REFBNkQ7QUFDN0Qsa0dBQTRGO0FBRTVGLHdEQUF3RDtBQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLDBCQUFlLENBQ3RDLGdEQUFnRCxFQUNoRDtJQUNFLFdBQVcsRUFBRSxDQUFDO0NBQ2YsQ0FDRixDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSwyQ0FBNEMsU0FBUSx1QkFBYTtJQUNyRSxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLGNBQWMsRUFBRTtnQkFDZCxXQUFXLEVBQUUsWUFBWSxDQUFDLFdBQVc7Z0JBQ3JDLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVztnQkFDckMsYUFBYSxFQUFFLFlBQVksQ0FBQyxhQUFhO2FBQzFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsMkJBQTJCO1FBQzNCLElBQUksd0JBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJDLHdCQUF3QjtRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQ3RDLG9DQUFvQyxFQUNwQyxNQUFNLENBQ1AsQ0FBQztRQUVGLHdCQUF3QjtRQUN4QixNQUFNLGFBQWEsR0FB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U0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdDLGFBQWE7UUFDYiwwRUFBMEU7UUFDMUUsbUVBQW1FO1FBQ25FLGdEQUFnRDtRQUNoRCxJQUFBLHVDQUE2QixFQUFDLFdBQVcsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLDhEQUE4RDtBQUM3RSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZWdyYXRpb24gdGVzdCBmb3IgQXp1cmUgVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvblxuICpcbiAqIFRoaXMgdGVzdCBkZW1vbnN0cmF0ZXMgYmFzaWMgdXNhZ2Ugb2YgdGhlIFZpcnR1YWxOZXR3b3JrR2F0ZXdheUNvbm5lY3Rpb24gY29uc3RydWN0XG4gKiBieSBjcmVhdGluZyBhIFZOZXQtdG8tVk5ldCBjb25uZWN0aW9uIGJldHdlZW4gdHdvIHZpcnR1YWwgbmV0d29yayBnYXRld2F5cy5cbiAqXG4gKiBOb3RlOiBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheXMgdGFrZSAzMC00NSBtaW51dGVzIGVhY2ggdG8gcHJvdmlzaW9uLFxuICogc28gdGhpcyB0ZXN0IGhhcyBhbiBleHRlbmRlZCB0aW1lb3V0ICh+MTIwIG1pbnV0ZXMgdG90YWwpLlxuICpcbiAqIFJ1biB3aXRoOiBucG0gcnVuIGludGVncmF0aW9uOm5vc3RyZWFtXG4gKi9cblxuaW1wb3J0IHsgVGVzdGluZyB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCBcImNka3RmL2xpYi90ZXN0aW5nL2FkYXB0ZXJzL2plc3RcIjtcbmltcG9ydCB7IFB1YmxpY0lQQWRkcmVzcyB9IGZyb20gXCIuLi8uLi9henVyZS1wdWJsaWNpcGFkZHJlc3NcIjtcbmltcG9ydCB7IFJlc291cmNlR3JvdXAgfSBmcm9tIFwiLi4vLi4vYXp1cmUtcmVzb3VyY2Vncm91cFwiO1xuaW1wb3J0IHsgU3VibmV0IH0gZnJvbSBcIi4uLy4uL2F6dXJlLXN1Ym5ldFwiO1xuaW1wb3J0IHsgVmlydHVhbE5ldHdvcmsgfSBmcm9tIFwiLi4vLi4vYXp1cmUtdmlydHVhbG5ldHdvcmtcIjtcbmltcG9ydCB7IFZpcnR1YWxOZXR3b3JrR2F0ZXdheSB9IGZyb20gXCIuLi8uLi9henVyZS12aXJ0dWFsbmV0d29ya2dhdGV3YXlcIjtcbmltcG9ydCB7IEF6YXBpUHJvdmlkZXIgfSBmcm9tIFwiLi4vLi4vY29yZS1henVyZS9saWIvYXphcGkvcHJvdmlkZXJzLWF6YXBpL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBCYXNlVGVzdFN0YWNrLCBUZXJyYWZvcm1BcHBseUNoZWNrQW5kRGVzdHJveSB9IGZyb20gXCIuLi8uLi90ZXN0aW5nXCI7XG5pbXBvcnQgeyBUZXN0UnVuTWV0YWRhdGEgfSBmcm9tIFwiLi4vLi4vdGVzdGluZy9saWIvbWV0YWRhdGFcIjtcbmltcG9ydCB7IFZpcnR1YWxOZXR3b3JrR2F0ZXdheUNvbm5lY3Rpb24gfSBmcm9tIFwiLi4vbGliL3ZpcnR1YWwtbmV0d29yay1nYXRld2F5LWNvbm5lY3Rpb25cIjtcblxuLy8gR2VuZXJhdGUgdW5pcXVlIHRlc3QgcnVuIG1ldGFkYXRhIGZvciB0aGlzIHRlc3Qgc3VpdGVcbmNvbnN0IHRlc3RNZXRhZGF0YSA9IG5ldyBUZXN0UnVuTWV0YWRhdGEoXG4gIFwidmlydHVhbC1uZXR3b3JrLWdhdGV3YXktY29ubmVjdGlvbi1pbnRlZ3JhdGlvblwiLFxuICB7XG4gICAgbWF4QWdlSG91cnM6IDQsXG4gIH0sXG4pO1xuXG4vKipcbiAqIEV4YW1wbGUgc3RhY2sgZGVtb25zdHJhdGluZyBWaXJ0dWFsIE5ldHdvcmsgR2F0ZXdheSBDb25uZWN0aW9uIHVzYWdlXG4gKiBDcmVhdGVzIHR3byBnYXRld2F5cyBhbmQgYSBWTmV0LXRvLVZOZXQgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZW1cbiAqL1xuY2xhc3MgVmlydHVhbE5ldHdvcmtHYXRld2F5Q29ubmVjdGlvbkV4YW1wbGVTdGFjayBleHRlbmRzIEJhc2VUZXN0U3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICB0ZXN0UnVuT3B0aW9uczoge1xuICAgICAgICBtYXhBZ2VIb3VyczogdGVzdE1ldGFkYXRhLm1heEFnZUhvdXJzLFxuICAgICAgICBhdXRvQ2xlYW51cDogdGVzdE1ldGFkYXRhLmF1dG9DbGVhbnVwLFxuICAgICAgICBjbGVhbnVwUG9saWN5OiB0ZXN0TWV0YWRhdGEuY2xlYW51cFBvbGljeSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBDb25maWd1cmUgQVpBUEkgcHJvdmlkZXJcbiAgICBuZXcgQXphcGlQcm92aWRlcih0aGlzLCBcImF6YXBpXCIsIHt9KTtcblxuICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBuYW1lc1xuICAgIGNvbnN0IHJnTmFtZSA9IHRoaXMuZ2VuZXJhdGVSZXNvdXJjZU5hbWUoXG4gICAgICBcIk1pY3Jvc29mdC5SZXNvdXJjZXMvcmVzb3VyY2VHcm91cHNcIixcbiAgICAgIFwiY29ublwiLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgcmVzb3VyY2UgZ3JvdXBcbiAgICBjb25zdCByZXNvdXJjZUdyb3VwID0gbmV3IFJlc291cmNlR3JvdXAodGhpcywgXCJyZ1wiLCB7XG4gICAgICBuYW1lOiByZ05hbWUsXG4gICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgLi4udGhpcy5zeXN0ZW1UYWdzKCksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT0gRmlyc3QgVmlydHVhbCBOZXR3b3JrIGFuZCBHYXRld2F5ID09PT09XG4gICAgY29uc3Qgdm5ldDEgPSBuZXcgVmlydHVhbE5ldHdvcmsodGhpcywgXCJ2bmV0MVwiLCB7XG4gICAgICBuYW1lOiBcInZuZXQxLWNvbm4tZXhhbXBsZVwiLFxuICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gICAgICBhZGRyZXNzU3BhY2U6IHtcbiAgICAgICAgYWRkcmVzc1ByZWZpeGVzOiBbXCIxMC4xLjAuMC8xNlwiXSxcbiAgICAgIH0sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIC4uLnRoaXMuc3lzdGVtVGFncygpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGdhdGV3YXlTdWJuZXQxID0gbmV3IFN1Ym5ldCh0aGlzLCBcImdhdGV3YXktc3VibmV0MVwiLCB7XG4gICAgICBuYW1lOiBcIkdhdGV3YXlTdWJuZXRcIixcbiAgICAgIHZpcnR1YWxOZXR3b3JrTmFtZTogXCJ2bmV0MS1jb25uLWV4YW1wbGVcIixcbiAgICAgIHZpcnR1YWxOZXR3b3JrSWQ6IHZuZXQxLmlkLFxuICAgICAgcmVzb3VyY2VHcm91cElkOiByZXNvdXJjZUdyb3VwLmlkLFxuICAgICAgYWRkcmVzc1ByZWZpeDogXCIxMC4xLjEuMC8yNFwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcHVibGljSXAxID0gbmV3IFB1YmxpY0lQQWRkcmVzcyh0aGlzLCBcInB1YmxpYy1pcDFcIiwge1xuICAgICAgbmFtZTogXCJwaXAtZ2F0ZXdheTEtZXhhbXBsZVwiLFxuICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gICAgICBza3U6IHtcbiAgICAgICAgbmFtZTogXCJTdGFuZGFyZFwiLFxuICAgICAgICB0aWVyOiBcIlJlZ2lvbmFsXCIsXG4gICAgICB9LFxuICAgICAgcHVibGljSVBBbGxvY2F0aW9uTWV0aG9kOiBcIlN0YXRpY1wiLFxuICAgICAgdGFnczoge1xuICAgICAgICAuLi50aGlzLnN5c3RlbVRhZ3MoKSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBnYXRld2F5MSA9IG5ldyBWaXJ0dWFsTmV0d29ya0dhdGV3YXkodGhpcywgXCJ2cG4tZ2F0ZXdheTFcIiwge1xuICAgICAgbmFtZTogXCJ2bmcxLWNvbm4tZXhhbXBsZVwiLFxuICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gICAgICBnYXRld2F5VHlwZTogXCJWcG5cIixcbiAgICAgIHZwblR5cGU6IFwiUm91dGVCYXNlZFwiLFxuICAgICAgc2t1OiB7XG4gICAgICAgIG5hbWU6IFwiVnBuR3cxXCIsXG4gICAgICAgIHRpZXI6IFwiVnBuR3cxXCIsXG4gICAgICB9LFxuICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgc3VibmV0SWQ6IGdhdGV3YXlTdWJuZXQxLmlkLFxuICAgICAgICAgIHB1YmxpY0lQQWRkcmVzc0lkOiBwdWJsaWNJcDEuaWQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdGFnczoge1xuICAgICAgICAuLi50aGlzLnN5c3RlbVRhZ3MoKSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PSBTZWNvbmQgVmlydHVhbCBOZXR3b3JrIGFuZCBHYXRld2F5ID09PT09XG4gICAgY29uc3Qgdm5ldDIgPSBuZXcgVmlydHVhbE5ldHdvcmsodGhpcywgXCJ2bmV0MlwiLCB7XG4gICAgICBuYW1lOiBcInZuZXQyLWNvbm4tZXhhbXBsZVwiLFxuICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gICAgICBhZGRyZXNzU3BhY2U6IHtcbiAgICAgICAgYWRkcmVzc1ByZWZpeGVzOiBbXCIxMC4yLjAuMC8xNlwiXSxcbiAgICAgIH0sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIC4uLnRoaXMuc3lzdGVtVGFncygpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGdhdGV3YXlTdWJuZXQyID0gbmV3IFN1Ym5ldCh0aGlzLCBcImdhdGV3YXktc3VibmV0MlwiLCB7XG4gICAgICBuYW1lOiBcIkdhdGV3YXlTdWJuZXRcIixcbiAgICAgIHZpcnR1YWxOZXR3b3JrTmFtZTogXCJ2bmV0Mi1jb25uLWV4YW1wbGVcIixcbiAgICAgIHZpcnR1YWxOZXR3b3JrSWQ6IHZuZXQyLmlkLFxuICAgICAgcmVzb3VyY2VHcm91cElkOiByZXNvdXJjZUdyb3VwLmlkLFxuICAgICAgYWRkcmVzc1ByZWZpeDogXCIxMC4yLjEuMC8yNFwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcHVibGljSXAyID0gbmV3IFB1YmxpY0lQQWRkcmVzcyh0aGlzLCBcInB1YmxpYy1pcDJcIiwge1xuICAgICAgbmFtZTogXCJwaXAtZ2F0ZXdheTItZXhhbXBsZVwiLFxuICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gICAgICBza3U6IHtcbiAgICAgICAgbmFtZTogXCJTdGFuZGFyZFwiLFxuICAgICAgICB0aWVyOiBcIlJlZ2lvbmFsXCIsXG4gICAgICB9LFxuICAgICAgcHVibGljSVBBbGxvY2F0aW9uTWV0aG9kOiBcIlN0YXRpY1wiLFxuICAgICAgdGFnczoge1xuICAgICAgICAuLi50aGlzLnN5c3RlbVRhZ3MoKSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBnYXRld2F5MiA9IG5ldyBWaXJ0dWFsTmV0d29ya0dhdGV3YXkodGhpcywgXCJ2cG4tZ2F0ZXdheTJcIiwge1xuICAgICAgbmFtZTogXCJ2bmcyLWNvbm4tZXhhbXBsZVwiLFxuICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICByZXNvdXJjZUdyb3VwSWQ6IHJlc291cmNlR3JvdXAuaWQsXG4gICAgICBnYXRld2F5VHlwZTogXCJWcG5cIixcbiAgICAgIHZwblR5cGU6IFwiUm91dGVCYXNlZFwiLFxuICAgICAgc2t1OiB7XG4gICAgICAgIG5hbWU6IFwiVnBuR3cxXCIsXG4gICAgICAgIHRpZXI6IFwiVnBuR3cxXCIsXG4gICAgICB9LFxuICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgc3VibmV0SWQ6IGdhdGV3YXlTdWJuZXQyLmlkLFxuICAgICAgICAgIHB1YmxpY0lQQWRkcmVzc0lkOiBwdWJsaWNJcDIuaWQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdGFnczoge1xuICAgICAgICAuLi50aGlzLnN5c3RlbVRhZ3MoKSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PSBWTmV0LXRvLVZOZXQgQ29ubmVjdGlvbnMgPT09PT1cbiAgICAvLyBDb25uZWN0aW9uIGZyb20gZ2F0ZXdheTEgdG8gZ2F0ZXdheTJcbiAgICBuZXcgVmlydHVhbE5ldHdvcmtHYXRld2F5Q29ubmVjdGlvbih0aGlzLCBcInZuZXQtdG8tdm5ldC1jb25uMVwiLCB7XG4gICAgICBuYW1lOiBcImNvbm4xdG8yLWV4YW1wbGVcIixcbiAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgcmVzb3VyY2VHcm91cElkOiByZXNvdXJjZUdyb3VwLmlkLFxuICAgICAgY29ubmVjdGlvblR5cGU6IFwiVm5ldDJWbmV0XCIsXG4gICAgICB2aXJ0dWFsTmV0d29ya0dhdGV3YXkxOiB7XG4gICAgICAgIGlkOiBnYXRld2F5MS5pZCxcbiAgICAgIH0sXG4gICAgICB2aXJ0dWFsTmV0d29ya0dhdGV3YXkyOiB7XG4gICAgICAgIGlkOiBnYXRld2F5Mi5pZCxcbiAgICAgIH0sXG4gICAgICBzaGFyZWRLZXk6IFwiU2VjdXJlU2hhcmVkS2V5MTIzIVwiLFxuICAgICAgdGFnczoge1xuICAgICAgICAuLi50aGlzLnN5c3RlbVRhZ3MoKSxcbiAgICAgICAgZXhhbXBsZTogXCJ2bmV0LXRvLXZuZXRcIixcbiAgICAgICAgZGlyZWN0aW9uOiBcIjEtdG8tMlwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIENvbm5lY3Rpb24gZnJvbSBnYXRld2F5MiB0byBnYXRld2F5MSAoYmlkaXJlY3Rpb25hbClcbiAgICBuZXcgVmlydHVhbE5ldHdvcmtHYXRld2F5Q29ubmVjdGlvbih0aGlzLCBcInZuZXQtdG8tdm5ldC1jb25uMlwiLCB7XG4gICAgICBuYW1lOiBcImNvbm4ydG8xLWV4YW1wbGVcIixcbiAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgcmVzb3VyY2VHcm91cElkOiByZXNvdXJjZUdyb3VwLmlkLFxuICAgICAgY29ubmVjdGlvblR5cGU6IFwiVm5ldDJWbmV0XCIsXG4gICAgICB2aXJ0dWFsTmV0d29ya0dhdGV3YXkxOiB7XG4gICAgICAgIGlkOiBnYXRld2F5Mi5pZCxcbiAgICAgIH0sXG4gICAgICB2aXJ0dWFsTmV0d29ya0dhdGV3YXkyOiB7XG4gICAgICAgIGlkOiBnYXRld2F5MS5pZCxcbiAgICAgIH0sXG4gICAgICBzaGFyZWRLZXk6IFwiU2VjdXJlU2hhcmVkS2V5MTIzIVwiLFxuICAgICAgdGFnczoge1xuICAgICAgICAuLi50aGlzLnN5c3RlbVRhZ3MoKSxcbiAgICAgICAgZXhhbXBsZTogXCJ2bmV0LXRvLXZuZXRcIixcbiAgICAgICAgZGlyZWN0aW9uOiBcIjItdG8tMVwiLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5kZXNjcmliZS5za2lwKFwiVmlydHVhbCBOZXR3b3JrIEdhdGV3YXkgQ29ubmVjdGlvbiBJbnRlZ3JhdGlvbiBUZXN0XCIsICgpID0+IHtcbiAgLy8gTk9URTogVGhpcyB0ZXN0IHRha2VzIDYwLTkwIG1pbnV0ZXMgZHVlIHRvIGdhdGV3YXkgcHJvdmlzaW9uaW5nIHRpbWUgKDIgZ2F0ZXdheXMpLlxuICAvLyBUaGlzIHRlc3QgcHJvdmlzaW9ucyB0d28gY29tcGxldGUgVlBOIGdhdGV3YXlzIGFuZCB0ZXN0cyBWTmV0LXRvLVZOZXQgY29ubmVjdGlvbnMuXG4gIC8vIFNLSVBQRUQgQlkgREVGQVVMVDogUnVuIGV4cGxpY2l0bHkgd2l0aDogamVzdCAtLXRlc3ROYW1lUGF0dGVybj1cIlZpcnR1YWwgTmV0d29yayBHYXRld2F5IENvbm5lY3Rpb25cIlxuICBpdChcInNob3VsZCBkZXBsb3kgZ2F0ZXdheXMgYW5kIGNvbm5lY3Rpb25zLCB2YWxpZGF0ZSBpZGVtcG90ZW5jeSwgYW5kIGNsZWFudXBcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGFwcCA9IFRlc3RpbmcuYXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgVmlydHVhbE5ldHdvcmtHYXRld2F5Q29ubmVjdGlvbkV4YW1wbGVTdGFjayhcbiAgICAgIGFwcCxcbiAgICAgIFwidGVzdC12aXJ0dWFsLW5ldHdvcmstZ2F0ZXdheS1jb25uZWN0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBzeW50aGVzaXplZCA9IFRlc3RpbmcuZnVsbFN5bnRoKHN0YWNrKTtcblxuICAgIC8vIFRoaXMgd2lsbDpcbiAgICAvLyAxLiBSdW4gdGVycmFmb3JtIGFwcGx5IHRvIGRlcGxveSByZXNvdXJjZXMgKDIgZ2F0ZXdheXMgKyAyIGNvbm5lY3Rpb25zKVxuICAgIC8vIDIuIFJ1biB0ZXJyYWZvcm0gcGxhbiB0byBjaGVjayBpZGVtcG90ZW5jeSAobm8gY2hhbmdlcyBleHBlY3RlZClcbiAgICAvLyAzLiBSdW4gdGVycmFmb3JtIGRlc3Ryb3kgdG8gY2xlYW51cCByZXNvdXJjZXNcbiAgICBUZXJyYWZvcm1BcHBseUNoZWNrQW5kRGVzdHJveShzeW50aGVzaXplZCwgeyB2ZXJpZnlDbGVhbnVwOiB0cnVlIH0pO1xuICB9LCA3MjAwMDAwKTsgLy8gMTIwIG1pbnV0ZXMgdGltZW91dCAoMiBob3VycykgZm9yIGR1YWwgZ2F0ZXdheSBwcm92aXNpb25pbmdcbn0pO1xuIl19
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Comprehensive tests for the Virtual Network Gateway Connection implementation
3
+ *
4
+ * This test suite validates the VirtualNetworkGatewayConnection class using the AzapiResource framework.
5
+ * Tests cover automatic version resolution, explicit version pinning, schema validation,
6
+ * property transformation, and resource creation for all connection types.
7
+ */
8
+ export {};