@fjall/components-infrastructure 0.89.4 → 0.89.6

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 (378) hide show
  1. package/LICENSE +50 -21
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +1 -18
  4. package/dist/lib/app.d.ts +12 -12
  5. package/dist/lib/app.js +61 -56
  6. package/dist/lib/aspects/index.d.ts +1 -1
  7. package/dist/lib/aspects/index.js +1 -6
  8. package/dist/lib/aspects/resourceInventory.js +6 -13
  9. package/dist/lib/config/audit.js +1 -5
  10. package/dist/lib/config/aws/accessAnalyser.d.ts +11 -0
  11. package/dist/lib/config/aws/accessAnalyser.js +17 -0
  12. package/dist/lib/config/aws/accountAuditRole.js +11 -15
  13. package/dist/lib/config/aws/accountMonitoringRole.js +25 -29
  14. package/dist/lib/config/aws/alarmTopic.d.ts +8 -0
  15. package/dist/lib/config/aws/alarmTopic.js +19 -0
  16. package/dist/lib/config/aws/cloudTrail.js +4 -9
  17. package/dist/lib/config/aws/configRecorder.d.ts +16 -0
  18. package/dist/lib/config/aws/configRecorder.js +51 -0
  19. package/dist/lib/config/aws/configRulePreset.d.ts +13 -0
  20. package/dist/lib/config/aws/configRulePreset.js +62 -0
  21. package/dist/lib/config/aws/disasterRecovery.d.ts +1 -1
  22. package/dist/lib/config/aws/disasterRecovery.js +56 -73
  23. package/dist/lib/config/aws/ebsDefaultEncryption.d.ts +8 -0
  24. package/dist/lib/config/aws/ebsDefaultEncryption.js +41 -0
  25. package/dist/lib/config/aws/ecrDefaultImage.js +25 -30
  26. package/dist/lib/config/aws/eventBus.js +8 -11
  27. package/dist/lib/config/aws/guardDutyDetector.d.ts +16 -0
  28. package/dist/lib/config/aws/guardDutyDetector.js +26 -0
  29. package/dist/lib/config/aws/identityCenter.d.ts +1 -1
  30. package/dist/lib/config/aws/identityCenter.js +23 -25
  31. package/dist/lib/config/aws/identityCenterGroupMembership.js +18 -22
  32. package/dist/lib/config/aws/index.d.ts +19 -8
  33. package/dist/lib/config/aws/index.js +19 -25
  34. package/dist/lib/config/aws/inspectorEnablement.d.ts +9 -0
  35. package/dist/lib/config/aws/inspectorEnablement.js +51 -0
  36. package/dist/lib/config/aws/ipam.js +9 -13
  37. package/dist/lib/config/aws/oidcConnector.js +8 -12
  38. package/dist/lib/config/aws/platform.js +1 -5
  39. package/dist/lib/config/aws/s3BlockPublicAccess.d.ts +9 -0
  40. package/dist/lib/config/aws/s3BlockPublicAccess.js +55 -0
  41. package/dist/lib/config/aws/scpPreset.d.ts +21 -0
  42. package/dist/lib/config/aws/scpPreset.js +311 -0
  43. package/dist/lib/config/aws/securityBaseline.d.ts +15 -0
  44. package/dist/lib/config/aws/securityBaseline.js +27 -0
  45. package/dist/lib/config/aws/securityHubHub.d.ts +15 -0
  46. package/dist/lib/config/aws/securityHubHub.js +28 -0
  47. package/dist/lib/config/aws/securityServicesAdmin.d.ts +20 -0
  48. package/dist/lib/config/aws/securityServicesAdmin.js +115 -0
  49. package/dist/lib/config/index.d.ts +2 -2
  50. package/dist/lib/config/index.js +2 -21
  51. package/dist/lib/index.d.ts +4 -4
  52. package/dist/lib/index.js +5 -26
  53. package/dist/lib/patterns/aws/account.d.ts +17 -1
  54. package/dist/lib/patterns/aws/account.js +61 -33
  55. package/dist/lib/patterns/aws/apexDomainPattern.d.ts +26 -0
  56. package/dist/lib/patterns/aws/apexDomainPattern.js +91 -0
  57. package/dist/lib/patterns/aws/auditRole.js +13 -16
  58. package/dist/lib/patterns/aws/buildkite.d.ts +1 -1
  59. package/dist/lib/patterns/aws/buildkite.js +70 -75
  60. package/dist/lib/patterns/aws/cdn.d.ts +5 -5
  61. package/dist/lib/patterns/aws/cdn.js +22 -28
  62. package/dist/lib/patterns/aws/compute.d.ts +1 -1
  63. package/dist/lib/patterns/aws/compute.js +31 -44
  64. package/dist/lib/patterns/aws/computeEc2.d.ts +1 -1
  65. package/dist/lib/patterns/aws/computeEc2.js +11 -14
  66. package/dist/lib/patterns/aws/computeEcs.d.ts +18 -2
  67. package/dist/lib/patterns/aws/computeEcs.js +41 -31
  68. package/dist/lib/patterns/aws/computeLambda.d.ts +2 -2
  69. package/dist/lib/patterns/aws/computeLambda.js +24 -31
  70. package/dist/lib/patterns/aws/database.d.ts +16 -7
  71. package/dist/lib/patterns/aws/database.js +81 -73
  72. package/dist/lib/patterns/aws/delegatedDomainPattern.d.ts +17 -0
  73. package/dist/lib/patterns/aws/delegatedDomainPattern.js +54 -0
  74. package/dist/lib/patterns/aws/dnsRecordComposer.d.ts +25 -0
  75. package/dist/lib/patterns/aws/dnsRecordComposer.js +225 -0
  76. package/dist/lib/patterns/aws/domain.d.ts +32 -0
  77. package/dist/lib/patterns/aws/domain.js +115 -0
  78. package/dist/lib/patterns/aws/domainDelegation.d.ts +3 -3
  79. package/dist/lib/patterns/aws/domainDelegation.js +28 -37
  80. package/dist/lib/patterns/aws/domainFactory.d.ts +20 -5
  81. package/dist/lib/patterns/aws/domainFactory.js +48 -10
  82. package/dist/lib/patterns/aws/domainValidation.d.ts +11 -0
  83. package/dist/lib/patterns/aws/domainValidation.js +145 -0
  84. package/dist/lib/patterns/aws/externalRecordsPattern.d.ts +18 -0
  85. package/dist/lib/patterns/aws/externalRecordsPattern.js +141 -0
  86. package/dist/lib/patterns/aws/fivetranProxy.d.ts +1 -1
  87. package/dist/lib/patterns/aws/fivetranProxy.js +6 -11
  88. package/dist/lib/patterns/aws/index.d.ts +21 -19
  89. package/dist/lib/patterns/aws/index.js +25 -36
  90. package/dist/lib/patterns/aws/interfaces/cdn.js +1 -5
  91. package/dist/lib/patterns/aws/interfaces/compute.js +4 -11
  92. package/dist/lib/patterns/aws/interfaces/connector.js +1 -15
  93. package/dist/lib/patterns/aws/interfaces/database.d.ts +1 -1
  94. package/dist/lib/patterns/aws/interfaces/database.js +6 -15
  95. package/dist/lib/patterns/aws/interfaces/domain.d.ts +80 -2
  96. package/dist/lib/patterns/aws/interfaces/domain.js +1 -6
  97. package/dist/lib/patterns/aws/interfaces/index.js +8 -41
  98. package/dist/lib/patterns/aws/interfaces/messaging.js +4 -11
  99. package/dist/lib/patterns/aws/interfaces/organisation.d.ts +1 -1
  100. package/dist/lib/patterns/aws/interfaces/organisation.js +4 -11
  101. package/dist/lib/patterns/aws/interfaces/pattern.js +2 -7
  102. package/dist/lib/patterns/aws/interfaces/storage.js +1 -5
  103. package/dist/lib/patterns/aws/managedIdentityCenter.js +7 -12
  104. package/dist/lib/patterns/aws/messaging.d.ts +7 -7
  105. package/dist/lib/patterns/aws/messaging.js +22 -33
  106. package/dist/lib/patterns/aws/network.d.ts +2 -2
  107. package/dist/lib/patterns/aws/network.js +9 -14
  108. package/dist/lib/patterns/aws/organisation.d.ts +6 -2
  109. package/dist/lib/patterns/aws/organisation.js +34 -35
  110. package/dist/lib/patterns/aws/organisationFactory.d.ts +3 -3
  111. package/dist/lib/patterns/aws/organisationFactory.js +7 -12
  112. package/dist/lib/patterns/aws/pattern.js +6 -12
  113. package/dist/lib/patterns/aws/payload.js +73 -63
  114. package/dist/lib/patterns/aws/platform.d.ts +6 -3
  115. package/dist/lib/patterns/aws/platform.js +15 -15
  116. package/dist/lib/patterns/aws/storage.d.ts +6 -4
  117. package/dist/lib/patterns/aws/storage.js +35 -40
  118. package/dist/lib/patterns/aws/subdomainHostedZone.js +11 -16
  119. package/dist/lib/patterns/aws/targets/fjallTargets.d.ts +37 -0
  120. package/dist/lib/patterns/aws/targets/fjallTargets.js +66 -0
  121. package/dist/lib/patterns/aws/targets/index.d.ts +2 -0
  122. package/dist/lib/patterns/aws/targets/index.js +2 -0
  123. package/dist/lib/patterns/aws/targets/targetResolution.d.ts +76 -0
  124. package/dist/lib/patterns/aws/targets/targetResolution.js +119 -0
  125. package/dist/lib/patterns/index.d.ts +1 -0
  126. package/dist/lib/patterns/index.js +1 -0
  127. package/dist/lib/resources/aws/analytics/clickhouse.d.ts +15 -0
  128. package/dist/lib/resources/aws/analytics/clickhouse.js +292 -0
  129. package/dist/lib/resources/aws/analytics/clickhouseConstants.d.ts +73 -0
  130. package/dist/lib/resources/aws/analytics/clickhouseConstants.js +87 -0
  131. package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.d.ts +13 -0
  132. package/dist/lib/resources/aws/analytics/clickhouseSecurityGroup.js +28 -0
  133. package/dist/lib/resources/aws/analytics/clickhouseTypes.d.ts +47 -0
  134. package/dist/lib/resources/aws/analytics/clickhouseTypes.js +1 -0
  135. package/dist/lib/resources/aws/analytics/clickhouseUserData.d.ts +5 -0
  136. package/dist/lib/resources/aws/analytics/clickhouseUserData.js +248 -0
  137. package/dist/lib/resources/aws/analytics/index.d.ts +2 -0
  138. package/dist/lib/resources/aws/analytics/index.js +1 -0
  139. package/dist/lib/resources/aws/audit/auditRole.js +10 -15
  140. package/dist/lib/resources/aws/audit/index.d.ts +1 -1
  141. package/dist/lib/resources/aws/audit/index.js +1 -6
  142. package/dist/lib/resources/aws/backup/backupPlan.d.ts +1 -1
  143. package/dist/lib/resources/aws/backup/backupPlan.js +14 -16
  144. package/dist/lib/resources/aws/backup/backupVault.d.ts +1 -1
  145. package/dist/lib/resources/aws/backup/backupVault.js +13 -15
  146. package/dist/lib/resources/aws/backup/index.d.ts +2 -2
  147. package/dist/lib/resources/aws/backup/index.js +2 -19
  148. package/dist/lib/resources/aws/base/awsStack.js +17 -19
  149. package/dist/lib/resources/aws/base/index.d.ts +1 -1
  150. package/dist/lib/resources/aws/base/index.js +1 -18
  151. package/dist/lib/resources/aws/cdn/cloudFront.js +40 -42
  152. package/dist/lib/resources/aws/cdn/index.d.ts +1 -1
  153. package/dist/lib/resources/aws/cdn/index.js +1 -18
  154. package/dist/lib/resources/aws/compute/ec2.js +39 -39
  155. package/dist/lib/resources/aws/compute/ecs.d.ts +18 -396
  156. package/dist/lib/resources/aws/compute/ecs.js +105 -976
  157. package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.d.ts +22 -0
  158. package/dist/lib/resources/aws/compute/ecsCapacityProviderAspect.js +35 -0
  159. package/dist/lib/resources/aws/compute/ecsConstants.d.ts +20 -0
  160. package/dist/lib/resources/aws/compute/ecsConstants.js +49 -0
  161. package/dist/lib/resources/aws/compute/ecsContext.d.ts +12 -0
  162. package/dist/lib/resources/aws/compute/ecsContext.js +1 -0
  163. package/dist/lib/resources/aws/compute/ecsImages.d.ts +4 -0
  164. package/dist/lib/resources/aws/compute/ecsImages.js +35 -0
  165. package/dist/lib/resources/aws/compute/ecsNetworking.d.ts +28 -0
  166. package/dist/lib/resources/aws/compute/ecsNetworking.js +290 -0
  167. package/dist/lib/resources/aws/compute/ecsRoles.d.ts +15 -0
  168. package/dist/lib/resources/aws/compute/ecsRoles.js +110 -0
  169. package/dist/lib/resources/aws/compute/ecsServiceFactory.d.ts +33 -0
  170. package/dist/lib/resources/aws/compute/ecsServiceFactory.js +183 -0
  171. package/dist/lib/resources/aws/compute/ecsTaskDefinition.d.ts +30 -0
  172. package/dist/lib/resources/aws/compute/ecsTaskDefinition.js +168 -0
  173. package/dist/lib/resources/aws/compute/ecsTypes.d.ts +337 -0
  174. package/dist/lib/resources/aws/compute/ecsTypes.js +10 -0
  175. package/dist/lib/resources/aws/compute/ecsValidation.d.ts +18 -0
  176. package/dist/lib/resources/aws/compute/ecsValidation.js +72 -0
  177. package/dist/lib/resources/aws/compute/index.d.ts +3 -3
  178. package/dist/lib/resources/aws/compute/index.js +3 -20
  179. package/dist/lib/resources/aws/compute/lambda.d.ts +10 -2
  180. package/dist/lib/resources/aws/compute/lambda.js +82 -70
  181. package/dist/lib/resources/aws/database/dynamodb.js +27 -28
  182. package/dist/lib/resources/aws/database/index.d.ts +7 -7
  183. package/dist/lib/resources/aws/database/index.js +14 -33
  184. package/dist/lib/resources/aws/database/rdsAurora.d.ts +10 -2
  185. package/dist/lib/resources/aws/database/rdsAurora.js +76 -61
  186. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +2 -2
  187. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +24 -21
  188. package/dist/lib/resources/aws/database/rdsDefaults.js +3 -7
  189. package/dist/lib/resources/aws/database/rdsHelpers.d.ts +2 -2
  190. package/dist/lib/resources/aws/database/rdsHelpers.js +21 -29
  191. package/dist/lib/resources/aws/database/rdsInstance.d.ts +11 -3
  192. package/dist/lib/resources/aws/database/rdsInstance.js +101 -83
  193. package/dist/lib/resources/aws/database/rdsProxyOutput.js +5 -9
  194. package/dist/lib/resources/aws/iam/delegationRole.d.ts +18 -0
  195. package/dist/lib/resources/aws/iam/delegationRole.js +60 -0
  196. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +4 -9
  197. package/dist/lib/resources/aws/iam/identityCenter/group.js +5 -9
  198. package/dist/lib/resources/aws/iam/identityCenter/index.d.ts +3 -3
  199. package/dist/lib/resources/aws/iam/identityCenter/index.js +3 -20
  200. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -1
  201. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +5 -9
  202. package/dist/lib/resources/aws/iam/index.d.ts +5 -4
  203. package/dist/lib/resources/aws/iam/index.js +5 -21
  204. package/dist/lib/resources/aws/iam/instanceProfile.js +2 -7
  205. package/dist/lib/resources/aws/iam/managedPolicy.js +2 -7
  206. package/dist/lib/resources/aws/iam/policy.js +2 -7
  207. package/dist/lib/resources/aws/iam/role.js +2 -7
  208. package/dist/lib/resources/aws/index.d.ts +7 -7
  209. package/dist/lib/resources/aws/index.js +7 -24
  210. package/dist/lib/resources/aws/logging/cloudTrail.d.ts +1 -1
  211. package/dist/lib/resources/aws/logging/cloudTrail.js +18 -22
  212. package/dist/lib/resources/aws/logging/index.d.ts +2 -2
  213. package/dist/lib/resources/aws/logging/index.js +2 -19
  214. package/dist/lib/resources/aws/logging/logGroup.js +4 -10
  215. package/dist/lib/resources/aws/messaging/eventbridge.js +11 -14
  216. package/dist/lib/resources/aws/messaging/index.d.ts +4 -4
  217. package/dist/lib/resources/aws/messaging/index.js +4 -21
  218. package/dist/lib/resources/aws/messaging/sns.js +11 -14
  219. package/dist/lib/resources/aws/messaging/sqs.js +32 -34
  220. package/dist/lib/resources/aws/messaging/utils.d.ts +1 -1
  221. package/dist/lib/resources/aws/messaging/utils.js +1 -6
  222. package/dist/lib/resources/aws/monitoring/alarmDefaults.d.ts +36 -0
  223. package/dist/lib/resources/aws/monitoring/alarmDefaults.js +34 -0
  224. package/dist/lib/resources/aws/monitoring/ecsAlarms.d.ts +21 -0
  225. package/dist/lib/resources/aws/monitoring/ecsAlarms.js +88 -0
  226. package/dist/lib/resources/aws/monitoring/index.d.ts +4 -0
  227. package/dist/lib/resources/aws/monitoring/index.js +4 -5
  228. package/dist/lib/resources/aws/monitoring/lambdaAlarms.d.ts +18 -0
  229. package/dist/lib/resources/aws/monitoring/lambdaAlarms.js +44 -0
  230. package/dist/lib/resources/aws/monitoring/rdsAlarms.d.ts +20 -0
  231. package/dist/lib/resources/aws/monitoring/rdsAlarms.js +52 -0
  232. package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.d.ts +17 -0
  233. package/dist/lib/resources/aws/networking/crossAccountDelegationRecord.js +26 -0
  234. package/dist/lib/resources/aws/networking/dnsRecord/aRecord.d.ts +12 -0
  235. package/dist/lib/resources/aws/networking/dnsRecord/aRecord.js +21 -0
  236. package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.d.ts +12 -0
  237. package/dist/lib/resources/aws/networking/dnsRecord/aaaaRecord.js +22 -0
  238. package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.d.ts +12 -0
  239. package/dist/lib/resources/aws/networking/dnsRecord/aliasRecord.js +23 -0
  240. package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.d.ts +17 -0
  241. package/dist/lib/resources/aws/networking/dnsRecord/caaRecord.js +21 -0
  242. package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.d.ts +12 -0
  243. package/dist/lib/resources/aws/networking/dnsRecord/cnameRecord.js +22 -0
  244. package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.d.ts +17 -0
  245. package/dist/lib/resources/aws/networking/dnsRecord/dnsRecordBase.js +17 -0
  246. package/dist/lib/resources/aws/networking/dnsRecord/index.d.ts +10 -0
  247. package/dist/lib/resources/aws/networking/dnsRecord/index.js +10 -0
  248. package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.d.ts +16 -0
  249. package/dist/lib/resources/aws/networking/dnsRecord/mxRecord.js +21 -0
  250. package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.d.ts +12 -0
  251. package/dist/lib/resources/aws/networking/dnsRecord/nsRecord.js +21 -0
  252. package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.d.ts +18 -0
  253. package/dist/lib/resources/aws/networking/dnsRecord/srvRecord.js +21 -0
  254. package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.d.ts +12 -0
  255. package/dist/lib/resources/aws/networking/dnsRecord/txtRecord.js +21 -0
  256. package/dist/lib/resources/aws/networking/domain.d.ts +1 -1
  257. package/dist/lib/resources/aws/networking/domain.js +32 -34
  258. package/dist/lib/resources/aws/networking/domainCertificate.d.ts +8 -3
  259. package/dist/lib/resources/aws/networking/domainCertificate.js +22 -16
  260. package/dist/lib/resources/aws/networking/hostedZone.d.ts +23 -19
  261. package/dist/lib/resources/aws/networking/hostedZone.js +70 -134
  262. package/dist/lib/resources/aws/networking/index.d.ts +8 -7
  263. package/dist/lib/resources/aws/networking/index.js +8 -24
  264. package/dist/lib/resources/aws/networking/ipam.js +2 -7
  265. package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
  266. package/dist/lib/resources/aws/networking/ipamPool.js +45 -55
  267. package/dist/lib/resources/aws/networking/securityGroup.js +2 -7
  268. package/dist/lib/resources/aws/networking/vpc.d.ts +1 -1
  269. package/dist/lib/resources/aws/networking/vpc.js +17 -21
  270. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +1 -1
  271. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +11 -15
  272. package/dist/lib/resources/aws/organisation/index.d.ts +5 -5
  273. package/dist/lib/resources/aws/organisation/index.js +4 -12
  274. package/dist/lib/resources/aws/organisation/organisation.js +5 -7
  275. package/dist/lib/resources/aws/organisation/organisationAccount.js +7 -10
  276. package/dist/lib/resources/aws/organisation/organisationPolicy.js +5 -9
  277. package/dist/lib/resources/aws/organisation/organisationalUnit.js +1 -3
  278. package/dist/lib/resources/aws/secrets/alias.js +2 -7
  279. package/dist/lib/resources/aws/secrets/index.d.ts +4 -4
  280. package/dist/lib/resources/aws/secrets/index.js +4 -21
  281. package/dist/lib/resources/aws/secrets/kms.js +15 -18
  282. package/dist/lib/resources/aws/secrets/parameter.d.ts +3 -3
  283. package/dist/lib/resources/aws/secrets/parameter.js +19 -22
  284. package/dist/lib/resources/aws/secrets/secret.d.ts +2 -2
  285. package/dist/lib/resources/aws/secrets/secret.js +12 -14
  286. package/dist/lib/resources/aws/storage/ecr.d.ts +2 -2
  287. package/dist/lib/resources/aws/storage/ecr.js +7 -13
  288. package/dist/lib/resources/aws/storage/index.d.ts +2 -2
  289. package/dist/lib/resources/aws/storage/index.js +2 -19
  290. package/dist/lib/resources/aws/storage/s3.d.ts +1 -1
  291. package/dist/lib/resources/aws/storage/s3.js +24 -12
  292. package/dist/lib/resources/aws/utilities/awsCustomResource.js +3 -7
  293. package/dist/lib/resources/aws/utilities/codeBuild.js +7 -12
  294. package/dist/lib/resources/aws/utilities/customResource.js +14 -17
  295. package/dist/lib/resources/aws/utilities/customResourceProvider.js +2 -7
  296. package/dist/lib/resources/aws/utilities/index.d.ts +5 -5
  297. package/dist/lib/resources/aws/utilities/index.js +5 -22
  298. package/dist/lib/resources/aws/utilities/resourceShare.js +2 -7
  299. package/dist/lib/resources/index.d.ts +1 -1
  300. package/dist/lib/resources/index.js +1 -18
  301. package/dist/lib/types.js +1 -3
  302. package/dist/lib/utils/accountsUtils.d.ts +5 -0
  303. package/dist/lib/utils/accountsUtils.js +18 -0
  304. package/dist/lib/utils/addSuffixToEmail.js +1 -5
  305. package/dist/lib/utils/backupTierMapping.js +2 -6
  306. package/dist/lib/utils/capitaliseString.js +1 -10
  307. package/dist/lib/utils/connections.js +9 -13
  308. package/dist/lib/utils/connector.js +10 -23
  309. package/dist/lib/utils/constructMap.d.ts +33 -0
  310. package/dist/lib/utils/constructMap.js +154 -0
  311. package/dist/lib/utils/databaseTypes.js +4 -10
  312. package/dist/lib/utils/dnsRecords.d.ts +1 -1
  313. package/dist/lib/utils/dnsRecords.js +23 -27
  314. package/dist/lib/utils/domainTypes.d.ts +0 -1
  315. package/dist/lib/utils/domainTypes.js +2 -10
  316. package/dist/lib/utils/env.js +14 -26
  317. package/dist/lib/utils/getAccountId.js +3 -7
  318. package/dist/lib/utils/getAsync.js +7 -10
  319. package/dist/lib/utils/getConfig.d.ts +0 -2
  320. package/dist/lib/utils/getConfig.js +29 -47
  321. package/dist/lib/utils/getStackOutput.js +4 -8
  322. package/dist/lib/utils/index.d.ts +12 -12
  323. package/dist/lib/utils/index.js +12 -29
  324. package/dist/lib/utils/manifestWriter.d.ts +14 -3
  325. package/dist/lib/utils/manifestWriter.js +60 -43
  326. package/dist/lib/utils/orgConfigParser.d.ts +14 -0
  327. package/dist/lib/utils/orgConfigParser.js +49 -0
  328. package/dist/lib/utils/removalPolicy.js +5 -9
  329. package/dist/lib/utils/resourceNaming.js +11 -16
  330. package/dist/lib/utils/standardTagsAspect.js +9 -16
  331. package/dist/lib/utils/stripAndCamelCase.js +1 -5
  332. package/dist/lib/utils/validationLogger.js +12 -18
  333. package/dist/lib/utils/vpcUtils.js +5 -10
  334. package/package.json +25 -8
  335. package/dist/lib/config/aws/accountId.d.ts +0 -6
  336. package/dist/lib/config/aws/accountId.js +0 -32
  337. package/dist/lib/config/aws/backupGlobalSettings.d.ts +0 -29
  338. package/dist/lib/config/aws/backupGlobalSettings.js +0 -49
  339. package/dist/lib/config/aws/costAllocationTags.d.ts +0 -12
  340. package/dist/lib/config/aws/costAllocationTags.js +0 -47
  341. package/dist/lib/config/aws/ipamDelegateAdmin.d.ts +0 -8
  342. package/dist/lib/config/aws/ipamDelegateAdmin.js +0 -57
  343. package/dist/lib/config/aws/ipamPoolId.d.ts +0 -16
  344. package/dist/lib/config/aws/ipamPoolId.js +0 -42
  345. package/dist/lib/config/aws/organisation.d.ts +0 -30
  346. package/dist/lib/config/aws/organisation.js +0 -92
  347. package/dist/lib/config/aws/organisationId.d.ts +0 -7
  348. package/dist/lib/config/aws/organisationId.js +0 -45
  349. package/dist/lib/config/aws/organisationsAccess.d.ts +0 -10
  350. package/dist/lib/config/aws/organisationsAccess.js +0 -49
  351. package/dist/lib/config/aws/ramSharing.d.ts +0 -4
  352. package/dist/lib/config/aws/ramSharing.js +0 -34
  353. package/dist/lib/config/monitoring.d.ts +0 -18
  354. package/dist/lib/config/monitoring.js +0 -22
  355. package/dist/lib/patterns/aws/connections.d.ts +0 -46
  356. package/dist/lib/patterns/aws/connections.js +0 -159
  357. package/dist/lib/patterns/aws/hostedZone.d.ts +0 -28
  358. package/dist/lib/patterns/aws/hostedZone.js +0 -150
  359. package/dist/lib/patterns/aws/managedAccount.d.ts +0 -9
  360. package/dist/lib/patterns/aws/managedAccount.js +0 -55
  361. package/dist/lib/patterns/aws/managedOrganisation.d.ts +0 -36
  362. package/dist/lib/patterns/aws/managedOrganisation.js +0 -97
  363. package/dist/lib/patterns/aws/managedPlatform.d.ts +0 -12
  364. package/dist/lib/patterns/aws/managedPlatform.js +0 -29
  365. package/dist/lib/resources/aws/database/database.d.ts +0 -14
  366. package/dist/lib/resources/aws/database/database.js +0 -28
  367. package/dist/lib/resources/aws/database/databaseInstance.d.ts +0 -15
  368. package/dist/lib/resources/aws/database/databaseInstance.js +0 -30
  369. package/dist/lib/resources/aws/database/migrationLambda.d.ts +0 -80
  370. package/dist/lib/resources/aws/database/migrationLambda.js +0 -119
  371. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +0 -13
  372. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +0 -51
  373. package/dist/lib/resources/aws/iam/securityGroup.d.ts +0 -5
  374. package/dist/lib/resources/aws/iam/securityGroup.js +0 -14
  375. package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +0 -29
  376. package/dist/lib/resources/aws/monitoring/monitoringRole.js +0 -120
  377. package/dist/lib/utils/capitalizeString.d.ts +0 -12
  378. package/dist/lib/utils/capitalizeString.js +0 -30
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Payload CMS Pattern.
4
3
  *
