@microsoft/terraform-cdk-constructs 1.3.1 → 1.5.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 (86) hide show
  1. package/.jsii +32238 -27310
  2. package/API.md +43714 -35942
  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-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
  42. package/lib/azure-virtualnetworkmanager/lib/index.d.ts +5 -0
  43. package/lib/azure-virtualnetworkmanager/lib/index.js +6 -1
  44. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-schemas.d.ts +24 -0
  45. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-schemas.js +169 -0
  46. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr-schemas.d.ts +32 -0
  47. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr-schemas.js +206 -0
  48. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.d.ts +170 -0
  49. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +214 -0
  50. package/lib/azure-virtualnetworkmanager/lib/ipam-pool.d.ts +175 -0
  51. package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +206 -0
  52. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
  53. package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
  54. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
  55. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
  56. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
  57. package/lib/azure-virtualnetworkmanager/lib/utils/cidr-validator.d.ts +225 -0
  58. package/lib/azure-virtualnetworkmanager/lib/utils/cidr-validator.js +389 -0
  59. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +56 -0
  60. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +29 -2
  61. package/lib/azure-virtualnetworkmanager/test/cidr-validator.spec.d.ts +6 -0
  62. package/lib/azure-virtualnetworkmanager/test/cidr-validator.spec.js +292 -0
  63. package/lib/azure-virtualnetworkmanager/test/ipam-pool-static-cidr.spec.d.ts +6 -0
  64. package/lib/azure-virtualnetworkmanager/test/ipam-pool-static-cidr.spec.js +430 -0
  65. package/lib/azure-virtualnetworkmanager/test/ipam-pool.spec.d.ts +6 -0
  66. package/lib/azure-virtualnetworkmanager/test/ipam-pool.spec.js +372 -0
  67. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +2 -1
  68. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +30 -3
  69. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +105 -1
  70. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
  71. package/lib/core-azure/lib/azapi/azapi-resource.js +2 -2
  72. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  73. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  74. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +1 -1
  75. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  76. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  77. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  78. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +1 -1
  79. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  80. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  81. package/lib/index.d.ts +2 -0
  82. package/lib/index.js +4 -2
  83. package/lib/testing/index.js +2 -2
  84. package/lib/testing/lib/cleanup.js +1 -1
  85. package/lib/testing/lib/metadata.js +1 -1
  86. package/package.json +1 -1
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.IpamPool = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ /**
7
+ * Azure Virtual Network Manager IPAM Pool implementation using AzapiResource framework
8
+ *
9
+ * This class provides a unified implementation for Azure Virtual Network Manager IPAM Pools
10
+ * that automatically handles version management, schema validation, and property transformation
11
+ * across all supported API versions.
12
+ *
13
+ * Supported API Versions:
14
+ * - 2024-05-01 (Active, Latest)
15
+ *
16
+ * Features:
17
+ * - Automatic latest version resolution when no version is specified
18
+ * - Explicit version pinning for stability requirements
19
+ * - Schema-driven validation and transformation
20
+ * - CIDR validation and overlap detection
21
+ * - Hierarchical pool support
22
+ * - JSII compliance for multi-language support
23
+ */
24
+ const cdktf = require("cdktf");
25
+ const ipam_pool_schemas_1 = require("./ipam-pool-schemas");
26
+ const cidr_validator_1 = require("./utils/cidr-validator");
27
+ const azapi_resource_1 = require("../../core-azure/lib/azapi/azapi-resource");
28
+ /**
29
+ * Azure Virtual Network Manager IPAM Pool implementation
30
+ *
31
+ * IPAM Pools provide centralized IP address management for virtual networks,
32
+ * enabling automatic CIDR allocation, overlap prevention, and hierarchical
33
+ * address space organization. They are essential for managing IP addresses
34
+ * at scale across multiple virtual networks and subscriptions.
35
+ *
36
+ * @example
37
+ * // Basic IPAM pool for production workloads:
38
+ * const ipamPool = new IpamPool(this, "prod-pool", {
39
+ * name: "production-pool",
40
+ * location: "eastus",
41
+ * networkManagerId: networkManager.id,
42
+ * addressPrefixes: ["10.0.0.0/8"],
43
+ * description: "Root IP address pool for production",
44
+ * displayName: "Production Pool"
45
+ * });
46
+ *
47
+ * @example
48
+ * // Hierarchical pool with parent reference:
49
+ * const childPool = new IpamPool(this, "eastus-pool", {
50
+ * name: "eastus-pool",
51
+ * location: "eastus",
52
+ * networkManagerId: networkManager.id,
53
+ * addressPrefixes: ["10.1.0.0/16"],
54
+ * parentPoolName: "production-pool",
55
+ * description: "East US regional pool"
56
+ * });
57
+ *
58
+ * @stability stable
59
+ */
60
+ class IpamPool extends azapi_resource_1.AzapiResource {
61
+ /**
62
+ * Validates address prefixes for format and overlap
63
+ * Throws descriptive errors if validation fails
64
+ *
65
+ * @param prefixes - Array of CIDR blocks to validate
66
+ * @throws Error if validation fails
67
+ */
68
+ static validateAddressPrefixes(prefixes) {
69
+ if (!prefixes || prefixes.length === 0) {
70
+ throw new Error("At least one address prefix is required");
71
+ }
72
+ // Validate each CIDR individually
73
+ prefixes.forEach((prefix, index) => {
74
+ if (!(0, cidr_validator_1.isValidCidr)(prefix)) {
75
+ throw new Error(`Invalid CIDR notation at index ${index}: ${prefix}. ` +
76
+ `Expected format: x.x.x.x/y where y is 0-32`);
77
+ }
78
+ });
79
+ // Check for overlaps within the same pool
80
+ for (let i = 0; i < prefixes.length; i++) {
81
+ for (let j = i + 1; j < prefixes.length; j++) {
82
+ if ((0, cidr_validator_1.cidrsOverlap)(prefixes[i], prefixes[j])) {
83
+ throw new Error(`Address prefixes overlap: ${prefixes[i]} and ${prefixes[j]}. ` +
84
+ `Each CIDR block within a pool must be non-overlapping.`);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ /**
90
+ * Creates a new Azure Virtual Network Manager IPAM Pool using the AzapiResource framework
91
+ *
92
+ * @param scope - The scope in which to define this construct
93
+ * @param id - The unique identifier for this instance
94
+ * @param props - Configuration properties for the IPAM Pool
95
+ */
96
+ constructor(scope, id, props) {
97
+ // Validate CIDR prefixes before construction
98
+ IpamPool.validateAddressPrefixes(props.addressPrefixes);
99
+ super(scope, id, props);
100
+ this.props = props;
101
+ // Extract properties from the AZAPI resource outputs using Terraform interpolation
102
+ this.resourceName = `\${${this.terraformResource.fqn}.name}`;
103
+ // Create Terraform outputs for easy access and referencing from other resources
104
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
105
+ value: this.id,
106
+ description: "The ID of the IPAM Pool",
107
+ });
108
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
109
+ value: this.resourceName,
110
+ description: "The name of the IPAM Pool",
111
+ });
112
+ this.locationOutput = new cdktf.TerraformOutput(this, "location", {
113
+ value: `\${${this.terraformResource.fqn}.location}`,
114
+ description: "The location of the IPAM Pool",
115
+ });
116
+ // Override logical IDs to match naming convention
117
+ this.idOutput.overrideLogicalId("id");
118
+ this.nameOutput.overrideLogicalId("name");
119
+ this.locationOutput.overrideLogicalId("location");
120
+ // Apply ignore changes if specified
121
+ this._applyIgnoreChanges();
122
+ }
123
+ // =============================================================================
124
+ // REQUIRED ABSTRACT METHODS FROM AzapiResource
125
+ // =============================================================================
126
+ /**
127
+ * Resolves the parent resource ID for the IPAM Pool
128
+ * IPAM Pools are scoped to Network Managers
129
+ */
130
+ resolveParentId(props) {
131
+ const typedProps = props;
132
+ return typedProps.networkManagerId;
133
+ }
134
+ /**
135
+ * Gets the default API version to use when no explicit version is specified
136
+ */
137
+ defaultVersion() {
138
+ return "2024-05-01";
139
+ }
140
+ /**
141
+ * Gets the Azure resource type for IPAM Pools
142
+ */
143
+ resourceType() {
144
+ return ipam_pool_schemas_1.IPAM_POOL_TYPE;
145
+ }
146
+ /**
147
+ * Gets the API schema for the resolved version
148
+ */
149
+ apiSchema() {
150
+ return this.resolveSchema();
151
+ }
152
+ /**
153
+ * Creates the resource body for the Azure API call
154
+ */
155
+ createResourceBody(props) {
156
+ const typedProps = props;
157
+ return {
158
+ location: typedProps.location,
159
+ tags: this.allTags(),
160
+ properties: {
161
+ addressPrefixes: typedProps.addressPrefixes,
162
+ description: typedProps.description,
163
+ displayName: typedProps.displayName,
164
+ parentPoolName: typedProps.parentPoolName,
165
+ },
166
+ };
167
+ }
168
+ // =============================================================================
169
+ // PUBLIC METHODS FOR IPAM POOL OPERATIONS
170
+ // =============================================================================
171
+ /**
172
+ * Calculate total number of IP addresses in this pool
173
+ * Sums up all addresses from all CIDR blocks
174
+ *
175
+ * @returns Total count of IP addresses across all prefixes
176
+ *
177
+ * @example
178
+ * const pool = new IpamPool(this, "pool", {
179
+ * addressPrefixes: ["10.0.0.0/24", "10.1.0.0/24"]
180
+ * });
181
+ * console.log(pool.totalAddressCount); // 512 (256 + 256)
182
+ */
183
+ get totalAddressCount() {
184
+ return this.props.addressPrefixes.reduce((sum, cidr) => sum + (0, cidr_validator_1.calculateAddressCount)(cidr), 0);
185
+ }
186
+ // =============================================================================
187
+ // PRIVATE HELPER METHODS
188
+ // =============================================================================
189
+ /**
190
+ * Applies ignore changes lifecycle rules if specified in props
191
+ */
192
+ _applyIgnoreChanges() {
193
+ if (this.props.ignoreChanges && this.props.ignoreChanges.length > 0) {
194
+ this.terraformResource.addOverride("lifecycle", {
195
+ ignore_changes: this.props.ignoreChanges,
196
+ });
197
+ }
198
+ }
199
+ }
200
+ exports.IpamPool = IpamPool;
201
+ _a = JSII_RTTI_SYMBOL_1;
202
+ IpamPool[_a] = { fqn: "@microsoft/terraform-cdk-constructs.IpamPool", version: "1.5.0" };
203
+ (() => {
204
+ azapi_resource_1.AzapiResource.registerSchemas(ipam_pool_schemas_1.IPAM_POOL_TYPE, ipam_pool_schemas_1.ALL_IPAM_POOL_VERSIONS);
205
+ })();
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbS1wb29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dXJlLXZpcnR1YWxuZXR3b3JrbWFuYWdlci9saWIvaXBhbS1wb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsK0JBQStCO0FBRS9CLDJEQUE2RTtBQUM3RSwyREFJZ0M7QUFDaEMsOEVBR21EO0FBb0VuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUNILE1BQWEsUUFBUyxTQUFRLDhCQUFhO0lBS3pDOzs7Ozs7T0FNRztJQUNLLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxRQUFrQjtRQUN2RCxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsSUFBQSw0QkFBVyxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0NBQWtDLEtBQUssS0FBSyxNQUFNLElBQUk7b0JBQ3BELDRDQUE0QyxDQUMvQyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsMENBQTBDO1FBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzdDLElBQUksSUFB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QUMxQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLDBDQUEwQztJQUMxQyxnRkFBZ0Y7SUFFaEY7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBQSxzQ0FBcUIsRUFBQyxJQUFJLENBQUMsRUFDaEQsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLHlCQUF5QjtJQUN6QixnRkFBZ0Y7SUFFaEY7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzlDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7O0FBdkxILDRCQXdMQzs7O0FBdkxDO0lBQ0UsOEJBQWEsQ0FBQyxlQUFlLENBQUMsa0NBQWMsRUFBRSwwQ0FBc0IsQ0FBQyxDQUFDO0FBQ3hFLENBQUMsR0FBQSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBenVyZSBWaXJ0dWFsIE5ldHdvcmsgTWFuYWdlciBJUEFNIFBvb2wgaW1wbGVtZW50YXRpb24gdXNpbmcgQXphcGlSZXNvdXJjZSBmcmFtZXdvcmtcbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgdW5pZmllZCBpbXBsZW1lbnRhdGlvbiBmb3IgQXp1cmUgVmlydHVhbCBOZXR3b3JrIE1hbmFnZXIgSVBBTSBQb29sc1xuICogdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgdmVyc2lvbiBtYW5hZ2VtZW50LCBzY2hlbWEgdmFsaWRhdGlvbiwgYW5kIHByb3BlcnR5IHRyYW5zZm9ybWF0aW9uXG4gKiBhY3Jvc3MgYWxsIHN1cHBvcnRlZCBBUEkgdmVyc2lvbnMuXG4gKlxuICogU3VwcG9ydGVkIEFQSSBWZXJzaW9uczpcbiAqIC0gMjAyNC0wNS0wMSAoQWN0aXZlLCBMYXRlc3QpXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBsYXRlc3QgdmVyc2lvbiByZXNvbHV0aW9uIHdoZW4gbm8gdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAqIC0gRXhwbGljaXQgdmVyc2lvbiBwaW5uaW5nIGZvciBzdGFiaWxpdHkgcmVxdWlyZW1lbnRzXG4gKiAtIFNjaGVtYS1kcml2ZW4gdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb25cbiAqIC0gQ0lEUiB2YWxpZGF0aW9uIGFuZCBvdmVybGFwIGRldGVjdGlvblxuICogLSBIaWVyYXJjaGljYWwgcG9vbCBzdXBwb3J0XG4gKiAtIEpTSUkgY29tcGxpYW5jZSBmb3IgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydFxuICovXG5cbmltcG9ydCAqIGFzIGNka3RmIGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFMTF9JUEFNX1BPT0xfVkVSU0lPTlMsIElQQU1fUE9PTF9UWVBFIH0gZnJvbSBcIi4vaXBhbS1wb29sLXNjaGVtYXNcIjtcbmltcG9ydCB7XG4gIGlzVmFsaWRDaWRyLFxuICBjaWRyc092ZXJsYXAsXG4gIGNhbGN1bGF0ZUFkZHJlc3NDb3VudCxcbn0gZnJvbSBcIi4vdXRpbHMvY2lkci12YWxpZGF0b3JcIjtcbmltcG9ydCB7XG4gIEF6YXBpUmVzb3VyY2UsXG4gIEF6YXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlXCI7XG5pbXBvcnQgeyBBcGlTY2hlbWEgfSBmcm9tIFwiLi4vLi4vY29yZS1henVyZS9saWIvdmVyc2lvbi1tYW5hZ2VyL2ludGVyZmFjZXMvdmVyc2lvbi1pbnRlcmZhY2VzXCI7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIEF6dXJlIFZpcnR1YWwgTmV0d29yayBNYW5hZ2VyIElQQU0gUG9vbFxuICpcbiAqIEV4dGVuZHMgQXphcGlSZXNvdXJjZVByb3BzIHdpdGggSVBBTSBQb29sIHNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcGFtUG9vbFByb3BzIGV4dGVuZHMgQXphcGlSZXNvdXJjZVByb3BzIHtcbiAgLyoqXG4gICAqIFJlc291cmNlIElEIG9mIHRoZSBwYXJlbnQgTmV0d29yayBNYW5hZ2VyXG4gICAqIEBleGFtcGxlIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwL3Jlc291cmNlR3JvdXBzL3JnL3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9uZXR3b3JrTWFuYWdlcnMvdm5tXCJcbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtNYW5hZ2VySWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSVAgYWRkcmVzcyBwcmVmaXhlcyBmb3IgdGhlIHBvb2xcbiAgICogTXVzdCBiZSB2YWxpZCBDSURSIG5vdGF0aW9uIChlLmcuLCBcIjEwLjAuMC4wLzhcIilcbiAgICogTXVsdGlwbGUgcHJlZml4ZXMgbXVzdCBub3Qgb3ZlcmxhcFxuICAgKiBAZXhhbXBsZSBbXCIxMC4wLjAuMC84XCIsIFwiMTcyLjE2LjAuMC8xMlwiXVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkcmVzc1ByZWZpeGVzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIElQQU0gcG9vbFxuICAgKiBAZXhhbXBsZSBcIlByb2R1Y3Rpb24gSVAgYWRkcmVzcyBwb29sIGZvciBFYXN0IFVTIHJlZ2lvblwiXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZnJpZW5kbHkgZGlzcGxheSBuYW1lXG4gICAqIEBleGFtcGxlIFwiRWFzdCBVUyBQcm9kdWN0aW9uIFBvb2xcIlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgcGFyZW50IHBvb2wgZm9yIGhpZXJhcmNoaWNhbCBwb29sc1xuICAgKiBMZWF2ZSBlbXB0eS91bmRlZmluZWQgZm9yIHJvb3QgcG9vbHNcbiAgICogQGV4YW1wbGUgXCJyb290LXBvb2xcIlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50UG9vbE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsaWZlY3ljbGUgcnVsZXMgdG8gaWdub3JlIGNoYW5nZXNcbiAgICogQGV4YW1wbGUgW1widGFnc1wiXVxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlQ2hhbmdlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIElQQU0gUG9vbCBib2R5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBhbVBvb2xQcm9wZXJ0aWVzIHtcbiAgcmVhZG9ubHkgYWRkcmVzc1ByZWZpeGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBwYXJlbnRQb29sTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgYm9keSBpbnRlcmZhY2UgZm9yIEF6dXJlIElQQU0gUG9vbCBBUEkgY2FsbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcGFtUG9vbEJvZHkge1xuICByZWFkb25seSBsb2NhdGlvbjogc3RyaW5nO1xuICByZWFkb25seSB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVhZG9ubHkgcHJvcGVydGllczogSXBhbVBvb2xQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIEF6dXJlIFZpcnR1YWwgTmV0d29yayBNYW5hZ2VyIElQQU0gUG9vbCBpbXBsZW1lbnRhdGlvblxuICpcbiAqIElQQU0gUG9vbHMgcHJvdmlkZSBjZW50cmFsaXplZCBJUCBhZGRyZXNzIG1hbmFnZW1lbnQgZm9yIHZpcnR1YWwgbmV0d29ya3MsXG4gKiBlbmFibGluZyBhdXRvbWF0aWMgQ0lEUiBhbGxvY2F0aW9uLCBvdmVybGFwIHByZXZlbnRpb24sIGFuZCBoaWVyYXJjaGljYWxcbiAqIGFkZHJlc3Mgc3BhY2Ugb3JnYW5pemF0aW9uLiBUaGV5IGFyZSBlc3NlbnRpYWwgZm9yIG1hbmFnaW5nIElQIGFkZHJlc3Nlc1xuICogYXQgc2NhbGUgYWNyb3NzIG11bHRpcGxlIHZpcnR1YWwgbmV0d29ya3MgYW5kIHN1YnNjcmlwdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEJhc2ljIElQQU0gcG9vbCBmb3IgcHJvZHVjdGlvbiB3b3JrbG9hZHM6XG4gKiBjb25zdCBpcGFtUG9vbCA9IG5ldyBJcGFtUG9vbCh0aGlzLCBcInByb2QtcG9vbFwiLCB7XG4gKiAgIG5hbWU6IFwicHJvZHVjdGlvbi1wb29sXCIsXG4gKiAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICogICBuZXR3b3JrTWFuYWdlcklkOiBuZXR3b3JrTWFuYWdlci5pZCxcbiAqICAgYWRkcmVzc1ByZWZpeGVzOiBbXCIxMC4wLjAuMC84XCJdLFxuICogICBkZXNjcmlwdGlvbjogXCJSb290IElQIGFkZHJlc3MgcG9vbCBmb3IgcHJvZHVjdGlvblwiLFxuICogICBkaXNwbGF5TmFtZTogXCJQcm9kdWN0aW9uIFBvb2xcIlxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhpZXJhcmNoaWNhbCBwb29sIHdpdGggcGFyZW50IHJlZmVyZW5jZTpcbiAqIGNvbnN0IGNoaWxkUG9vbCA9IG5ldyBJcGFtUG9vbCh0aGlzLCBcImVhc3R1cy1wb29sXCIsIHtcbiAqICAgbmFtZTogXCJlYXN0dXMtcG9vbFwiLFxuICogICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAqICAgbmV0d29ya01hbmFnZXJJZDogbmV0d29ya01hbmFnZXIuaWQsXG4gKiAgIGFkZHJlc3NQcmVmaXhlczogW1wiMTAuMS4wLjAvMTZcIl0sXG4gKiAgIHBhcmVudFBvb2xOYW1lOiBcInByb2R1Y3Rpb24tcG9vbFwiLFxuICogICBkZXNjcmlwdGlvbjogXCJFYXN0IFVTIHJlZ2lvbmFsIHBvb2xcIlxuICogfSk7XG4gKlxuICogQHN0YWJpbGl0eSBzdGFibGVcbiAqL1xuZXhwb3J0IGNsYXNzIElwYW1Qb29sIGV4dGVuZHMgQXphcGlSZXNvdXJjZSB7XG4gIHN0YXRpYyB7XG4gICAgQXphcGlSZXNvdXJjZS5yZWdpc3RlclNjaGVtYXMoSVBBTV9QT09MX1RZUEUsIEFMTF9JUEFNX1BPT0xfVkVSU0lPTlMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhZGRyZXNzIHByZWZpeGVzIGZvciBmb3JtYXQgYW5kIG92ZXJsYXBcbiAgICogVGhyb3dzIGRlc2NyaXB0aXZlIGVycm9ycyBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBwYXJhbSBwcmVmaXhlcyAtIEFycmF5IG9mIENJRFIgYmxvY2tzIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRhdGVBZGRyZXNzUHJlZml4ZXMocHJlZml4ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCFwcmVmaXhlcyB8fCBwcmVmaXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSBhZGRyZXNzIHByZWZpeCBpcyByZXF1aXJlZFwiKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIENJRFIgaW5kaXZpZHVhbGx5XG4gICAgcHJlZml4ZXMuZm9yRWFjaCgocHJlZml4LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFpc1ZhbGlkQ2lkcihwcmVmaXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBDSURSIG5vdGF0aW9uIGF0IGluZGV4ICR7aW5kZXh9OiAke3ByZWZpeH0uIGAgK1xuICAgICAgICAgICAgYEV4cGVjdGVkIGZvcm1hdDogeC54LngueC95IHdoZXJlIHkgaXMgMC0zMmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBmb3Igb3ZlcmxhcHMgd2l0aGluIHRoZSBzYW1lIHBvb2xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBwcmVmaXhlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoY2lkcnNPdmVybGFwKHByZWZpeGVzW2ldLCBwcmVmaXhlc1tqXSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWRkcmVzcyBwcmVmaXhlcyBvdmVybGFwOiAke3ByZWZpeGVzW2ldfSBhbmQgJHtwcmVmaXhlc1tqXX0uIGAgK1xuICAgICAgICAgICAgICBgRWFjaCBDSURSIGJsb2NrIHdpdGhpbiBhIHBvb2wgbXVzdCBiZSBub24tb3ZlcmxhcHBpbmcuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBwcm9wZXJ0aWVzIGZvciB0aGlzIElQQU0gUG9vbCBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BzOiBJcGFtUG9vbFByb3BzO1xuXG4gIC8vIE91dHB1dCBwcm9wZXJ0aWVzIGZvciBlYXN5IGFjY2VzcyBhbmQgcmVmZXJlbmNpbmdcbiAgcHVibGljIHJlYWRvbmx5IGlkT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lT3V0cHV0OiBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQ7XG4gIHB1YmxpYyByZWFkb25seSBsb2NhdGlvbk91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuXG4gIC8vIFB1YmxpYyBwcm9wZXJ0aWVzXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBBenVyZSBWaXJ0dWFsIE5ldHdvcmsgTWFuYWdlciBJUEFNIFBvb2wgdXNpbmcgdGhlIEF6YXBpUmVzb3VyY2UgZnJhbWV3b3JrXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGluc3RhbmNlXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIElQQU0gUG9vbFxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElwYW1Qb29sUHJvcHMpIHtcbiAgICAvLyBWYWxpZGF0ZSBDSURSIHByZWZpeGVzIGJlZm9yZSBjb25zdHJ1Y3Rpb25cbiAgICBJcGFtUG9vbC52YWxpZGF0ZUFkZHJlc3NQcmVmaXhlcyhwcm9wcy5hZGRyZXNzUHJlZml4ZXMpO1xuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICAvLyBFeHRyYWN0IHByb3BlcnRpZXMgZnJvbSB0aGUgQVpBUEkgcmVzb3VyY2Ugb3V0cHV0cyB1c2luZyBUZXJyYWZvcm0gaW50ZXJwb2xhdGlvblxuICAgIHRoaXMucmVzb3VyY2VOYW1lID0gYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5uYW1lfWA7XG5cbiAgICAvLyBDcmVhdGUgVGVycmFmb3JtIG91dHB1dHMgZm9yIGVhc3kgYWNjZXNzIGFuZCByZWZlcmVuY2luZyBmcm9tIG90aGVyIHJlc291cmNlc1xuICAgIHRoaXMuaWRPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiaWRcIiwge1xuICAgICAgdmFsdWU6IHRoaXMuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgSUQgb2YgdGhlIElQQU0gUG9vbFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5uYW1lT3V0cHV0ID0gbmV3IGNka3RmLlRlcnJhZm9ybU91dHB1dCh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IHRoaXMucmVzb3VyY2VOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIG5hbWUgb2YgdGhlIElQQU0gUG9vbFwiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2NhdGlvbk91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJsb2NhdGlvblwiLCB7XG4gICAgICB2YWx1ZTogYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5sb2NhdGlvbn1gLFxuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGxvY2F0aW9uIG9mIHRoZSBJUEFNIFBvb2xcIixcbiAgICB9KTtcblxuICAgIC8vIE92ZXJyaWRlIGxvZ2ljYWwgSURzIHRvIG1hdGNoIG5hbWluZyBjb252ZW50aW9uXG4gICAgdGhpcy5pZE91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImlkXCIpO1xuICAgIHRoaXMubmFtZU91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcIm5hbWVcIik7XG4gICAgdGhpcy5sb2NhdGlvbk91dHB1dC5vdmVycmlkZUxvZ2ljYWxJZChcImxvY2F0aW9uXCIpO1xuXG4gICAgLy8gQXBwbHkgaWdub3JlIGNoYW5nZXMgaWYgc3BlY2lmaWVkXG4gICAgdGhpcy5fYXBwbHlJZ25vcmVDaGFuZ2VzKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSRVFVSVJFRCBBQlNUUkFDVCBNRVRIT0RTIEZST00gQXphcGlSZXNvdXJjZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcGFyZW50IHJlc291cmNlIElEIGZvciB0aGUgSVBBTSBQb29sXG4gICAqIElQQU0gUG9vbHMgYXJlIHNjb3BlZCB0byBOZXR3b3JrIE1hbmFnZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBJcGFtUG9vbFByb3BzO1xuICAgIHJldHVybiB0eXBlZFByb3BzLm5ldHdvcmtNYW5hZ2VySWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZGVmYXVsdCBBUEkgdmVyc2lvbiB0byB1c2Ugd2hlbiBubyBleHBsaWNpdCB2ZXJzaW9uIGlzIHNwZWNpZmllZFxuICAgKi9cbiAgcHJvdGVjdGVkIGRlZmF1bHRWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiMjAyNC0wNS0wMVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEF6dXJlIHJlc291cmNlIHR5cGUgZm9yIElQQU0gUG9vbHNcbiAgICovXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSVBBTV9QT09MX1RZUEU7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgQVBJIHNjaGVtYSBmb3IgdGhlIHJlc29sdmVkIHZlcnNpb25cbiAgICovXG4gIHByb3RlY3RlZCBhcGlTY2hlbWEoKTogQXBpU2NoZW1hIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcmVzb3VyY2UgYm9keSBmb3IgdGhlIEF6dXJlIEFQSSBjYWxsXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBJcGFtUG9vbFByb3BzO1xuICAgIHJldHVybiB7XG4gICAgICBsb2NhdGlvbjogdHlwZWRQcm9wcy5sb2NhdGlvbixcbiAgICAgIHRhZ3M6IHRoaXMuYWxsVGFncygpLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBhZGRyZXNzUHJlZml4ZXM6IHR5cGVkUHJvcHMuYWRkcmVzc1ByZWZpeGVzLFxuICAgICAgICBkZXNjcmlwdGlvbjogdHlwZWRQcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgZGlzcGxheU5hbWU6IHR5cGVkUHJvcHMuZGlzcGxheU5hbWUsXG4gICAgICAgIHBhcmVudFBvb2xOYW1lOiB0eXBlZFByb3BzLnBhcmVudFBvb2xOYW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFVCTElDIE1FVEhPRFMgRk9SIElQQU0gUE9PTCBPUEVSQVRJT05TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0b3RhbCBudW1iZXIgb2YgSVAgYWRkcmVzc2VzIGluIHRoaXMgcG9vbFxuICAgKiBTdW1zIHVwIGFsbCBhZGRyZXNzZXMgZnJvbSBhbGwgQ0lEUiBibG9ja3NcbiAgICpcbiAgICogQHJldHVybnMgVG90YWwgY291bnQgb2YgSVAgYWRkcmVzc2VzIGFjcm9zcyBhbGwgcHJlZml4ZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcG9vbCA9IG5ldyBJcGFtUG9vbCh0aGlzLCBcInBvb2xcIiwge1xuICAgKiAgIGFkZHJlc3NQcmVmaXhlczogW1wiMTAuMC4wLjAvMjRcIiwgXCIxMC4xLjAuMC8yNFwiXVxuICAgKiB9KTtcbiAgICogY29uc29sZS5sb2cocG9vbC50b3RhbEFkZHJlc3NDb3VudCk7IC8vIDUxMiAoMjU2ICsgMjU2KVxuICAgKi9cbiAgcHVibGljIGdldCB0b3RhbEFkZHJlc3NDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmFkZHJlc3NQcmVmaXhlcy5yZWR1Y2UoXG4gICAgICAoc3VtLCBjaWRyKSA9PiBzdW0gKyBjYWxjdWxhdGVBZGRyZXNzQ291bnQoY2lkciksXG4gICAgICAwLFxuICAgICk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIEhFTFBFUiBNRVRIT0RTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgaWdub3JlIGNoYW5nZXMgbGlmZWN5Y2xlIHJ1bGVzIGlmIHNwZWNpZmllZCBpbiBwcm9wc1xuICAgKi9cbiAgcHJpdmF0ZSBfYXBwbHlJZ25vcmVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzLmlnbm9yZUNoYW5nZXMgJiYgdGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudGVycmFmb3JtUmVzb3VyY2UuYWRkT3ZlcnJpZGUoXCJsaWZlY3ljbGVcIiwge1xuICAgICAgICBpZ25vcmVfY2hhbmdlczogdGhpcy5wcm9wcy5pZ25vcmVDaGFuZ2VzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -156,7 +156,7 @@ class NetworkGroupStaticMember extends azapi_resource_1.AzapiResource {
156
156
  }
