@microsoft/terraform-cdk-constructs 1.3.0 → 1.4.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 (76) hide show
  1. package/.jsii +22673 -19618
  2. package/API.md +25592 -20586
  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.d.ts +7 -0
  18. package/lib/azure-policyassignment/lib/policy-assignment.js +11 -2
  19. package/lib/azure-policydefinition/lib/policy-definition.d.ts +21 -0
  20. package/lib/azure-policydefinition/lib/policy-definition.js +40 -3
  21. package/lib/azure-policydefinition/test/policy-definition.spec.js +211 -1
  22. package/lib/azure-privatednszone/lib/private-dns-zone.js +1 -1
  23. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
  24. package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
  25. package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
  26. package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
  27. package/lib/azure-roledefinition/lib/role-definition.js +1 -1
  28. package/lib/azure-storageaccount/lib/storage-account.js +1 -1
  29. package/lib/azure-subnet/lib/subnet.js +1 -1
  30. package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
  31. package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
  32. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
  33. package/lib/azure-virtualnetworkmanager/lib/index.d.ts +5 -0
  34. package/lib/azure-virtualnetworkmanager/lib/index.js +6 -1
  35. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-schemas.d.ts +24 -0
  36. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-schemas.js +169 -0
  37. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr-schemas.d.ts +32 -0
  38. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr-schemas.js +206 -0
  39. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.d.ts +170 -0
  40. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +214 -0
  41. package/lib/azure-virtualnetworkmanager/lib/ipam-pool.d.ts +175 -0
  42. package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +206 -0
  43. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
  44. package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
  45. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
  46. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
  47. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
  48. package/lib/azure-virtualnetworkmanager/lib/utils/cidr-validator.d.ts +225 -0
  49. package/lib/azure-virtualnetworkmanager/lib/utils/cidr-validator.js +389 -0
  50. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +56 -0
  51. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +29 -2
  52. package/lib/azure-virtualnetworkmanager/test/cidr-validator.spec.d.ts +6 -0
  53. package/lib/azure-virtualnetworkmanager/test/cidr-validator.spec.js +292 -0
  54. package/lib/azure-virtualnetworkmanager/test/ipam-pool-static-cidr.spec.d.ts +6 -0
  55. package/lib/azure-virtualnetworkmanager/test/ipam-pool-static-cidr.spec.js +430 -0
  56. package/lib/azure-virtualnetworkmanager/test/ipam-pool.spec.d.ts +6 -0
  57. package/lib/azure-virtualnetworkmanager/test/ipam-pool.spec.js +372 -0
  58. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +2 -1
  59. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +30 -3
  60. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +105 -1
  61. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
  62. package/lib/core-azure/lib/azapi/azapi-resource.d.ts +28 -0
  63. package/lib/core-azure/lib/azapi/azapi-resource.js +60 -10
  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/testing/index.js +2 -2
  74. package/lib/testing/lib/cleanup.js +1 -1
  75. package/lib/testing/lib/metadata.js +1 -1
  76. package/package.json +1 -1
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Azure Virtual Network Manager IPAM Pool Static CIDR implementation using AzapiResource framework
3
+ *
4
+ * This class provides a unified implementation for explicitly allocating static CIDR blocks
5
+ * within an IPAM pool. Static CIDRs allow precise control over IP address space allocation
6
+ * and enable manual CIDR reservation within the pool's address space.
7
+ *
8
+ * Supported API Versions:
9
+ * - 2023-11-01 (Maintenance)
10
+ * - 2024-05-01 (Active, Latest)
11
+ *
12
+ * Features:
13
+ * - Automatic latest version resolution when no version is specified
14
+ * - Explicit version pinning for stability requirements
15
+ * - Schema-driven validation and transformation
16
+ * - CIDR format validation at construct creation time
17
+ * - Automatic IP address count calculation from CIDR prefix
18
+ * - Full backward compatibility
19
+ * - JSII compliance for multi-language support
20
+ */
21
+ import * as cdktf from "cdktf";
22
+ import { Construct } from "constructs";
23
+ import { AzapiResource, AzapiResourceProps } from "../../core-azure/lib/azapi/azapi-resource";
24
+ import { ApiSchema } from "../../core-azure/lib/version-manager/interfaces/version-interfaces";
25
+ /**
26
+ * Properties for the Azure Virtual Network Manager IPAM Pool Static CIDR
27
+ *
28
+ * Extends AzapiResourceProps with Static CIDR specific properties
29
+ */
30
+ export interface IpamPoolStaticCidrProps extends AzapiResourceProps {
31
+ /**
32
+ * Resource ID of the parent IPAM Pool
33
+ * @example "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.Network/networkManagers/vnm/ipamPools/prod-pool"
34
+ */
35
+ readonly ipamPoolId: string;
36
+ /**
37
+ * Array of IP address prefixes in CIDR notation
38
+ * Must be valid CIDR format (e.g., ["10.0.0.0/24"])
39
+ * Must be contained within the parent pool's address space
40
+ * @example ["10.0.1.0/24"]
41
+ */
42
+ readonly addressPrefixes: string[];
43
+ /**
44
+ * Optional description of the static CIDR allocation
45
+ * @example "Reserved for production web servers"
46
+ */
47
+ readonly description?: string;
48
+ /**
49
+ * The lifecycle rules to ignore changes
50
+ * @example ["tags"]
51
+ */
52
+ readonly ignoreChanges?: string[];
53
+ }
54
+ /**
55
+ * Properties for Static CIDR body
56
+ */
57
+ export interface IpamPoolStaticCidrProperties {
58
+ readonly addressPrefixes: string[];
59
+ readonly description?: string;
60
+ }
61
+ /**
62
+ * The resource body interface for Azure Static CIDR API calls
63
+ */
64
+ export interface IpamPoolStaticCidrBody {
65
+ readonly properties: IpamPoolStaticCidrProperties;
66
+ }
67
+ /**
68
+ * Azure Virtual Network Manager IPAM Pool Static CIDR implementation
69
+ *
70
+ * Static CIDRs explicitly allocate IP address blocks within an IPAM pool,
71
+ * providing precise control over address space reservations. This is useful
72
+ * for manual IP address management or reserving specific ranges for particular
73
+ * purposes within the larger pool.
74
+ *
75
+ * @example
76
+ * // Allocate a static CIDR block in a pool:
77
+ * const staticCidr = new IpamPoolStaticCidr(this, "web-servers", {
78
+ * name: "web-servers-cidr",
79
+ * ipamPoolId: ipamPool.id,
80
+ * addressPrefixes: ["10.0.1.0/24"],
81
+ * description: "Reserved for production web servers"
82
+ * });
83
+ *
84
+ * @example
85
+ * // Allocate with explicit IP count:
86
+ * const staticCidr = new IpamPoolStaticCidr(this, "database-servers", {
87
+ * name: "db-servers-cidr",
88
+ * ipamPoolId: ipamPool.id,
89
+ * addressPrefixes: ["10.0.2.0/24"],
90
+ * description: "Reserved for database servers",
91
+ * apiVersion: "2024-05-01"
92
+ * });
93
+ *
94
+ * @stability stable
95
+ */
96
+ export declare class IpamPoolStaticCidr extends AzapiResource {
97
+ /**
98
+ * Validates address prefix for correct CIDR format
99
+ * Throws descriptive errors if validation fails
100
+ *
101
+ * @param addressPrefix - CIDR block to validate
102
+ * @throws Error if validation fails
103
+ */
104
+ private static validateAddressPrefix;
105
+ /**
106
+ * The input properties for this Static CIDR instance
107
+ */
108
+ readonly props: IpamPoolStaticCidrProps;
109
+ readonly idOutput: cdktf.TerraformOutput;
110
+ readonly nameOutput: cdktf.TerraformOutput;
111
+ readonly addressPrefixOutput: cdktf.TerraformOutput;
112
+ readonly resourceName: string;
113
+ private readonly _calculatedAddressCount;
114
+ /**
115
+ * Creates a new Azure Virtual Network Manager IPAM Pool Static CIDR using the AzapiResource framework
116
+ *
117
+ * @param scope - The scope in which to define this construct
118
+ * @param id - The unique identifier for this instance
119
+ * @param props - Configuration properties for the Static CIDR
120
+ */
121
+ constructor(scope: Construct, id: string, props: IpamPoolStaticCidrProps);
122
+ /**
123
+ * Resolves the parent resource ID for the Static CIDR
124
+ * Static CIDRs are scoped to IPAM Pools
125
+ */
126
+ protected resolveParentId(props: any): string;
127
+ /**
128
+ * Gets the default API version to use when no explicit version is specified
129
+ */
130
+ protected defaultVersion(): string;
131
+ /**
132
+ * Gets the Azure resource type for Static CIDRs
133
+ */
134
+ protected resourceType(): string;
135
+ /**
136
+ * Gets the API schema for the resolved version
137
+ */
138
+ protected apiSchema(): ApiSchema;
139
+ /**
140
+ * Creates the resource body for the Azure API call
141
+ * Note: Child resources do not include location or tags
142
+ */
143
+ protected createResourceBody(props: any): any;
144
+ /**
145
+ * Get the address prefixes of this Static CIDR
146
+ * Returns the input addressPrefixes array
147
+ */
148
+ get addressPrefixes(): string[];
149
+ /**
150
+ * Get the calculated number of IP addresses in this CIDR block
151
+ * This is automatically calculated from the CIDR prefix at construct creation time
152
+ *
153
+ * @returns Total count of IP addresses in the CIDR block
154
+ *
155
+ * @example
156
+ * const staticCidr = new IpamPoolStaticCidr(this, "cidr", {
157
+ * addressPrefixes: ["10.0.1.0/24"]
158
+ * });
159
+ * console.log(staticCidr.calculatedAddressCount); // 256
160
+ */
161
+ get calculatedAddressCount(): number;
162
+ /**
163
+ * Get the provisioning state of the Static CIDR
164
+ */
165
+ get provisioningState(): string;
166
+ /**
167
+ * Applies ignore changes lifecycle rules if specified in props
168
+ */
169
+ private _applyIgnoreChanges;
170
+ }
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.IpamPoolStaticCidr = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ /**
7
+ * Azure Virtual Network Manager IPAM Pool Static CIDR implementation using AzapiResource framework
8
+ *
9
+ * This class provides a unified implementation for explicitly allocating static CIDR blocks
10
+ * within an IPAM pool. Static CIDRs allow precise control over IP address space allocation
11
+ * and enable manual CIDR reservation within the pool's address space.
12
+ *
13
+ * Supported API Versions:
14
+ * - 2023-11-01 (Maintenance)
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
+ * - CIDR format validation at construct creation time
22
+ * - Automatic IP address count calculation from CIDR prefix
23
+ * - Full backward compatibility
24
+ * - JSII compliance for multi-language support
25
+ */
26
+ const cdktf = require("cdktf");
27
+ const ipam_pool_static_cidr_schemas_1 = require("./ipam-pool-static-cidr-schemas");
28
+ const cidr_validator_1 = require("./utils/cidr-validator");
29
+ const azapi_resource_1 = require("../../core-azure/lib/azapi/azapi-resource");
30
+ /**
31
+ * Azure Virtual Network Manager IPAM Pool Static CIDR implementation
32
+ *
33
+ * Static CIDRs explicitly allocate IP address blocks within an IPAM pool,
34
+ * providing precise control over address space reservations. This is useful
35
+ * for manual IP address management or reserving specific ranges for particular
36
+ * purposes within the larger pool.
37
+ *
38
+ * @example
39
+ * // Allocate a static CIDR block in a pool:
40
+ * const staticCidr = new IpamPoolStaticCidr(this, "web-servers", {
41
+ * name: "web-servers-cidr",
42
+ * ipamPoolId: ipamPool.id,
43
+ * addressPrefixes: ["10.0.1.0/24"],
44
+ * description: "Reserved for production web servers"
45
+ * });
46
+ *
47
+ * @example
48
+ * // Allocate with explicit IP count:
49
+ * const staticCidr = new IpamPoolStaticCidr(this, "database-servers", {
50
+ * name: "db-servers-cidr",
51
+ * ipamPoolId: ipamPool.id,
52
+ * addressPrefixes: ["10.0.2.0/24"],
53
+ * description: "Reserved for database servers",
54
+ * apiVersion: "2024-05-01"
55
+ * });
56
+ *
57
+ * @stability stable
58
+ */
59
+ class IpamPoolStaticCidr extends azapi_resource_1.AzapiResource {
60
+ /**
61
+ * Validates address prefix for correct CIDR format
62
+ * Throws descriptive errors if validation fails
63
+ *
64
+ * @param addressPrefix - CIDR block to validate
65
+ * @throws Error if validation fails
66
+ */
67
+ static validateAddressPrefix(addressPrefix) {
68
+ if (!addressPrefix) {
69
+ throw new Error("Address prefix is required");
70
+ }
71
+ const validation = (0, cidr_validator_1.validateCidr)(addressPrefix);
72
+ if (!validation.valid) {
73
+ throw new Error(`Invalid address prefix: ${addressPrefix}. ${validation.errors.join(", ")}`);
74
+ }
75
+ // Log warnings if any (e.g., misaligned network address)
76
+ if (validation.warnings.length > 0) {
77
+ console.warn(`Warning for address prefix ${addressPrefix}: ${validation.warnings.join(", ")}`);
78
+ }
79
+ }
80
+ /**
81
+ * Creates a new Azure Virtual Network Manager IPAM Pool Static CIDR using the AzapiResource framework
82
+ *
83
+ * @param scope - The scope in which to define this construct
84
+ * @param id - The unique identifier for this instance
85
+ * @param props - Configuration properties for the Static CIDR
86
+ */
87
+ constructor(scope, id, props) {
88
+ // Validate CIDR formats before construction
89
+ if (!props.addressPrefixes || props.addressPrefixes.length === 0) {
90
+ throw new Error("At least one address prefix is required");
91
+ }
92
+ props.addressPrefixes.forEach((prefix) => {
93
+ IpamPoolStaticCidr.validateAddressPrefix(prefix);
94
+ });
95
+ super(scope, id, props);
96
+ this.props = props;
97
+ // Calculate address count from first CIDR prefix
98
+ this._calculatedAddressCount = (0, cidr_validator_1.calculateAddressCount)(props.addressPrefixes[0]);
99
+ // Extract properties from the AZAPI resource outputs using Terraform interpolation
100
+ this.resourceName = `\${${this.terraformResource.fqn}.name}`;
101
+ // Create Terraform outputs for easy access and referencing from other resources
102
+ this.idOutput = new cdktf.TerraformOutput(this, "id", {
103
+ value: this.id,
104
+ description: "The ID of the Static CIDR",
105
+ });
106
+ this.nameOutput = new cdktf.TerraformOutput(this, "name", {
107
+ value: this.resourceName,
108
+ description: "The name of the Static CIDR",
109
+ });
110
+ this.addressPrefixOutput = new cdktf.TerraformOutput(this, "addressPrefixes", {
111
+ value: JSON.stringify(props.addressPrefixes),
112
+ description: "The address prefixes of the Static CIDR",
113
+ });
114
+ // Override logical IDs to match naming convention
115
+ this.idOutput.overrideLogicalId("id");
116
+ this.nameOutput.overrideLogicalId("name");
117
+ this.addressPrefixOutput.overrideLogicalId("addressPrefixes");
118
+ // Apply ignore changes if specified
119
+ this._applyIgnoreChanges();
120
+ }
121
+ // =============================================================================
122
+ // REQUIRED ABSTRACT METHODS FROM AzapiResource
123
+ // =============================================================================
124
+ /**
125
+ * Resolves the parent resource ID for the Static CIDR
126
+ * Static CIDRs are scoped to IPAM Pools
127
+ */
128
+ resolveParentId(props) {
129
+ const typedProps = props;
130
+ return typedProps.ipamPoolId;
131
+ }
132
+ /**
133
+ * Gets the default API version to use when no explicit version is specified
134
+ */
135
+ defaultVersion() {
136
+ return "2024-05-01";
137
+ }
138
+ /**
139
+ * Gets the Azure resource type for Static CIDRs
140
+ */
141
+ resourceType() {
142
+ return ipam_pool_static_cidr_schemas_1.STATIC_CIDR_TYPE;
143
+ }
144
+ /**
145
+ * Gets the API schema for the resolved version
146
+ */
147
+ apiSchema() {
148
+ return this.resolveSchema();
149
+ }
150
+ /**
151
+ * Creates the resource body for the Azure API call
152
+ * Note: Child resources do not include location or tags
153
+ */
154
+ createResourceBody(props) {
155
+ const typedProps = props;
156
+ return {
157
+ properties: {
158
+ addressPrefixes: typedProps.addressPrefixes,
159
+ description: typedProps.description,
160
+ },
161
+ };
162
+ }
163
+ // =============================================================================
164
+ // PUBLIC METHODS FOR STATIC CIDR OPERATIONS
165
+ // =============================================================================
166
+ /**
167
+ * Get the address prefixes of this Static CIDR
168
+ * Returns the input addressPrefixes array
169
+ */
170
+ get addressPrefixes() {
171
+ return this.props.addressPrefixes;
172
+ }
173
+ /**
174
+ * Get the calculated number of IP addresses in this CIDR block
175
+ * This is automatically calculated from the CIDR prefix at construct creation time
176
+ *
177
+ * @returns Total count of IP addresses in the CIDR block
178
+ *
179
+ * @example
180
+ * const staticCidr = new IpamPoolStaticCidr(this, "cidr", {
181
+ * addressPrefixes: ["10.0.1.0/24"]
182
+ * });
183
+ * console.log(staticCidr.calculatedAddressCount); // 256
184
+ */
185
+ get calculatedAddressCount() {
186
+ return this._calculatedAddressCount;
187
+ }
188
+ /**
189
+ * Get the provisioning state of the Static CIDR
190
+ */
191
+ get provisioningState() {
192
+ return `\${${this.terraformResource.fqn}.output.properties.provisioningState}`;
193
+ }
194
+ // =============================================================================
195
+ // PRIVATE HELPER METHODS
196
+ // =============================================================================
197
+ /**
198
+ * Applies ignore changes lifecycle rules if specified in props
199
+ */
200
+ _applyIgnoreChanges() {
201
+ if (this.props.ignoreChanges && this.props.ignoreChanges.length > 0) {
202
+ this.terraformResource.addOverride("lifecycle", {
203
+ ignore_changes: this.props.ignoreChanges,
204
+ });
205
+ }
206
+ }
207
+ }
208
+ exports.IpamPoolStaticCidr = IpamPoolStaticCidr;
209
+ _a = JSII_RTTI_SYMBOL_1;
210
+ IpamPoolStaticCidr[_a] = { fqn: "@microsoft/terraform-cdk-constructs.IpamPoolStaticCidr", version: "1.4.0" };
211
+ (() => {
212
+ azapi_resource_1.AzapiResource.registerSchemas(ipam_pool_static_cidr_schemas_1.STATIC_CIDR_TYPE, ipam_pool_static_cidr_schemas_1.ALL_STATIC_CIDR_VERSIONS);
213
+ })();
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbS1wb29sLXN0YXRpYy1jaWRyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F6dXJlLXZpcnR1YWxuZXR3b3JrbWFuYWdlci9saWIvaXBhbS1wb29sLXN0YXRpYy1jaWRyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCwrQkFBK0I7QUFFL0IsbUZBR3lDO0FBQ3pDLDJEQUE2RTtBQUM3RSw4RUFHbUQ7QUFtRG5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSw4QkFBYTtJQUtuRDs7Ozs7O09BTUc7SUFDSyxNQUFNLENBQUMscUJBQXFCLENBQUMsYUFBcUI7UUFDeEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBQSw2QkFBWSxFQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYiwyQkFBMkIsYUFBYSxLQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQzVFLENBQUM7UUFDSixDQUFDO1FBRUQseURBQXlEO1FBQ3pELElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxDQUFDLElBQUksQ0FDViw4QkFBOEIsYUFBYSxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ2pGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQWtCRDs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixpREFBaUQ7UUFDakQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUEsc0NBQXFCLEVBQ2xELEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQ3pCLENBQUM7UUFFRixtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUU3RCxnRkFBZ0Y7UUFDaEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtZQUNwRCxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDZCxXQUFXLEVBQUUsMkJBQTJCO1NBQ3pDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDeEQsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3hCLFdBQVcsRUFBRSw2QkFBNkI7U0FDM0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FDbEQsSUFBSSxFQUNKLGlCQUFpQixFQUNqQjtZQUNFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDNUMsV0FBVyxFQUFFLHlDQUF5QztTQUN2RCxDQUNGLENBQUM7UUFFRixrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLCtDQUErQztJQUMvQyxnRkFBZ0Y7SUFFaEY7OztPQUdHO0lBQ08sZUFBZSxDQUFDLEtBQVU7UUFDbEMsTUFBTSxVQUFVLEdBQUcsS0FBZ0MsQ0FBQztRQUNwRCxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ08sY0FBYztRQUN0QixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDTyxZQUFZO1FBQ3BCLE9BQU8sZ0RBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ08sU0FBUztRQUNqQixPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sa0JBQWtCLENBQUMsS0FBVTtRQUNyQyxNQUFNLFVBQVUsR0FBRyxLQUFnQyxDQUFDO1FBRXBELE9BQU87WUFDTCxVQUFVLEVBQUU7Z0JBQ1YsZUFBZSxFQUFFLFVBQVUsQ0FBQyxlQUFlO2dCQUMzQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7YUFDcEM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELGdGQUFnRjtJQUNoRiw0Q0FBNEM7SUFDNUMsZ0ZBQWdGO0lBRWhGOzs7T0FHRztJQUNILElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsaUJBQWlCO1FBQzFCLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyx1Q0FBdUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsZ0ZBQWdGO0lBQ2hGLHlCQUF5QjtJQUN6QixnRkFBZ0Y7SUFFaEY7O09BRUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzlDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7O0FBMU1ILGdEQTJNQzs7O0FBMU1DO0lBQ0UsOEJBQWEsQ0FBQyxlQUFlLENBQUMsZ0RBQWdCLEVBQUUsd0RBQXdCLENBQUMsQ0FBQztBQUM1RSxDQUFDLEdBQUEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXp1cmUgVmlydHVhbCBOZXR3b3JrIE1hbmFnZXIgSVBBTSBQb29sIFN0YXRpYyBDSURSIGltcGxlbWVudGF0aW9uIHVzaW5nIEF6YXBpUmVzb3VyY2UgZnJhbWV3b3JrXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHVuaWZpZWQgaW1wbGVtZW50YXRpb24gZm9yIGV4cGxpY2l0bHkgYWxsb2NhdGluZyBzdGF0aWMgQ0lEUiBibG9ja3NcbiAqIHdpdGhpbiBhbiBJUEFNIHBvb2wuIFN0YXRpYyBDSURScyBhbGxvdyBwcmVjaXNlIGNvbnRyb2wgb3ZlciBJUCBhZGRyZXNzIHNwYWNlIGFsbG9jYXRpb25cbiAqIGFuZCBlbmFibGUgbWFudWFsIENJRFIgcmVzZXJ2YXRpb24gd2l0aGluIHRoZSBwb29sJ3MgYWRkcmVzcyBzcGFjZS5cbiAqXG4gKiBTdXBwb3J0ZWQgQVBJIFZlcnNpb25zOlxuICogLSAyMDIzLTExLTAxIChNYWludGVuYW5jZSlcbiAqIC0gMjAyNC0wNS0wMSAoQWN0aXZlLCBMYXRlc3QpXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBsYXRlc3QgdmVyc2lvbiByZXNvbHV0aW9uIHdoZW4gbm8gdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAqIC0gRXhwbGljaXQgdmVyc2lvbiBwaW5uaW5nIGZvciBzdGFiaWxpdHkgcmVxdWlyZW1lbnRzXG4gKiAtIFNjaGVtYS1kcml2ZW4gdmFsaWRhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb25cbiAqIC0gQ0lEUiBmb3JtYXQgdmFsaWRhdGlvbiBhdCBjb25zdHJ1Y3QgY3JlYXRpb24gdGltZVxuICogLSBBdXRvbWF0aWMgSVAgYWRkcmVzcyBjb3VudCBjYWxjdWxhdGlvbiBmcm9tIENJRFIgcHJlZml4XG4gKiAtIEZ1bGwgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICogLSBKU0lJIGNvbXBsaWFuY2UgZm9yIG11bHRpLWxhbmd1YWdlIHN1cHBvcnRcbiAqL1xuXG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBBTExfU1RBVElDX0NJRFJfVkVSU0lPTlMsXG4gIFNUQVRJQ19DSURSX1RZUEUsXG59IGZyb20gXCIuL2lwYW0tcG9vbC1zdGF0aWMtY2lkci1zY2hlbWFzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVBZGRyZXNzQ291bnQsIHZhbGlkYXRlQ2lkciB9IGZyb20gXCIuL3V0aWxzL2NpZHItdmFsaWRhdG9yXCI7XG5pbXBvcnQge1xuICBBemFwaVJlc291cmNlLFxuICBBemFwaVJlc291cmNlUHJvcHMsXG59IGZyb20gXCIuLi8uLi9jb3JlLWF6dXJlL2xpYi9hemFwaS9hemFwaS1yZXNvdXJjZVwiO1xuaW1wb3J0IHsgQXBpU2NoZW1hIH0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL3ZlcnNpb24tbWFuYWdlci9pbnRlcmZhY2VzL3ZlcnNpb24taW50ZXJmYWNlc1wiO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBBenVyZSBWaXJ0dWFsIE5ldHdvcmsgTWFuYWdlciBJUEFNIFBvb2wgU3RhdGljIENJRFJcbiAqXG4gKiBFeHRlbmRzIEF6YXBpUmVzb3VyY2VQcm9wcyB3aXRoIFN0YXRpYyBDSURSIHNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcGFtUG9vbFN0YXRpY0NpZHJQcm9wcyBleHRlbmRzIEF6YXBpUmVzb3VyY2VQcm9wcyB7XG4gIC8qKlxuICAgKiBSZXNvdXJjZSBJRCBvZiB0aGUgcGFyZW50IElQQU0gUG9vbFxuICAgKiBAZXhhbXBsZSBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMC9yZXNvdXJjZUdyb3Vwcy9yZy9wcm92aWRlcnMvTWljcm9zb2Z0Lk5ldHdvcmsvbmV0d29ya01hbmFnZXJzL3ZubS9pcGFtUG9vbHMvcHJvZC1wb29sXCJcbiAgICovXG4gIHJlYWRvbmx5IGlwYW1Qb29sSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQXJyYXkgb2YgSVAgYWRkcmVzcyBwcmVmaXhlcyBpbiBDSURSIG5vdGF0aW9uXG4gICAqIE11c3QgYmUgdmFsaWQgQ0lEUiBmb3JtYXQgKGUuZy4sIFtcIjEwLjAuMC4wLzI0XCJdKVxuICAgKiBNdXN0IGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHBhcmVudCBwb29sJ3MgYWRkcmVzcyBzcGFjZVxuICAgKiBAZXhhbXBsZSBbXCIxMC4wLjEuMC8yNFwiXVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkcmVzc1ByZWZpeGVzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0YXRpYyBDSURSIGFsbG9jYXRpb25cbiAgICogQGV4YW1wbGUgXCJSZXNlcnZlZCBmb3IgcHJvZHVjdGlvbiB3ZWIgc2VydmVyc1wiXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxpZmVjeWNsZSBydWxlcyB0byBpZ25vcmUgY2hhbmdlc1xuICAgKiBAZXhhbXBsZSBbXCJ0YWdzXCJdXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVDaGFuZ2VzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgU3RhdGljIENJRFIgYm9keVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElwYW1Qb29sU3RhdGljQ2lkclByb3BlcnRpZXMge1xuICByZWFkb25seSBhZGRyZXNzUHJlZml4ZXM6IHN0cmluZ1tdO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgYm9keSBpbnRlcmZhY2UgZm9yIEF6dXJlIFN0YXRpYyBDSURSIEFQSSBjYWxsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElwYW1Qb29sU3RhdGljQ2lkckJvZHkge1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBJcGFtUG9vbFN0YXRpY0NpZHJQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIEF6dXJlIFZpcnR1YWwgTmV0d29yayBNYW5hZ2VyIElQQU0gUG9vbCBTdGF0aWMgQ0lEUiBpbXBsZW1lbnRhdGlvblxuICpcbiAqIFN0YXRpYyBDSURScyBleHBsaWNpdGx5IGFsbG9jYXRlIElQIGFkZHJlc3MgYmxvY2tzIHdpdGhpbiBhbiBJUEFNIHBvb2wsXG4gKiBwcm92aWRpbmcgcHJlY2lzZSBjb250cm9sIG92ZXIgYWRkcmVzcyBzcGFjZSByZXNlcnZhdGlvbnMuIFRoaXMgaXMgdXNlZnVsXG4gKiBmb3IgbWFudWFsIElQIGFkZHJlc3MgbWFuYWdlbWVudCBvciByZXNlcnZpbmcgc3BlY2lmaWMgcmFuZ2VzIGZvciBwYXJ0aWN1bGFyXG4gKiBwdXJwb3NlcyB3aXRoaW4gdGhlIGxhcmdlciBwb29sLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBbGxvY2F0ZSBhIHN0YXRpYyBDSURSIGJsb2NrIGluIGEgcG9vbDpcbiAqIGNvbnN0IHN0YXRpY0NpZHIgPSBuZXcgSXBhbVBvb2xTdGF0aWNDaWRyKHRoaXMsIFwid2ViLXNlcnZlcnNcIiwge1xuICogICBuYW1lOiBcIndlYi1zZXJ2ZXJzLWNpZHJcIixcbiAqICAgaXBhbVBvb2xJZDogaXBhbVBvb2wuaWQsXG4gKiAgIGFkZHJlc3NQcmVmaXhlczogW1wiMTAuMC4xLjAvMjRcIl0sXG4gKiAgIGRlc2NyaXB0aW9uOiBcIlJlc2VydmVkIGZvciBwcm9kdWN0aW9uIHdlYiBzZXJ2ZXJzXCJcbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBbGxvY2F0ZSB3aXRoIGV4cGxpY2l0IElQIGNvdW50OlxuICogY29uc3Qgc3RhdGljQ2lkciA9IG5ldyBJcGFtUG9vbFN0YXRpY0NpZHIodGhpcywgXCJkYXRhYmFzZS1zZXJ2ZXJzXCIsIHtcbiAqICAgbmFtZTogXCJkYi1zZXJ2ZXJzLWNpZHJcIixcbiAqICAgaXBhbVBvb2xJZDogaXBhbVBvb2wuaWQsXG4gKiAgIGFkZHJlc3NQcmVmaXhlczogW1wiMTAuMC4yLjAvMjRcIl0sXG4gKiAgIGRlc2NyaXB0aW9uOiBcIlJlc2VydmVkIGZvciBkYXRhYmFzZSBzZXJ2ZXJzXCIsXG4gKiAgIGFwaVZlcnNpb246IFwiMjAyNC0wNS0wMVwiXG4gKiB9KTtcbiAqXG4gKiBAc3RhYmlsaXR5IHN0YWJsZVxuICovXG5leHBvcnQgY2xhc3MgSXBhbVBvb2xTdGF0aWNDaWRyIGV4dGVuZHMgQXphcGlSZXNvdXJjZSB7XG4gIHN0YXRpYyB7XG4gICAgQXphcGlSZXNvdXJjZS5yZWdpc3RlclNjaGVtYXMoU1RBVElDX0NJRFJfVFlQRSwgQUxMX1NUQVRJQ19DSURSX1ZFUlNJT05TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYWRkcmVzcyBwcmVmaXggZm9yIGNvcnJlY3QgQ0lEUiBmb3JtYXRcbiAgICogVGhyb3dzIGRlc2NyaXB0aXZlIGVycm9ycyBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBwYXJhbSBhZGRyZXNzUHJlZml4IC0gQ0lEUiBibG9jayB0byB2YWxpZGF0ZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlQWRkcmVzc1ByZWZpeChhZGRyZXNzUHJlZml4OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWFkZHJlc3NQcmVmaXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFkZHJlc3MgcHJlZml4IGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZUNpZHIoYWRkcmVzc1ByZWZpeCk7XG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGFkZHJlc3MgcHJlZml4OiAke2FkZHJlc3NQcmVmaXh9LiAke3ZhbGlkYXRpb24uZXJyb3JzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55IChlLmcuLCBtaXNhbGlnbmVkIG5ldHdvcmsgYWRkcmVzcylcbiAgICBpZiAodmFsaWRhdGlvbi53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nIGZvciBhZGRyZXNzIHByZWZpeCAke2FkZHJlc3NQcmVmaXh9OiAke3ZhbGlkYXRpb24ud2FybmluZ3Muam9pbihcIiwgXCIpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcHJvcGVydGllcyBmb3IgdGhpcyBTdGF0aWMgQ0lEUiBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb3BzOiBJcGFtUG9vbFN0YXRpY0NpZHJQcm9wcztcblxuICAvLyBPdXRwdXQgcHJvcGVydGllcyBmb3IgZWFzeSBhY2Nlc3MgYW5kIHJlZmVyZW5jaW5nXG4gIHB1YmxpYyByZWFkb25seSBpZE91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZU91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuICBwdWJsaWMgcmVhZG9ubHkgYWRkcmVzc1ByZWZpeE91dHB1dDogY2RrdGYuVGVycmFmb3JtT3V0cHV0O1xuXG4gIC8vIFB1YmxpYyBwcm9wZXJ0aWVzXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZU5hbWU6IHN0cmluZztcblxuICAvLyBTdG9yZSBjYWxjdWxhdGVkIGFkZHJlc3MgY291bnRcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FsY3VsYXRlZEFkZHJlc3NDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IEF6dXJlIFZpcnR1YWwgTmV0d29yayBNYW5hZ2VyIElQQU0gUG9vbCBTdGF0aWMgQ0lEUiB1c2luZyB0aGUgQXphcGlSZXNvdXJjZSBmcmFtZXdvcmtcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgaW5zdGFuY2VcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgU3RhdGljIENJRFJcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJcGFtUG9vbFN0YXRpY0NpZHJQcm9wcykge1xuICAgIC8vIFZhbGlkYXRlIENJRFIgZm9ybWF0cyBiZWZvcmUgY29uc3RydWN0aW9uXG4gICAgaWYgKCFwcm9wcy5hZGRyZXNzUHJlZml4ZXMgfHwgcHJvcHMuYWRkcmVzc1ByZWZpeGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXQgbGVhc3Qgb25lIGFkZHJlc3MgcHJlZml4IGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cbiAgICBwcm9wcy5hZGRyZXNzUHJlZml4ZXMuZm9yRWFjaCgocHJlZml4KSA9PiB7XG4gICAgICBJcGFtUG9vbFN0YXRpY0NpZHIudmFsaWRhdGVBZGRyZXNzUHJlZml4KHByZWZpeCk7XG4gICAgfSk7XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIC8vIENhbGN1bGF0ZSBhZGRyZXNzIGNvdW50IGZyb20gZmlyc3QgQ0lEUiBwcmVmaXhcbiAgICB0aGlzLl9jYWxjdWxhdGVkQWRkcmVzc0NvdW50ID0gY2FsY3VsYXRlQWRkcmVzc0NvdW50KFxuICAgICAgcHJvcHMuYWRkcmVzc1ByZWZpeGVzWzBdLFxuICAgICk7XG5cbiAgICAvLyBFeHRyYWN0IHByb3BlcnRpZXMgZnJvbSB0aGUgQVpBUEkgcmVzb3VyY2Ugb3V0cHV0cyB1c2luZyBUZXJyYWZvcm0gaW50ZXJwb2xhdGlvblxuICAgIHRoaXMucmVzb3VyY2VOYW1lID0gYFxcJHske3RoaXMudGVycmFmb3JtUmVzb3VyY2UuZnFufS5uYW1lfWA7XG5cbiAgICAvLyBDcmVhdGUgVGVycmFmb3JtIG91dHB1dHMgZm9yIGVhc3kgYWNjZXNzIGFuZCByZWZlcmVuY2luZyBmcm9tIG90aGVyIHJlc291cmNlc1xuICAgIHRoaXMuaWRPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwiaWRcIiwge1xuICAgICAgdmFsdWU6IHRoaXMuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgSUQgb2YgdGhlIFN0YXRpYyBDSURSXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm5hbWVPdXRwdXQgPSBuZXcgY2RrdGYuVGVycmFmb3JtT3V0cHV0KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogdGhpcy5yZXNvdXJjZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbmFtZSBvZiB0aGUgU3RhdGljIENJRFJcIixcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkcmVzc1ByZWZpeE91dHB1dCA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQoXG4gICAgICB0aGlzLFxuICAgICAgXCJhZGRyZXNzUHJlZml4ZXNcIixcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHByb3BzLmFkZHJlc3NQcmVmaXhlcyksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBhZGRyZXNzIHByZWZpeGVzIG9mIHRoZSBTdGF0aWMgQ0lEUlwiLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gT3ZlcnJpZGUgbG9naWNhbCBJRHMgdG8gbWF0Y2ggbmFtaW5nIGNvbnZlbnRpb25cbiAgICB0aGlzLmlkT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwiaWRcIik7XG4gICAgdGhpcy5uYW1lT3V0cHV0Lm92ZXJyaWRlTG9naWNhbElkKFwibmFtZVwiKTtcbiAgICB0aGlzLmFkZHJlc3NQcmVmaXhPdXRwdXQub3ZlcnJpZGVMb2dpY2FsSWQoXCJhZGRyZXNzUHJlZml4ZXNcIik7XG5cbiAgICAvLyBBcHBseSBpZ25vcmUgY2hhbmdlcyBpZiBzcGVjaWZpZWRcbiAgICB0aGlzLl9hcHBseUlnbm9yZUNoYW5nZXMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJFUVVJUkVEIEFCU1RSQUNUIE1FVEhPRFMgRlJPTSBBemFwaVJlc291cmNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBwYXJlbnQgcmVzb3VyY2UgSUQgZm9yIHRoZSBTdGF0aWMgQ0lEUlxuICAgKiBTdGF0aWMgQ0lEUnMgYXJlIHNjb3BlZCB0byBJUEFNIFBvb2xzXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVBhcmVudElkKHByb3BzOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVkUHJvcHMgPSBwcm9wcyBhcyBJcGFtUG9vbFN0YXRpY0NpZHJQcm9wcztcbiAgICByZXR1cm4gdHlwZWRQcm9wcy5pcGFtUG9vbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRlZmF1bHQgQVBJIHZlcnNpb24gdG8gdXNlIHdoZW4gbm8gZXhwbGljaXQgdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHByb3RlY3RlZCBkZWZhdWx0VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjIwMjQtMDUtMDFcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBenVyZSByZXNvdXJjZSB0eXBlIGZvciBTdGF0aWMgQ0lEUnNcbiAgICovXG4gIHByb3RlY3RlZCByZXNvdXJjZVR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU1RBVElDX0NJRFJfVFlQRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBBUEkgc2NoZW1hIGZvciB0aGUgcmVzb2x2ZWQgdmVyc2lvblxuICAgKi9cbiAgcHJvdGVjdGVkIGFwaVNjaGVtYSgpOiBBcGlTY2hlbWEge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVTY2hlbWEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSByZXNvdXJjZSBib2R5IGZvciB0aGUgQXp1cmUgQVBJIGNhbGxcbiAgICogTm90ZTogQ2hpbGQgcmVzb3VyY2VzIGRvIG5vdCBpbmNsdWRlIGxvY2F0aW9uIG9yIHRhZ3NcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVSZXNvdXJjZUJvZHkocHJvcHM6IGFueSk6IGFueSB7XG4gICAgY29uc3QgdHlwZWRQcm9wcyA9IHByb3BzIGFzIElwYW1Qb29sU3RhdGljQ2lkclByb3BzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgYWRkcmVzc1ByZWZpeGVzOiB0eXBlZFByb3BzLmFkZHJlc3NQcmVmaXhlcyxcbiAgICAgICAgZGVzY3JpcHRpb246IHR5cGVkUHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQVUJMSUMgTUVUSE9EUyBGT1IgU1RBVElDIENJRFIgT1BFUkFUSU9OU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFkZHJlc3MgcHJlZml4ZXMgb2YgdGhpcyBTdGF0aWMgQ0lEUlxuICAgKiBSZXR1cm5zIHRoZSBpbnB1dCBhZGRyZXNzUHJlZml4ZXMgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBnZXQgYWRkcmVzc1ByZWZpeGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5hZGRyZXNzUHJlZml4ZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjYWxjdWxhdGVkIG51bWJlciBvZiBJUCBhZGRyZXNzZXMgaW4gdGhpcyBDSURSIGJsb2NrXG4gICAqIFRoaXMgaXMgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGZyb20gdGhlIENJRFIgcHJlZml4IGF0IGNvbnN0cnVjdCBjcmVhdGlvbiB0aW1lXG4gICAqXG4gICAqIEByZXR1cm5zIFRvdGFsIGNvdW50IG9mIElQIGFkZHJlc3NlcyBpbiB0aGUgQ0lEUiBibG9ja1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBzdGF0aWNDaWRyID0gbmV3IElwYW1Qb29sU3RhdGljQ2lkcih0aGlzLCBcImNpZHJcIiwge1xuICAgKiAgIGFkZHJlc3NQcmVmaXhlczogW1wiMTAuMC4xLjAvMjRcIl1cbiAgICogfSk7XG4gICAqIGNvbnNvbGUubG9nKHN0YXRpY0NpZHIuY2FsY3VsYXRlZEFkZHJlc3NDb3VudCk7IC8vIDI1NlxuICAgKi9cbiAgcHVibGljIGdldCBjYWxjdWxhdGVkQWRkcmVzc0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZWRBZGRyZXNzQ291bnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwcm92aXNpb25pbmcgc3RhdGUgb2YgdGhlIFN0YXRpYyBDSURSXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb3Zpc2lvbmluZ1N0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcXCR7JHt0aGlzLnRlcnJhZm9ybVJlc291cmNlLmZxbn0ub3V0cHV0LnByb3BlcnRpZXMucHJvdmlzaW9uaW5nU3RhdGV9YDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgSEVMUEVSIE1FVEhPRFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQXBwbGllcyBpZ25vcmUgY2hhbmdlcyBsaWZlY3ljbGUgcnVsZXMgaWYgc3BlY2lmaWVkIGluIHByb3BzXG4gICAqL1xuICBwcml2YXRlIF9hcHBseUlnbm9yZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJvcHMuaWdub3JlQ2hhbmdlcyAmJiB0aGlzLnByb3BzLmlnbm9yZUNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50ZXJyYWZvcm1SZXNvdXJjZS5hZGRPdmVycmlkZShcImxpZmVjeWNsZVwiLCB7XG4gICAgICAgIGlnbm9yZV9jaGFuZ2VzOiB0aGlzLnByb3BzLmlnbm9yZUNoYW5nZXMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Azure Virtual Network Manager IPAM Pool implementation using AzapiResource framework
3
+ *
4
+ * This class provides a unified implementation for Azure Virtual Network Manager IPAM Pools
5
+ * that automatically handles version management, schema validation, and property transformation
6
+ * across all supported API versions.
7
+ *
8
+ * Supported API Versions:
9
+ * - 2024-05-01 (Active, Latest)
10
+ *
11
+ * Features:
12
+ * - Automatic latest version resolution when no version is specified
13
+ * - Explicit version pinning for stability requirements
14
+ * - Schema-driven validation and transformation
15
+ * - CIDR validation and overlap detection
16
+ * - Hierarchical pool support
17
+ * - JSII compliance for multi-language support
18
+ */
19
+ import * as cdktf from "cdktf";
20
+ import { Construct } from "constructs";
21
+ import { AzapiResource, AzapiResourceProps } from "../../core-azure/lib/azapi/azapi-resource";
22
+ import { ApiSchema } from "../../core-azure/lib/version-manager/interfaces/version-interfaces";
23
+ /**
24
+ * Properties for the Azure Virtual Network Manager IPAM Pool
25
+ *
26
+ * Extends AzapiResourceProps with IPAM Pool specific properties
27
+ */
28
+ export interface IpamPoolProps extends AzapiResourceProps {
29
+ /**
30
+ * Resource ID of the parent Network Manager
31
+ * @example "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.Network/networkManagers/vnm"
32
+ */
33
+ readonly networkManagerId: string;
34
+ /**
35
+ * IP address prefixes for the pool
36
+ * Must be valid CIDR notation (e.g., "10.0.0.0/8")
37
+ * Multiple prefixes must not overlap
38
+ * @example ["10.0.0.0/8", "172.16.0.0/12"]
39
+ */
40
+ readonly addressPrefixes: string[];
41
+ /**
42
+ * Optional description of the IPAM pool
43
+ * @example "Production IP address pool for East US region"
44
+ */
45
+ readonly description?: string;
46
+ /**
47
+ * Optional friendly display name
48
+ * @example "East US Production Pool"
49
+ */
50
+ readonly displayName?: string;
51
+ /**
52
+ * Name of parent pool for hierarchical pools
53
+ * Leave empty/undefined for root pools
54
+ * @example "root-pool"
55
+ */
56
+ readonly parentPoolName?: string;
57
+ /**
58
+ * The lifecycle rules to ignore changes
59
+ * @example ["tags"]
60
+ */
61
+ readonly ignoreChanges?: string[];
62
+ }
63
+ /**
64
+ * Properties for IPAM Pool body
65
+ */
66
+ export interface IpamPoolProperties {
67
+ readonly addressPrefixes: string[];
68
+ readonly description?: string;
69
+ readonly displayName?: string;
70
+ readonly parentPoolName?: string;
71
+ }
72
+ /**
73
+ * The resource body interface for Azure IPAM Pool API calls
74
+ */
75
+ export interface IpamPoolBody {
76
+ readonly location: string;
77
+ readonly tags?: Record<string, string>;
78
+ readonly properties: IpamPoolProperties;
79
+ }
80
+ /**
81
+ * Azure Virtual Network Manager IPAM Pool implementation
82
+ *
83
+ * IPAM Pools provide centralized IP address management for virtual networks,
84
+ * enabling automatic CIDR allocation, overlap prevention, and hierarchical
85
+ * address space organization. They are essential for managing IP addresses
86
+ * at scale across multiple virtual networks and subscriptions.
87
+ *
88
+ * @example
89
+ * // Basic IPAM pool for production workloads:
90
+ * const ipamPool = new IpamPool(this, "prod-pool", {
91
+ * name: "production-pool",
92
+ * location: "eastus",
93
+ * networkManagerId: networkManager.id,
94
+ * addressPrefixes: ["10.0.0.0/8"],
95
+ * description: "Root IP address pool for production",
96
+ * displayName: "Production Pool"
97
+ * });
98
+ *
99
+ * @example
100
+ * // Hierarchical pool with parent reference:
101
+ * const childPool = new IpamPool(this, "eastus-pool", {
102
+ * name: "eastus-pool",
103
+ * location: "eastus",
104
+ * networkManagerId: networkManager.id,
105
+ * addressPrefixes: ["10.1.0.0/16"],
106
+ * parentPoolName: "production-pool",
107
+ * description: "East US regional pool"
108
+ * });
109
+ *
110
+ * @stability stable
111
+ */
112
+ export declare class IpamPool extends AzapiResource {
113
+ /**
114
+ * Validates address prefixes for format and overlap
115
+ * Throws descriptive errors if validation fails
116
+ *
117
+ * @param prefixes - Array of CIDR blocks to validate
118
+ * @throws Error if validation fails
119
+ */
120
+ private static validateAddressPrefixes;
121
+ /**
122
+ * The input properties for this IPAM Pool instance
123
+ */
124
+ readonly props: IpamPoolProps;
125
+ readonly idOutput: cdktf.TerraformOutput;
126
+ readonly nameOutput: cdktf.TerraformOutput;
127
+ readonly locationOutput: cdktf.TerraformOutput;
128
+ readonly resourceName: string;
129
+ /**
130
+ * Creates a new Azure Virtual Network Manager IPAM Pool using the AzapiResource framework
131
+ *
132
+ * @param scope - The scope in which to define this construct
133
+ * @param id - The unique identifier for this instance
134
+ * @param props - Configuration properties for the IPAM Pool
135
+ */
136
+ constructor(scope: Construct, id: string, props: IpamPoolProps);
137
+ /**
138
+ * Resolves the parent resource ID for the IPAM Pool
139
+ * IPAM Pools are scoped to Network Managers
140
+ */
141
+ protected resolveParentId(props: any): string;
142
+ /**
143
+ * Gets the default API version to use when no explicit version is specified
144
+ */
145
+ protected defaultVersion(): string;
146
+ /**
147
+ * Gets the Azure resource type for IPAM Pools
148
+ */
149
+ protected resourceType(): string;
150
+ /**
151
+ * Gets the API schema for the resolved version
152
+ */
153
+ protected apiSchema(): ApiSchema;
154
+ /**
155
+ * Creates the resource body for the Azure API call
156
+ */
157
+ protected createResourceBody(props: any): any;
158
+ /**
159
+ * Calculate total number of IP addresses in this pool
160
+ * Sums up all addresses from all CIDR blocks
161
+ *
162
+ * @returns Total count of IP addresses across all prefixes
163
+ *
164
+ * @example
165
+ * const pool = new IpamPool(this, "pool", {
166
+ * addressPrefixes: ["10.0.0.0/24", "10.1.0.0/24"]
167
+ * });
168
+ * console.log(pool.totalAddressCount); // 512 (256 + 256)
169
+ */
170
+ get totalAddressCount(): number;
171
+ /**
172
+ * Applies ignore changes lifecycle rules if specified in props
173
+ */
174
+ private _applyIgnoreChanges;
175
+ }