@@ -22,22 +21,20 @@
22
21
  * // Escape hatches
23
22
  * payload.getDatabase().grantConnect(otherLambda);
24
23
  */
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.Payload = void 0;
27
- const constructs_1 = require("constructs");
28
- const aws_cdk_lib_1 = require("aws-cdk-lib");
29
- const secrets_1 = require("../../resources/aws/secrets");
30
- const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
31
- const aws_certificatemanager_1 = require("aws-cdk-lib/aws-certificatemanager");
32
- const aws_route53_1 = require("aws-cdk-lib/aws-route53");
33
- const aws_route53_targets_1 = require("aws-cdk-lib/aws-route53-targets");
34
- const database_js_1 = require("./database.js");
35
- const compute_js_1 = require("./compute.js");
36
- const storage_js_1 = require("./storage.js");
37
- const messaging_js_1 = require("./messaging.js");
38
- const cdn_js_1 = require("./cdn.js");
39
- const validationLogger_js_1 = require("../../utils/validationLogger.js");
40
- const capitaliseString_js_1 = require("../../utils/capitaliseString.js");
24
+ import { Construct } from "constructs";
25
+ import { CfnOutput, Fn, Stack } from "aws-cdk-lib";
26
+ import { Secret } from "../../resources/aws/secrets/index.js";
27
+ import { Code, Runtime, Architecture, FunctionUrlAuthType } from "aws-cdk-lib/aws-lambda";
28
+ import { Certificate, CertificateValidation } from "aws-cdk-lib/aws-certificatemanager";
29
+ import { HostedZone, ARecord, RecordTarget } from "aws-cdk-lib/aws-route53";
30
+ import { CloudFrontTarget } from "aws-cdk-lib/aws-route53-targets";
31
+ import { DatabaseFactory } from "./database.js";
32
+ import { ComputeFactory, InvokeMode } from "./compute.js";
33
+ import { StorageFactory } from "./storage.js";
34
+ import { MessagingFactory } from "./messaging.js";
35
+ import { CdnFactory } from "./cdn.js";
36
+ import { FjallLogger } from "../../utils/validationLogger.js";
37
+ import { toPascalCase, toValidDatabaseName } from "../../utils/capitaliseString.js";
41
38
  const PAYLOAD_DEFAULTS = {
42
39
  /** Path to OpenNext output relative to app folder (CDK runs from fjall/<appname>) */
43
40
  SOURCE: "../..",
@@ -116,14 +113,29 @@ function resolveLambdaConfig(config, defaults) {
116
113
  *
117
114
  * Composes all required AWS resources for a Payload deployment.
118
115
  */
119
- class Payload extends constructs_1.Construct {
116
+ export class Payload extends Construct {
117
+ patternType = "payload";
118
+ app;
119
+ props;
120
+ pascalName;
121
+ _payloadSecret;
122
+ _database;
123
+ _server;
124
+ _imageOptimisation;
125
+ _revalidation;
126
+ _assetsBucket;
127
+ _cacheBucket;
128
+ _mediaBucket;
129
+ _tagCache;
130
+ _revalidationQueue;
131
+ _cdn;
132
+ _resolvedDomain;
120
133
  constructor(scope, id, app, props) {
121
134
  super(scope, id);
122
- this.patternType = "payload";
123
135
  this.app = app;
124
136
  this.props = props;
125
- this.pascalName = (0, capitaliseString_js_1.toPascalCase)(props.name);
126
- this._payloadSecret = new secrets_1.Secret(this, `${this.pascalName}PayloadSecret`, {
137
+ this.pascalName = toPascalCase(props.name);
138
+ this._payloadSecret = new Secret(this, `${this.pascalName}PayloadSecret`, {
127
139
  secretName: `${props.name}/payload-secret`,
128
140
  description: `Payload CMS secret for ${props.name}`,
129
141
  generateSecretString: {
@@ -153,7 +165,7 @@ class Payload extends constructs_1.Construct {
153
165
  validateProps() {
154
166
  const dbConfig = this.props.database ?? {};
155
167
  if (dbConfig.publiclyAccessible) {
156
- validationLogger_js_1.FjallLogger.warn(`Payload database '${this.props.name}' is configured with public accessibility. ` +
168
+ FjallLogger.warn(`Payload database '${this.props.name}' is configured with public accessibility. ` +
157
169
  "This is a security risk and should only be used for development.");
158
170
  }
159
171
  }
@@ -167,7 +179,7 @@ class Payload extends constructs_1.Construct {
167
179
  }
168
180
  buildBaseDatabaseProps(dbConfig) {
169
181
  return {
170
- databaseName: dbConfig.databaseName ?? (0, capitaliseString_js_1.toValidDatabaseName)(this.props.name),
182
+ databaseName: dbConfig.databaseName ?? toValidDatabaseName(this.props.name),
171
183
  databaseEngine: dbConfig.databaseEngine ?? "postgresql",
172
184
  backupRetention: dbConfig.backupRetention ?? PAYLOAD_DEFAULTS.DATABASE.BACKUP_RETENTION,
173
185
  deletionProtection: dbConfig.deletionProtection ??
@@ -193,7 +205,7 @@ class Payload extends constructs_1.Construct {
193
205
  monitoringInterval: dbConfig.monitoringInterval,
194
206
  preferredMaintenanceWindow: dbConfig.preferredMaintenanceWindow
195
207
  };
196
- return this.app.addDatabase(database_js_1.DatabaseFactory.build(this.props.name, auroraProps));
208
+ return this.app.addDatabase(DatabaseFactory.build(this.props.name, auroraProps));
197
209
  }
198
210
  createInstanceDatabase(dbConfig) {
199
211
  const instanceProps = {
@@ -206,7 +218,7 @@ class Payload extends constructs_1.Construct {
206
218
  readReplica: dbConfig.readReplica,
207
219
  encryption: dbConfig.encryption
208
220
  };
209
- return this.app.addDatabase(database_js_1.DatabaseFactory.build(this.props.name, instanceProps));
221
+ return this.app.addDatabase(DatabaseFactory.build(this.props.name, instanceProps));
210
222
  }
211
223
  createStorageBuckets() {
212
224
  this._assetsBucket = this.createAssetsBucket();
@@ -226,7 +238,7 @@ class Payload extends constructs_1.Construct {
226
238
  }
227
239
  }
228
240
  };
229
- return this.app.addStorage(storage_js_1.StorageFactory.build(`${this.props.name}-assets`, assetsProps));
241
+ return this.app.addStorage(StorageFactory.build(`${this.props.name}-assets`, assetsProps));
230
242
  }
231
243
  createCacheBucket() {
232
244
  const cacheConfig = this.props.storage?.cache ?? {};
@@ -237,14 +249,14 @@ class Payload extends constructs_1.Construct {
237
249
  prune: false // ISR adds files at runtime
238
250
  }
239
251
  };
240
- return this.app.addStorage(storage_js_1.StorageFactory.build(`${this.props.name}-cache`, cacheProps));
252
+ return this.app.addStorage(StorageFactory.build(`${this.props.name}-cache`, cacheProps));
241
253
  }
242
254
  createMediaBucket() {
243
255
  const mediaConfig = this.props.storage?.media ?? {};
244
256
  const mediaProps = {
245
257
  versioned: mediaConfig.versioned ?? false
246
258
  };
247
- return this.app.addStorage(storage_js_1.StorageFactory.build(`${this.props.name}-media`, mediaProps));
259
+ return this.app.addStorage(StorageFactory.build(`${this.props.name}-media`, mediaProps));
248
260
  }
249
261
  createTagCache() {
250
262
  const tagCacheProps = {
@@ -259,7 +271,7 @@ class Payload extends constructs_1.Construct {
259
271
  }
260
272
  ]
261
273
  };
262
- this._tagCache = this.app.addDatabase(database_js_1.DatabaseFactory.build(`${this.props.name}-tag-cache`, tagCacheProps));
274
+ this._tagCache = this.app.addDatabase(DatabaseFactory.build(`${this.props.name}-tag-cache`, tagCacheProps));
263
275
  }
264
276
  createRevalidationQueue() {
265
277
  const queueConfig = this.props.messaging?.revalidationQueue ?? {};
@@ -288,7 +300,7 @@ class Payload extends constructs_1.Construct {
288
300
  contentBasedDeduplication: true,
289
301
  deadLetterQueue: dlqConfig
290
302
  };
291
- this._revalidationQueue = this.app.addMessaging(messaging_js_1.MessagingFactory.build(`${this.props.name}-revalidation`, queueProps));
303
+ this._revalidationQueue = this.app.addMessaging(MessagingFactory.build(`${this.props.name}-revalidation`, queueProps));
292
304
  }
293
305
  createLambdaFunctions() {
294
306
  this._server = this.createServerLambda();
@@ -303,16 +315,16 @@ class Payload extends constructs_1.Construct {
303
315
  const serverProps = {
304
316
  type: "lambda",
305
317
  deployment: "code",
306
- code: aws_lambda_1.Code.fromAsset(`${PAYLOAD_DEFAULTS.SOURCE}/${PAYLOAD_DEFAULTS.OPENNEXT.SERVER}`),
318
+ code: Code.fromAsset(`${PAYLOAD_DEFAULTS.SOURCE}/${PAYLOAD_DEFAULTS.OPENNEXT.SERVER}`),
307
319
  handler: "index.handler",
308
- runtime: aws_lambda_1.Runtime.NODEJS_22_X,
309
- architecture: aws_lambda_1.Architecture.ARM_64,
320
+ runtime: Runtime.NODEJS_22_X,
321
+ architecture: Architecture.ARM_64,
310
322
  memorySize,
311
323
  timeout,
312
324
  ephemeralStorageSize,
313
325
  functionUrl: {
314
- authType: aws_lambda_1.FunctionUrlAuthType.NONE,
315
- invokeMode: compute_js_1.InvokeMode.RESPONSE_STREAM
326
+ authType: FunctionUrlAuthType.NONE,
327
+ invokeMode: InvokeMode.RESPONSE_STREAM
316
328
  },
317
329
  connections: [this._database],
318
330
  secretsImport: {
@@ -326,7 +338,7 @@ class Payload extends constructs_1.Construct {
326
338
  },
327
339
  environment: this.buildServerEnvironment()
328
340
  };
329
- const server = this.app.addCompute(compute_js_1.ComputeFactory.build(`${this.props.name}-server`, serverProps));
341
+ const server = this.app.addCompute(ComputeFactory.build(`${this.props.name}-server`, serverProps));
330
342
  this.grantServerPermissions(server);
331
343
  return server;
332
344
  }
@@ -337,10 +349,10 @@ class Payload extends constructs_1.Construct {
337
349
  DATABASE_NAME: this._database.getDatabaseName(),
338
350
  DATABASE_SSL: "true",
339
351
  CACHE_BUCKET_NAME: this._cacheBucket.getBucketName(),
340
- CACHE_BUCKET_REGION: aws_cdk_lib_1.Stack.of(this).region,
352
+ CACHE_BUCKET_REGION: Stack.of(this).region,
341
353
  CACHE_DYNAMO_TABLE: this._tagCache.getTableName(),
342
354
  REVALIDATION_QUEUE_URL: this._revalidationQueue.getQueueUrl(),
343
- REVALIDATION_QUEUE_REGION: aws_cdk_lib_1.Stack.of(this).region,
355
+ REVALIDATION_QUEUE_REGION: Stack.of(this).region,
344
356
  MEDIA_BUCKET_NAME: this._mediaBucket.getBucketName()
345
357
  };
346
358
  // Lock down CORS to custom domain when provided
@@ -365,20 +377,20 @@ class Payload extends constructs_1.Construct {
365
377
  const imageProps = {
366
378
  type: "lambda",
367
379
  deployment: "code",
368
- code: aws_lambda_1.Code.fromAsset(`${PAYLOAD_DEFAULTS.SOURCE}/${PAYLOAD_DEFAULTS.OPENNEXT.IMAGE}`),
380
+ code: Code.fromAsset(`${PAYLOAD_DEFAULTS.SOURCE}/${PAYLOAD_DEFAULTS.OPENNEXT.IMAGE}`),
369
381
  handler: "index.handler",
370
- runtime: aws_lambda_1.Runtime.NODEJS_22_X,
371
- architecture: aws_lambda_1.Architecture.ARM_64,
382
+ runtime: Runtime.NODEJS_22_X,
383
+ architecture: Architecture.ARM_64,
372
384
  memorySize,
373
385
  timeout,
374
386
  ephemeralStorageSize,
375
- functionUrl: { authType: aws_lambda_1.FunctionUrlAuthType.NONE },
387
+ functionUrl: { authType: FunctionUrlAuthType.NONE },
376
388
  environment: {
377
389
  BUCKET_NAME: this._assetsBucket.getBucketName(),
378
390
  BUCKET_KEY_PREFIX: "_assets"
379
391
  }
380
392
  };
381
- const image = this.app.addCompute(compute_js_1.ComputeFactory.build(`${this.props.name}-image`, imageProps));
393
+ const image = this.app.addCompute(ComputeFactory.build(`${this.props.name}-image`, imageProps));
382
394
  const imageFunction = requireFunction(image, "ImageOptimisation");
383
395
  this._assetsBucket.grantRead(imageFunction);
384
396
  return image;
@@ -391,10 +403,10 @@ class Payload extends constructs_1.Construct {
391
403
  const revalidationProps = {
392
404
  type: "lambda",
393
405
  deployment: "code",
394
- code: aws_lambda_1.Code.fromAsset(`${PAYLOAD_DEFAULTS.SOURCE}/${PAYLOAD_DEFAULTS.OPENNEXT.REVALIDATION}`),
406
+ code: Code.fromAsset(`${PAYLOAD_DEFAULTS.SOURCE}/${PAYLOAD_DEFAULTS.OPENNEXT.REVALIDATION}`),
395
407
  handler: "index.handler",
396
- runtime: aws_lambda_1.Runtime.NODEJS_22_X,
397
- architecture: aws_lambda_1.Architecture.ARM_64,
408
+ runtime: Runtime.NODEJS_22_X,
409
+ architecture: Architecture.ARM_64,
398
410
  memorySize,
399
411
  timeout,
400
412
  ephemeralStorageSize,
@@ -403,7 +415,7 @@ class Payload extends constructs_1.Construct {
403
415
  CACHE_BUCKET_NAME: this._cacheBucket.getBucketName()
404
416
  }
405
417
  };
406
- const revalidation = this.app.addCompute(compute_js_1.ComputeFactory.build(`${this.props.name}-revalidation`, revalidationProps));
418
+ const revalidation = this.app.addCompute(ComputeFactory.build(`${this.props.name}-revalidation`, revalidationProps));
407
419
  const revalidationLambda = revalidation.getLambdaFunction();
408
420
  revalidationLambda.addSqsEventSource(this._revalidationQueue.getQueue(), {
409
421
  batchSize: 5
@@ -451,7 +463,7 @@ class Payload extends constructs_1.Construct {
451
463
  ...(this.props.cdn?.behaviours ?? [])
452
464
  ]
453
465
  };
454
- this._cdn = this.app.addCdn(cdn_js_1.CdnFactory.build(this.props.name, cdnProps));
466
+ this._cdn = this.app.addCdn(CdnFactory.build(this.props.name, cdnProps));
455
467
  }
456
468
  resolveDomainConfig() {
457
469
  if (this._resolvedDomain)
@@ -479,18 +491,18 @@ class Payload extends constructs_1.Construct {
479
491
  // Managed domain: import zone and cert from domain stack
480
492
  if (this.props.managedDomain) {
481
493
  const managed = this.props.managedDomain;
482
- const hostedZone = aws_route53_1.HostedZone.fromHostedZoneAttributes(this, `${this.pascalName}ManagedHostedZone`, {
483
- hostedZoneId: aws_cdk_lib_1.Fn.importValue(managed.hostedZoneIdExport),
494
+ const hostedZone = HostedZone.fromHostedZoneAttributes(this, `${this.pascalName}ManagedHostedZone`, {
495
+ hostedZoneId: Fn.importValue(managed.hostedZoneIdExport),
484
496
  zoneName: managed.zoneName
485
497
  });
486
- const certificate = aws_certificatemanager_1.Certificate.fromCertificateArn(this, `${this.pascalName}ManagedCertificate`, aws_cdk_lib_1.Fn.importValue(managed.certificateArnExport));
498
+ const certificate = Certificate.fromCertificateArn(this, `${this.pascalName}ManagedCertificate`, Fn.importValue(managed.certificateArnExport));
487
499
  return { domainNames: [domain], certificate, hostedZone };
488
500
  }
489
501
  const rootDomain = extractRootDomain(domain);
490
- const hostedZone = aws_route53_1.HostedZone.fromLookup(this, `${this.pascalName}HostedZone`, { domainName: rootDomain });
491
- const certificate = new aws_certificatemanager_1.Certificate(this, `${this.pascalName}Certificate`, {
502
+ const hostedZone = HostedZone.fromLookup(this, `${this.pascalName}HostedZone`, { domainName: rootDomain });
503
+ const certificate = new Certificate(this, `${this.pascalName}Certificate`, {
492
504
  domainName: domain,
493
- validation: aws_certificatemanager_1.CertificateValidation.fromDns(hostedZone)
505
+ validation: CertificateValidation.fromDns(hostedZone)
494
506
  });
495
507
  return { domainNames: [domain], certificate, hostedZone };
496
508
  }
@@ -501,7 +513,7 @@ class Payload extends constructs_1.Construct {
501
513
  }
502
514
  const certificate = cdnConfig.certificate ??
503
515
  (cdnConfig.certificateArn
504
- ? aws_certificatemanager_1.Certificate.fromCertificateArn(this, `${this.pascalName}Certificate`, cdnConfig.certificateArn)
516
+ ? Certificate.fromCertificateArn(this, `${this.pascalName}Certificate`, cdnConfig.certificateArn)
505
517
  : undefined);
506
518
  return {
507
519
  domainNames: cdnConfig.domainNames,
@@ -519,24 +531,24 @@ class Payload extends constructs_1.Construct {
519
531
  // Payload construct lives) to avoid a cyclic dependency: CDN references the
520
532
  // server Lambda FunctionUrl, so Compute cannot also depend on CDN.
521
533
  const cdnStack = this.app.getDefaultCdnStack().getStack();
522
- new aws_route53_1.ARecord(cdnStack, `${this.pascalName}AliasRecord`, {
534
+ new ARecord(cdnStack, `${this.pascalName}AliasRecord`, {
523
535
  zone: hostedZone,
524
536
  recordName: this.props.domain,
525
- target: aws_route53_1.RecordTarget.fromAlias(new aws_route53_targets_1.CloudFrontTarget(this._cdn.getDistribution()))
537
+ target: RecordTarget.fromAlias(new CloudFrontTarget(this._cdn.getDistribution()))
526
538
  });
527
539
  }
528
540
  exportPatternOutputs() {
529
- new aws_cdk_lib_1.CfnOutput(this, `${this.pascalName}PatternType`, {
541
+ new CfnOutput(this, `${this.pascalName}PatternType`, {
530
542
  key: `${this.pascalName}PatternType`,
531
543
  value: "payload",
532
544
  description: `Pattern type for ${this.props.name}`
533
545
  });
534
- new aws_cdk_lib_1.CfnOutput(this, `${this.pascalName}PatternName`, {
546
+ new CfnOutput(this, `${this.pascalName}PatternName`, {
535
547
  key: `${this.pascalName}PatternName`,
536
548
  value: this.props.name,
537
549
  description: `Pattern name for ${this.props.name}`
538
550
  });
539
- new aws_cdk_lib_1.CfnOutput(this, `${this.pascalName}PatternLambdas`, {
551
+ new CfnOutput(this, `${this.pascalName}PatternLambdas`, {
540
552
  key: `${this.pascalName}PatternLambdas`,
541
553
  value: [
542
554
  `${this.props.name}-server`,
@@ -545,7 +557,7 @@ class Payload extends constructs_1.Construct {
545
557
  ].join(","),
546
558
  description: `Lambda construct prefixes for pattern ${this.props.name}`
547
559
  });
548
- new aws_cdk_lib_1.CfnOutput(this, `${this.pascalName}PatternResources`, {
560
+ new CfnOutput(this, `${this.pascalName}PatternResources`, {
549
561
  key: `${this.pascalName}PatternResources`,
550
562
  value: JSON.stringify({
551
563
  databases: [this.props.name, `${this.props.name}-tag-cache`],
@@ -590,5 +602,3 @@ class Payload extends constructs_1.Construct {
590
602
  return this._cdn;
591
603
  }
592
604
  }
593
- exports.Payload = Payload;
594
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvcGF5bG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7OztBQUVILDJDQUF1QztBQUN2Qyw2Q0FBbUQ7QUFDbkQseURBQXFEO0FBQ3JELHVEQU1nQztBQUNoQywrRUFJNEM7QUFDNUMseURBQTRFO0FBQzVFLHlFQUFtRTtBQUtuRSwrQ0FPdUI7QUFDdkIsNkNBS3NCO0FBQ3RCLDZDQUEwRTtBQUMxRSxpREFJd0I7QUFDeEIscUNBQW9FO0FBQ3BFLHlFQUE4RDtBQUM5RCx5RUFHeUM7QUFFekMsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QixxRkFBcUY7SUFDckYsTUFBTSxFQUFFLE9BQU87SUFDZixtRkFBbUY7SUFDbkYsZUFBZSxFQUFFLFdBQVc7SUFDNUIsUUFBUSxFQUFFO1FBQ1IsSUFBSSxFQUFFLFVBQW1CO1FBQ3pCLDhFQUE4RTtRQUM5RSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ25CLG1CQUFtQixFQUFFLElBQUk7S0FDMUI7SUFDRCxPQUFPLEVBQUU7UUFDUCw2RkFBNkY7UUFDN0YsYUFBYSxFQUFFLElBQUk7UUFDbkIsK0RBQStEO1FBQy9ELGNBQWMsRUFBRSxFQUFFO1FBQ2xCLDJFQUEyRTtRQUMzRSxZQUFZLEVBQUUsSUFBSTtRQUNsQix3RUFBd0U7UUFDeEUsYUFBYSxFQUFFLEVBQUU7UUFDakIsNEZBQTRGO1FBQzVGLG1CQUFtQixFQUFFLEdBQUc7UUFDeEIsK0VBQStFO1FBQy9FLG9CQUFvQixFQUFFLEdBQUc7S0FDMUI7SUFDRCxLQUFLLEVBQUU7UUFDTCxnR0FBZ0c7UUFDaEcsZUFBZSxFQUFFLFFBQVE7S0FDMUI7SUFDRCxRQUFRLEVBQUU7UUFDUixNQUFNLEVBQUUsbUJBQW1CO1FBQzNCLEtBQUssRUFBRSxrQkFBa0I7UUFDekIsTUFBTSxFQUFFLHFDQUFxQztR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LE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBaG9CRCwwQkFnb0JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXlsb2FkIENNUyBQYXR0ZXJuLlxuICpcbiAqIEEgaGlnaC1sZXZlbCBwYXR0ZXJuIHRoYXQgY3JlYXRlcyBhbGwgaW5mcmFzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIGFcbiAqIFBheWxvYWQgQ01TIGRlcGxveW1lbnQgdXNpbmcgT3Blbk5leHQuXG4gKlxuICogUmVzb3VyY2VzIGNyZWF0ZWQ6XG4gKiAtIFJEUyBQb3N0Z3JlU1FMIGRhdGFiYXNlIChBdXJvcmEgb3IgSW5zdGFuY2UpXG4gKiAtIDMgUzMgYnVja2V0cyAoYXNzZXRzLCBjYWNoZSwgbWVkaWEpXG4gKiAtIER5bmFtb0RCIHRhYmxlICh0YWcgY2FjaGUgd2l0aCBHU0kpXG4gKiAtIFNRUyBGSUZPIHF1ZXVlIChyZXZhbGlkYXRpb24pXG4gKiAtIDMgTGFtYmRhIGZ1bmN0aW9ucyAoc2VydmVyLCBpbWFnZSBvcHRpbWlzYXRpb24sIHJldmFsaWRhdGlvbilcbiAqIC0gQ2xvdWRGcm9udCBkaXN0cmlidXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcGF5bG9hZCA9IGFwcC5hZGRQYXR0ZXJuKFBhdHRlcm5GYWN0b3J5LmJ1aWxkKFwiUGF5bG9hZEFwcFwiLCB7XG4gKiAgIHR5cGU6IFwicGF5bG9hZFwiLFxuICogICBuYW1lOiBcIm15LWNtc1wiXG4gKiB9KSk7XG4gKlxuICogLy8gRXNjYXBlIGhhdGNoZXNcbiAqIHBheWxvYWQuZ2V0RGF0YWJhc2UoKS5ncmFudENvbm5lY3Qob3RoZXJMYW1iZGEpO1xuICovXG5cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIEZuLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgU2VjcmV0IH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc2VjcmV0c1wiO1xuaW1wb3J0IHtcbiAgQ29kZSxcbiAgUnVudGltZSxcbiAgQXJjaGl0ZWN0dXJlLFxuICBGdW5jdGlvblVybEF1dGhUeXBlLFxuICB0eXBlIElGdW5jdGlvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHtcbiAgQ2VydGlmaWNhdGUsXG4gIENlcnRpZmljYXRlVmFsaWRhdGlvbixcbiAgdHlwZSBJQ2VydGlmaWNhdGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7IEhvc3RlZFpvbmUsIEFSZWNvcmQsIFJlY29yZFRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgQ2xvdWRGcm9udFRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCI7XG5cbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi4vLi4vYXBwLmpzXCI7XG5pbXBvcnQgeyB0eXBlIElQYXlsb2FkUHJvcHMsIHR5cGUgSVBheWxvYWQgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL3BhdHRlcm4uanNcIjtcbmltcG9ydCB7IHR5cGUgTWFuaWZlc3RQYXR0ZXJuIH0gZnJvbSBcIi4uLy4uL3V0aWxzL21hbmlmZXN0V3JpdGVyLmpzXCI7XG5pbXBvcnQge1xuICB0eXBlIFJlbGF0aW9uYWxEYXRhYmFzZSxcbiAgdHlwZSBEeW5hbW9EQkRhdGFiYXNlLFxuICBEYXRhYmFzZUZhY3RvcnksXG4gIHR5cGUgQXVyb3JhRGF0YWJhc2VQcm9wcyxcbiAgdHlwZSBJbnN0YW5jZURhdGFiYXNlUHJvcHMsXG4gIHR5cGUgRHluYW1vREJEYXRhYmFzZVByb3BzXG59IGZyb20gXCIuL2RhdGFiYXNlLmpzXCI7XG5pbXBvcnQge1xuICBDb21wdXRlRmFjdG9yeSxcbiAgdHlwZSBMYW1iZGFDb21wdXRlLFxuICBJbnZva2VNb2RlLFxuICB0eXBlIENvZGVMYW1iZGFQcm9wc1xufSBmcm9tIFwiLi9jb21wdXRlLmpzXCI7XG5pbXBvcnQgeyBTdG9yYWdlRmFjdG9yeSwgdHlwZSBTdG9yYWdlLCB0eXBlIFMzUHJvcHMgfSBmcm9tIFwiLi9zdG9yYWdlLmpzXCI7XG5pbXBvcnQge1xuICBNZXNzYWdpbmdGYWN0b3J5LFxuICB0eXBlIFF1ZXVlTWVzc2FnaW5nLFxuICB0eXBlIElRdWV1ZVByb3BzXG59IGZyb20gXCIuL21lc3NhZ2luZy5qc1wiO1xuaW1wb3J0IHsgQ2RuRmFjdG9yeSwgdHlwZSBDZG4sIHR5cGUgU21hcnRDZG5Qcm9wcyB9IGZyb20gXCIuL2Nkbi5qc1wiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlci5qc1wiO1xuaW1wb3J0IHtcbiAgdG9QYXNjYWxDYXNlLFxuICB0b1ZhbGlkRGF0YWJhc2VOYW1lXG59IGZyb20gXCIuLi8uLi91dGlscy9jYXBpdGFsaXNlU3RyaW5nLmpzXCI7XG5cbmNvbnN0IFBBWUxPQURfREVGQVVMVFMgPSB7XG4gIC8qKiBQYXRoIHRvIE9wZW5OZXh0IG91dHB1dCByZWxhdGl2ZSB0byBhcHAgZm9sZGVyIChDREsgcnVucyBmcm9tIGZqYWxsLzxhcHBuYW1lPikgKi9cbiAgU09VUkNFOiBcIi4uLy4uXCIsXG4gIC8qKiBDbG91ZEZyb250IHJlcXVpcmVzIHVzLWVhc3QtMSBmb3IgY2VydGFpbiByZXNvdXJjZXM7IHVzZWQgYXMgcmVnaW9uIGZhbGxiYWNrICovXG4gIEZBTExCQUNLX1JFR0lPTjogXCJ1cy1lYXN0LTFcIixcbiAgREFUQUJBU0U6IHtcbiAgICBUWVBFOiBcIkluc3RhbmNlXCIgYXMgY29uc3QsXG4gICAgLyoqIEFXUyBkZWZhdWx0OyA3IGRheXMgY292ZXJzIG1vc3QgYWNjaWRlbnRhbCBkYXRhIGxvc3MgcmVjb3Zlcnkgc2NlbmFyaW9zICovXG4gICAgQkFDS1VQX1JFVEVOVElPTjogNyxcbiAgICBERUxFVElPTl9QUk9URUNUSU9OOiB0cnVlXG4gIH0sXG4gIENPTVBVVEU6IHtcbiAgICAvKiogMS41IEdCIGJhbGFuY2VzIE5leHQuanMgU1NSIHBlcmZvcm1hbmNlIHZzIGNvc3Q7IGJlbG93IHRoaXMgcmlza3MgT09NIG9uIGNvbXBsZXggcGFnZXMgKi9cbiAgICBTRVJWRVJfTUVNT1JZOiAxNTM2LFxuICAgIC8qKiBBUEkgR2F0ZXdheSBkZWZhdWx0IG1heDsgc3VmZmljaWVudCBmb3IgbW9zdCBTU1IgcmVuZGVycyAqL1xuICAgIFNFUlZFUl9USU1FT1VUOiAzMCxcbiAgICAvKiogU2hhcnAgaW1hZ2UgcHJvY2Vzc2luZyBuZWVkcyBtZW1vcnkgcHJvcG9ydGlvbmFsIHRvIGltYWdlIGRpbWVuc2lvbnMgKi9cbiAgICBJTUFHRV9NRU1PUlk6IDE1MzYsXG4gICAgLyoqIEltYWdlIHByb2Nlc3NpbmcgdHlwaWNhbGx5IGNvbXBsZXRlcyBpbiA8MTBzOyAzMHMgcHJvdmlkZXMgbWFyZ2luICovXG4gICAgSU1BR0VfVElNRU9VVDogMzAsXG4gICAgLyoqIFJldmFsaWRhdGlvbiBpcyBsaWdodHdlaWdodCAoSFRUUCBjYWxsICsgY2FjaGUgd3JpdGUpOyBoYWxmIG9mIHNlcnZlciBtZW1vcnkgc3VmZmljZXMgKi9cbiAgICBSRVZBTElEQVRJT05fTUVNT1JZOiA3NjgsXG4gICAgLyoqIDUgbWludXRlcyBhbGxvd3MgYmF0Y2ggcmV2YWxpZGF0aW9uIG9mIG1hbnkgcGFnZXMgaW4gYSBzaW5nbGUgaW52b2NhdGlvbiAqL1xuICAgIFJFVkFMSURBVElPTl9USU1FT1VUOiAzMDBcbiAgfSxcbiAgQ0FDSEU6IHtcbiAgICAvKiogMSB5ZWFyIOKAlCBzdGF0aWMgYXNzZXRzIGFyZSBjb250ZW50LWhhc2hlZCBzbyBsb25nIGNhY2hpbmcgaXMgc2FmZTsgbWF4aW1pc2VzIENETiBoaXQgcmF0ZSAqL1xuICAgIE1BWF9BR0VfU0VDT05EUzogMzE1MzYwMDBcbiAgfSxcbiAgT1BFTk5FWFQ6IHtcbiAgICBBU1NFVFM6IFwiLm9wZW4tbmV4dC9hc3NldHNcIixcbiAgICBDQUNIRTogXCIub3Blbi1uZXh0L2NhY2hlXCIsXG4gICAgU0VSVkVSOiBcIi5vcGVuLW5leHQvc2VydmVyLWZ1bmN0aW9ucy9kZWZhdWx0XCIsXG4gICAgSU1BR0U6IFwiLm9wZW4tbmV4dC9pbWFnZS1vcHRpbWl6YXRpb24tZnVuY3Rpb25cIixcbiAgICBSRVZBTElEQVRJT046IFwiLm9wZW4tbmV4dC9yZXZhbGlkYXRpb24tZnVuY3Rpb25cIlxuICB9LFxuICBQQVRIUzoge1xuICAgIFNUQVRJQzogXCIvX25leHQvc3RhdGljLypcIixcbiAgICBJTUFHRTogXCIvX25leHQvaW1hZ2UqXCIsXG4gICAgQVBJOiBcIi9hcGkvKlwiLFxuICAgIEFETUlOOiBcIi9hZG1pbi8qXCJcbiAgfVxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBFeHRyYWN0IHJvb3QgZG9tYWluIGZyb20gYSBmdWxsIGRvbWFpbiBuYW1lLlxuICogZS5nLiwgXCJjbXMuZXhhbXBsZS5jb21cIiAtPiBcImV4YW1wbGUuY29tXCJcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFJvb3REb21haW4oZG9tYWluOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0cyA9IGRvbWFpbi5zcGxpdChcIi5cIik7XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPiAyID8gcGFydHMuc2xpY2UoLTIpLmpvaW4oXCIuXCIpIDogZG9tYWluO1xufVxuXG4vKipcbiAqIFNhZmVseSBnZXQgdGhlIHVuZGVybHlpbmcgTGFtYmRhIGZ1bmN0aW9uIGZyb20gYSBjb21wdXRlIHJlc291cmNlLlxuICogVGhyb3dzIGEgY2xlYXIgZXJyb3IgaWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVGdW5jdGlvbihjb21wdXRlOiBMYW1iZGFDb21wdXRlLCBuYW1lOiBzdHJpbmcpOiBJRnVuY3Rpb24ge1xuICBjb25zdCBmbiA9IGNvbXB1dGUuZ2V0RnVuY3Rpb24oKTtcbiAgaWYgKCFmbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke25hbWV9IExhbWJkYSBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgICtcbiAgICAgICAgXCJUaGlzIGluZGljYXRlcyBhbiBpbnRlcm5hbCBlcnJvciBpbiBjb21wdXRlIHJlc291cmNlIGNyZWF0aW9uLlwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZm47XG59XG5cbi8qKlxuICogQmFzZSBkYXRhYmFzZSBwcm9wZXJ0aWVzIHNoYXJlZCBiZXR3ZWVuIEF1cm9yYSBhbmQgSW5zdGFuY2UuXG4gKiBVc2VzIFBpY2sgdG8gZXh0cmFjdCBjb21tb24gcHJvcGVydGllcyBmcm9tIHRoZSBkYXRhYmFzZSBjb25maWcuXG4gKi9cbnR5cGUgQmFzZURhdGFiYXNlUHJvcHMgPSBQaWNrPFxuICBJbnN0YW5jZURhdGFiYXNlUHJvcHMsXG4gIHwgXCJkYXRhYmFzZU5hbWVcIlxuICB8IFwiZGF0YWJhc2VFbmdpbmVcIlxuICB8IFwiYmFja3VwUmV0ZW50aW9uXCJcbiAgfCBcImRlbGV0aW9uUHJvdGVjdGlvblwiXG4gIHwgXCJwdWJsaWNseUFjY2Vzc2libGVcIlxuICB8IFwicG9ydFwiXG4gIHwgXCJkYXRhYmFzZUluc2lnaHRzXCJcbiAgfCBcInByb3h5XCJcbiAgfCBcImNyZWRlbnRpYWxzXCJcbiAgfCBcInNuYXBzaG90SWRlbnRpZmllclwiXG4gIHwgXCJzbmFwc2hvdFVzZXJuYW1lXCJcbj47XG5cbi8qKlxuICogTGFtYmRhIGNvbmZpZ3VyYXRpb24gd2l0aCByZXNvbHZlZCBkZWZhdWx0cy5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVkTGFtYmRhQ29uZmlnIHtcbiAgbWVtb3J5U2l6ZTogbnVtYmVyO1xuICB0aW1lb3V0OiBudW1iZXI7XG4gIGVwaGVtZXJhbFN0b3JhZ2VTaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgTGFtYmRhIGNvbmZpZyBmcm9tIHByb3BzIHdpdGggZGVmYXVsdHMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVMYW1iZGFDb25maWcoXG4gIGNvbmZpZzpcbiAgICB8IHsgbWVtb3J5U2l6ZT86IG51bWJlcjsgdGltZW91dD86IG51bWJlcjsgZXBoZW1lcmFsU3RvcmFnZVNpemU/OiBudW1iZXIgfVxuICAgIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0czogeyBtZW1vcnk6IG51bWJlcjsgdGltZW91dDogbnVtYmVyIH1cbik6IFJlc29sdmVkTGFtYmRhQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBtZW1vcnlTaXplOiBjb25maWc/Lm1lbW9yeVNpemUgPz8gZGVmYXVsdHMubWVtb3J5LFxuICAgIHRpbWVvdXQ6IGNvbmZpZz8udGltZW91dCA/PyBkZWZhdWx0cy50aW1lb3V0LFxuICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBjb25maWc/LmVwaGVtZXJhbFN0b3JhZ2VTaXplXG4gIH07XG59XG5cbi8qKlxuICogUGF5bG9hZCBDTVMgcGF0dGVybiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBDb21wb3NlcyBhbGwgcmVxdWlyZWQgQVdTIHJlc291cmNlcyBmb3IgYSBQYXlsb2FkIGRlcGxveW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXlsb2FkIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVBheWxvYWQge1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0dGVyblR5cGUgPSBcInBheWxvYWRcIiBhcyBjb25zdDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBJUGF5bG9hZFByb3BzO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhc2NhbE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGF5bG9hZFNlY3JldDogU2VjcmV0O1xuXG4gIHByaXZhdGUgX2RhdGFiYXNlITogUmVsYXRpb25hbERhdGFiYXNlO1xuICBwcml2YXRlIF9zZXJ2ZXIhOiBMYW1iZGFDb21wdXRlO1xuICBwcml2YXRlIF9pbWFnZU9wdGltaXNhdGlvbiE6IExhbWJkYUNvbXB1dGU7XG4gIHByaXZhdGUgX3JldmFsaWRhdGlvbiE6IExhbWJkYUNvbXB1dGU7XG4gIHByaXZhdGUgX2Fzc2V0c0J1Y2tldCE6IFN0b3JhZ2U7XG4gIHByaXZhdGUgX2NhY2hlQnVja2V0ITogU3RvcmFnZTtcbiAgcHJpdmF0ZSBfbWVkaWFCdWNrZXQhOiBTdG9yYWdlO1xuICBwcml2YXRlIF90YWdDYWNoZSE6IER5bmFtb0RCRGF0YWJhc2U7XG4gIHByaXZhdGUgX3JldmFsaWRhdGlvblF1ZXVlITogUXVldWVNZXNzYWdpbmc7XG4gIHByaXZhdGUgX2NkbiE6IENkbjtcbiAgcHJpdmF0ZSBfcmVzb2x2ZWREb21haW46XG4gICAgfCB7XG4gICAgICAgIGRvbWFpbk5hbWVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY2VydGlmaWNhdGU6IElDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaG9zdGVkWm9uZTogUmV0dXJuVHlwZTx0eXBlb2YgSG9zdGVkWm9uZS5mcm9tTG9va3VwPiB8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhcHA6IEFwcCwgcHJvcHM6IElQYXlsb2FkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMucGFzY2FsTmFtZSA9IHRvUGFzY2FsQ2FzZShwcm9wcy5uYW1lKTtcbiAgICB0aGlzLl9wYXlsb2FkU2VjcmV0ID0gbmV3IFNlY3JldCh0aGlzLCBgJHt0aGlzLnBhc2NhbE5hbWV9UGF5bG9hZFNlY3JldGAsIHtcbiAgICAgIHNlY3JldE5hbWU6IGAke3Byb3BzLm5hbWV9L3BheWxvYWQtc2VjcmV0YCxcbiAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBDTVMgc2VjcmV0IGZvciAke3Byb3BzLm5hbWV9YCxcbiAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgIGV4Y2x1ZGVQdW5jdHVhdGlvbjogdHJ1ZSxcbiAgICAgICAgcGFzc3dvcmRMZW5ndGg6IDY0XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWFuaWZlc3QoKTtcbiAgICB0aGlzLnZhbGlkYXRlUHJvcHMoKTtcblxuICAgIHRoaXMuY3JlYXRlRGF0YWJhc2UoKTtcbiAgICB0aGlzLmNyZWF0ZVN0b3JhZ2VCdWNrZXRzKCk7XG4gICAgdGhpcy5jcmVhdGVUYWdDYWNoZSgpO1xuICAgIHRoaXMuY3JlYXRlUmV2YWxpZGF0aW9uUXVldWUoKTtcbiAgICB0aGlzLmNyZWF0ZUxhbWJkYUZ1bmN0aW9ucygpO1xuICAgIHRoaXMuY3JlYXRlQ2RuKCk7XG4gICAgdGhpcy5jcmVhdGVEbnNSZWNvcmQoKTtcbiAgICB0aGlzLmV4cG9ydFBhdHRlcm5PdXRwdXRzKCk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTWFuaWZlc3QoKTogdm9pZCB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXR0ZXJuOiBNYW5pZmVzdFBhdHRlcm4gPSB7XG4gICAgICB0eXBlOiBcInBheWxvYWRcIixcbiAgICAgIG5hbWU6IHRoaXMucHJvcHMubmFtZSxcbiAgICAgIHNvdXJjZTogUEFZTE9BRF9ERUZBVUxUUy5TT1VSQ0VcbiAgICB9O1xuICAgIHRoaXMuYXBwLmdldE1hbmlmZXN0Q29sbGVjdG9yKCkuc2V0UGF0dGVybihtYW5pZmVzdFBhdHRlcm4pO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVByb3BzKCk6IHZvaWQge1xuICAgIGNvbnN0IGRiQ29uZmlnID0gdGhpcy5wcm9wcy5kYXRhYmFzZSA/PyB7fTtcbiAgICBpZiAoZGJDb25maWcucHVibGljbHlBY2Nlc3NpYmxlKSB7XG4gICAgICBGamFsbExvZ2dlci53YXJuKFxuICAgICAgICBgUGF5bG9hZCBkYXRhYmFzZSAnJHt0aGlzLnByb3BzLm5hbWV9JyBpcyBjb25maWd1cmVkIHdpdGggcHVibGljIGFjY2Vzc2liaWxpdHkuIGAgK1xuICAgICAgICAgIFwiVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2sgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRldmVsb3BtZW50LlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGF0YWJhc2UoKTogdm9pZCB7XG4gICAgY29uc3QgZGJDb25maWcgPSB0aGlzLnByb3BzLmRhdGFiYXNlID8/IHt9O1xuICAgIGNvbnN0IGRhdGFiYXNlVHlwZSA9IGRiQ29uZmlnLnR5cGUgPz8gUEFZTE9BRF9ERUZBVUxUUy5EQVRBQkFTRS5UWVBFO1xuXG4gICAgdGhpcy5fZGF0YWJhc2UgPVxuICAgICAgZGF0YWJhc2VUeXBlID09PSBcIkF1cm9yYVwiXG4gICAgICAgID8gdGhpcy5jcmVhdGVBdXJvcmFEYXRhYmFzZShkYkNvbmZpZylcbiAgICAgICAgOiB0aGlzLmNyZWF0ZUluc3RhbmNlRGF0YWJhc2UoZGJDb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEJhc2VEYXRhYmFzZVByb3BzKFxuICAgIGRiQ29uZmlnOiBOb25OdWxsYWJsZTxJUGF5bG9hZFByb3BzW1wiZGF0YWJhc2VcIl0+XG4gICk6IEJhc2VEYXRhYmFzZVByb3BzIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YWJhc2VOYW1lOlxuICAgICAgICBkYkNvbmZpZy5kYXRhYmFzZU5hbWUgPz8gdG9WYWxpZERhdGFiYXNlTmFtZSh0aGlzLnByb3BzLm5hbWUpLFxuICAgICAgZGF0YWJhc2VFbmdpbmU6IGRiQ29uZmlnLmRhdGFiYXNlRW5naW5lID8/IFwicG9zdGdyZXNxbFwiLFxuICAgICAgYmFja3VwUmV0ZW50aW9uOlxuICAgICAgICBkYkNvbmZpZy5iYWNrdXBSZXRlbnRpb24gPz8gUEFZTE9BRF9ERUZBVUxUUy5EQVRBQkFTRS5CQUNLVVBfUkVURU5USU9OLFxuICAgICAgZGVsZXRpb25Qcm90ZWN0aW9uOlxuICAgICAgICBkYkNvbmZpZy5kZWxldGlvblByb3RlY3Rpb24gPz9cbiAgICAgICAgUEFZTE9BRF9ERUZBVUxUUy5EQVRBQkFTRS5ERUxFVElPTl9QUk9URUNUSU9OLFxuICAgICAgcHVibGljbHlBY2Nlc3NpYmxlOiBkYkNvbmZpZy5wdWJsaWNseUFjY2Vzc2libGUsXG4gICAgICBwb3J0OiBkYkNvbmZpZy5wb3J0LFxuICAgICAgZGF0YWJhc2VJbnNpZ2h0czogZGJDb25maWcuZGF0YWJhc2VJbnNpZ2h0cyxcbiAgICAgIHByb3h5OiBkYkNvbmZpZy5wcm94eSxcbiAgICAgIGNyZWRlbnRpYWxzOiBkYkNvbmZpZy5jcmVkZW50aWFscyxcbiAgICAgIHNuYXBzaG90SWRlbnRpZmllcjogZGJDb25maWcuc25hcHNob3RJZGVudGlmaWVyLFxuICAgICAgc25hcHNob3RVc2VybmFtZTogZGJDb25maWcuc25hcHNob3RVc2VybmFtZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUF1cm9yYURhdGFiYXNlKFxuICAgIGRiQ29uZmlnOiBOb25OdWxsYWJsZTxJUGF5bG9hZFByb3BzW1wiZGF0YWJhc2VcIl0+XG4gICk6IFJlbGF0aW9uYWxEYXRhYmFzZSB7XG4gICAgY29uc3QgYXVyb3JhUHJvcHM6IEF1cm9yYURhdGFiYXNlUHJvcHMgPSB7XG4gICAgICB0eXBlOiBcIkF1cm9yYVwiLFxuICAgICAgLi4udGhpcy5idWlsZEJhc2VEYXRhYmFzZVByb3BzKGRiQ29uZmlnKSxcbiAgICAgIGFsbG93ZWRJcENpZHI6IGRiQ29uZmlnLmFsbG93ZWRJcENpZHIsXG4gICAgICBlbmNyeXB0aW9uOiBkYkNvbmZpZy5lbmNyeXB0aW9uLFxuICAgICAgd3JpdGVyOiBkYkNvbmZpZy53cml0ZXIsXG4gICAgICByZWFkZXJzOiBkYkNvbmZpZy5yZWFkZXJzLFxuICAgICAgYWxsb3dWcGNBY2Nlc3M6IGRiQ29uZmlnLmFsbG93VnBjQWNjZXNzLFxuICAgICAgbW9uaXRvcmluZ0ludGVydmFsOiBkYkNvbmZpZy5tb25pdG9yaW5nSW50ZXJ2YWwsXG4gICAgICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzogZGJDb25maWcucHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3dcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmFwcC5hZGREYXRhYmFzZShcbiAgICAgIERhdGFiYXNlRmFjdG9yeS5idWlsZCh0aGlzLnByb3BzLm5hbWUsIGF1cm9yYVByb3BzKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUluc3RhbmNlRGF0YWJhc2UoXG4gICAgZGJDb25maWc6IE5vbk51bGxhYmxlPElQYXlsb2FkUHJvcHNbXCJkYXRhYmFzZVwiXT5cbiAgKTogUmVsYXRpb25hbERhdGFiYXNlIHtcbiAgICBjb25zdCBpbnN0YW5jZVByb3BzOiBJbnN0YW5jZURhdGFiYXNlUHJvcHMgPSB7XG4gICAgICB0eXBlOiBcIkluc3RhbmNlXCIsXG4gICAgICAuLi50aGlzLmJ1aWxkQmFzZURhdGFiYXNlUHJvcHMoZGJDb25maWcpLFxuICAgICAgcHVibGljbHlBY2Nlc3NpYmxlOiBkYkNvbmZpZy5wdWJsaWNseUFjY2Vzc2libGUgPz8gZmFsc2UsXG4gICAgICBpbnN0YW5jZVR5cGU6IGRiQ29uZmlnLmluc3RhbmNlVHlwZSxcbiAgICAgIGFsbG9jYXRlZFN0b3JhZ2U6IGRiQ29uZmlnLmFsbG9jYXRlZFN0b3JhZ2UsXG4gICAgICBtdWx0aUF6OiBkYkNvbmZpZy5tdWx0aUF6LFxuICAgICAgcmVhZFJlcGxpY2E6IGRiQ29uZmlnLnJlYWRSZXBsaWNhLFxuICAgICAgZW5jcnlwdGlvbjogZGJDb25maWcuZW5jcnlwdGlvblxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuYXBwLmFkZERhdGFiYXNlKFxuICAgICAgRGF0YWJhc2VGYWN0b3J5LmJ1aWxkKHRoaXMucHJvcHMubmFtZSwgaW5zdGFuY2VQcm9wcylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdG9yYWdlQnVja2V0cygpOiB2b2lkIHtcbiAgICB0aGlzLl9hc3NldHNCdWNrZXQgPSB0aGlzLmNyZWF0ZUFzc2V0c0J1Y2tldCgpO1xuICAgIHRoaXMuX2NhY2hlQnVja2V0ID0gdGhpcy5jcmVhdGVDYWNoZUJ1Y2tldCgpO1xuICAgIHRoaXMuX21lZGlhQnVja2V0ID0gdGhpcy5jcmVhdGVNZWRpYUJ1Y2tldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBc3NldHNCdWNrZXQoKTogU3RvcmFnZSB7XG4gICAgY29uc3QgYXNzZXRzQ29uZmlnID0gdGhpcy5wcm9wcy5zdG9yYWdlPy5hc3NldHMgPz8ge307XG4gICAgY29uc3QgYXNzZXRzUHJvcHM6IFMzUHJvcHMgPSB7XG4gICAgICB2ZXJzaW9uZWQ6IGFzc2V0c0NvbmZpZy52ZXJzaW9uZWQgPz8gZmFsc2UsXG4gICAgICBkZXBsb3ltZW50OiB7XG4gICAgICAgIHNvdXJjZTogYCR7UEFZTE9BRF9ERUZBVUxUUy5TT1VSQ0V9LyR7UEFZTE9BRF9ERUZBVUxUUy5PUEVOTkVYVC5BU1NFVFN9YCxcbiAgICAgICAgcHJ1bmU6IHRydWUsXG4gICAgICAgIGNhY2hlQ29udHJvbDoge1xuICAgICAgICAgIG1heEFnZTogUEFZTE9BRF9ERUZBVUxUUy5DQUNIRS5NQVhfQUdFX1NFQ09ORFMsXG4gICAgICAgICAgaW1tdXRhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmFwcC5hZGRTdG9yYWdlKFxuICAgICAgU3RvcmFnZUZhY3RvcnkuYnVpbGQoYCR7dGhpcy5wcm9wcy5uYW1lfS1hc3NldHNgLCBhc3NldHNQcm9wcylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDYWNoZUJ1Y2tldCgpOiBTdG9yYWdlIHtcbiAgICBjb25zdCBjYWNoZUNvbmZpZyA9IHRoaXMucHJvcHMuc3RvcmFnZT8uY2FjaGUgPz8ge307XG4gICAgY29uc3QgY2FjaGVQcm9wczogUzNQcm9wcyA9IHtcbiAgICAgIHZlcnNpb25lZDogY2FjaGVDb25maWcudmVyc2lvbmVkID8/IGZhbHNlLFxuICAgICAgZGVwbG95bWVudDoge1xuICAgICAgICBzb3VyY2U6IGAke1BBWUxPQURfREVGQVVMVFMuU09VUkNFfS8ke1BBWUxPQURfREVGQVVMVFMuT1BFTk5FWFQuQ0FDSEV9YCxcbiAgICAgICAgcHJ1bmU6IGZhbHNlIC8vIElTUiBhZGRzIGZpbGVzIGF0IHJ1bnRpbWVcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmFwcC5hZGRTdG9yYWdlKFxuICAgICAgU3RvcmFnZUZhY3RvcnkuYnVpbGQoYCR7dGhpcy5wcm9wcy5uYW1lfS1jYWNoZWAsIGNhY2hlUHJvcHMpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWVkaWFCdWNrZXQoKTogU3RvcmFnZSB7XG4gICAgY29uc3QgbWVkaWFDb25maWcgPSB0aGlzLnByb3BzLnN0b3JhZ2U/Lm1lZGlhID8/IHt9O1xuICAgIGNvbnN0IG1lZGlhUHJvcHM6IFMzUHJvcHMgPSB7XG4gICAgICB2ZXJzaW9uZWQ6IG1lZGlhQ29uZmlnLnZlcnNpb25lZCA/PyBmYWxzZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuYXBwLmFkZFN0b3JhZ2UoXG4gICAgICBTdG9yYWdlRmFjdG9yeS5idWlsZChgJHt0aGlzLnByb3BzLm5hbWV9LW1lZGlhYCwgbWVkaWFQcm9wcylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUYWdDYWNoZSgpOiB2b2lkIHtcbiAgICBjb25zdCB0YWdDYWNoZVByb3BzOiBEeW5hbW9EQkRhdGFiYXNlUHJvcHMgPSB7XG4gICAgICB0eXBlOiBcIkR5bmFtb0RCXCIsXG4gICAgICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogXCJ0YWdcIiwgdHlwZTogXCJTXCIgfSxcbiAgICAgIHNvcnRLZXk6IHsgbmFtZTogXCJwYXRoXCIsIHR5cGU6IFwiU1wiIH0sXG4gICAgICBnbG9iYWxTZWNvbmRhcnlJbmRleGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpbmRleE5hbWU6IFwicmV2YWxpZGF0ZVwiLFxuICAgICAgICAgIHBhcnRpdGlvbktleTogeyBuYW1lOiBcInBhdGhcIiwgdHlwZTogXCJTXCIgfSxcbiAgICAgICAgICBzb3J0S2V5OiB7IG5hbWU6IFwicmV2YWxpZGF0ZWRBdFwiLCB0eXBlOiBcIk5cIiB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuICAgIHRoaXMuX3RhZ0NhY2hlID0gdGhpcy5hcHAuYWRkRGF0YWJhc2UoXG4gICAgICBEYXRhYmFzZUZhY3RvcnkuYnVpbGQoYCR7dGhpcy5wcm9wcy5uYW1lfS10YWctY2FjaGVgLCB0YWdDYWNoZVByb3BzKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJldmFsaWRhdGlvblF1ZXVlKCk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXVlQ29uZmlnID0gdGhpcy5wcm9wcy5tZXNzYWdpbmc/LnJldmFsaWRhdGlvblF1ZXVlID8/IHt9O1xuICAgIGNvbnN0IHJldmFsaWRhdGlvblRpbWVvdXQgPVxuICAgICAgdGhpcy5wcm9wcy5jb21wdXRlPy5yZXZhbGlkYXRpb24/LnRpbWVvdXQgPz9cbiAgICAgIFBBWUxPQURfREVGQVVMVFMuQ09NUFVURS5SRVZBTElEQVRJT05fVElNRU9VVDtcblxuICAgIC8vIFJlc29sdmUgZGVhZCBsZXR0ZXIgcXVldWUgY29uZmlnXG4gICAgbGV0IGRscUNvbmZpZzogSVF1ZXVlUHJvcHNbXCJkZWFkTGV0dGVyUXVldWVcIl07XG4gICAgaWYgKHF1ZXVlQ29uZmlnLmRlYWRMZXR0ZXJRdWV1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIGRscUNvbmZpZyA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHF1ZXVlQ29uZmlnLmRlYWRMZXR0ZXJRdWV1ZSkge1xuICAgICAgZGxxQ29uZmlnID0ge1xuICAgICAgICBlbmFibGVkOiBxdWV1ZUNvbmZpZy5kZWFkTGV0dGVyUXVldWUuZW5hYmxlZCA/PyB0cnVlLFxuICAgICAgICBtYXhSZWNlaXZlQ291bnQ6IHF1ZXVlQ29uZmlnLmRlYWRMZXR0ZXJRdWV1ZS5tYXhSZWNlaXZlQ291bnQgPz8gM1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGxxQ29uZmlnID0geyBlbmFibGVkOiB0cnVlLCBtYXhSZWNlaXZlQ291bnQ6IDMgfTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZVByb3BzOiBJUXVldWVQcm9wcyA9IHtcbiAgICAgIHR5cGU6IFwicXVldWVcIixcbiAgICAgIHF1ZXVlVHlwZTogXCJmaWZvXCIsXG4gICAgICB2aXNpYmlsaXR5VGltZW91dDogcXVldWVDb25maWcudmlzaWJpbGl0eVRpbWVvdXQgPz8gcmV2YWxpZGF0aW9uVGltZW91dCxcbiAgICAgIG1lc3NhZ2VSZXRlbnRpb25QZXJpb2Q6IHF1ZXVlQ29uZmlnLm1lc3NhZ2VSZXRlbnRpb25QZXJpb2QsXG4gICAgICBtYXhNZXNzYWdlU2l6ZTogcXVldWVDb25maWcubWF4TWVzc2FnZVNpemUsXG4gICAgICBjb250ZW50QmFzZWREZWR1cGxpY2F0aW9uOiB0cnVlLFxuICAgICAgZGVhZExldHRlclF1ZXVlOiBkbHFDb25maWdcbiAgICB9O1xuICAgIHRoaXMuX3JldmFsaWRhdGlvblF1ZXVlID0gdGhpcy5hcHAuYWRkTWVzc2FnaW5nKFxuICAgICAgTWVzc2FnaW5nRmFjdG9yeS5idWlsZChgJHt0aGlzLnByb3BzLm5hbWV9LXJldmFsaWRhdGlvbmAsIHF1ZXVlUHJvcHMpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTGFtYmRhRnVuY3Rpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlcnZlciA9IHRoaXMuY3JlYXRlU2VydmVyTGFtYmRhKCk7XG4gICAgdGhpcy5faW1hZ2VPcHRpbWlzYXRpb24gPSB0aGlzLmNyZWF0ZUltYWdlTGFtYmRhKCk7XG4gICAgdGhpcy5fcmV2YWxpZGF0aW9uID0gdGhpcy5jcmVhdGVSZXZhbGlkYXRpb25MYW1iZGEoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2VydmVyTGFtYmRhKCk6IExhbWJkYUNvbXB1dGUge1xuICAgIGNvbnN0IHsgbWVtb3J5U2l6ZSwgdGltZW91dCwgZXBoZW1lcmFsU3RvcmFnZVNpemUgfSA9IHJlc29sdmVMYW1iZGFDb25maWcoXG4gICAgICB0aGlzLnByb3BzLmNvbXB1dGU/LnNlcnZlcixcbiAgICAgIHtcbiAgICAgICAgbWVtb3J5OiBQQVlMT0FEX0RFRkFVTFRTLkNPTVBVVEUuU0VSVkVSX01FTU9SWSxcbiAgICAgICAgdGltZW91dDogUEFZTE9BRF9ERUZBVUxUUy5DT01QVVRFLlNFUlZFUl9USU1FT1VUXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHNlcnZlclByb3BzOiBDb2RlTGFtYmRhUHJvcHMgPSB7XG4gICAgICB0eXBlOiBcImxhbWJkYVwiLFxuICAgICAgZGVwbG95bWVudDogXCJjb2RlXCIsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChcbiAgICAgICAgYCR7UEFZTE9BRF9ERUZBVUxUUy5TT1VSQ0V9LyR7UEFZTE9BRF9ERUZBVUxUUy5PUEVOTkVYVC5TRVJWRVJ9YFxuICAgICAgKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIG1lbW9yeVNpemUsXG4gICAgICB0aW1lb3V0LFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZVNpemUsXG4gICAgICBmdW5jdGlvblVybDoge1xuICAgICAgICBhdXRoVHlwZTogRnVuY3Rpb25VcmxBdXRoVHlwZS5OT05FLFxuICAgICAgICBpbnZva2VNb2RlOiBJbnZva2VNb2RlLlJFU1BPTlNFX1NUUkVBTVxuICAgICAgfSxcbiAgICAgIGNvbm5lY3Rpb25zOiBbdGhpcy5fZGF0YWJhc2VdLFxuICAgICAgc2VjcmV0c0ltcG9ydDoge1xuICAgICAgICBEQVRBQkFTRV9VU0VSTkFNRTogdGhpcy5fZGF0YWJhc2VcbiAgICAgICAgICAuZ2V0Q3JlZGVudGlhbHMoKVxuICAgICAgICAgIC5nZXRJbXBvcnQoXCJ1c2VybmFtZVwiKSxcbiAgICAgICAgREFUQUJBU0VfUEFTU1dPUkQ6IHRoaXMuX2RhdGFiYXNlXG4gICAgICAgICAgLmdldENyZWRlbnRpYWxzKClcbiAgICAgICAgICAuZ2V0SW1wb3J0KFwicGFzc3dvcmRcIiksXG4gICAgICAgIFBBWUxPQURfU0VDUkVUOiB0aGlzLl9wYXlsb2FkU2VjcmV0LmdldEltcG9ydCgpXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuYnVpbGRTZXJ2ZXJFbnZpcm9ubWVudCgpXG4gICAgfTtcblxuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMuYXBwLmFkZENvbXB1dGUoXG4gICAgICBDb21wdXRlRmFjdG9yeS5idWlsZChgJHt0aGlzLnByb3BzLm5hbWV9LXNlcnZlcmAsIHNlcnZlclByb3BzKVxuICAgICk7XG5cbiAgICB0aGlzLmdyYW50U2VydmVyUGVybWlzc2lvbnMoc2VydmVyKTtcbiAgICByZXR1cm4gc2VydmVyO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlckVudmlyb25tZW50KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGJhc2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBEQVRBQkFTRV9IT1NUOiB0aGlzLl9kYXRhYmFzZS5nZXRIb3N0RW5kcG9pbnQoKSxcbiAgICAgIERBVEFCQVNFX1BPUlQ6IHRoaXMuX2RhdGFiYXNlLmdldEhvc3RQb3J0KCksXG4gICAgICBEQVRBQkFTRV9OQU1FOiB0aGlzLl9kYXRhYmFzZS5nZXREYXRhYmFzZU5hbWUoKSxcbiAgICAgIERBVEFCQVNFX1NTTDogXCJ0cnVlXCIsXG4gICAgICBDQUNIRV9CVUNLRVRfTkFNRTogdGhpcy5fY2FjaGVCdWNrZXQuZ2V0QnVja2V0TmFtZSgpLFxuICAgICAgQ0FDSEVfQlVDS0VUX1JFR0lPTjogU3RhY2sub2YodGhpcykucmVnaW9uLFxuICAgICAgQ0FDSEVfRFlOQU1PX1RBQkxFOiB0aGlzLl90YWdDYWNoZS5nZXRUYWJsZU5hbWUoKSxcbiAgICAgIFJFVkFMSURBVElPTl9RVUVVRV9VUkw6IHRoaXMuX3JldmFsaWRhdGlvblF1ZXVlLmdldFF1ZXVlVXJsKCksXG4gICAgICBSRVZBTElEQVRJT05fUVVFVUVfUkVHSU9OOiBTdGFjay5vZih0aGlzKS5yZWdpb24sXG4gICAgICBNRURJQV9CVUNLRVRfTkFNRTogdGhpcy5fbWVkaWFCdWNrZXQuZ2V0QnVja2V0TmFtZSgpXG4gICAgfTtcblxuICAgIC8vIExvY2sgZG93biBDT1JTIHRvIGN1c3RvbSBkb21haW4gd2hlbiBwcm92aWRlZFxuICAgIGNvbnN0IGN1c3RvbURvbWFpbiA9IHRoaXMucHJvcHMuZG9tYWluID8/IHRoaXMucHJvcHMuY2RuPy5kb21haW5OYW1lcz8uWzBdO1xuICAgIGlmIChjdXN0b21Eb21haW4pIHtcbiAgICAgIGJhc2VFbnYuTkVYVF9QVUJMSUNfU0VSVkVSX1VSTCA9IGBodHRwczovLyR7Y3VzdG9tRG9tYWlufWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgLi4uYmFzZUVudiwgLi4udGhpcy5wcm9wcy5lbnZpcm9ubWVudCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBncmFudFNlcnZlclBlcm1pc3Npb25zKHNlcnZlcjogTGFtYmRhQ29tcHV0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHNlcnZlckZ1bmN0aW9uID0gcmVxdWlyZUZ1bmN0aW9uKHNlcnZlciwgXCJTZXJ2ZXJcIik7XG4gICAgdGhpcy5fY2FjaGVCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoc2VydmVyRnVuY3Rpb24pO1xuICAgIHRoaXMuX21lZGlhQnVja2V0LmdyYW50UmVhZFdyaXRlKHNlcnZlckZ1bmN0aW9uKTtcbiAgICB0aGlzLl90YWdDYWNoZS5ncmFudFJlYWRXcml0ZURhdGEoc2VydmVyRnVuY3Rpb24pO1xuICAgIHRoaXMuX3JldmFsaWRhdGlvblF1ZXVlLmdyYW50U2VuZE1lc3NhZ2VzKHNlcnZlckZ1bmN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VMYW1iZGEoKTogTGFtYmRhQ29tcHV0ZSB7XG4gICAgY29uc3QgeyBtZW1vcnlTaXplLCB0aW1lb3V0LCBlcGhlbWVyYWxTdG9yYWdlU2l6ZSB9ID0gcmVzb2x2ZUxhbWJkYUNvbmZpZyhcbiAgICAgIHRoaXMucHJvcHMuY29tcHV0ZT8uaW1hZ2VPcHRpbWlzYXRpb24sXG4gICAgICB7XG4gICAgICAgIG1lbW9yeTogUEFZTE9BRF9ERUZBVUxUUy5DT01QVVRFLklNQUdFX01FTU9SWSxcbiAgICAgICAgdGltZW91dDogUEFZTE9BRF9ERUZBVUxUUy5DT01QVVRFLklNQUdFX1RJTUVPVVRcbiAgICAgIH1cbiAgICApO1xuXG4gICAgY29uc3QgaW1hZ2VQcm9wczogQ29kZUxhbWJkYVByb3BzID0ge1xuICAgICAgdHlwZTogXCJsYW1iZGFcIixcbiAgICAgIGRlcGxveW1lbnQ6IFwiY29kZVwiLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIGAke1BBWUxPQURfREVGQVVMVFMuU09VUkNFfS8ke1BBWUxPQURfREVGQVVMVFMuT1BFTk5FWFQuSU1BR0V9YFxuICAgICAgKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIG1lbW9yeVNpemUsXG4gICAgICB0aW1lb3V0LFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZVNpemUsXG4gICAgICBmdW5jdGlvblVybDogeyBhdXRoVHlwZTogRnVuY3Rpb25VcmxBdXRoVHlwZS5OT05FIH0sXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBCVUNLRVRfTkFNRTogdGhpcy5fYXNzZXRzQnVja2V0LmdldEJ1Y2tldE5hbWUoKSxcbiAgICAgICAgQlVDS0VUX0tFWV9QUkVGSVg6IFwiX2Fzc2V0c1wiXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGltYWdlID0gdGhpcy5hcHAuYWRkQ29tcHV0ZShcbiAgICAgIENvbXB1dGVGYWN0b3J5LmJ1aWxkKGAke3RoaXMucHJvcHMubmFtZX0taW1hZ2VgLCBpbWFnZVByb3BzKVxuICAgICk7XG5cbiAgICBjb25zdCBpbWFnZUZ1bmN0aW9uID0gcmVxdWlyZUZ1bmN0aW9uKGltYWdlLCBcIkltYWdlT3B0aW1pc2F0aW9uXCIpO1xuICAgIHRoaXMuX2Fzc2V0c0J1Y2tldC5ncmFudFJlYWQoaW1hZ2VGdW5jdGlvbik7XG5cbiAgICByZXR1cm4gaW1hZ2U7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJldmFsaWRhdGlvbkxhbWJkYSgpOiBMYW1iZGFDb21wdXRlIHtcbiAgICBjb25zdCB7IG1lbW9yeVNpemUsIHRpbWVvdXQsIGVwaGVtZXJhbFN0b3JhZ2VTaXplIH0gPSByZXNvbHZlTGFtYmRhQ29uZmlnKFxuICAgICAgdGhpcy5wcm9wcy5jb21wdXRlPy5yZXZhbGlkYXRpb24sXG4gICAgICB7XG4gICAgICAgIG1lbW9yeTogUEFZTE9BRF9ERUZBVUxUUy5DT01QVVRFLlJFVkFMSURBVElPTl9NRU1PUlksXG4gICAgICAgIHRpbWVvdXQ6IFBBWUxPQURfREVGQVVMVFMuQ09NUFVURS5SRVZBTElEQVRJT05fVElNRU9VVFxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCByZXZhbGlkYXRpb25Qcm9wczogQ29kZUxhbWJkYVByb3BzID0ge1xuICAgICAgdHlwZTogXCJsYW1iZGFcIixcbiAgICAgIGRlcGxveW1lbnQ6IFwiY29kZVwiLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIGAke1BBWUxPQURfREVGQVVMVFMuU09VUkNFfS8ke1BBWUxPQURfREVGQVVMVFMuT1BFTk5FWFQuUkVWQUxJREFUSU9OfWBcbiAgICAgICksXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICBtZW1vcnlTaXplLFxuICAgICAgdGltZW91dCxcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgQ0FDSEVfRFlOQU1PX1RBQkxFOiB0aGlzLl90YWdDYWNoZS5nZXRUYWJsZU5hbWUoKSxcbiAgICAgICAgQ0FDSEVfQlVDS0VUX05BTUU6IHRoaXMuX2NhY2hlQnVja2V0LmdldEJ1Y2tldE5hbWUoKVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCByZXZhbGlkYXRpb24gPSB0aGlzLmFwcC5hZGRDb21wdXRlKFxuICAgICAgQ29tcHV0ZUZhY3RvcnkuYnVpbGQoYCR7dGhpcy5wcm9wcy5uYW1lfS1yZXZhbGlkYXRpb25gLCByZXZhbGlkYXRpb25Qcm9wcylcbiAgICApO1xuXG4gICAgY29uc3QgcmV2YWxpZGF0aW9uTGFtYmRhID0gcmV2YWxpZGF0aW9uLmdldExhbWJkYUZ1bmN0aW9uKCk7XG4gICAgcmV2YWxpZGF0aW9uTGFtYmRhLmFkZFNxc0V2ZW50U291cmNlKHRoaXMuX3JldmFsaWRhdGlvblF1ZXVlLmdldFF1ZXVlKCksIHtcbiAgICAgIGJhdGNoU2l6ZTogNVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmV2YWxpZGF0aW9uRnVuY3Rpb24gPSByZXF1aXJlRnVuY3Rpb24ocmV2YWxpZGF0aW9uLCBcIlJldmFsaWRhdGlvblwiKTtcbiAgICB0aGlzLl90YWdDYWNoZS5ncmFudFJlYWRXcml0ZURhdGEocmV2YWxpZGF0aW9uRnVuY3Rpb24pO1xuICAgIHRoaXMuX2NhY2hlQnVja2V0LmdyYW50UmVhZFdyaXRlKHJldmFsaWRhdGlvbkZ1bmN0aW9uKTtcbiAgICB0aGlzLl9yZXZhbGlkYXRpb25RdWV1ZS5ncmFudENvbnN1bWVNZXNzYWdlcyhyZXZhbGlkYXRpb25GdW5jdGlvbik7XG5cbiAgICByZXR1cm4gcmV2YWxpZGF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDZG4oKTogdm9pZCB7XG4gICAgY29uc3QgeyBkb21haW5OYW1lcywgY2VydGlmaWNhdGUgfSA9IHRoaXMucmVzb2x2ZURvbWFpbkNvbmZpZygpO1xuXG4gICAgY29uc3QgY2RuUHJvcHM6IFNtYXJ0Q2RuUHJvcHMgPSB7XG4gICAgICBvcmlnaW5UeXBlOiBcImF1dG9cIixcbiAgICAgIG9yaWdpbjogdGhpcy5fc2VydmVyLFxuICAgICAgY2FjaGVQb2xpY3k6IFwiQ0FDSElOR19ESVNBQkxFRFwiLFxuICAgICAgZGVmYXVsdEFsbG93ZWRNZXRob2RzOiBcIkFMTFwiLFxuICAgICAgZm9yd2FyZEhvc3RIZWFkZXI6IHRydWUsXG4gICAgICBwcmljZUNsYXNzOiBcIlByaWNlQ2xhc3NfMTAwXCIsXG4gICAgICBkb21haW5OYW1lcyxcbiAgICAgIGNlcnRpZmljYXRlLFxuICAgICAgYmVoYXZpb3VyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcGF0aFBhdHRlcm46IFBBWUxPQURfREVGQVVMVFMuUEFUSFMuU1RBVElDLFxuICAgICAgICAgIG9yaWdpbjogdGhpcy5fYXNzZXRzQnVja2V0LFxuICAgICAgICAgIGNhY2hlUG9saWN5OiBcIkNBQ0hJTkdfT1BUSU1JWkVEXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGhQYXR0ZXJuOiBQQVlMT0FEX0RFRkFVTFRTLlBBVEhTLklNQUdFLFxuICAgICAgICAgIG9yaWdpbjogdGhpcy5faW1hZ2VPcHRpbWlzYXRpb24sXG4gICAgICAgICAgY2FjaGVQb2xpY3k6IFwiQ0FDSElOR19PUFRJTUlaRURcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aFBhdHRlcm46IFBBWUxPQURfREVGQVVMVFMuUEFUSFMuQVBJLFxuICAgICAgICAgIG9yaWdpbjogdGhpcy5fc2VydmVyLFxuICAgICAgICAgIGNhY2hlUG9saWN5OiBcIkNBQ0hJTkdfRElTQUJMRURcIixcbiAgICAgICAgICBhbGxvd2VkTWV0aG9kczogXCJBTExcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aFBhdHRlcm46IFBBWUxPQURfREVGQVVMVFMuUEFUSFMuQURNSU4sXG4gICAgICAgICAgb3JpZ2luOiB0aGlzLl9zZXJ2ZXIsXG4gICAgICAgICAgY2FjaGVQb2xpY3k6IFwiQ0FDSElOR19ESVNBQkxFRFwiLFxuICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBcIkFMTFwiXG4gICAgICAgIH0sXG4gICAgICAgIC4uLih0aGlzLnByb3BzLmNkbj8uYmVoYXZpb3VycyA/PyBbXSlcbiAgICAgIF1cbiAgICB9O1xuXG4gICAgdGhpcy5fY2RuID0gdGhpcy5hcHAuYWRkQ2RuKENkbkZhY3RvcnkuYnVpbGQodGhpcy5wcm9wcy5uYW1lLCBjZG5Qcm9wcykpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRG9tYWluQ29uZmlnKCk6IHtcbiAgICBkb21haW5OYW1lczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgY2VydGlmaWNhdGU6IElDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZDtcbiAgICBob3N0ZWRab25lOiBSZXR1cm5UeXBlPHR5cGVvZiBIb3N0ZWRab25lLmZyb21Mb29rdXA+IHwgdW5kZWZpbmVkO1xuICB9IHtcbiAgICBpZiAodGhpcy5fcmVzb2x2ZWREb21haW4pIHJldHVybiB0aGlzLl9yZXNvbHZlZERvbWFpbjtcblxuICAgIGlmICh0aGlzLnByb3BzLmRvbWFpbikge1xuICAgICAgdGhpcy5fcmVzb2x2ZWREb21haW4gPSB0aGlzLnJlc29sdmVTaW1wbGVEb21haW4oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuY2RuPy5kb21haW5OYW1lcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9yZXNvbHZlZERvbWFpbiA9IHRoaXMucmVzb2x2ZUFkdmFuY2VkRG9tYWluKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Jlc29sdmVkRG9tYWluID0ge1xuICAgICAgICBkb21haW5OYW1lczogdW5kZWZpbmVkLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogdW5kZWZpbmVkLFxuICAgICAgICBob3N0ZWRab25lOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkRG9tYWluO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlU2ltcGxlRG9tYWluKCk6IHtcbiAgICBkb21haW5OYW1lczogc3RyaW5nW107XG4gICAgY2VydGlmaWNhdGU6IElDZXJ0aWZpY2F0ZTtcbiAgICBob3N0ZWRab25lOiBSZXR1cm5UeXBlPHR5cGVvZiBIb3N0ZWRab25lLmZyb21Mb29rdXA+O1xuICB9IHtcbiAgICBjb25zdCBkb21haW4gPSB0aGlzLnByb3BzLmRvbWFpbjtcbiAgICBpZiAoIWRvbWFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRG9tYWluIGlzIHJlcXVpcmVkIGZvciBzaW1wbGUgZG9tYWluIHJlc29sdXRpb25cIik7XG4gICAgfVxuXG4gICAgLy8gTWFuYWdlZCBkb21haW46IGltcG9ydCB6b25lIGFuZCBjZXJ0IGZyb20gZG9tYWluIHN0YWNrXG4gICAgaWYgKHRoaXMucHJvcHMubWFuYWdlZERvbWFpbikge1xuICAgICAgY29uc3QgbWFuYWdlZCA9IHRoaXMucHJvcHMubWFuYWdlZERvbWFpbjtcbiAgICAgIGNvbnN0IGhvc3RlZFpvbmUgPSBIb3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcyhcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7dGhpcy5wYXNjYWxOYW1lfU1hbmFnZWRIb3N0ZWRab25lYCxcbiAgICAgICAge1xuICAgICAgICAgIGhvc3RlZFpvbmVJZDogRm4uaW1wb3J0VmFsdWUobWFuYWdlZC5ob3N0ZWRab25lSWRFeHBvcnQpLFxuICAgICAgICAgIHpvbmVOYW1lOiBtYW5hZ2VkLnpvbmVOYW1lXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7dGhpcy5wYXNjYWxOYW1lfU1hbmFnZWRDZXJ0aWZpY2F0ZWAsXG4gICAgICAgIEZuLmltcG9ydFZhbHVlKG1hbmFnZWQuY2VydGlmaWNhdGVBcm5FeHBvcnQpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgZG9tYWluTmFtZXM6IFtkb21haW5dLCBjZXJ0aWZpY2F0ZSwgaG9zdGVkWm9uZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3REb21haW4gPSBleHRyYWN0Um9vdERvbWFpbihkb21haW4pO1xuXG4gICAgY29uc3QgaG9zdGVkWm9uZSA9IEhvc3RlZFpvbmUuZnJvbUxvb2t1cChcbiAgICAgIHRoaXMsXG4gICAgICBgJHt0aGlzLnBhc2NhbE5hbWV9SG9zdGVkWm9uZWAsXG4gICAgICB7IGRvbWFpbk5hbWU6IHJvb3REb21haW4gfVxuICAgICk7XG5cbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IG5ldyBDZXJ0aWZpY2F0ZSh0aGlzLCBgJHt0aGlzLnBhc2NhbE5hbWV9Q2VydGlmaWNhdGVgLCB7XG4gICAgICBkb21haW5OYW1lOiBkb21haW4sXG4gICAgICB2YWxpZGF0aW9uOiBDZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyhob3N0ZWRab25lKVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgZG9tYWluTmFtZXM6IFtkb21haW5dLCBjZXJ0aWZpY2F0ZSwgaG9zdGVkWm9uZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQWR2YW5jZWREb21haW4oKToge1xuICAgIGRvbWFpbk5hbWVzOiBzdHJpbmdbXTtcbiAgICBjZXJ0aWZpY2F0ZTogSUNlcnRpZmljYXRlIHwgdW5kZWZpbmVkO1xuICAgIGhvc3RlZFpvbmU6IHVuZGVmaW5lZDtcbiAgfSB7XG4gICAgY29uc3QgY2RuQ29uZmlnID0gdGhpcy5wcm9wcy5jZG47XG4gICAgaWYgKCFjZG5Db25maWc/LmRvbWFpbk5hbWVzPy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDRE4gZG9tYWluIG5hbWVzIGFyZSByZXF1aXJlZCBmb3IgYWR2YW5jZWQgZG9tYWluIHJlc29sdXRpb25cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9XG4gICAgICBjZG5Db25maWcuY2VydGlmaWNhdGUgPz9cbiAgICAgIChjZG5Db25maWcuY2VydGlmaWNhdGVBcm5cbiAgICAgICAgPyBDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4oXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgYCR7dGhpcy5wYXNjYWxOYW1lfUNlcnRpZmljYXRlYCxcbiAgICAgICAgICAgIGNkbkNvbmZpZy5jZXJ0aWZpY2F0ZUFyblxuICAgICAgICAgIClcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbWFpbk5hbWVzOiBjZG5Db25maWcuZG9tYWluTmFtZXMsXG4gICAgICBjZXJ0aWZpY2F0ZSxcbiAgICAgIGhvc3RlZFpvbmU6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURuc1JlY29yZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuZG9tYWluKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGhvc3RlZFpvbmUgfSA9IHRoaXMucmVzb2x2ZURvbWFpbkNvbmZpZygpO1xuICAgIGlmICghaG9zdGVkWm9uZSkgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBETlMgcmVjb3JkIGluIHRoZSBDRE4gc3RhY2sgKG5vdCB0aGUgQ29tcHV0ZSBzdGFjayB3aGVyZSB0aGlzXG4gICAgLy8gUGF5bG9hZCBjb25zdHJ1Y3QgbGl2ZXMpIHRvIGF2b2lkIGEgY3ljbGljIGRlcGVuZGVuY3k6IENETiByZWZlcmVuY2VzIHRoZVxuICAgIC8vIHNlcnZlciBMYW1iZGEgRnVuY3Rpb25VcmwsIHNvIENvbXB1dGUgY2Fubm90IGFsc28gZGVwZW5kIG9uIENETi5cbiAgICBjb25zdCBjZG5TdGFjayA9IHRoaXMuYXBwLmdldERlZmF1bHRDZG5TdGFjaygpLmdldFN0YWNrKCk7XG4gICAgbmV3IEFSZWNvcmQoY2RuU3RhY2ssIGAke3RoaXMucGFzY2FsTmFtZX1BbGlhc1JlY29yZGAsIHtcbiAgICAgIHpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICByZWNvcmROYW1lOiB0aGlzLnByb3BzLmRvbWFpbixcbiAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgbmV3IENsb3VkRnJvbnRUYXJnZXQodGhpcy5fY2RuLmdldERpc3RyaWJ1dGlvbigpKVxuICAgICAgKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBvcnRQYXR0ZXJuT3V0cHV0cygpOiB2b2lkIHtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3RoaXMucGFzY2FsTmFtZX1QYXR0ZXJuVHlwZWAsIHtcbiAgICAgIGtleTogYCR7dGhpcy5wYXNjYWxOYW1lfVBhdHRlcm5UeXBlYCxcbiAgICAgIHZhbHVlOiBcInBheWxvYWRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBgUGF0dGVybiB0eXBlIGZvciAke3RoaXMucHJvcHMubmFtZX1gXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3RoaXMucGFzY2FsTmFtZX1QYXR0ZXJuTmFtZWAsIHtcbiAgICAgIGtleTogYCR7dGhpcy5wYXNjYWxOYW1lfVBhdHRlcm5OYW1lYCxcbiAgICAgIHZhbHVlOiB0aGlzLnByb3BzLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYFBhdHRlcm4gbmFtZSBmb3IgJHt0aGlzLnByb3BzLm5hbWV9YFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHt0aGlzLnBhc2NhbE5hbWV9UGF0dGVybkxhbWJkYXNgLCB7XG4gICAgICBrZXk6IGAke3RoaXMucGFzY2FsTmFtZX1QYXR0ZXJuTGFtYmRhc2AsXG4gICAgICB2YWx1ZTogW1xuICAgICAgICBgJHt0aGlzLnByb3BzLm5hbWV9LXNlcnZlcmAsXG4gICAgICAgIGAke3RoaXMucHJvcHMubmFtZX0taW1hZ2VgLFxuICAgICAgICBgJHt0aGlzLnByb3BzLm5hbWV9LXJldmFsaWRhdGlvbmBcbiAgICAgIF0uam9pbihcIixcIiksXG4gICAgICBkZXNjcmlwdGlvbjogYExhbWJkYSBjb25zdHJ1Y3QgcHJlZml4ZXMgZm9yIHBhdHRlcm4gJHt0aGlzLnByb3BzLm5hbWV9YFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHt0aGlzLnBhc2NhbE5hbWV9UGF0dGVyblJlc291cmNlc2AsIHtcbiAgICAgIGtleTogYCR7dGhpcy5wYXNjYWxOYW1lfVBhdHRlcm5SZXNvdXJjZXNgLFxuICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZGF0YWJhc2VzOiBbdGhpcy5wcm9wcy5uYW1lLCBgJHt0aGlzLnByb3BzLm5hbWV9LXRhZy1jYWNoZWBdLFxuICAgICAgICBzdG9yYWdlOiBbXG4gICAgICAgICAgYCR7dGhpcy5wcm9wcy5uYW1lfS1hc3NldHNgLFxuICAgICAgICAgIGAke3RoaXMucHJvcHMubmFtZX0tY2FjaGVgLFxuICAgICAgICAgIGAke3RoaXMucHJvcHMubmFtZX0tbWVkaWFgXG4gICAgICAgIF0sXG4gICAgICAgIGNkbjogdGhpcy5wcm9wcy5uYW1lXG4gICAgICB9KSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgUmVsYXRlZCByZXNvdXJjZSBuYW1lcyBmb3IgcGF0dGVybiAke3RoaXMucHJvcHMubmFtZX1gXG4gICAgfSk7XG4gIH1cblxuICBnZXREYXRhYmFzZSgpOiBSZWxhdGlvbmFsRGF0YWJhc2Uge1xuICAgIHJldHVybiB0aGlzLl9kYXRhYmFzZTtcbiAgfVxuXG4gIGdldFNlcnZlcigpOiBMYW1iZGFDb21wdXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc2VydmVyO1xuICB9XG5cbiAgZ2V0SW1hZ2VPcHRpbWlzYXRpb24oKTogTGFtYmRhQ29tcHV0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ltYWdlT3B0aW1pc2F0aW9uO1xuICB9XG5cbiAgZ2V0UmV2YWxpZGF0aW9uKCk6IExhbWJkYUNvbXB1dGUge1xuICAgIHJldHVybiB0aGlzLl9yZXZhbGlkYXRpb247XG4gIH1cblxuICBnZXRBc3NldHNCdWNrZXQoKTogU3RvcmFnZSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fzc2V0c0J1Y2tldDtcbiAgfVxuXG4gIGdldENhY2hlQnVja2V0KCk6IFN0b3JhZ2Uge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZUJ1Y2tldDtcbiAgfVxuXG4gIGdldE1lZGlhQnVja2V0KCk6IFN0b3JhZ2Uge1xuICAgIHJldHVybiB0aGlzLl9tZWRpYUJ1Y2tldDtcbiAgfVxuXG4gIGdldFRhZ0NhY2hlKCk6IER5bmFtb0RCRGF0YWJhc2Uge1xuICAgIHJldHVybiB0aGlzLl90YWdDYWNoZTtcbiAgfVxuXG4gIGdldFJldmFsaWRhdGlvblF1ZXVlKCk6IFF1ZXVlTWVzc2FnaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcmV2YWxpZGF0aW9uUXVldWU7XG4gIH1cblxuICBnZXRDZG4oKTogQ2RuIHtcbiAgICByZXR1cm4gdGhpcy5fY2RuO1xuICB9XG59XG4iXX0=
@@ -1,11 +1,14 @@
1
1
  import { type Construct } from "constructs";
2
- import { Account, type AccountProps } from "./account";
3
- import { type AccountsConfig } from "./organisation";
4
- import type { OrganisationType } from "./interfaces/organisation";
2
+ import { Account, type AccountProps } from "./account.js";
3
+ import { type AccountsConfig } from "./organisation.js";
4
+ import { SecurityServicesAdmin } from "../../config/aws/securityServicesAdmin.js";
5
+ import type { SecurityServicesAdminProps } from "../../config/aws/securityServicesAdmin.js";
6
+ import type { OrganisationType } from "./interfaces/organisation.js";
5
7
  export interface PlatformProps extends AccountProps {
6
8
  accounts?: AccountsConfig;
7
9
  }
8
10
  export declare class Platform extends Account {
9
11
  readonly organisationType: OrganisationType;
10
12
  constructor(scope: Construct, id: string, props: PlatformProps);
13
+ enableSecurityServicesAdmin(props: SecurityServicesAdminProps): SecurityServicesAdmin;
11
14
  }
@@ -1,29 +1,29 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Platform = void 0;
4
- const ipam_1 = require("../../config/aws/ipam");
5
- const ipamPool_1 = require("../../resources/aws/networking/ipamPool");
6
- const account_1 = require("./account");
7
- const getConfig_1 = require("../../utils/getConfig");
8
- class Platform extends account_1.Account {
1
+ import { Ipam } from "../../config/aws/ipam.js";
2
+ import { IpamPool } from "../../resources/aws/networking/ipamPool.js";
3
+ import { Account } from "./account.js";
4
+ import { getConfig } from "../../utils/getConfig.js";
5
+ import { extractAccountNames } from "../../utils/accountsUtils.js";
6
+ import { SecurityServicesAdmin } from "../../config/aws/securityServicesAdmin.js";
7
+ export class Platform extends Account {
8
+ organisationType = "platform";
9
9
  constructor(scope, id, props) {
10
10
  super(scope, id, props);
11
- this.organisationType = "platform";
12
- const config = (0, getConfig_1.getConfig)();
11
+ const config = getConfig();
13
12
  const allRegions = config.allRegions.length > 0 ? config.allRegions : [this.resolvedRegion];
14
- const ipam = new ipam_1.Ipam(this, "Ipam", {
13
+ const ipam = new Ipam(this, "Ipam", {
15
14
  regions: allRegions
16
15
  });
17
16
  // Derive account list from props or config
18
17
  const orgAccounts = props.accounts
19
- ? Object.values(props.accounts).flatMap((account) => Array.isArray(account) ? account : [account])
18
+ ? extractAccountNames(props.accounts)
20
19
  : Object.keys(config.accountIds ?? {});
21
- new ipamPool_1.IpamPool(this, "IpamPool", {
20
+ new IpamPool(this, "IpamPool", {
22
21
  orgAccounts,
23
22
  regions: allRegions,
24
23
  ipamScope: ipam.privateDefaultScopeId
25
24
  });
26
25
  }
26
+ enableSecurityServicesAdmin(props) {
27
+ return new SecurityServicesAdmin(this, "SecurityServicesAdmin", props);
28
+ }
27
29
  }
28
- exports.Platform = Platform;
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL3BsYXRmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUE2QztBQUM3QyxzRUFBbUU7QUFFbkUsdUNBQXVEO0FBRXZELHFEQUFrRDtBQU9sRCxNQUFhLFFBQVMsU0FBUSxpQkFBTztJQUduQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW9CO1FBQzVELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBSEQscUJBQWdCLEdBQXFCLFVBQVUsQ0FBQztRQUt2RSxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFTLEdBQUUsQ0FBQztRQUMzQixNQUFNLFVBQVUsR0FDZCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTNFLE1BQU0sSUFBSSxHQUFHLElBQUksV0FBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDbEMsT0FBTyxFQUFFLFVBQVU7U0FDcEIsQ0FBQyxDQUFDO1FBRUgsMkNBQTJDO1FBQzNDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRO1lBQ2hDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNoRCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQzdDO1lBQ0gsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV6QyxJQUFJLG1CQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUM3QixXQUFXO1lBQ1gsT0FBTyxFQUFFLFVBQVU7WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxxQkFBcUI7U0FDdEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBM0JELDRCQTJCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElwYW0gfSBmcm9tIFwiLi4vLi4vY29uZmlnL2F3cy9pcGFtXCI7XG5pbXBvcnQgeyBJcGFtUG9vbCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvaXBhbVBvb2xcIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFjY291bnQsIHR5cGUgQWNjb3VudFByb3BzIH0gZnJvbSBcIi4vYWNjb3VudFwiO1xuaW1wb3J0IHsgdHlwZSBBY2NvdW50c0NvbmZpZyB9IGZyb20gXCIuL29yZ2FuaXNhdGlvblwiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2dldENvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBPcmdhbmlzYXRpb25UeXBlIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9vcmdhbmlzYXRpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybVByb3BzIGV4dGVuZHMgQWNjb3VudFByb3BzIHtcbiAgYWNjb3VudHM/OiBBY2NvdW50c0NvbmZpZztcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtIGV4dGVuZHMgQWNjb3VudCB7XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSBvcmdhbmlzYXRpb25UeXBlOiBPcmdhbmlzYXRpb25UeXBlID0gXCJwbGF0Zm9ybVwiO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQbGF0Zm9ybVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgICBjb25zdCBhbGxSZWdpb25zID1cbiAgICAgIGNvbmZpZy5hbGxSZWdpb25zLmxlbmd0aCA+IDAgPyBjb25maWcuYWxsUmVnaW9ucyA6IFt0aGlzLnJlc29sdmVkUmVnaW9uXTtcblxuICAgIGNvbnN0IGlwYW0gPSBuZXcgSXBhbSh0aGlzLCBcIklwYW1cIiwge1xuICAgICAgcmVnaW9uczogYWxsUmVnaW9uc1xuICAgIH0pO1xuXG4gICAgLy8gRGVyaXZlIGFjY291bnQgbGlzdCBmcm9tIHByb3BzIG9yIGNvbmZpZ1xuICAgIGNvbnN0IG9yZ0FjY291bnRzID0gcHJvcHMuYWNjb3VudHNcbiAgICAgID8gT2JqZWN0LnZhbHVlcyhwcm9wcy5hY2NvdW50cykuZmxhdE1hcCgoYWNjb3VudCkgPT5cbiAgICAgICAgICBBcnJheS5pc0FycmF5KGFjY291bnQpID8gYWNjb3VudCA6IFthY2NvdW50XVxuICAgICAgICApXG4gICAgICA6IE9iamVjdC5rZXlzKGNvbmZpZy5hY2NvdW50SWRzID8/IHt9KTtcblxuICAgIG5ldyBJcGFtUG9vbCh0aGlzLCBcIklwYW1Qb29sXCIsIHtcbiAgICAgIG9yZ0FjY291bnRzLFxuICAgICAgcmVnaW9uczogYWxsUmVnaW9ucyxcbiAgICAgIGlwYW1TY29wZTogaXBhbS5wcml2YXRlRGVmYXVsdFNjb3BlSWRcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -2,13 +2,13 @@ import { Construct } from "constructs";
2
2
  import { type IBucket, type EventType, type IBucketNotificationDestination, type NotificationKeyFilter } from "aws-cdk-lib/aws-s3";
3
3
  import { BucketDeployment } from "aws-cdk-lib/aws-s3-deployment";
4
4
  import { type IGrantable, type Grant } from "aws-cdk-lib/aws-iam";
5
- import type App from "../../app";
6
- import { type WebsiteHostingConfig } from "../../resources/aws/storage";
7
- import { type BackupTier } from "../../utils/backupTierMapping";
5
+ import type App from "../../app.js";
6
+ import { type WebsiteHostingConfig } from "../../resources/aws/storage/index.js";
7
+ import { type BackupTier } from "../../utils/backupTierMapping.js";
8
8
  import { type IStorage } from "./interfaces/storage.js";
9
9
  import { type IStorageConnector } from "./interfaces/connector.js";
10
10
  export { type IStorage, isStorage } from "./interfaces/storage.js";
11
- export { type WebsiteHostingConfig } from "../../resources/aws/storage";
11
+ export { type WebsiteHostingConfig } from "../../resources/aws/storage/index.js";
12
12
  export interface CorsRule {
13
13
  readonly allowedOrigins: string[];
14
14
  readonly allowedMethods: string[];
@@ -39,6 +39,8 @@ export interface S3Props {
39
39
  readonly backupVaultTier?: BackupTier;
40
40
  readonly cors?: CorsRule[];
41
41
  readonly deployment?: S3DeploymentConfig;
42
+ /** When true, sets RemovalPolicy.RETAIN and disables autoDeleteObjects. Used for imported buckets. */
43
+ readonly retain?: boolean;
42
44
  }
43
45
  export interface StorageBuildProps extends S3Props {
44
46
  readonly stackPlacement?: "storage" | "cdn" | "compute";