157
157
  exports.NetworkGroupStaticMember = NetworkGroupStaticMember;
158
158
  _a = JSII_RTTI_SYMBOL_1;
159
- NetworkGroupStaticMember[_a] = { fqn: "@microsoft/terraform-cdk-constructs.NetworkGroupStaticMember", version: "1.3.1" };
159
+ NetworkGroupStaticMember[_a] = { fqn: "@microsoft/terraform-cdk-constructs.NetworkGroupStaticMember", version: "1.5.0" };
160
160
  (() => {
161
161
  azapi_resource_1.AzapiResource.registerSchemas(network_group_static_member_schemas_1.STATIC_MEMBER_TYPE, network_group_static_member_schemas_1.ALL_STATIC_MEMBER_VERSIONS);
162
162
  })();
@@ -151,7 +151,7 @@ class NetworkGroup extends azapi_resource_1.AzapiResource {
151
151
  }
152
152
  exports.NetworkGroup = NetworkGroup;
153
153
  _a = JSII_RTTI_SYMBOL_1;
154
- NetworkGroup[_a] = { fqn: "@microsoft/terraform-cdk-constructs.NetworkGroup", version: "1.3.1" };
154
+ NetworkGroup[_a] = { fqn: "@microsoft/terraform-cdk-constructs.NetworkGroup", version: "1.5.0" };
155
155
  (() => {
156
156
  azapi_resource_1.AzapiResource.registerSchemas(network_group_schemas_1.NETWORK_GROUP_TYPE, network_group_schemas_1.ALL_NETWORK_GROUP_VERSIONS);
157
157
  })();
@@ -157,7 +157,7 @@ class SecurityAdminConfiguration extends azapi_resource_1.AzapiResource {
157
157
  }
158
158
  exports.SecurityAdminConfiguration = SecurityAdminConfiguration;
159
159
  _a = JSII_RTTI_SYMBOL_1;
160
- SecurityAdminConfiguration[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminConfiguration", version: "1.3.1" };
160
+ SecurityAdminConfiguration[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminConfiguration", version: "1.5.0" };
161
161
  (() => {
162
162
  azapi_resource_1.AzapiResource.registerSchemas(security_admin_configuration_schemas_1.SECURITY_ADMIN_CONFIGURATION_TYPE, security_admin_configuration_schemas_1.ALL_SECURITY_ADMIN_CONFIGURATION_VERSIONS);
163
163
  })();
@@ -155,7 +155,7 @@ class SecurityAdminRuleCollection extends azapi_resource_1.AzapiResource {
155
155
  }
156
156
  exports.SecurityAdminRuleCollection = SecurityAdminRuleCollection;
157
157
  _a = JSII_RTTI_SYMBOL_1;
158
- SecurityAdminRuleCollection[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminRuleCollection", version: "1.3.1" };
158
+ SecurityAdminRuleCollection[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminRuleCollection", version: "1.5.0" };
159
159
  (() => {
160
160
  azapi_resource_1.AzapiResource.registerSchemas(security_admin_rule_collection_schemas_1.RULE_COLLECTION_TYPE, security_admin_rule_collection_schemas_1.ALL_RULE_COLLECTION_VERSIONS);
161
161
  })();
@@ -197,7 +197,7 @@ class SecurityAdminRule extends azapi_resource_1.AzapiResource {
197
197
  }
198
198
  exports.SecurityAdminRule = SecurityAdminRule;
199
199
  _a = JSII_RTTI_SYMBOL_1;
200
- SecurityAdminRule[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminRule", version: "1.3.1" };
200
+ SecurityAdminRule[_a] = { fqn: "@microsoft/terraform-cdk-constructs.SecurityAdminRule", version: "1.5.0" };
201
201
  (() => {
202
202
  azapi_resource_1.AzapiResource.registerSchemas(security_admin_rule_schemas_1.SECURITY_ADMIN_RULE_TYPE, security_admin_rule_schemas_1.ALL_SECURITY_ADMIN_RULE_VERSIONS);
203
203
  })();
@@ -0,0 +1,225 @@
1
+ /**
2
+ * CIDR Validator Utility
3
+ *
4
+ * Provides comprehensive validation and parsing utilities for IPv4 CIDR notation.
5
+ * Used by IPAM constructs to ensure proper network address space management.
6
+ */
7
+ /**
8
+ * Result of CIDR validation operations
9
+ */
10
+ export interface CidrValidationResult {
11
+ /** Whether the validation passed */
12
+ readonly valid: boolean;
13
+ /** List of validation errors */
14
+ readonly errors: string[];
15
+ /** List of validation warnings */
16
+ readonly warnings: string[];
17
+ }
18
+ /**
19
+ * Parsed CIDR information
20
+ */
21
+ export interface ParsedCidr {
22
+ /** Original CIDR notation (e.g., "10.0.0.0/8") */
23
+ readonly cidr: string;
24
+ /** Network address (e.g., "10.0.0.0") */
25
+ readonly network: string;
26
+ /** Prefix length (e.g., 8) */
27
+ readonly prefix: number;
28
+ /** First usable IP address */
29
+ readonly firstIp: string;
30
+ /** Last usable IP address */
31
+ readonly lastIp: string;
32
+ /** Total number of addresses in the range */
33
+ readonly totalAddresses: number;
34
+ /** Network mask (e.g., "255.0.0.0") */
35
+ readonly netmask: string;
36
+ }
37
+ /**
38
+ * Validates if a string is a valid CIDR notation
39
+ *
40
+ * @param cidr - CIDR string (e.g., "10.0.0.0/16")
41
+ * @returns boolean - true if valid CIDR format
42
+ *
43
+ * @example
44
+ * const valid = isValidCidr("10.0.0.0/16");
45
+ * console.log(valid); // true
46
+ */
47
+ export declare function isValidCidr(cidr: string): boolean;
48
+ /**
49
+ * Validates if CIDR is within allowed private ranges (RFC 1918)
50
+ *
51
+ * @param cidr - CIDR string
52
+ * @returns boolean - true if within private IP range
53
+ *
54
+ * @example
55
+ * const isPrivate = isPrivateRange("10.0.0.0/16");
56
+ * console.log(isPrivate); // true
57
+ */
58
+ export declare function isPrivateRange(cidr: string): boolean;
59
+ /**
60
+ * Checks if two CIDR blocks overlap
61
+ *
62
+ * @param cidr1 - First CIDR
63
+ * @param cidr2 - Second CIDR
64
+ * @returns boolean - true if CIDRs overlap
65
+ *
66
+ * @example
67
+ * const overlap = cidrsOverlap("10.0.0.0/8", "10.1.0.0/16");
68
+ * console.log(overlap); // true
69
+ */
70
+ export declare function cidrsOverlap(cidr1: string, cidr2: string): boolean;
71
+ /**
72
+ * Validates if child CIDR is contained within parent CIDR
73
+ *
74
+ * @param childCidr - Child CIDR block
75
+ * @param parentCidr - Parent CIDR block
76
+ * @returns boolean - true if child is subnet of parent
77
+ *
78
+ * @example
79
+ * const isSubnet = isSubnet("10.1.0.0/16", "10.0.0.0/8");
80
+ * console.log(isSubnet); // true
81
+ */
82
+ export declare function isSubnet(childCidr: string, parentCidr: string): boolean;
83
+ /**
84
+ * Calculates number of IP addresses in a CIDR block
85
+ *
86
+ * @param cidr - CIDR string
87
+ * @returns number - Total IP addresses in the block
88
+ *
89
+ * @example
90
+ * const count = calculateAddressCount("10.0.0.0/24");
91
+ * console.log(count); // 256
92
+ */
93
+ export declare function calculateAddressCount(cidr: string): number;
94
+ /**
95
+ * Validates prefix length is within allowed range
96
+ *
97
+ * @param cidr - CIDR string
98
+ * @param minPrefix - Minimum allowed prefix (e.g., 8)
99
+ * @param maxPrefix - Maximum allowed prefix (e.g., 29)
100
+ * @returns boolean - true if prefix length is within range
101
+ *
102
+ * @example
103
+ * const valid = isValidPrefixLength("10.0.0.0/24", 8, 29);
104
+ * console.log(valid); // true
105
+ */
106
+ export declare function isValidPrefixLength(cidr: string, minPrefix: number, maxPrefix: number): boolean;
107
+ /**
108
+ * Validate CIDR format and structure
109
+ *
110
+ * @param cidr - CIDR notation string (e.g., "10.0.0.0/8")
111
+ * @returns Validation result with errors and warnings
112
+ *
113
+ * @example
114
+ * const result = validateCidr("10.0.0.0/8");
115
+ * if (!result.valid) {
116
+ * console.error("Invalid CIDR:", result.errors);
117
+ * }
118
+ */
119
+ export declare function validateCidr(cidr: string): CidrValidationResult;
120
+ /**
121
+ * Parse CIDR into structured information
122
+ *
123
+ * @param cidr - CIDR notation string
124
+ * @returns Parsed CIDR information
125
+ * @throws Error if CIDR format is invalid
126
+ *
127
+ * @example
128
+ * const parsed = parseCidr("10.0.0.0/8");
129
+ * console.log(`Network: ${parsed.network}, Prefix: ${parsed.prefix}`);
130
+ * console.log(`Range: ${parsed.firstIp} - ${parsed.lastIp}`);
131
+ * console.log(`Total addresses: ${parsed.totalAddresses}`);
132
+ */
133
+ export declare function parseCidr(cidr: string): ParsedCidr;
134
+ /**
135
+ * Check if two CIDRs overlap
136
+ *
137
+ * @param cidr1 - First CIDR block
138
+ * @param cidr2 - Second CIDR block
139
+ * @returns True if the CIDRs overlap
140
+ *
141
+ * @example
142
+ * const overlaps = checkOverlap("10.0.0.0/16", "10.0.1.0/24");
143
+ * console.log(overlaps); // true
144
+ */
145
+ export declare function checkOverlap(cidr1: string, cidr2: string): boolean;
146
+ /**
147
+ * Validate that multiple CIDRs don't overlap
148
+ *
149
+ * @param cidrs - Array of CIDR blocks to check
150
+ * @returns Validation result with details of any overlaps
151
+ *
152
+ * @example
153
+ * const result = validateNoOverlaps([
154
+ * "10.0.0.0/16",
155
+ * "10.1.0.0/16",
156
+ * "10.0.1.0/24"
157
+ * ]);
158
+ * if (!result.valid) {
159
+ * console.error("Overlapping CIDRs:", result.errors);
160
+ * }
161
+ */
162
+ export declare function validateNoOverlaps(cidrs: string[]): CidrValidationResult;
163
+ /**
164
+ * Check if a child CIDR is contained within a parent CIDR
165
+ *
166
+ * @param parentCidr - Parent CIDR block
167
+ * @param childCidr - Child CIDR block to check
168
+ * @returns True if child is fully contained in parent
169
+ *
170
+ * @example
171
+ * const contained = isContained("10.0.0.0/16", "10.0.1.0/24");
172
+ * console.log(contained); // true
173
+ */
174
+ export declare function isContained(parentCidr: string, childCidr: string): boolean;
175
+ /**
176
+ * Validate that multiple child CIDRs are all contained within a parent CIDR
177
+ *
178
+ * @param parentCidr - Parent CIDR block
179
+ * @param childCidrs - Array of child CIDR blocks
180
+ * @returns Validation result with details of any containment violations
181
+ *
182
+ * @example
183
+ * const result = validateContainment("10.0.0.0/16", [
184
+ * "10.0.1.0/24",
185
+ * "10.0.2.0/24"
186
+ * ]);
187
+ * if (!result.valid) {
188
+ * console.error("Containment violations:", result.errors);
189
+ * }
190
+ */
191
+ export declare function validateContainment(parentCidr: string, childCidrs: string[]): CidrValidationResult;
192
+ /**
193
+ * Convert an IP address string to a 32-bit number
194
+ *
195
+ * @param ip - IP address string (e.g., "10.0.0.1")
196
+ * @returns 32-bit number representation
197
+ *
198
+ * @example
199
+ * const num = ipToNumber("10.0.0.1");
200
+ * console.log(num); // 167772161
201
+ */
202
+ export declare function ipToNumber(ip: string): number;
203
+ /**
204
+ * Convert a 32-bit number to an IP address string
205
+ *
206
+ * @param num - 32-bit number representation
207
+ * @returns IP address string
208
+ *
209
+ * @example
210
+ * const ip = numberToIp(167772161);
211
+ * console.log(ip); // "10.0.0.1"
212
+ */
213
+ export declare function numberToIp(num: number): string;
214
+ /**
215
+ * Convert a prefix length to a netmask number
216
+ *
217
+ * @param prefix - Prefix length (0-32)
218
+ * @returns 32-bit netmask number
219
+ *
220
+ * @example
221
+ * const mask = prefixToMask(24);
222
+ * const maskIp = numberToIp(mask);
223
+ * console.log(maskIp); // "255.255.255.0"
224
+ */
225
+ export declare function prefixToMask(prefix: number): number;