@decaf-ts/integrations 0.3.10 → 0.3.12

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 (937) hide show
  1. package/dist/integrations.cjs +1649 -2
  2. package/dist/integrations.js +1885 -2
  3. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +2 -2
  4. package/lib/cjs/blob/azure/index.cjs +2 -2
  5. package/lib/cjs/blob/core/BlobErrors.cjs +2 -2
  6. package/lib/cjs/blob/core/BlobKey.cjs +2 -2
  7. package/lib/cjs/blob/core/BlobStoreFactory.cjs +2 -2
  8. package/lib/cjs/blob/core/BlobStoreService.cjs +2 -2
  9. package/lib/cjs/blob/core/BlobTypes.cjs +2 -2
  10. package/lib/cjs/blob/core/BlobValue.cjs +2 -2
  11. package/lib/cjs/blob/core/index.cjs +2 -2
  12. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +2 -2
  13. package/lib/cjs/blob/gcp/index.cjs +2 -2
  14. package/lib/cjs/blob/index.cjs +2 -2
  15. package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs +2 -2
  16. package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs +2 -2
  17. package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs +2 -2
  18. package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs +2 -2
  19. package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs +2 -2
  20. package/lib/cjs/blob/ipfs/index.cjs +2 -2
  21. package/lib/cjs/blob/local/LocalBlobStoreService.cjs +2 -2
  22. package/lib/cjs/blob/local/index.cjs +2 -2
  23. package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs +2 -2
  24. package/lib/cjs/blob/memory/index.cjs +2 -2
  25. package/lib/cjs/blob/s3/MinioBlobStoreService.cjs +2 -2
  26. package/lib/cjs/blob/s3/R2BlobStoreService.cjs +2 -2
  27. package/lib/cjs/blob/s3/S3BlobStoreService.cjs +2 -2
  28. package/lib/cjs/blob/s3/index.cjs +2 -2
  29. package/lib/cjs/docker/DockerComposeService.cjs +2 -2
  30. package/lib/cjs/docker/index.cjs +2 -2
  31. package/lib/cjs/graph/engine/constants.cjs +2 -2
  32. package/lib/cjs/graph/engine/decorators.cjs +2 -2
  33. package/lib/cjs/graph/engine/errors/GraphCycleError.cjs +2 -2
  34. package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs +2 -2
  35. package/lib/cjs/graph/engine/errors/GraphInputError.cjs +2 -2
  36. package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs +2 -2
  37. package/lib/cjs/graph/engine/errors/GraphPinningError.cjs +2 -2
  38. package/lib/cjs/graph/engine/errors/GraphPortError.cjs +2 -2
  39. package/lib/cjs/graph/engine/errors/GraphStoreError.cjs +2 -2
  40. package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs +2 -2
  41. package/lib/cjs/graph/engine/errors/index.cjs +2 -2
  42. package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs +2 -2
  43. package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs +2 -2
  44. package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs +2 -2
  45. package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs +2 -2
  46. package/lib/cjs/graph/engine/events/index.cjs +2 -2
  47. package/lib/cjs/graph/engine/execution/CodeGraphNodeExecutor.cjs +99 -0
  48. package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs +2 -2
  49. package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs +2 -2
  50. package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs +22 -3
  51. package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs +2 -2
  52. package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs +2 -2
  53. package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs +2 -2
  54. package/lib/cjs/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.cjs +481 -0
  55. package/lib/cjs/graph/engine/execution/LogGraphNodeExecutor.cjs +19 -0
  56. package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +23 -6
  57. package/lib/cjs/graph/engine/execution/index.cjs +5 -2
  58. package/lib/cjs/graph/engine/index.cjs +5 -2
  59. package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs +2 -2
  60. package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs +3 -2
  61. package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs +2 -2
  62. package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs +2 -2
  63. package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs +2 -2
  64. package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs +2 -2
  65. package/lib/cjs/graph/engine/loops/index.cjs +2 -2
  66. package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs +2 -2
  67. package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs +2 -2
  68. package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs +2 -2
  69. package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs +2 -2
  70. package/lib/cjs/graph/engine/pinning/index.cjs +2 -2
  71. package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs +2 -2
  72. package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs +2 -2
  73. package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs +2 -2
  74. package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs +2 -2
  75. package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs +2 -2
  76. package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs +2 -2
  77. package/lib/cjs/graph/engine/planning/GraphTopology.cjs +2 -2
  78. package/lib/cjs/graph/engine/planning/index.cjs +2 -2
  79. package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs +2 -2
  80. package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs +2 -2
  81. package/lib/cjs/graph/engine/registry/index.cjs +2 -2
  82. package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs +2 -2
  83. package/lib/cjs/graph/engine/snapshots/index.cjs +2 -2
  84. package/lib/cjs/graph/engine/store/GraphCachedValue.cjs +2 -2
  85. package/lib/cjs/graph/engine/store/GraphValueKey.cjs +2 -2
  86. package/lib/cjs/graph/engine/store/GraphValueStore.cjs +2 -2
  87. package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs +2 -2
  88. package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs +2 -2
  89. package/lib/cjs/graph/engine/store/index.cjs +2 -2
  90. package/lib/cjs/graph/engine/types.cjs +2 -2
  91. package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs +2 -2
  92. package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs +2 -2
  93. package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs +2 -2
  94. package/lib/cjs/graph/engine/validation/index.cjs +2 -2
  95. package/lib/cjs/graph/index.cjs +2 -2
  96. package/lib/cjs/graph/shared/constants.cjs +2 -2
  97. package/lib/cjs/graph/shared/index.cjs +2 -2
  98. package/lib/cjs/graph/shared/nodes/agent.cjs +2 -2
  99. package/lib/cjs/graph/shared/nodes/base.cjs +2 -2
  100. package/lib/cjs/graph/shared/nodes/category-styles.cjs +2 -2
  101. package/lib/cjs/graph/shared/nodes/flow-control.cjs +100 -17
  102. package/lib/cjs/graph/shared/nodes/index.cjs +2 -2
  103. package/lib/cjs/graph/shared/nodes/triggers.cjs +2 -2
  104. package/lib/cjs/graph/shared/types.cjs +2 -2
  105. package/lib/cjs/index.cjs +5 -5
  106. package/lib/cjs/keycloak/index.cjs +2 -2
  107. package/lib/cjs/keycloak/services/KeycloakAuthService.cjs +2 -2
  108. package/lib/cjs/keycloak/services/KeycloakClientService.cjs +2 -2
  109. package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs +2 -2
  110. package/lib/cjs/keycloak/services/KeycloakRealmService.cjs +2 -2
  111. package/lib/cjs/keycloak/services/KeycloakRoleService.cjs +2 -2
  112. package/lib/cjs/keycloak/services/KeycloakService.cjs +2 -2
  113. package/lib/cjs/keycloak/services/KeycloakUserService.cjs +2 -2
  114. package/lib/cjs/keycloak/services/index.cjs +2 -2
  115. package/lib/cjs/keycloak/services/runtime.cjs +2 -2
  116. package/lib/cjs/keycloak/types.cjs +2 -2
  117. package/lib/cjs/kibana/helpers.cjs +2 -2
  118. package/lib/cjs/kibana/index.cjs +2 -2
  119. package/lib/cjs/kibana/services/KibanaAuthService.cjs +2 -2
  120. package/lib/cjs/kibana/services/KibanaDashboardService.cjs +2 -2
  121. package/lib/cjs/kibana/services/KibanaDataViewService.cjs +2 -2
  122. package/lib/cjs/kibana/services/KibanaRoleService.cjs +2 -2
  123. package/lib/cjs/kibana/services/KibanaService.cjs +2 -2
  124. package/lib/cjs/kibana/services/KibanaSpaceService.cjs +2 -2
  125. package/lib/cjs/kibana/services/KibanaUserService.cjs +2 -2
  126. package/lib/cjs/kibana/services/index.cjs +2 -2
  127. package/lib/cjs/kibana/services/runtime.cjs +2 -2
  128. package/lib/cjs/kibana/types.cjs +2 -2
  129. package/lib/cjs/namespaces/index.cjs +2 -2
  130. package/lib/cjs/namespaces/models/authorization-model.cjs +2 -2
  131. package/lib/cjs/namespaces/models/effective-permission.model.cjs +6 -6
  132. package/lib/cjs/namespaces/models/group-membership.model.cjs +8 -8
  133. package/lib/cjs/namespaces/models/group.model.cjs +8 -8
  134. package/lib/cjs/namespaces/models/index.cjs +22 -22
  135. package/lib/cjs/namespaces/models/inheritance-block.model.cjs +7 -7
  136. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +7 -7
  137. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +8 -8
  138. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +4 -4
  139. package/lib/cjs/namespaces/models/org-unit.model.cjs +13 -13
  140. package/lib/cjs/namespaces/models/permission.model.cjs +4 -4
  141. package/lib/cjs/namespaces/models/principal.model.cjs +8 -8
  142. package/lib/cjs/namespaces/models/protected-resource.model.cjs +10 -10
  143. package/lib/cjs/namespaces/models/resource-grant.model.cjs +9 -9
  144. package/lib/cjs/namespaces/models/role-assignment.model.cjs +8 -8
  145. package/lib/cjs/namespaces/models/role-permission.model.cjs +6 -6
  146. package/lib/cjs/namespaces/models/role.model.cjs +8 -8
  147. package/lib/cjs/namespaces/models/storage-binding.model.cjs +4 -4
  148. package/lib/cjs/namespaces/models/tenant-membership.model.cjs +6 -6
  149. package/lib/cjs/namespaces/models/tenant-profile.model.cjs +4 -4
  150. package/lib/cjs/namespaces/models/tenant.model.cjs +10 -10
  151. package/lib/cjs/namespaces/models/user.model.cjs +6 -6
  152. package/lib/cjs/namespaces/org-based-authorization-system.cjs +2 -2
  153. package/lib/cjs/namespaces/org-based-authorization-system.models.cjs +2 -2
  154. package/lib/cjs/namespaces/org-based-authorization-system.services.cjs +23 -23
  155. package/lib/cjs/namespaces/services/authz.service.cjs +2 -2
  156. package/lib/cjs/namespaces/services/bootstrap.service.cjs +26 -26
  157. package/lib/cjs/namespaces/services/effective-permission.service.cjs +19 -19
  158. package/lib/cjs/namespaces/services/group-membership.service.cjs +6 -6
  159. package/lib/cjs/namespaces/services/group.service.cjs +4 -4
  160. package/lib/cjs/namespaces/services/index.cjs +26 -26
  161. package/lib/cjs/namespaces/services/inheritance-block.service.cjs +4 -4
  162. package/lib/cjs/namespaces/services/org-unit-closure.service.cjs +4 -4
  163. package/lib/cjs/namespaces/services/org-unit-membership.service.cjs +4 -4
  164. package/lib/cjs/namespaces/services/org-unit-profile.service.cjs +4 -4
  165. package/lib/cjs/namespaces/services/org-unit.service.cjs +13 -13
  166. package/lib/cjs/namespaces/services/permission.service.cjs +4 -4
  167. package/lib/cjs/namespaces/services/principal.service.cjs +4 -4
  168. package/lib/cjs/namespaces/services/protected-resource.service.cjs +4 -4
  169. package/lib/cjs/namespaces/services/resource-grant.service.cjs +4 -4
  170. package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs +7 -7
  171. package/lib/cjs/namespaces/services/role-assignment.service.cjs +4 -4
  172. package/lib/cjs/namespaces/services/role-permission.service.cjs +8 -8
  173. package/lib/cjs/namespaces/services/role.service.cjs +4 -4
  174. package/lib/cjs/namespaces/services/storage-binding.service.cjs +4 -4
  175. package/lib/cjs/namespaces/services/system-management.service.cjs +14 -14
  176. package/lib/cjs/namespaces/services/tenant-membership.service.cjs +4 -4
  177. package/lib/cjs/namespaces/services/tenant-profile.service.cjs +4 -4
  178. package/lib/cjs/namespaces/services/tenant.service.cjs +4 -4
  179. package/lib/cjs/namespaces/services/user.service.cjs +4 -4
  180. package/lib/cjs/namespaces/types.cjs +2 -2
  181. package/lib/cjs/namespaces/utils.cjs +2 -2
  182. package/lib/cjs/nest/authService.cjs +2 -2
  183. package/lib/cjs/nest/graph/GraphExecutionController.cjs +41 -52
  184. package/lib/cjs/nest/graph/GraphExecutionModule.cjs +47 -42
  185. package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs +2 -20
  186. package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs +21 -48
  187. package/lib/cjs/nest/graph/GraphResultService.cjs +54 -0
  188. package/lib/cjs/nest/graph/GraphWorkflowModel.cjs +44 -0
  189. package/lib/cjs/nest/graph/GraphWorkflowService.cjs +62 -0
  190. package/lib/cjs/nest/graph/index.cjs +5 -8
  191. package/lib/cjs/nest/graph/main.cjs +3 -3
  192. package/lib/cjs/nest/index.cjs +2 -2
  193. package/lib/cjs/nest/keycloakAuthHandler.cjs +2 -2
  194. package/lib/cjs/nest/keycloakModule.cjs +2 -2
  195. package/lib/cjs/nest/logging.cjs +2 -2
  196. package/lib/cjs/nest/types.cjs +2 -2
  197. package/lib/cjs/nest/utils.cjs +2 -2
  198. package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -2
  199. package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs +2 -2
  200. package/lib/cjs/secrets/aws/index.cjs +2 -2
  201. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -2
  202. package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs +2 -2
  203. package/lib/cjs/secrets/azure/index.cjs +2 -2
  204. package/lib/cjs/secrets/core/SecretErrors.cjs +2 -2
  205. package/lib/cjs/secrets/core/SecretName.cjs +2 -2
  206. package/lib/cjs/secrets/core/SecretReference.cjs +2 -2
  207. package/lib/cjs/secrets/core/SecretSerialization.cjs +2 -2
  208. package/lib/cjs/secrets/core/SecretService.cjs +2 -2
  209. package/lib/cjs/secrets/core/SecretTypes.cjs +2 -2
  210. package/lib/cjs/secrets/core/index.cjs +2 -2
  211. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -2
  212. package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs +2 -2
  213. package/lib/cjs/secrets/gcp/index.cjs +2 -2
  214. package/lib/cjs/secrets/index.cjs +2 -2
  215. package/lib/cjs/secrets/model/ModelSecretCrypto.cjs +2 -2
  216. package/lib/cjs/secrets/model/ModelSecretService.cjs +2 -2
  217. package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs +2 -2
  218. package/lib/cjs/secrets/model/Secret.cjs +2 -2
  219. package/lib/cjs/secrets/model/index.cjs +2 -2
  220. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -2
  221. package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs +2 -2
  222. package/lib/cjs/secrets/onepassword/index.cjs +2 -2
  223. package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -2
  224. package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs +2 -2
  225. package/lib/cjs/secrets/vault/index.cjs +2 -2
  226. package/lib/cjs/shared/runtime.cjs +2 -2
  227. package/lib/cjs/utils.cjs +2 -2
  228. package/lib/esm/blob/azure/AzureBlobStoreService.js +1 -1
  229. package/lib/esm/blob/azure/index.js +1 -1
  230. package/lib/esm/blob/core/BlobErrors.js +1 -1
  231. package/lib/esm/blob/core/BlobKey.js +1 -1
  232. package/lib/esm/blob/core/BlobStoreFactory.js +1 -1
  233. package/lib/esm/blob/core/BlobStoreService.js +1 -1
  234. package/lib/esm/blob/core/BlobTypes.js +1 -1
  235. package/lib/esm/blob/core/BlobValue.js +1 -1
  236. package/lib/esm/blob/core/index.js +1 -1
  237. package/lib/esm/blob/gcp/GcsBlobStoreService.js +1 -1
  238. package/lib/esm/blob/gcp/index.js +1 -1
  239. package/lib/esm/blob/index.js +1 -1
  240. package/lib/esm/blob/ipfs/IpfsBlobStoreService.js +1 -1
  241. package/lib/esm/blob/ipfs/IpfsKeyIndex.js +1 -1
  242. package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js +1 -1
  243. package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js +1 -1
  244. package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js +1 -1
  245. package/lib/esm/blob/ipfs/index.js +1 -1
  246. package/lib/esm/blob/local/LocalBlobStoreService.js +1 -1
  247. package/lib/esm/blob/local/index.js +1 -1
  248. package/lib/esm/blob/memory/MemoryBlobStoreService.js +1 -1
  249. package/lib/esm/blob/memory/index.js +1 -1
  250. package/lib/esm/blob/s3/MinioBlobStoreService.js +1 -1
  251. package/lib/esm/blob/s3/R2BlobStoreService.js +1 -1
  252. package/lib/esm/blob/s3/S3BlobStoreService.js +1 -1
  253. package/lib/esm/blob/s3/index.js +1 -1
  254. package/lib/esm/docker/DockerComposeService.js +1 -1
  255. package/lib/esm/docker/index.js +1 -1
  256. package/lib/esm/graph/engine/constants.js +1 -1
  257. package/lib/esm/graph/engine/decorators.js +1 -1
  258. package/lib/esm/graph/engine/errors/GraphCycleError.js +1 -1
  259. package/lib/esm/graph/engine/errors/GraphExecutionError.js +1 -1
  260. package/lib/esm/graph/engine/errors/GraphInputError.js +1 -1
  261. package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +1 -1
  262. package/lib/esm/graph/engine/errors/GraphPinningError.js +1 -1
  263. package/lib/esm/graph/engine/errors/GraphPortError.js +1 -1
  264. package/lib/esm/graph/engine/errors/GraphStoreError.js +1 -1
  265. package/lib/esm/graph/engine/errors/GraphTopologyError.js +1 -1
  266. package/lib/esm/graph/engine/errors/index.js +1 -1
  267. package/lib/esm/graph/engine/events/GraphExecutionEvent.js +1 -1
  268. package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +1 -1
  269. package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +1 -1
  270. package/lib/esm/graph/engine/events/GraphExecutionObserver.js +1 -1
  271. package/lib/esm/graph/engine/events/index.js +1 -1
  272. package/lib/esm/graph/engine/execution/CodeGraphNodeExecutor.js +94 -0
  273. package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +1 -1
  274. package/lib/esm/graph/engine/execution/GraphExecutionContext.js +1 -1
  275. package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +21 -2
  276. package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +1 -1
  277. package/lib/esm/graph/engine/execution/GraphExecutionResult.js +1 -1
  278. package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +1 -1
  279. package/lib/esm/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.js +440 -0
  280. package/lib/esm/graph/engine/execution/LogGraphNodeExecutor.js +14 -0
  281. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +22 -5
  282. package/lib/esm/graph/engine/execution/index.js +4 -1
  283. package/lib/esm/graph/engine/index.js +4 -1
  284. package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +1 -1
  285. package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +2 -1
  286. package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +1 -1
  287. package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +1 -1
  288. package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +1 -1
  289. package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +1 -1
  290. package/lib/esm/graph/engine/loops/index.js +1 -1
  291. package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +1 -1
  292. package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +1 -1
  293. package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +1 -1
  294. package/lib/esm/graph/engine/pinning/GraphPinningService.js +1 -1
  295. package/lib/esm/graph/engine/pinning/index.js +1 -1
  296. package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +1 -1
  297. package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +1 -1
  298. package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +1 -1
  299. package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +1 -1
  300. package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +1 -1
  301. package/lib/esm/graph/engine/planning/GraphRelationResolver.js +1 -1
  302. package/lib/esm/graph/engine/planning/GraphTopology.js +1 -1
  303. package/lib/esm/graph/engine/planning/index.js +1 -1
  304. package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +1 -1
  305. package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +1 -1
  306. package/lib/esm/graph/engine/registry/index.js +1 -1
  307. package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +1 -1
  308. package/lib/esm/graph/engine/snapshots/index.js +1 -1
  309. package/lib/esm/graph/engine/store/GraphCachedValue.js +1 -1
  310. package/lib/esm/graph/engine/store/GraphValueKey.js +1 -1
  311. package/lib/esm/graph/engine/store/GraphValueStore.js +1 -1
  312. package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +1 -1
  313. package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +1 -1
  314. package/lib/esm/graph/engine/store/index.js +1 -1
  315. package/lib/esm/graph/engine/types.js +1 -1
  316. package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +1 -1
  317. package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +1 -1
  318. package/lib/esm/graph/engine/validation/GraphValueValidator.js +1 -1
  319. package/lib/esm/graph/engine/validation/index.js +1 -1
  320. package/lib/esm/graph/index.js +1 -1
  321. package/lib/esm/graph/shared/constants.js +1 -1
  322. package/lib/esm/graph/shared/index.js +1 -1
  323. package/lib/esm/graph/shared/nodes/agent.js +1 -1
  324. package/lib/esm/graph/shared/nodes/base.js +1 -1
  325. package/lib/esm/graph/shared/nodes/category-styles.js +1 -1
  326. package/lib/esm/graph/shared/nodes/flow-control.js +99 -16
  327. package/lib/esm/graph/shared/nodes/index.js +1 -1
  328. package/lib/esm/graph/shared/nodes/triggers.js +1 -1
  329. package/lib/esm/graph/shared/types.js +1 -1
  330. package/lib/esm/index.js +4 -4
  331. package/lib/esm/keycloak/index.js +1 -1
  332. package/lib/esm/keycloak/services/KeycloakAuthService.js +1 -1
  333. package/lib/esm/keycloak/services/KeycloakClientService.js +1 -1
  334. package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js +1 -1
  335. package/lib/esm/keycloak/services/KeycloakRealmService.js +1 -1
  336. package/lib/esm/keycloak/services/KeycloakRoleService.js +1 -1
  337. package/lib/esm/keycloak/services/KeycloakService.js +1 -1
  338. package/lib/esm/keycloak/services/KeycloakUserService.js +1 -1
  339. package/lib/esm/keycloak/services/index.js +1 -1
  340. package/lib/esm/keycloak/services/runtime.js +1 -1
  341. package/lib/esm/keycloak/types.js +1 -1
  342. package/lib/esm/kibana/helpers.js +1 -1
  343. package/lib/esm/kibana/index.js +1 -1
  344. package/lib/esm/kibana/services/KibanaAuthService.js +1 -1
  345. package/lib/esm/kibana/services/KibanaDashboardService.js +1 -1
  346. package/lib/esm/kibana/services/KibanaDataViewService.js +1 -1
  347. package/lib/esm/kibana/services/KibanaRoleService.js +1 -1
  348. package/lib/esm/kibana/services/KibanaService.js +1 -1
  349. package/lib/esm/kibana/services/KibanaSpaceService.js +1 -1
  350. package/lib/esm/kibana/services/KibanaUserService.js +1 -1
  351. package/lib/esm/kibana/services/index.js +1 -1
  352. package/lib/esm/kibana/services/runtime.js +1 -1
  353. package/lib/esm/kibana/types.js +1 -1
  354. package/lib/esm/namespaces/index.js +1 -1
  355. package/lib/esm/namespaces/models/authorization-model.js +1 -1
  356. package/lib/esm/namespaces/models/effective-permission.model.js +3 -3
  357. package/lib/esm/namespaces/models/group-membership.model.js +4 -4
  358. package/lib/esm/namespaces/models/group.model.js +4 -4
  359. package/lib/esm/namespaces/models/index.js +21 -21
  360. package/lib/esm/namespaces/models/inheritance-block.model.js +3 -3
  361. package/lib/esm/namespaces/models/org-unit-closure.model.js +3 -3
  362. package/lib/esm/namespaces/models/org-unit-membership.model.js +4 -4
  363. package/lib/esm/namespaces/models/org-unit-profile.model.js +2 -2
  364. package/lib/esm/namespaces/models/org-unit.model.js +6 -6
  365. package/lib/esm/namespaces/models/permission.model.js +2 -2
  366. package/lib/esm/namespaces/models/principal.model.js +4 -4
  367. package/lib/esm/namespaces/models/protected-resource.model.js +5 -5
  368. package/lib/esm/namespaces/models/resource-grant.model.js +4 -4
  369. package/lib/esm/namespaces/models/role-assignment.model.js +4 -4
  370. package/lib/esm/namespaces/models/role-permission.model.js +3 -3
  371. package/lib/esm/namespaces/models/role.model.js +4 -4
  372. package/lib/esm/namespaces/models/storage-binding.model.js +2 -2
  373. package/lib/esm/namespaces/models/tenant-membership.model.js +3 -3
  374. package/lib/esm/namespaces/models/tenant-profile.model.js +2 -2
  375. package/lib/esm/namespaces/models/tenant.model.js +5 -5
  376. package/lib/esm/namespaces/models/user.model.js +3 -3
  377. package/lib/esm/namespaces/org-based-authorization-system.js +1 -1
  378. package/lib/esm/namespaces/org-based-authorization-system.models.js +1 -1
  379. package/lib/esm/namespaces/org-based-authorization-system.services.js +2 -2
  380. package/lib/esm/namespaces/services/authz.service.js +1 -1
  381. package/lib/esm/namespaces/services/bootstrap.service.js +13 -13
  382. package/lib/esm/namespaces/services/effective-permission.service.js +9 -9
  383. package/lib/esm/namespaces/services/group-membership.service.js +3 -3
  384. package/lib/esm/namespaces/services/group.service.js +2 -2
  385. package/lib/esm/namespaces/services/index.js +25 -25
  386. package/lib/esm/namespaces/services/inheritance-block.service.js +2 -2
  387. package/lib/esm/namespaces/services/org-unit-closure.service.js +2 -2
  388. package/lib/esm/namespaces/services/org-unit-membership.service.js +2 -2
  389. package/lib/esm/namespaces/services/org-unit-profile.service.js +2 -2
  390. package/lib/esm/namespaces/services/org-unit.service.js +4 -4
  391. package/lib/esm/namespaces/services/permission.service.js +2 -2
  392. package/lib/esm/namespaces/services/principal.service.js +2 -2
  393. package/lib/esm/namespaces/services/protected-resource.service.js +2 -2
  394. package/lib/esm/namespaces/services/resource-grant.service.js +2 -2
  395. package/lib/esm/namespaces/services/resource-lifecycle.service.js +3 -3
  396. package/lib/esm/namespaces/services/role-assignment.service.js +2 -2
  397. package/lib/esm/namespaces/services/role-permission.service.js +4 -4
  398. package/lib/esm/namespaces/services/role.service.js +2 -2
  399. package/lib/esm/namespaces/services/storage-binding.service.js +2 -2
  400. package/lib/esm/namespaces/services/system-management.service.js +7 -7
  401. package/lib/esm/namespaces/services/tenant-membership.service.js +2 -2
  402. package/lib/esm/namespaces/services/tenant-profile.service.js +2 -2
  403. package/lib/esm/namespaces/services/tenant.service.js +2 -2
  404. package/lib/esm/namespaces/services/user.service.js +2 -2
  405. package/lib/esm/namespaces/types.js +1 -1
  406. package/lib/esm/namespaces/utils.js +1 -1
  407. package/lib/esm/nest/authService.js +1 -1
  408. package/lib/esm/nest/graph/GraphExecutionController.js +40 -51
  409. package/lib/esm/nest/graph/GraphExecutionModule.js +12 -40
  410. package/lib/esm/nest/graph/GraphExecutionResultModel.js +1 -19
  411. package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js +21 -48
  412. package/lib/esm/nest/graph/GraphResultService.js +45 -0
  413. package/lib/esm/nest/graph/GraphWorkflowModel.js +35 -0
  414. package/lib/esm/nest/graph/GraphWorkflowService.js +53 -0
  415. package/lib/esm/nest/graph/index.js +4 -7
  416. package/lib/esm/nest/graph/main.js +2 -2
  417. package/lib/esm/nest/index.js +1 -1
  418. package/lib/esm/nest/keycloakAuthHandler.js +1 -1
  419. package/lib/esm/nest/keycloakModule.js +1 -1
  420. package/lib/esm/nest/logging.js +1 -1
  421. package/lib/esm/nest/types.js +1 -1
  422. package/lib/esm/nest/utils.js +1 -1
  423. package/lib/esm/secrets/aws/AwsSecretService.js +1 -1
  424. package/lib/esm/secrets/aws/AwsSecretServiceConfig.js +1 -1
  425. package/lib/esm/secrets/aws/index.js +1 -1
  426. package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +1 -1
  427. package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js +1 -1
  428. package/lib/esm/secrets/azure/index.js +1 -1
  429. package/lib/esm/secrets/core/SecretErrors.js +1 -1
  430. package/lib/esm/secrets/core/SecretName.js +1 -1
  431. package/lib/esm/secrets/core/SecretReference.js +1 -1
  432. package/lib/esm/secrets/core/SecretSerialization.js +1 -1
  433. package/lib/esm/secrets/core/SecretService.js +1 -1
  434. package/lib/esm/secrets/core/SecretTypes.js +1 -1
  435. package/lib/esm/secrets/core/index.js +1 -1
  436. package/lib/esm/secrets/gcp/GcpSecretManagerService.js +1 -1
  437. package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js +1 -1
  438. package/lib/esm/secrets/gcp/index.js +1 -1
  439. package/lib/esm/secrets/index.js +1 -1
  440. package/lib/esm/secrets/model/ModelSecretCrypto.js +1 -1
  441. package/lib/esm/secrets/model/ModelSecretService.js +1 -1
  442. package/lib/esm/secrets/model/ModelSecretServiceConfig.js +1 -1
  443. package/lib/esm/secrets/model/Secret.js +1 -1
  444. package/lib/esm/secrets/model/index.js +1 -1
  445. package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +1 -1
  446. package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js +1 -1
  447. package/lib/esm/secrets/onepassword/index.js +1 -1
  448. package/lib/esm/secrets/vault/VaultSecretService.js +1 -1
  449. package/lib/esm/secrets/vault/VaultSecretServiceConfig.js +1 -1
  450. package/lib/esm/secrets/vault/index.js +1 -1
  451. package/lib/esm/shared/runtime.js +1 -1
  452. package/lib/esm/utils.js +1 -1
  453. package/lib/types/graph/engine/execution/CodeGraphNodeExecutor.d.cts +65 -0
  454. package/lib/types/graph/engine/execution/CodeGraphNodeExecutor.d.mts +65 -0
  455. package/lib/types/graph/engine/execution/CodeSandboxEvaluator.d.cts +23 -0
  456. package/lib/types/graph/engine/execution/CodeSandboxEvaluator.d.mts +23 -0
  457. package/lib/types/graph/engine/execution/GraphExecutionEngine.d.cts +6 -0
  458. package/lib/types/graph/engine/execution/GraphExecutionEngine.d.mts +6 -0
  459. package/lib/types/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.d.cts +63 -0
  460. package/lib/types/graph/engine/execution/IsolatedVmCodeSandboxEvaluator.d.mts +63 -0
  461. package/lib/types/graph/engine/execution/LogGraphNodeExecutor.d.cts +19 -0
  462. package/lib/types/graph/engine/execution/LogGraphNodeExecutor.d.mts +19 -0
  463. package/lib/types/graph/engine/execution/SwitchGraphNodeExecutor.d.cts +3 -2
  464. package/lib/types/graph/engine/execution/SwitchGraphNodeExecutor.d.mts +3 -2
  465. package/lib/types/graph/engine/execution/index.d.cts +3 -0
  466. package/lib/types/graph/engine/execution/index.d.mts +3 -0
  467. package/lib/types/graph/engine/index.d.cts +3 -0
  468. package/lib/types/graph/engine/index.d.mts +3 -0
  469. package/lib/types/graph/shared/nodes/flow-control.d.cts +36 -9
  470. package/lib/types/graph/shared/nodes/flow-control.d.mts +36 -9
  471. package/lib/types/graph/shared/types.d.cts +6 -0
  472. package/lib/types/graph/shared/types.d.mts +6 -0
  473. package/lib/types/index.d.cts +2 -2
  474. package/lib/types/index.d.mts +2 -2
  475. package/lib/types/nest/graph/GraphExecutionController.d.cts +11 -42
  476. package/lib/types/nest/graph/GraphExecutionController.d.mts +11 -42
  477. package/lib/types/nest/graph/GraphExecutionModule.d.cts +9 -29
  478. package/lib/types/nest/graph/GraphExecutionModule.d.mts +9 -29
  479. package/lib/types/nest/graph/GraphExecutionResultModel.d.cts +0 -34
  480. package/lib/types/nest/graph/GraphExecutionResultModel.d.mts +0 -34
  481. package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.cts +16 -9
  482. package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.mts +16 -9
  483. package/lib/types/nest/graph/GraphResultService.d.cts +8 -0
  484. package/lib/types/nest/graph/GraphResultService.d.mts +8 -0
  485. package/lib/types/nest/graph/GraphWorkflowModel.d.cts +7 -0
  486. package/lib/types/nest/graph/GraphWorkflowModel.d.mts +7 -0
  487. package/lib/types/nest/graph/GraphWorkflowService.d.cts +7 -0
  488. package/lib/types/nest/graph/GraphWorkflowService.d.mts +7 -0
  489. package/lib/types/nest/graph/index.d.cts +3 -6
  490. package/lib/types/nest/graph/index.d.mts +3 -6
  491. package/package.json +5 -1
  492. package/dist/integrations.cjs.map +0 -1
  493. package/dist/integrations.js.map +0 -1
  494. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +0 -1
  495. package/lib/cjs/blob/azure/index.cjs.map +0 -1
  496. package/lib/cjs/blob/core/BlobErrors.cjs.map +0 -1
  497. package/lib/cjs/blob/core/BlobKey.cjs.map +0 -1
  498. package/lib/cjs/blob/core/BlobStoreFactory.cjs.map +0 -1
  499. package/lib/cjs/blob/core/BlobStoreService.cjs.map +0 -1
  500. package/lib/cjs/blob/core/BlobTypes.cjs.map +0 -1
  501. package/lib/cjs/blob/core/BlobValue.cjs.map +0 -1
  502. package/lib/cjs/blob/core/index.cjs.map +0 -1
  503. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +0 -1
  504. package/lib/cjs/blob/gcp/index.cjs.map +0 -1
  505. package/lib/cjs/blob/index.cjs.map +0 -1
  506. package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs.map +0 -1
  507. package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs.map +0 -1
  508. package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs.map +0 -1
  509. package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs.map +0 -1
  510. package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs.map +0 -1
  511. package/lib/cjs/blob/ipfs/index.cjs.map +0 -1
  512. package/lib/cjs/blob/local/LocalBlobStoreService.cjs.map +0 -1
  513. package/lib/cjs/blob/local/index.cjs.map +0 -1
  514. package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs.map +0 -1
  515. package/lib/cjs/blob/memory/index.cjs.map +0 -1
  516. package/lib/cjs/blob/s3/MinioBlobStoreService.cjs.map +0 -1
  517. package/lib/cjs/blob/s3/R2BlobStoreService.cjs.map +0 -1
  518. package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +0 -1
  519. package/lib/cjs/blob/s3/index.cjs.map +0 -1
  520. package/lib/cjs/docker/DockerComposeService.cjs.map +0 -1
  521. package/lib/cjs/docker/index.cjs.map +0 -1
  522. package/lib/cjs/graph/engine/constants.cjs.map +0 -1
  523. package/lib/cjs/graph/engine/decorators.cjs.map +0 -1
  524. package/lib/cjs/graph/engine/errors/GraphCycleError.cjs.map +0 -1
  525. package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs.map +0 -1
  526. package/lib/cjs/graph/engine/errors/GraphInputError.cjs.map +0 -1
  527. package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs.map +0 -1
  528. package/lib/cjs/graph/engine/errors/GraphPinningError.cjs.map +0 -1
  529. package/lib/cjs/graph/engine/errors/GraphPortError.cjs.map +0 -1
  530. package/lib/cjs/graph/engine/errors/GraphStoreError.cjs.map +0 -1
  531. package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs.map +0 -1
  532. package/lib/cjs/graph/engine/errors/index.cjs.map +0 -1
  533. package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs.map +0 -1
  534. package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs.map +0 -1
  535. package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs.map +0 -1
  536. package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs.map +0 -1
  537. package/lib/cjs/graph/engine/events/index.cjs.map +0 -1
  538. package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs.map +0 -1
  539. package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs.map +0 -1
  540. package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs.map +0 -1
  541. package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs.map +0 -1
  542. package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs.map +0 -1
  543. package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs.map +0 -1
  544. package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs.map +0 -1
  545. package/lib/cjs/graph/engine/execution/index.cjs.map +0 -1
  546. package/lib/cjs/graph/engine/index.cjs.map +0 -1
  547. package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs.map +0 -1
  548. package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs.map +0 -1
  549. package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs.map +0 -1
  550. package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs.map +0 -1
  551. package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs.map +0 -1
  552. package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs.map +0 -1
  553. package/lib/cjs/graph/engine/loops/index.cjs.map +0 -1
  554. package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs.map +0 -1
  555. package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs.map +0 -1
  556. package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs.map +0 -1
  557. package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs.map +0 -1
  558. package/lib/cjs/graph/engine/pinning/index.cjs.map +0 -1
  559. package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs.map +0 -1
  560. package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs.map +0 -1
  561. package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs.map +0 -1
  562. package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs.map +0 -1
  563. package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs.map +0 -1
  564. package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs.map +0 -1
  565. package/lib/cjs/graph/engine/planning/GraphTopology.cjs.map +0 -1
  566. package/lib/cjs/graph/engine/planning/index.cjs.map +0 -1
  567. package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs.map +0 -1
  568. package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs.map +0 -1
  569. package/lib/cjs/graph/engine/registry/index.cjs.map +0 -1
  570. package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs.map +0 -1
  571. package/lib/cjs/graph/engine/snapshots/index.cjs.map +0 -1
  572. package/lib/cjs/graph/engine/store/GraphCachedValue.cjs.map +0 -1
  573. package/lib/cjs/graph/engine/store/GraphValueKey.cjs.map +0 -1
  574. package/lib/cjs/graph/engine/store/GraphValueStore.cjs.map +0 -1
  575. package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs.map +0 -1
  576. package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs.map +0 -1
  577. package/lib/cjs/graph/engine/store/index.cjs.map +0 -1
  578. package/lib/cjs/graph/engine/types.cjs.map +0 -1
  579. package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs.map +0 -1
  580. package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs.map +0 -1
  581. package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs.map +0 -1
  582. package/lib/cjs/graph/engine/validation/index.cjs.map +0 -1
  583. package/lib/cjs/graph/index.cjs.map +0 -1
  584. package/lib/cjs/graph/shared/constants.cjs.map +0 -1
  585. package/lib/cjs/graph/shared/index.cjs.map +0 -1
  586. package/lib/cjs/graph/shared/nodes/agent.cjs.map +0 -1
  587. package/lib/cjs/graph/shared/nodes/base.cjs.map +0 -1
  588. package/lib/cjs/graph/shared/nodes/category-styles.cjs.map +0 -1
  589. package/lib/cjs/graph/shared/nodes/flow-control.cjs.map +0 -1
  590. package/lib/cjs/graph/shared/nodes/index.cjs.map +0 -1
  591. package/lib/cjs/graph/shared/nodes/triggers.cjs.map +0 -1
  592. package/lib/cjs/graph/shared/types.cjs.map +0 -1
  593. package/lib/cjs/index.cjs.map +0 -1
  594. package/lib/cjs/keycloak/index.cjs.map +0 -1
  595. package/lib/cjs/keycloak/services/KeycloakAuthService.cjs.map +0 -1
  596. package/lib/cjs/keycloak/services/KeycloakClientService.cjs.map +0 -1
  597. package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs.map +0 -1
  598. package/lib/cjs/keycloak/services/KeycloakRealmService.cjs.map +0 -1
  599. package/lib/cjs/keycloak/services/KeycloakRoleService.cjs.map +0 -1
  600. package/lib/cjs/keycloak/services/KeycloakService.cjs.map +0 -1
  601. package/lib/cjs/keycloak/services/KeycloakUserService.cjs.map +0 -1
  602. package/lib/cjs/keycloak/services/index.cjs.map +0 -1
  603. package/lib/cjs/keycloak/services/runtime.cjs.map +0 -1
  604. package/lib/cjs/keycloak/types.cjs.map +0 -1
  605. package/lib/cjs/kibana/helpers.cjs.map +0 -1
  606. package/lib/cjs/kibana/index.cjs.map +0 -1
  607. package/lib/cjs/kibana/services/KibanaAuthService.cjs.map +0 -1
  608. package/lib/cjs/kibana/services/KibanaDashboardService.cjs.map +0 -1
  609. package/lib/cjs/kibana/services/KibanaDataViewService.cjs.map +0 -1
  610. package/lib/cjs/kibana/services/KibanaRoleService.cjs.map +0 -1
  611. package/lib/cjs/kibana/services/KibanaService.cjs.map +0 -1
  612. package/lib/cjs/kibana/services/KibanaSpaceService.cjs.map +0 -1
  613. package/lib/cjs/kibana/services/KibanaUserService.cjs.map +0 -1
  614. package/lib/cjs/kibana/services/index.cjs.map +0 -1
  615. package/lib/cjs/kibana/services/runtime.cjs.map +0 -1
  616. package/lib/cjs/kibana/types.cjs.map +0 -1
  617. package/lib/cjs/namespaces/index.cjs.map +0 -1
  618. package/lib/cjs/namespaces/models/authorization-model.cjs.map +0 -1
  619. package/lib/cjs/namespaces/models/effective-permission.model.cjs.map +0 -1
  620. package/lib/cjs/namespaces/models/group-membership.model.cjs.map +0 -1
  621. package/lib/cjs/namespaces/models/group.model.cjs.map +0 -1
  622. package/lib/cjs/namespaces/models/index.cjs.map +0 -1
  623. package/lib/cjs/namespaces/models/inheritance-block.model.cjs.map +0 -1
  624. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs.map +0 -1
  625. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs.map +0 -1
  626. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs.map +0 -1
  627. package/lib/cjs/namespaces/models/org-unit.model.cjs.map +0 -1
  628. package/lib/cjs/namespaces/models/permission.model.cjs.map +0 -1
  629. package/lib/cjs/namespaces/models/principal.model.cjs.map +0 -1
  630. package/lib/cjs/namespaces/models/protected-resource.model.cjs.map +0 -1
  631. package/lib/cjs/namespaces/models/resource-grant.model.cjs.map +0 -1
  632. package/lib/cjs/namespaces/models/role-assignment.model.cjs.map +0 -1
  633. package/lib/cjs/namespaces/models/role-permission.model.cjs.map +0 -1
  634. package/lib/cjs/namespaces/models/role.model.cjs.map +0 -1
  635. package/lib/cjs/namespaces/models/storage-binding.model.cjs.map +0 -1
  636. package/lib/cjs/namespaces/models/tenant-membership.model.cjs.map +0 -1
  637. package/lib/cjs/namespaces/models/tenant-profile.model.cjs.map +0 -1
  638. package/lib/cjs/namespaces/models/tenant.model.cjs.map +0 -1
  639. package/lib/cjs/namespaces/models/user.model.cjs.map +0 -1
  640. package/lib/cjs/namespaces/org-based-authorization-system.cjs.map +0 -1
  641. package/lib/cjs/namespaces/org-based-authorization-system.models.cjs.map +0 -1
  642. package/lib/cjs/namespaces/org-based-authorization-system.services.cjs.map +0 -1
  643. package/lib/cjs/namespaces/services/authz.service.cjs.map +0 -1
  644. package/lib/cjs/namespaces/services/bootstrap.service.cjs.map +0 -1
  645. package/lib/cjs/namespaces/services/effective-permission.service.cjs.map +0 -1
  646. package/lib/cjs/namespaces/services/group-membership.service.cjs.map +0 -1
  647. package/lib/cjs/namespaces/services/group.service.cjs.map +0 -1
  648. package/lib/cjs/namespaces/services/index.cjs.map +0 -1
  649. package/lib/cjs/namespaces/services/inheritance-block.service.cjs.map +0 -1
  650. package/lib/cjs/namespaces/services/org-unit-closure.service.cjs.map +0 -1
  651. package/lib/cjs/namespaces/services/org-unit-membership.service.cjs.map +0 -1
  652. package/lib/cjs/namespaces/services/org-unit-profile.service.cjs.map +0 -1
  653. package/lib/cjs/namespaces/services/org-unit.service.cjs.map +0 -1
  654. package/lib/cjs/namespaces/services/permission.service.cjs.map +0 -1
  655. package/lib/cjs/namespaces/services/principal.service.cjs.map +0 -1
  656. package/lib/cjs/namespaces/services/protected-resource.service.cjs.map +0 -1
  657. package/lib/cjs/namespaces/services/resource-grant.service.cjs.map +0 -1
  658. package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs.map +0 -1
  659. package/lib/cjs/namespaces/services/role-assignment.service.cjs.map +0 -1
  660. package/lib/cjs/namespaces/services/role-permission.service.cjs.map +0 -1
  661. package/lib/cjs/namespaces/services/role.service.cjs.map +0 -1
  662. package/lib/cjs/namespaces/services/storage-binding.service.cjs.map +0 -1
  663. package/lib/cjs/namespaces/services/system-management.service.cjs.map +0 -1
  664. package/lib/cjs/namespaces/services/tenant-membership.service.cjs.map +0 -1
  665. package/lib/cjs/namespaces/services/tenant-profile.service.cjs.map +0 -1
  666. package/lib/cjs/namespaces/services/tenant.service.cjs.map +0 -1
  667. package/lib/cjs/namespaces/services/user.service.cjs.map +0 -1
  668. package/lib/cjs/namespaces/types.cjs.map +0 -1
  669. package/lib/cjs/namespaces/utils.cjs.map +0 -1
  670. package/lib/cjs/nest/authService.cjs.map +0 -1
  671. package/lib/cjs/nest/graph/GraphExecutionController.cjs.map +0 -1
  672. package/lib/cjs/nest/graph/GraphExecutionModule.cjs.map +0 -1
  673. package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs.map +0 -1
  674. package/lib/cjs/nest/graph/GraphExecutionResultRepository.cjs +0 -66
  675. package/lib/cjs/nest/graph/GraphExecutionResultRepository.cjs.map +0 -1
  676. package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs.map +0 -1
  677. package/lib/cjs/nest/graph/index.cjs.map +0 -1
  678. package/lib/cjs/nest/graph/main.cjs.map +0 -1
  679. package/lib/cjs/nest/index.cjs.map +0 -1
  680. package/lib/cjs/nest/keycloakAuthHandler.cjs.map +0 -1
  681. package/lib/cjs/nest/keycloakModule.cjs.map +0 -1
  682. package/lib/cjs/nest/logging.cjs.map +0 -1
  683. package/lib/cjs/nest/types.cjs.map +0 -1
  684. package/lib/cjs/nest/utils.cjs.map +0 -1
  685. package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +0 -1
  686. package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs.map +0 -1
  687. package/lib/cjs/secrets/aws/index.cjs.map +0 -1
  688. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +0 -1
  689. package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs.map +0 -1
  690. package/lib/cjs/secrets/azure/index.cjs.map +0 -1
  691. package/lib/cjs/secrets/core/SecretErrors.cjs.map +0 -1
  692. package/lib/cjs/secrets/core/SecretName.cjs.map +0 -1
  693. package/lib/cjs/secrets/core/SecretReference.cjs.map +0 -1
  694. package/lib/cjs/secrets/core/SecretSerialization.cjs.map +0 -1
  695. package/lib/cjs/secrets/core/SecretService.cjs.map +0 -1
  696. package/lib/cjs/secrets/core/SecretTypes.cjs.map +0 -1
  697. package/lib/cjs/secrets/core/index.cjs.map +0 -1
  698. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +0 -1
  699. package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs.map +0 -1
  700. package/lib/cjs/secrets/gcp/index.cjs.map +0 -1
  701. package/lib/cjs/secrets/index.cjs.map +0 -1
  702. package/lib/cjs/secrets/model/ModelSecretCrypto.cjs.map +0 -1
  703. package/lib/cjs/secrets/model/ModelSecretService.cjs.map +0 -1
  704. package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs.map +0 -1
  705. package/lib/cjs/secrets/model/Secret.cjs.map +0 -1
  706. package/lib/cjs/secrets/model/index.cjs.map +0 -1
  707. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +0 -1
  708. package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs.map +0 -1
  709. package/lib/cjs/secrets/onepassword/index.cjs.map +0 -1
  710. package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +0 -1
  711. package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs.map +0 -1
  712. package/lib/cjs/secrets/vault/index.cjs.map +0 -1
  713. package/lib/cjs/shared/runtime.cjs.map +0 -1
  714. package/lib/cjs/utils.cjs.map +0 -1
  715. package/lib/esm/blob/azure/AzureBlobStoreService.js.map +0 -1
  716. package/lib/esm/blob/azure/index.js.map +0 -1
  717. package/lib/esm/blob/core/BlobErrors.js.map +0 -1
  718. package/lib/esm/blob/core/BlobKey.js.map +0 -1
  719. package/lib/esm/blob/core/BlobStoreFactory.js.map +0 -1
  720. package/lib/esm/blob/core/BlobStoreService.js.map +0 -1
  721. package/lib/esm/blob/core/BlobTypes.js.map +0 -1
  722. package/lib/esm/blob/core/BlobValue.js.map +0 -1
  723. package/lib/esm/blob/core/index.js.map +0 -1
  724. package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +0 -1
  725. package/lib/esm/blob/gcp/index.js.map +0 -1
  726. package/lib/esm/blob/index.js.map +0 -1
  727. package/lib/esm/blob/ipfs/IpfsBlobStoreService.js.map +0 -1
  728. package/lib/esm/blob/ipfs/IpfsKeyIndex.js.map +0 -1
  729. package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js.map +0 -1
  730. package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js.map +0 -1
  731. package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js.map +0 -1
  732. package/lib/esm/blob/ipfs/index.js.map +0 -1
  733. package/lib/esm/blob/local/LocalBlobStoreService.js.map +0 -1
  734. package/lib/esm/blob/local/index.js.map +0 -1
  735. package/lib/esm/blob/memory/MemoryBlobStoreService.js.map +0 -1
  736. package/lib/esm/blob/memory/index.js.map +0 -1
  737. package/lib/esm/blob/s3/MinioBlobStoreService.js.map +0 -1
  738. package/lib/esm/blob/s3/R2BlobStoreService.js.map +0 -1
  739. package/lib/esm/blob/s3/S3BlobStoreService.js.map +0 -1
  740. package/lib/esm/blob/s3/index.js.map +0 -1
  741. package/lib/esm/docker/DockerComposeService.js.map +0 -1
  742. package/lib/esm/docker/index.js.map +0 -1
  743. package/lib/esm/graph/engine/constants.js.map +0 -1
  744. package/lib/esm/graph/engine/decorators.js.map +0 -1
  745. package/lib/esm/graph/engine/errors/GraphCycleError.js.map +0 -1
  746. package/lib/esm/graph/engine/errors/GraphExecutionError.js.map +0 -1
  747. package/lib/esm/graph/engine/errors/GraphInputError.js.map +0 -1
  748. package/lib/esm/graph/engine/errors/GraphLoopLimitError.js.map +0 -1
  749. package/lib/esm/graph/engine/errors/GraphPinningError.js.map +0 -1
  750. package/lib/esm/graph/engine/errors/GraphPortError.js.map +0 -1
  751. package/lib/esm/graph/engine/errors/GraphStoreError.js.map +0 -1
  752. package/lib/esm/graph/engine/errors/GraphTopologyError.js.map +0 -1
  753. package/lib/esm/graph/engine/errors/index.js.map +0 -1
  754. package/lib/esm/graph/engine/events/GraphExecutionEvent.js.map +0 -1
  755. package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js.map +0 -1
  756. package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js.map +0 -1
  757. package/lib/esm/graph/engine/events/GraphExecutionObserver.js.map +0 -1
  758. package/lib/esm/graph/engine/events/index.js.map +0 -1
  759. package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js.map +0 -1
  760. package/lib/esm/graph/engine/execution/GraphExecutionContext.js.map +0 -1
  761. package/lib/esm/graph/engine/execution/GraphExecutionEngine.js.map +0 -1
  762. package/lib/esm/graph/engine/execution/GraphExecutionFrame.js.map +0 -1
  763. package/lib/esm/graph/engine/execution/GraphExecutionResult.js.map +0 -1
  764. package/lib/esm/graph/engine/execution/GraphNodeExecutor.js.map +0 -1
  765. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js.map +0 -1
  766. package/lib/esm/graph/engine/execution/index.js.map +0 -1
  767. package/lib/esm/graph/engine/index.js.map +0 -1
  768. package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js.map +0 -1
  769. package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js.map +0 -1
  770. package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js.map +0 -1
  771. package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js.map +0 -1
  772. package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js.map +0 -1
  773. package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js.map +0 -1
  774. package/lib/esm/graph/engine/loops/index.js.map +0 -1
  775. package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js.map +0 -1
  776. package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js.map +0 -1
  777. package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js.map +0 -1
  778. package/lib/esm/graph/engine/pinning/GraphPinningService.js.map +0 -1
  779. package/lib/esm/graph/engine/pinning/index.js.map +0 -1
  780. package/lib/esm/graph/engine/planning/GraphExecutionPlan.js.map +0 -1
  781. package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js.map +0 -1
  782. package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js.map +0 -1
  783. package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js.map +0 -1
  784. package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js.map +0 -1
  785. package/lib/esm/graph/engine/planning/GraphRelationResolver.js.map +0 -1
  786. package/lib/esm/graph/engine/planning/GraphTopology.js.map +0 -1
  787. package/lib/esm/graph/engine/planning/index.js.map +0 -1
  788. package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js.map +0 -1
  789. package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js.map +0 -1
  790. package/lib/esm/graph/engine/registry/index.js.map +0 -1
  791. package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js.map +0 -1
  792. package/lib/esm/graph/engine/snapshots/index.js.map +0 -1
  793. package/lib/esm/graph/engine/store/GraphCachedValue.js.map +0 -1
  794. package/lib/esm/graph/engine/store/GraphValueKey.js.map +0 -1
  795. package/lib/esm/graph/engine/store/GraphValueStore.js.map +0 -1
  796. package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js.map +0 -1
  797. package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js.map +0 -1
  798. package/lib/esm/graph/engine/store/index.js.map +0 -1
  799. package/lib/esm/graph/engine/types.js.map +0 -1
  800. package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js.map +0 -1
  801. package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js.map +0 -1
  802. package/lib/esm/graph/engine/validation/GraphValueValidator.js.map +0 -1
  803. package/lib/esm/graph/engine/validation/index.js.map +0 -1
  804. package/lib/esm/graph/index.js.map +0 -1
  805. package/lib/esm/graph/shared/constants.js.map +0 -1
  806. package/lib/esm/graph/shared/index.js.map +0 -1
  807. package/lib/esm/graph/shared/nodes/agent.js.map +0 -1
  808. package/lib/esm/graph/shared/nodes/base.js.map +0 -1
  809. package/lib/esm/graph/shared/nodes/category-styles.js.map +0 -1
  810. package/lib/esm/graph/shared/nodes/flow-control.js.map +0 -1
  811. package/lib/esm/graph/shared/nodes/index.js.map +0 -1
  812. package/lib/esm/graph/shared/nodes/triggers.js.map +0 -1
  813. package/lib/esm/graph/shared/types.js.map +0 -1
  814. package/lib/esm/index.js.map +0 -1
  815. package/lib/esm/keycloak/index.js.map +0 -1
  816. package/lib/esm/keycloak/services/KeycloakAuthService.js.map +0 -1
  817. package/lib/esm/keycloak/services/KeycloakClientService.js.map +0 -1
  818. package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js.map +0 -1
  819. package/lib/esm/keycloak/services/KeycloakRealmService.js.map +0 -1
  820. package/lib/esm/keycloak/services/KeycloakRoleService.js.map +0 -1
  821. package/lib/esm/keycloak/services/KeycloakService.js.map +0 -1
  822. package/lib/esm/keycloak/services/KeycloakUserService.js.map +0 -1
  823. package/lib/esm/keycloak/services/index.js.map +0 -1
  824. package/lib/esm/keycloak/services/runtime.js.map +0 -1
  825. package/lib/esm/keycloak/types.js.map +0 -1
  826. package/lib/esm/kibana/helpers.js.map +0 -1
  827. package/lib/esm/kibana/index.js.map +0 -1
  828. package/lib/esm/kibana/services/KibanaAuthService.js.map +0 -1
  829. package/lib/esm/kibana/services/KibanaDashboardService.js.map +0 -1
  830. package/lib/esm/kibana/services/KibanaDataViewService.js.map +0 -1
  831. package/lib/esm/kibana/services/KibanaRoleService.js.map +0 -1
  832. package/lib/esm/kibana/services/KibanaService.js.map +0 -1
  833. package/lib/esm/kibana/services/KibanaSpaceService.js.map +0 -1
  834. package/lib/esm/kibana/services/KibanaUserService.js.map +0 -1
  835. package/lib/esm/kibana/services/index.js.map +0 -1
  836. package/lib/esm/kibana/services/runtime.js.map +0 -1
  837. package/lib/esm/kibana/types.js.map +0 -1
  838. package/lib/esm/namespaces/index.js.map +0 -1
  839. package/lib/esm/namespaces/models/authorization-model.js.map +0 -1
  840. package/lib/esm/namespaces/models/effective-permission.model.js.map +0 -1
  841. package/lib/esm/namespaces/models/group-membership.model.js.map +0 -1
  842. package/lib/esm/namespaces/models/group.model.js.map +0 -1
  843. package/lib/esm/namespaces/models/index.js.map +0 -1
  844. package/lib/esm/namespaces/models/inheritance-block.model.js.map +0 -1
  845. package/lib/esm/namespaces/models/org-unit-closure.model.js.map +0 -1
  846. package/lib/esm/namespaces/models/org-unit-membership.model.js.map +0 -1
  847. package/lib/esm/namespaces/models/org-unit-profile.model.js.map +0 -1
  848. package/lib/esm/namespaces/models/org-unit.model.js.map +0 -1
  849. package/lib/esm/namespaces/models/permission.model.js.map +0 -1
  850. package/lib/esm/namespaces/models/principal.model.js.map +0 -1
  851. package/lib/esm/namespaces/models/protected-resource.model.js.map +0 -1
  852. package/lib/esm/namespaces/models/resource-grant.model.js.map +0 -1
  853. package/lib/esm/namespaces/models/role-assignment.model.js.map +0 -1
  854. package/lib/esm/namespaces/models/role-permission.model.js.map +0 -1
  855. package/lib/esm/namespaces/models/role.model.js.map +0 -1
  856. package/lib/esm/namespaces/models/storage-binding.model.js.map +0 -1
  857. package/lib/esm/namespaces/models/tenant-membership.model.js.map +0 -1
  858. package/lib/esm/namespaces/models/tenant-profile.model.js.map +0 -1
  859. package/lib/esm/namespaces/models/tenant.model.js.map +0 -1
  860. package/lib/esm/namespaces/models/user.model.js.map +0 -1
  861. package/lib/esm/namespaces/org-based-authorization-system.js.map +0 -1
  862. package/lib/esm/namespaces/org-based-authorization-system.models.js.map +0 -1
  863. package/lib/esm/namespaces/org-based-authorization-system.services.js.map +0 -1
  864. package/lib/esm/namespaces/services/authz.service.js.map +0 -1
  865. package/lib/esm/namespaces/services/bootstrap.service.js.map +0 -1
  866. package/lib/esm/namespaces/services/effective-permission.service.js.map +0 -1
  867. package/lib/esm/namespaces/services/group-membership.service.js.map +0 -1
  868. package/lib/esm/namespaces/services/group.service.js.map +0 -1
  869. package/lib/esm/namespaces/services/index.js.map +0 -1
  870. package/lib/esm/namespaces/services/inheritance-block.service.js.map +0 -1
  871. package/lib/esm/namespaces/services/org-unit-closure.service.js.map +0 -1
  872. package/lib/esm/namespaces/services/org-unit-membership.service.js.map +0 -1
  873. package/lib/esm/namespaces/services/org-unit-profile.service.js.map +0 -1
  874. package/lib/esm/namespaces/services/org-unit.service.js.map +0 -1
  875. package/lib/esm/namespaces/services/permission.service.js.map +0 -1
  876. package/lib/esm/namespaces/services/principal.service.js.map +0 -1
  877. package/lib/esm/namespaces/services/protected-resource.service.js.map +0 -1
  878. package/lib/esm/namespaces/services/resource-grant.service.js.map +0 -1
  879. package/lib/esm/namespaces/services/resource-lifecycle.service.js.map +0 -1
  880. package/lib/esm/namespaces/services/role-assignment.service.js.map +0 -1
  881. package/lib/esm/namespaces/services/role-permission.service.js.map +0 -1
  882. package/lib/esm/namespaces/services/role.service.js.map +0 -1
  883. package/lib/esm/namespaces/services/storage-binding.service.js.map +0 -1
  884. package/lib/esm/namespaces/services/system-management.service.js.map +0 -1
  885. package/lib/esm/namespaces/services/tenant-membership.service.js.map +0 -1
  886. package/lib/esm/namespaces/services/tenant-profile.service.js.map +0 -1
  887. package/lib/esm/namespaces/services/tenant.service.js.map +0 -1
  888. package/lib/esm/namespaces/services/user.service.js.map +0 -1
  889. package/lib/esm/namespaces/types.js.map +0 -1
  890. package/lib/esm/namespaces/utils.js.map +0 -1
  891. package/lib/esm/nest/authService.js.map +0 -1
  892. package/lib/esm/nest/graph/GraphExecutionController.js.map +0 -1
  893. package/lib/esm/nest/graph/GraphExecutionModule.js.map +0 -1
  894. package/lib/esm/nest/graph/GraphExecutionResultModel.js.map +0 -1
  895. package/lib/esm/nest/graph/GraphExecutionResultRepository.js +0 -60
  896. package/lib/esm/nest/graph/GraphExecutionResultRepository.js.map +0 -1
  897. package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js.map +0 -1
  898. package/lib/esm/nest/graph/index.js.map +0 -1
  899. package/lib/esm/nest/graph/main.js.map +0 -1
  900. package/lib/esm/nest/index.js.map +0 -1
  901. package/lib/esm/nest/keycloakAuthHandler.js.map +0 -1
  902. package/lib/esm/nest/keycloakModule.js.map +0 -1
  903. package/lib/esm/nest/logging.js.map +0 -1
  904. package/lib/esm/nest/types.js.map +0 -1
  905. package/lib/esm/nest/utils.js.map +0 -1
  906. package/lib/esm/secrets/aws/AwsSecretService.js.map +0 -1
  907. package/lib/esm/secrets/aws/AwsSecretServiceConfig.js.map +0 -1
  908. package/lib/esm/secrets/aws/index.js.map +0 -1
  909. package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +0 -1
  910. package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js.map +0 -1
  911. package/lib/esm/secrets/azure/index.js.map +0 -1
  912. package/lib/esm/secrets/core/SecretErrors.js.map +0 -1
  913. package/lib/esm/secrets/core/SecretName.js.map +0 -1
  914. package/lib/esm/secrets/core/SecretReference.js.map +0 -1
  915. package/lib/esm/secrets/core/SecretSerialization.js.map +0 -1
  916. package/lib/esm/secrets/core/SecretService.js.map +0 -1
  917. package/lib/esm/secrets/core/SecretTypes.js.map +0 -1
  918. package/lib/esm/secrets/core/index.js.map +0 -1
  919. package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +0 -1
  920. package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js.map +0 -1
  921. package/lib/esm/secrets/gcp/index.js.map +0 -1
  922. package/lib/esm/secrets/index.js.map +0 -1
  923. package/lib/esm/secrets/model/ModelSecretCrypto.js.map +0 -1
  924. package/lib/esm/secrets/model/ModelSecretService.js.map +0 -1
  925. package/lib/esm/secrets/model/ModelSecretServiceConfig.js.map +0 -1
  926. package/lib/esm/secrets/model/Secret.js.map +0 -1
  927. package/lib/esm/secrets/model/index.js.map +0 -1
  928. package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +0 -1
  929. package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js.map +0 -1
  930. package/lib/esm/secrets/onepassword/index.js.map +0 -1
  931. package/lib/esm/secrets/vault/VaultSecretService.js.map +0 -1
  932. package/lib/esm/secrets/vault/VaultSecretServiceConfig.js.map +0 -1
  933. package/lib/esm/secrets/vault/index.js.map +0 -1
  934. package/lib/esm/shared/runtime.js.map +0 -1
  935. package/lib/esm/utils.js.map +0 -1
  936. package/lib/types/nest/graph/GraphExecutionResultRepository.d.cts +0 -38
  937. package/lib/types/nest/graph/GraphExecutionResultRepository.d.mts +0 -38
@@ -1,2 +1,1649 @@
1
- var e,t;e=this,t=function(e,t,i,r,a,n,o){"use strict";var s,d,c,p,_,l,y,u;e.IsolationTier=void 0,(s=e.IsolationTier||(e.IsolationTier={})).Pooled="pooled",s.Bridge="bridge",s.Silo="silo",e.MembershipStatus=void 0,(d=e.MembershipStatus||(e.MembershipStatus={})).Invited="invited",d.Active="active",d.Suspended="suspended",d.Removed="removed",e.PrincipalKind=void 0,(c=e.PrincipalKind||(e.PrincipalKind={})).User="user",c.Group="group",c.ServiceAccount="service_account",c.Agent="agent",c.ApiKey="api_key",e.ScopeKind=void 0,(p=e.ScopeKind||(e.ScopeKind={})).Tenant="tenant",p.OrgUnit="org_unit",p.Resource="resource",e.PermissionCategory=void 0,(_=e.PermissionCategory||(e.PermissionCategory={})).Admin="admin",_.ContentRead="content_read",_.ContentWrite="content_write",_.Memory="memory",_.Graph="graph",_.Vector="vector",_.Export="export",_.Billing="billing",_.Audit="audit",_.Security="security",_.Data="data",_.Automation="automation",e.ResourceVisibility=void 0,(l=e.ResourceVisibility||(e.ResourceVisibility={})).Private="private",l.ResourceAcl="resource_acl",l.OrgUnit="org_unit",l.OrgSubtree="org_subtree",l.Tenant="tenant",e.StorageKind=void 0,(y=e.StorageKind||(e.StorageKind={})).Postgres="postgres",y.Arango="arango",y.Qdrant="qdrant",y.ObjectStorage="object_storage",e.StorageBindingKind=void 0,(u=e.StorageBindingKind||(e.StorageBindingKind={})).Shared="shared",u.Dedicated="dedicated";const g=Object.values(e.IsolationTier),m=Object.values(e.MembershipStatus),h=Object.values(e.PrincipalKind),v=Object.values(e.ScopeKind),S=Object.values(e.PermissionCategory),O=Object.values(e.ResourceVisibility),f=Object.values(e.StorageKind),b=Object.values(e.StorageBindingKind),A={update:a.Cascade.NONE,delete:a.Cascade.NONE,nullable:!1},w={update:a.Cascade.NONE,delete:a.Cascade.NONE,nullable:!0},P={update:a.Cascade.CASCADE,delete:a.Cascade.CASCADE,nullable:!1},T={update:a.Cascade.CASCADE,delete:a.Cascade.NONE,nullable:!1};function U(e){return{tenantId:e.tenantId,principalId:e.principalId,permissionKey:e.permissionKey,allowedOrgUnitIds:[...e.allowedOrgUnitIds],allowedResourceIds:[...e.allowedResourceIds]}}function I(e){return{must:[{key:"tenant_id",match:{value:e.tenantId}},{should:[{key:"org_unit_id",match:{any:e.allowedOrgUnitIds}},{key:"protected_resource_id",match:{any:e.allowedResourceIds}},{key:"owner_principal_id",match:{value:e.principalId}}]}]}}function R(e,t){return`${e}:${t}`}function K(e){return e??[]}function j(e,t){return D(e)===t}function k(e,t){return!!t&&D(e)===t}function B(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function M(e,t,i){const r=e??new Date;return!(t&&t>r||i&&r>i)}function x(t){const i={},r={};for(const a of t.permissions){const t=R(a.scopeKind,a.scopeId);i[t]=i[t]??[],i[t].push(a.permissionKey),a.scopeKind===e.ScopeKind.OrgUnit&&(r[a.permissionKey]=r[a.permissionKey]??[],r[a.permissionKey].push(a.scopeId))}return{tenantId:t.tenantId,principalId:t.principalId,permissionsByScope:i,allowedOrgUnitIdsByPermission:r,resourceGrants:t.grants.map(e=>({resourceId:e.resourceId,permissionKey:e.permissionKey}))}}class q extends a.ModelService{constructor(e){super(e)}newModel(e,t){return Object.assign(new e,t)}async create(e,...t){return this.repo.create(Object.assign({},e),...t)}async createOne(e,...t){return this.create(e,...t)}async getById(e,...t){return this.repo.read(e,...t)}async updateOne(e,t,...i){const r=await this.repo.read(e,...i);return this.repo.update(Object.assign(r,t),...i)}async deleteById(e,...t){await this.repo.delete(e,...t)}async findOneBy(e,t,...i){return this.repo.findOneBy(e,t,...i)}async findManyBy(e,t,...i){return this.repo.select().where({[e]:t}).execute(...i)}async listAll(...e){return this.repo.select().execute(...e)}}function D(e){return"string"==typeof e?e:e.id}class C extends n.Model{constructor(e){super(e)}}e.TenantMembership=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.TenantMembership.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,P,!1,void 0,"fk_tenant_memberships_tenant"),n.required(),o.__metadata("design:type",Object)],e.TenantMembership.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.User,P,!1,void 0,"fk_tenant_memberships_user"),n.required(),o.__metadata("design:type",Object)],e.TenantMembership.prototype,"user",void 0),o.__decorate([n.required(),n.type(String),n.option(m),a.column(),o.__metadata("design:type",String)],e.TenantMembership.prototype,"status",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.TenantMembership.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.TenantMembership.prototype,"updatedAt",void 0),e.TenantMembership=o.__decorate([a.table("tenant_memberships"),n.model(),o.__metadata("design:paramtypes",[Object])],e.TenantMembership),e.User=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.User.prototype,"id",void 0),o.__decorate([a.unique(),n.type(String),a.column(),o.__metadata("design:type",String)],e.User.prototype,"email",void 0),o.__decorate([a.unique(),n.type(String),a.column(),o.__metadata("design:type",String)],e.User.prototype,"phone",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.User.prototype,"displayName",void 0),o.__decorate([a.oneToMany(()=>e.TenantMembership,A,!1),o.__metadata("design:type",Array)],e.User.prototype,"tenantMemberships",void 0),o.__decorate([a.oneToMany(()=>e.OrgUnitMembership,A,!1),o.__metadata("design:type",Array)],e.User.prototype,"orgUnitMemberships",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.User.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.User.prototype,"updatedAt",void 0),e.User=o.__decorate([a.table("users"),n.model(),o.__metadata("design:paramtypes",[Object])],e.User),e.OrgUnitMembership=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.OrgUnitMembership.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,P,!1,void 0,"fk_org_memberships_tenant"),n.required(),o.__metadata("design:type",Object)],e.OrgUnitMembership.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.OrgUnit,P,!1,void 0,"fk_org_memberships_org_unit"),n.required(),o.__metadata("design:type",Object)],e.OrgUnitMembership.prototype,"orgUnit",void 0),o.__decorate([a.manyToOne(()=>e.User,A,!1,void 0,"fk_org_memberships_user"),n.required(),o.__metadata("design:type",Object)],e.OrgUnitMembership.prototype,"user",void 0),o.__decorate([n.required(),n.type(String),n.option(m),a.column(),o.__metadata("design:type",String)],e.OrgUnitMembership.prototype,"status",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.OrgUnitMembership.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.OrgUnitMembership.prototype,"updatedAt",void 0),e.OrgUnitMembership=o.__decorate([a.table("org_unit_memberships"),n.model(),o.__metadata("design:paramtypes",[Object])],e.OrgUnitMembership),e.OrgUnitClosure=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.OrgUnitClosure.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,P,!1,void 0,"fk_org_closure_tenant"),n.required(),o.__metadata("design:type",Object)],e.OrgUnitClosure.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.OrgUnit,P,!1,void 0,"fk_org_closure_ancestor"),n.required(),o.__metadata("design:type",Object)],e.OrgUnitClosure.prototype,"ancestor",void 0),o.__decorate([a.manyToOne(()=>e.OrgUnit,P,!1,void 0,"fk_org_closure_descendant"),n.required(),o.__metadata("design:type",Object)],e.OrgUnitClosure.prototype,"descendant",void 0),o.__decorate([n.required(),n.type(Number),a.column(),o.__metadata("design:type",Number)],e.OrgUnitClosure.prototype,"depth",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.OrgUnitClosure.prototype,"createdAt",void 0),e.OrgUnitClosure=o.__decorate([a.table("org_unit_closure"),n.model(),o.__metadata("design:paramtypes",[Object])],e.OrgUnitClosure),e.Permission=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.Permission.prototype,"id",void 0),o.__decorate([a.unique(),n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.Permission.prototype,"key",void 0),o.__decorate([n.required(),n.type(String),n.option(S),a.column(),o.__metadata("design:type",String)],e.Permission.prototype,"category",void 0),o.__decorate([n.type(String),a.column(),o.__metadata("design:type",String)],e.Permission.prototype,"description",void 0),o.__decorate([a.oneToMany(()=>e.RolePermission,A,!1),o.__metadata("design:type",Array)],e.Permission.prototype,"rolePermissions",void 0),e.Permission=o.__decorate([a.table("permissions"),n.model(),o.__metadata("design:paramtypes",[Object])],e.Permission),e.RolePermission=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.RolePermission.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Role,P,!1,void 0,"fk_role_permissions_role"),n.required(),o.__metadata("design:type",Object)],e.RolePermission.prototype,"role",void 0),o.__decorate([a.manyToOne(()=>e.Permission,P,!1,void 0,"fk_role_permissions_permission"),n.required(),o.__metadata("design:type",Object)],e.RolePermission.prototype,"permission",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.RolePermission.prototype,"createdAt",void 0),e.RolePermission=o.__decorate([a.table("role_permissions"),n.model(),o.__metadata("design:paramtypes",[Object])],e.RolePermission),e.Role=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.Role.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,w,!1,void 0,"fk_roles_tenant"),o.__metadata("design:type",Object)],e.Role.prototype,"tenant",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.Role.prototype,"key",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.Role.prototype,"name",void 0),o.__decorate([n.type(String),a.column(),o.__metadata("design:type",String)],e.Role.prototype,"description",void 0),o.__decorate([n.type(Object),a.column(),o.__metadata("design:type",Object)],e.Role.prototype,"metadata",void 0),o.__decorate([a.oneToMany(()=>e.RolePermission,A,!1),o.__metadata("design:type",Array)],e.Role.prototype,"rolePermissions",void 0),o.__decorate([a.oneToMany(()=>e.RoleAssignment,A,!1),o.__metadata("design:type",Array)],e.Role.prototype,"assignments",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.Role.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.Role.prototype,"updatedAt",void 0),e.Role=o.__decorate([a.table("roles"),n.model(),o.__metadata("design:paramtypes",[Object])],e.Role),e.RoleAssignment=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.RoleAssignment.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,P,!1,void 0,"fk_role_assignments_tenant"),n.required(),o.__metadata("design:type",Object)],e.RoleAssignment.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.Principal,P,!1,void 0,"fk_role_assignments_principal"),n.required(),o.__metadata("design:type",Object)],e.RoleAssignment.prototype,"principal",void 0),o.__decorate([a.manyToOne(()=>e.Role,A,!1,void 0,"fk_role_assignments_role"),n.required(),o.__metadata("design:type",Object)],e.RoleAssignment.prototype,"role",void 0),o.__decorate([n.required(),n.type(String),n.option(v),a.column(),o.__metadata("design:type",String)],e.RoleAssignment.prototype,"scopeKind",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.RoleAssignment.prototype,"scopeId",void 0),o.__decorate([n.required(),n.type(Boolean),a.column(),o.__metadata("design:type",Boolean)],e.RoleAssignment.prototype,"inheritDown",void 0),o.__decorate([a.column(),o.__metadata("design:type",Date)],e.RoleAssignment.prototype,"startsAt",void 0),o.__decorate([a.column(),o.__metadata("design:type",Date)],e.RoleAssignment.prototype,"expiresAt",void 0),o.__decorate([n.type(Object),a.column(),o.__metadata("design:type",Object)],e.RoleAssignment.prototype,"conditions",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.RoleAssignment.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.RoleAssignment.prototype,"updatedAt",void 0),e.RoleAssignment=o.__decorate([a.table("role_assignments"),n.model(),o.__metadata("design:paramtypes",[Object])],e.RoleAssignment),e.ResourceGrant=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.ResourceGrant.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,P,!1,void 0,"fk_resource_grants_tenant"),n.required(),o.__metadata("design:type",Object)],e.ResourceGrant.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.ProtectedResource,P,!1,void 0,"fk_resource_grants_resource"),n.required(),o.__metadata("design:type",Object)],e.ResourceGrant.prototype,"resource",void 0),o.__decorate([a.manyToOne(()=>e.Principal,P,!1,void 0,"fk_resource_grants_principal"),n.required(),o.__metadata("design:type",Object)],e.ResourceGrant.prototype,"principal",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.ResourceGrant.prototype,"permissionKey",void 0),o.__decorate([a.column(),o.__metadata("design:type",Date)],e.ResourceGrant.prototype,"startsAt",void 0),o.__decorate([a.column(),o.__metadata("design:type",Date)],e.ResourceGrant.prototype,"expiresAt",void 0),o.__decorate([n.type(Object),a.column(),o.__metadata("design:type",Object)],e.ResourceGrant.prototype,"conditions",void 0),o.__decorate([a.manyToOne(()=>e.Principal,A,!1,void 0,"fk_resource_grants_created_by"),o.__metadata("design:type",Object)],e.ResourceGrant.prototype,"createdBy",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.ResourceGrant.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.ResourceGrant.prototype,"updatedAt",void 0),e.ResourceGrant=o.__decorate([a.table("resource_grants"),n.model(),o.__metadata("design:paramtypes",[Object])],e.ResourceGrant),e.Principal=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.Principal.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,A,!1,void 0,"fk_principals_tenant"),n.required(),o.__metadata("design:type",Object)],e.Principal.prototype,"tenant",void 0),o.__decorate([n.required(),n.type(String),n.option(h),a.column(),o.__metadata("design:type",String)],e.Principal.prototype,"kind",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.Principal.prototype,"subjectId",void 0),o.__decorate([a.oneToMany(()=>e.RoleAssignment,A,!1),o.__metadata("design:type",Array)],e.Principal.prototype,"roleAssignments",void 0),o.__decorate([a.oneToMany(()=>e.ResourceGrant,A,!1),o.__metadata("design:type",Array)],e.Principal.prototype,"resourceGrants",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.Principal.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.Principal.prototype,"updatedAt",void 0),e.Principal=o.__decorate([a.table("principals"),n.model(),o.__metadata("design:paramtypes",[Object])],e.Principal),e.ProtectedResource=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.ProtectedResource.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,A,!1,void 0,"fk_protected_resources_tenant"),n.required(),o.__metadata("design:type",Object)],e.ProtectedResource.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.OrgUnit,A,!1,void 0,"fk_protected_resources_org_unit"),n.required(),o.__metadata("design:type",Object)],e.ProtectedResource.prototype,"orgUnit",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.ProtectedResource.prototype,"resourceType",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.ProtectedResource.prototype,"resourceId",void 0),o.__decorate([n.required(),n.type(String),n.option(O),a.column(),o.__metadata("design:type",String)],e.ProtectedResource.prototype,"visibility",void 0),o.__decorate([a.manyToOne(()=>e.Principal,w,!1,void 0,"fk_protected_resources_owner"),o.__metadata("design:type",Object)],e.ProtectedResource.prototype,"owner",void 0),o.__decorate([n.type(String),a.column(),o.__metadata("design:type",String)],e.ProtectedResource.prototype,"sensitivity",void 0),o.__decorate([n.type(Object),a.column(),o.__metadata("design:type",Object)],e.ProtectedResource.prototype,"metadata",void 0),o.__decorate([a.oneToMany(()=>e.ResourceGrant,A,!1),o.__metadata("design:type",Array)],e.ProtectedResource.prototype,"grants",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.ProtectedResource.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.ProtectedResource.prototype,"updatedAt",void 0),e.ProtectedResource=o.__decorate([a.table("protected_resources"),n.model(),o.__metadata("design:paramtypes",[Object])],e.ProtectedResource),e.InheritanceBlock=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.InheritanceBlock.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,P,!1,void 0,"fk_inheritance_blocks_tenant"),n.required(),o.__metadata("design:type",Object)],e.InheritanceBlock.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.OrgUnit,P,!1,void 0,"fk_inheritance_blocks_org_unit"),n.required(),o.__metadata("design:type",Object)],e.InheritanceBlock.prototype,"orgUnit",void 0),o.__decorate([a.manyToOne(()=>e.OrgUnit,w,!1,void 0,"fk_inheritance_blocks_blocked_ancestor"),o.__metadata("design:type",Object)],e.InheritanceBlock.prototype,"blockedFromAncestor",void 0),o.__decorate([n.required(),n.type(String),n.option(S),a.column(),o.__metadata("design:type",String)],e.InheritanceBlock.prototype,"permissionCategory",void 0),o.__decorate([n.type(String),a.column(),o.__metadata("design:type",String)],e.InheritanceBlock.prototype,"reason",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.InheritanceBlock.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.InheritanceBlock.prototype,"updatedAt",void 0),e.InheritanceBlock=o.__decorate([a.table("inheritance_blocks"),n.model(),o.__metadata("design:paramtypes",[Object])],e.InheritanceBlock),e.OrgUnit=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.OrgUnit.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,A,!1,void 0,"fk_org_units_tenant"),n.required(),o.__metadata("design:type",Object)],e.OrgUnit.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.OrgUnit,A,!1,void 0,"fk_org_units_parent"),o.__metadata("design:type",Object)],e.OrgUnit.prototype,"parent",void 0),o.__decorate([a.oneToMany(()=>e.OrgUnit,A,!1),o.__metadata("design:type",Array)],e.OrgUnit.prototype,"children",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.OrgUnit.prototype,"name",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.OrgUnit.prototype,"path",void 0),o.__decorate([n.type(Object),a.column(),o.__metadata("design:type",Object)],e.OrgUnit.prototype,"metadata",void 0),o.__decorate([a.oneToMany(()=>e.OrgUnitMembership,A,!1),o.__metadata("design:type",Array)],e.OrgUnit.prototype,"memberships",void 0),o.__decorate([a.oneToMany(()=>e.ProtectedResource,A,!1),o.__metadata("design:type",Array)],e.OrgUnit.prototype,"resources",void 0),o.__decorate([a.oneToMany(()=>e.InheritanceBlock,A,!1),o.__metadata("design:type",Array)],e.OrgUnit.prototype,"inheritanceBlocks",void 0),o.__decorate([a.oneToMany(()=>e.OrgUnitClosure,A,!1),o.__metadata("design:type",Array)],e.OrgUnit.prototype,"ancestorLinks",void 0),o.__decorate([a.oneToMany(()=>e.OrgUnitClosure,A,!1),o.__metadata("design:type",Array)],e.OrgUnit.prototype,"descendantLinks",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.OrgUnit.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.OrgUnit.prototype,"updatedAt",void 0),e.OrgUnit=o.__decorate([a.table("org_units"),n.model(),o.__metadata("design:paramtypes",[Object])],e.OrgUnit),e.StorageBinding=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.StorageBinding.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,P,!1,void 0,"fk_storage_bindings_tenant"),n.required(),o.__metadata("design:type",Object)],e.StorageBinding.prototype,"tenant",void 0),o.__decorate([n.required(),n.type(String),n.option(f),a.column(),o.__metadata("design:type",String)],e.StorageBinding.prototype,"storageKind",void 0),o.__decorate([n.required(),n.type(String),n.option(b),a.column(),o.__metadata("design:type",String)],e.StorageBinding.prototype,"bindingKind",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.StorageBinding.prototype,"bindingKey",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.StorageBinding.prototype,"region",void 0),o.__decorate([n.type(Object),a.column(),o.__metadata("design:type",Object)],e.StorageBinding.prototype,"config",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.StorageBinding.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.StorageBinding.prototype,"updatedAt",void 0),e.StorageBinding=o.__decorate([a.table("storage_bindings"),n.model(),o.__metadata("design:paramtypes",[Object])],e.StorageBinding),e.Tenant=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.Tenant.prototype,"id",void 0),o.__decorate([a.unique(),n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.Tenant.prototype,"slug",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.Tenant.prototype,"name",void 0),o.__decorate([n.required(),n.type(String),n.option(g),a.column(),o.__metadata("design:type",String)],e.Tenant.prototype,"isolationTier",void 0),o.__decorate([a.oneToMany(()=>e.OrgUnit,A,!1),o.__metadata("design:type",Array)],e.Tenant.prototype,"orgUnits",void 0),o.__decorate([a.oneToMany(()=>e.TenantMembership,A,!1),o.__metadata("design:type",Array)],e.Tenant.prototype,"memberships",void 0),o.__decorate([a.oneToMany(()=>e.Principal,A,!1),o.__metadata("design:type",Array)],e.Tenant.prototype,"principals",void 0),o.__decorate([a.oneToMany(()=>e.StorageBinding,A,!1),o.__metadata("design:type",Array)],e.Tenant.prototype,"storageBindings",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.Tenant.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.Tenant.prototype,"updatedAt",void 0),e.Tenant=o.__decorate([a.table("tenants"),n.model(),o.__metadata("design:paramtypes",[Object])],e.Tenant),e.TenantProfile=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.TenantProfile.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,P,!1,void 0,"fk_tenant_profiles_tenant"),n.required(),o.__metadata("design:type",Object)],e.TenantProfile.prototype,"tenant",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.TenantProfile.prototype,"profileKey",void 0),o.__decorate([n.type(Object),a.column(),o.__metadata("design:type",Object)],e.TenantProfile.prototype,"metadata",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.TenantProfile.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.TenantProfile.prototype,"updatedAt",void 0),e.TenantProfile=o.__decorate([a.table("tenant_profiles"),n.model(),o.__metadata("design:paramtypes",[Object])],e.TenantProfile),e.OrgUnitProfile=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.OrgUnitProfile.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.OrgUnit,P,!1,void 0,"fk_org_unit_profiles_org_unit"),n.required(),o.__metadata("design:type",Object)],e.OrgUnitProfile.prototype,"orgUnit",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.OrgUnitProfile.prototype,"profileKey",void 0),o.__decorate([n.type(Object),a.column(),o.__metadata("design:type",Object)],e.OrgUnitProfile.prototype,"metadata",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.OrgUnitProfile.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.OrgUnitProfile.prototype,"updatedAt",void 0),e.OrgUnitProfile=o.__decorate([a.table("org_unit_profiles"),n.model(),o.__metadata("design:paramtypes",[Object])],e.OrgUnitProfile),e.GroupMembership=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.GroupMembership.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,P,!1,void 0,"fk_group_memberships_tenant"),n.required(),o.__metadata("design:type",Object)],e.GroupMembership.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.Group,P,!1,void 0,"fk_group_memberships_group"),n.required(),o.__metadata("design:type",Object)],e.GroupMembership.prototype,"group",void 0),o.__decorate([a.manyToOne(()=>e.Principal,P,!1,void 0,"fk_group_memberships_principal"),n.required(),o.__metadata("design:type",Object)],e.GroupMembership.prototype,"principal",void 0),o.__decorate([n.type(Object),a.column(),o.__metadata("design:type",Object)],e.GroupMembership.prototype,"metadata",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.GroupMembership.prototype,"createdAt",void 0),e.GroupMembership=o.__decorate([a.table("group_memberships"),n.model(),o.__metadata("design:paramtypes",[Object])],e.GroupMembership),e.Group=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.Group.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,A,!1,void 0,"fk_groups_tenant"),n.required(),o.__metadata("design:type",Object)],e.Group.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.OrgUnit,w,!1,void 0,"fk_groups_org_unit"),o.__metadata("design:type",Object)],e.Group.prototype,"orgUnit",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.Group.prototype,"name",void 0),o.__decorate([n.type(Object),a.column(),o.__metadata("design:type",Object)],e.Group.prototype,"metadata",void 0),o.__decorate([a.oneToMany(()=>e.GroupMembership,A,!1),o.__metadata("design:type",Array)],e.Group.prototype,"members",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.Group.prototype,"createdAt",void 0),o.__decorate([a.updatedAt(),o.__metadata("design:type",Date)],e.Group.prototype,"updatedAt",void 0),e.Group=o.__decorate([a.table("groups"),n.model(),o.__metadata("design:paramtypes",[Object])],e.Group),e.EffectivePermission=class extends C{constructor(e){super(e)}},o.__decorate([a.pk({type:String}),a.uuid(),o.__metadata("design:type",String)],e.EffectivePermission.prototype,"id",void 0),o.__decorate([a.manyToOne(()=>e.Tenant,P,!1,void 0,"fk_effective_permissions_tenant"),n.required(),o.__metadata("design:type",Object)],e.EffectivePermission.prototype,"tenant",void 0),o.__decorate([a.manyToOne(()=>e.Principal,P,!1,void 0,"fk_effective_permissions_principal"),n.required(),o.__metadata("design:type",Object)],e.EffectivePermission.prototype,"principal",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.EffectivePermission.prototype,"permissionKey",void 0),o.__decorate([n.required(),n.type(String),n.option(v),a.column(),o.__metadata("design:type",String)],e.EffectivePermission.prototype,"scopeKind",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.EffectivePermission.prototype,"scopeId",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.EffectivePermission.prototype,"sourceKind",void 0),o.__decorate([n.required(),n.type(String),a.column(),o.__metadata("design:type",String)],e.EffectivePermission.prototype,"sourceId",void 0),o.__decorate([a.column(),o.__metadata("design:type",Date)],e.EffectivePermission.prototype,"startsAt",void 0),o.__decorate([a.column(),o.__metadata("design:type",Date)],e.EffectivePermission.prototype,"expiresAt",void 0),o.__decorate([a.createdAt(),o.__metadata("design:type",Date)],e.EffectivePermission.prototype,"createdAt",void 0),e.EffectivePermission=o.__decorate([a.table("effective_permissions"),n.model(),o.__metadata("design:paramtypes",[Object])],e.EffectivePermission);class G extends q{constructor(){super(e.TenantProfile)}async createProfile(e,t,i,...r){return this.create({tenant:e,profileKey:t,metadata:i},...r)}async listForTenant(e,...t){return(await this.listAll(...t)).filter(t=>j(t.tenant,e))}async deleteForTenant(e,...t){for(const i of await this.listForTenant(e,...t))await this.deleteById(i.id,...t)}}class F extends q{constructor(){super(e.OrgUnitProfile)}async createProfile(e,t,i,...r){return this.create({orgUnit:e,profileKey:t,metadata:i},...r)}async listForOrgUnit(e,...t){return(await this.listAll(...t)).filter(t=>k(t.orgUnit,e))}}class E extends q{constructor(){super(e.OrgUnitClosure)}async listAncestors(e,t,...i){return(await this.listAll(...i)).filter(i=>j(i.tenant,e)&&k(i.descendant,t)).sort((e,t)=>e.depth-t.depth)}async listDescendants(e,t,...i){return(await this.listAll(...i)).filter(i=>j(i.tenant,e)&&k(i.ancestor,t)).sort((e,t)=>e.depth-t.depth)}async isAncestorOf(e,t,i,...r){return(await this.listAncestors(e,i,...r)).some(e=>k(e.ancestor,t))}async createSelfLink(e,t,...i){return this.create({tenant:e,ancestor:t,descendant:t,depth:0},...i)}async insertAncestorLinksForNewChild(e,t,i,...r){const a=await this.listAncestors(e,t,...r);for(const t of a)await this.create({tenant:e,ancestor:t.ancestor,descendant:i,depth:t.depth+1},...r)}async deleteLinksForSubtree(e,t,...i){const r=await this.listDescendants(e,t,...i),a=new Set([t,...r.map(e=>D(e.descendant))]),n=new Set([t,...r.map(e=>D(e.ancestor))]),o=(await this.listAll(...i)).filter(t=>j(t.tenant,e)&&(a.has(D(t.descendant))||n.has(D(t.ancestor))));for(const e of o)await this.deleteById(e.id,...i)}}class N extends q{constructor(){super(e.InheritanceBlock)}async blockCategory(e,t,i,r,a,...n){return this.create({tenant:e,orgUnit:t,blockedFromAncestor:r,permissionCategory:i,reason:a},...n)}async unblockCategory(e,...t){await this.deleteById(e,...t)}async listForOrgUnit(e,t,...i){return(await this.listAll(...i)).filter(i=>j(i.tenant,e)&&k(i.orgUnit,t))}async categoryBlockedForAncestor(e,t,i,r,...a){return(await this.listForOrgUnit(e,t,...a)).some(e=>e.permissionCategory===r&&(!e.blockedFromAncestor||k(e.blockedFromAncestor,i)))}}class L extends q{constructor(){super(e.Tenant)}async createTenant(t,...i){return this.create({slug:t.slug,name:t.name,isolationTier:t.isolationTier??e.IsolationTier.Pooled},...i)}async getBySlug(e,...t){return this.findOneBy("slug",e,...t)}async renameTenant(e,t,...i){return this.updateOne(e,{name:t},...i)}async changeSlug(e,t,...i){return this.updateOne(e,{slug:t},...i)}async setIsolationTier(e,t,...i){return this.updateOne(e,{isolationTier:t},...i)}async deleteTenantControlled(e,...t){await this.deleteById(e,...t)}}async function V(e,t,...i){for(const r of t)await e.deleteById(r.id,...i)}class $ extends q{constructor(){super(e.OrgUnit)}orgUnitPath(e,t){const i=B(t);return e?`${e.replace(/\/+$/,"")}/${i}`:"/"+i}async createProfileIfNeeded(e,t,i,...r){t&&await(new F).createProfile(e,t,i,...r)}async createRoot(e,t,i,r,a,...n){const o=await this.create({tenant:e,name:t,path:this.orgUnitPath(void 0,t),metadata:i},...n);return await this.createProfileIfNeeded(o.id,r,a,...n),await(new E).createSelfLink(e,o.id,...n),o}async createChild(e,...t){const i=e.parentOrgUnitId?await this.getById(e.parentOrgUnitId,...t):void 0,r=await this.create({tenant:e.tenantId,parent:i?.id??e.parentOrgUnitId,name:e.name,path:this.orgUnitPath(i?.path,e.name),metadata:e.metadata},...t);await this.createProfileIfNeeded(r.id,e.profileKey,e.profileMetadata,...t);const a=new E;return await a.createSelfLink(e.tenantId,r.id,...t),e.parentOrgUnitId&&await a.insertAncestorLinksForNewChild(e.tenantId,e.parentOrgUnitId,r.id,...t),r}async listChildren(e,...t){return(await this.listAll(...t)).filter(t=>k(t.parent,e))}async listTenantOrgUnits(e,...t){return(await this.listAll(...t)).filter(t=>j(t.tenant,e))}async listDescendantOrgUnits(e,t,i=!1,...r){const a=await(new E).listDescendants(e,t,...r),n=new Set(a.map(e=>D(e.descendant)));return i&&n.add(t),(await this.listTenantOrgUnits(e,...r)).filter(e=>n.has(e.id))}async listAncestorOrgUnits(e,t,i=!1,...r){const a=await(new E).listAncestors(e,t,...r),n=new Set(a.map(e=>D(e.ancestor)));return i&&n.add(t),(await this.listTenantOrgUnits(e,...r)).filter(e=>n.has(e.id))}async renameOrgUnit(e,t,...i){const r=await this.getById(e,...i);return this.updateOne(e,{name:t,path:this.orgUnitPath(r.path.includes("/")?r.path.replace(/\/[^/]+$/,""):void 0,t)},...i)}async moveOrgUnit(e,t,i,...r){const a=await this.getById(i,...r),n=await this.getById(t,...r),o=await this.updateOne(t,{parent:a.id,path:this.orgUnitPath(a.path,n.name)},...r);return await this.rebuildTenantClosure(e,...r),o}async rebuildTenantClosure(e,...t){const i=new E,r=await i.listAll(...t);await V(i,r.filter(t=>j(t.tenant,e)),...t);const a=(await this.listTenantOrgUnits(e,...t)).sort((e,t)=>e.path.split("/").filter(Boolean).length-t.path.split("/").filter(Boolean).length);for(const r of a)await i.createSelfLink(e,r.id,...t),r.parent&&await i.insertAncestorLinksForNewChild(e,D(r.parent),r.id,...t)}async deleteOrgUnitTree(e,t,...i){const r=new E,a=await this.listDescendantOrgUnits(e,t,!0,...i),n=new Set(a.map(e=>e.id)),o=(await this.listTenantOrgUnits(e,...i)).filter(e=>n.has(e.id));await V(this,o,...i),await r.deleteLinksForSubtree(e,t,...i)}}o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[String,String,Object,String,Object,Object]),o.__metadata("design:returntype",Promise)],$.prototype,"createRoot",null),o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[Object,Object]),o.__metadata("design:returntype",Promise)],$.prototype,"createChild",null),o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[String,String,String,Object]),o.__metadata("design:returntype",Promise)],$.prototype,"moveOrgUnit",null),o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[String,Object]),o.__metadata("design:returntype",Promise)],$.prototype,"rebuildTenantClosure",null),o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[String,String,Object]),o.__metadata("design:returntype",Promise)],$.prototype,"deleteOrgUnitTree",null);class z extends q{constructor(){super(e.User)}async createUser(e,...t){return this.create({email:e.email,phone:e.phone,displayName:e.displayName},...t)}async getByEmail(e,...t){return(await this.listAll(...t)).find(t=>t.email===e)}async updateDisplayName(e,t,...i){return this.updateOne(e,{displayName:t},...i)}async updateEmail(e,t,...i){return this.updateOne(e,{email:t},...i)}async updatePhone(e,t,...i){return this.updateOne(e,{phone:t},...i)}}class W extends q{constructor(){super(e.Principal)}async createPrincipal(e,t,i,...r){return this.create({tenant:e,kind:t,subjectId:i},...r)}async getForSubject(e,t,i,...r){return(await this.listAll(...r)).find(r=>j(r.tenant,e)&&r.kind===t&&r.subjectId===i)}async getOrCreateForSubject(e,t,i,...r){return await this.getForSubject(e,t,i,...r)??await this.createPrincipal(e,t,i,...r)}async getUserPrincipal(t,i,...r){return this.getOrCreateForSubject(t,e.PrincipalKind.User,i,...r)}async getGroupPrincipal(t,i,...r){return this.getOrCreateForSubject(t,e.PrincipalKind.Group,i,...r)}}class Q extends q{constructor(){super(e.TenantMembership)}async addUserToTenant(t,i,r=e.MembershipStatus.Active,...a){return this.create({tenant:t,user:i,status:r},...a)}async setStatus(e,t,...i){return this.updateOne(e,{status:t},...i)}async listUserTenants(e,...t){return(await this.listAll(...t)).filter(t=>k(t.user,e))}async listTenantUsers(e,...t){return(await this.listAll(...t)).filter(t=>j(t.tenant,e))}async removeUserFromTenant(e,...t){await this.deleteById(e,...t)}}class Y extends q{constructor(){super(e.OrgUnitMembership)}async addUserToOrgUnit(t,i,r,a=e.MembershipStatus.Active,...n){return this.create({tenant:t,orgUnit:i,user:r,status:a},...n)}async setStatus(e,t,...i){return this.updateOne(e,{status:t},...i)}async listUserOrgUnits(e,...t){return(await this.listAll(...t)).filter(t=>k(t.user,e))}async listOrgUnitUsers(e,...t){return(await this.listAll(...t)).filter(t=>k(t.orgUnit,e))}async removeUserFromOrgUnit(e,...t){await this.deleteById(e,...t)}}class H extends q{constructor(){super(e.GroupMembership)}async addPrincipalToGroup(e,t,i,r,...a){return this.create({tenant:e,group:t,principal:i,metadata:r},...a)}async listGroupMembers(e,...t){return(await this.listAll(...t)).filter(t=>k(t.group,e))}async listPrincipalGroups(e,...t){return(await this.listAll(...t)).filter(t=>k(t.principal,e))}async removePrincipalFromGroup(e,...t){await this.deleteById(e,...t)}async resolveGroupPrincipalIdsForPrincipal(e,...t){const i=new W,r=await this.listPrincipalGroups(e,...t);return await Promise.all(r.map(async e=>{const r=D(e.tenant),a=D(e.group);return(await i.getGroupPrincipal(r,a,...t)).id}))}}class J extends q{constructor(){super(e.Permission)}async createPermission(e,...t){return this.create({key:e.key,category:e.category,description:e.description},...t)}async getByKey(e,...t){return(await this.listAll(...t)).find(t=>t.key===e)}async listByCategory(e,...t){return(await this.listAll(...t)).filter(t=>t.category===e)}async updateDescription(e,t,...i){return this.updateOne(e,{description:t},...i)}}class X extends q{constructor(){super(e.Role)}async createRole(e,...t){return this.create({tenant:e.tenantId,key:e.key,name:e.name,description:e.description,metadata:e.metadata},...t)}async getSystemRoleByKey(e,...t){const i=(await this.listAll(...t)).find(t=>!t.tenant&&t.key===e);if(!i)throw Error(`Role "${e}" not found`);return i}async getTenantRoleByKey(e,t,...i){const r=(await this.listAll(...i)).find(i=>j(i.tenant,e)&&i.key===t);if(!r)throw Error(`Role "${t}" not found for tenant ${e}`);return r}async renameRole(e,t,...i){return this.updateOne(e,{name:t},...i)}async updateRoleMetadata(e,t,...i){return this.updateOne(e,{metadata:t},...i)}async listTenantRoles(e,t=!1,...i){return(await this.listAll(...i)).filter(i=>t&&!i.tenant||j(i.tenant,e))}}class Z extends q{constructor(){super(e.RolePermission)}async addPermissionToRole(e,t,...i){return this.create({role:e,permission:t},...i)}async addPermissionKeyToRole(e,t,...i){const r=await(new J).getByKey(t,...i);return this.addPermissionToRole(e,r.id,...i)}async removePermissionFromRole(e,...t){await this.deleteById(e,...t)}async listRolePermissions(e,...t){return(await this.listAll(...t)).filter(t=>k(t.role,e))}async listPermissionRoles(e,...t){return(await this.listAll(...t)).filter(t=>k(t.permission,e))}async replaceRolePermissions(e,t,...i){const r=await this.listRolePermissions(e,...i);return await(async(e,t,...i)=>{for(const r of t)await e.deleteById(r.id,...i)})(this,r,...i),Promise.all(t.map(t=>this.addPermissionToRole(e,t,...i)))}async createRoleWithPermissions(e,t,...i){const r=await(new X).createRole(e,...i);for(const e of t)await this.addPermissionKeyToRole(r.id,e,...i);return r}}class ee extends q{constructor(){super(e.RoleAssignment)}async assignRole(e,...t){return this.create({tenant:e.tenantId,principal:e.principalId,role:e.roleId,scopeKind:e.scopeKind,scopeId:e.scopeId,inheritDown:e.inheritDown??!1,startsAt:e.startsAt,expiresAt:e.expiresAt,conditions:e.conditions},...t)}async revokeAssignment(e,...t){await this.deleteById(e,...t)}async listPrincipalAssignments(e,t,...i){return(await this.listAll(...i)).filter(i=>j(i.tenant,e)&&k(i.principal,t))}async listRoleAssignments(e,...t){return(await this.listAll(...t)).filter(t=>k(t.role,e))}async listTenantAssignments(e,...t){return(await this.listAll(...t)).filter(t=>j(t.tenant,e))}async updateAssignmentWindow(e,t,i,...r){return this.updateOne(e,{startsAt:t,expiresAt:i},...r)}}class te extends q{constructor(){super(e.EffectivePermission)}async listForPrincipal(e,t,...i){return(await this.listAll(...i)).filter(i=>j(i.tenant,e)&&k(i.principal,t))}async listForScope(e,t,i,...r){return(await this.listAll(...r)).filter(r=>j(r.tenant,e)&&r.scopeKind===t&&r.scopeId===i)}async hasPermission(e,t,i,r,a,n,...o){return(await this.listForPrincipal(e,t,...o)).some(e=>!(e.permissionKey!==i||e.scopeKind!==r||e.scopeId!==a||e.startsAt&&n&&e.startsAt>n||e.expiresAt&&n&&e.expiresAt<n))}async deleteForPrincipal(e,t,...i){for(const r of await this.listForPrincipal(e,t,...i))await this.deleteById(r.id,...i)}async deleteForTenant(e,...t){for(const i of(await this.listAll(...t)).filter(t=>j(t.tenant,e)))await this.deleteById(i.id,...t)}async rebuildForPrincipal(t,i,...r){await this.deleteForPrincipal(t,i,...r);const a=new ee,n=new Z,o=new J,s=new H,d=new W,c=new E,p=new N,_=[],l=await a.listPrincipalAssignments(t,i,...r),y=await s.listPrincipalGroups(i,...r),u=[...l,...(await Promise.all(y.map(async e=>{const i=await d.getGroupPrincipal(D(e.tenant),D(e.group),...r);return a.listPrincipalAssignments(t,i.id,...r)}))).flat()];for(const a of u){const s=await n.listRolePermissions(D(a.role),...r),d=await Promise.all(s.map(async e=>o.findOneBy("id",D(e.permission),...r)));for(const n of d){if(!n)continue;const o=a.scopeKind,s=a.scopeId,d=[];if(o===e.ScopeKind.Tenant)d.push({scopeKind:o,scopeId:t});else if(o===e.ScopeKind.Resource)d.push({scopeKind:o,scopeId:s});else if(o!==e.ScopeKind.OrgUnit||a.inheritDown){if(o===e.ScopeKind.OrgUnit&&a.inheritDown){const e=await c.listDescendants(t,s,...r);d.push(...e.map(e=>({scopeKind:o,scopeId:D(e.descendant)})))}}else d.push({scopeKind:o,scopeId:s});for(const c of d)o===e.ScopeKind.OrgUnit&&a.inheritDown&&c.scopeId!==s&&await p.categoryBlockedForAncestor(t,c.scopeId,s,n.category,...r)||_.push({id:"",tenantId:t,principalId:i,permissionKey:n.key,scopeKind:c.scopeKind,scopeId:c.scopeId,sourceKind:"role_assignment",sourceId:a.id,startsAt:a.startsAt,expiresAt:a.expiresAt})}}return await Promise.all(_.map(e=>this.create({tenant:e.tenantId,principal:e.principalId,permissionKey:e.permissionKey,scopeKind:e.scopeKind,scopeId:e.scopeId,sourceKind:e.sourceKind,sourceId:e.sourceId,startsAt:e.startsAt,expiresAt:e.expiresAt},...r)))}async rebuildForTenant(e,...t){const i=(await(new W).listAll(...t)).filter(t=>j(t.tenant,e));for(const r of i)await this.rebuildForPrincipal(e,r.id,...t)}}o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[String,String,Object]),o.__metadata("design:returntype",Promise)],te.prototype,"rebuildForPrincipal",null),o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[String,Object]),o.__metadata("design:returntype",Promise)],te.prototype,"rebuildForTenant",null);class ie extends q{constructor(){super(e.ProtectedResource)}async registerResource(e,...t){return this.create({tenant:e.tenantId,orgUnit:e.orgUnitId,resourceType:e.resourceType,resourceId:e.resourceId,visibility:e.visibility,owner:e.ownerPrincipalId,sensitivity:e.sensitivity,metadata:e.metadata},...t)}async getByDomainResource(e,t,i,...r){return(await this.listAll(...r)).find(r=>j(r.tenant,e)&&r.resourceType===t&&r.resourceId===i)}async moveResourceToOrgUnit(e,t,...i){return this.updateOne(e,{orgUnit:t},...i)}async setVisibility(e,t,...i){return this.updateOne(e,{visibility:t},...i)}async transferOwnership(e,t,...i){return this.updateOne(e,{owner:t},...i)}async listOrgUnitResources(e,...t){return(await this.listAll(...t)).filter(t=>k(t.orgUnit,e))}async listTenantResources(e,...t){return(await this.listAll(...t)).filter(t=>j(t.tenant,e))}}class re extends q{constructor(){super(e.ResourceGrant)}async grantResource(e,...t){return this.create({tenant:e.tenantId,resource:e.resourceId,principal:e.principalId,permissionKey:e.permissionKey,startsAt:e.startsAt,expiresAt:e.expiresAt,conditions:e.conditions,createdBy:e.createdByPrincipalId},...t)}async revokeGrant(e,...t){await this.deleteById(e,...t)}async listResourceGrants(e,...t){return(await this.listAll(...t)).filter(t=>k(t.resource,e))}async listPrincipalGrants(e,t,...i){return(await this.listAll(...i)).filter(i=>j(i.tenant,e)&&k(i.principal,t))}async hasGrant(e,t,i,r,a,...n){return(await this.listPrincipalGrants(e,t,...n)).some(e=>k(e.resource,i)&&e.permissionKey===r&&(!e.startsAt||!a||e.startsAt<=a)&&(!e.expiresAt||!a||e.expiresAt>=a))}async deleteAllForResource(e,...t){for(const i of await this.listResourceGrants(e,...t))await this.deleteById(i.id,...t)}}class ae{constructor(){this.tenantService=new L,this.tenantProfileService=new G,this.orgUnitService=new $,this.orgUnitProfileService=new F,this.userService=new z,this.membershipService=new Q,this.principalService=new W,this.permissionService=new J,this.roleService=new X,this.rolePermissionService=new Z,this.roleAssignmentService=new ee,this.effectivePermissionService=new te}async bootstrapTenantFromTemplate(t,...i){const r=await this.tenantService.createTenant(t.tenant,...i);t.tenant.profileKey&&await this.tenantProfileService.createProfile(r.id,t.tenant.profileKey,t.tenant.profileMetadata,...i);const a=async(e,t)=>{const n=void 0===e?await this.orgUnitService.createRoot(r.id,t.name,t.metadata,t.profileKey,t.metadata,...i):await this.orgUnitService.createChild({tenantId:r.id,parentOrgUnitId:e,name:t.name,metadata:t.metadata,profileKey:t.profileKey,profileMetadata:t.metadata},...i);for(const e of t.children??[])await a(n.id,e);return n},n=await a(void 0,t.rootOrgUnit),o=await this.userService.createUser(t.ownerUser,...i);await this.membershipService.addUserToTenant(r.id,o.id,e.MembershipStatus.Active,...i);const s=await this.principalService.getUserPrincipal(r.id,o.id,...i);for(const e of t.permissions)await this.permissionService.createPermission(e,...i);for(const e of t.roles){const t=await this.roleService.createRole({tenantId:r.id,key:e.key,name:e.name,description:e.description},...i);for(const r of e.permissionKeys)await this.rolePermissionService.addPermissionKeyToRole(t.id,r,...i)}const d=await this.roleService.getTenantRoleByKey(r.id,t.ownerRoleKey,...i);return await this.roleAssignmentService.assignRole({tenantId:r.id,principalId:s.id,roleId:d.id,scopeKind:e.ScopeKind.OrgUnit,scopeId:n.id,inheritDown:!0},...i),await this.effectivePermissionService.rebuildForPrincipal(r.id,s.id,...i),{tenantId:r.id,rootOrgUnitId:n.id,ownerUserId:o.id,ownerPrincipalId:s.id}}}o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[Object,Object]),o.__metadata("design:returntype",Promise)],ae.prototype,"bootstrapTenantFromTemplate",null);class ne{constructor(){this.membershipService=new Q,this.orgMembershipService=new Y,this.principalService=new W,this.roleService=new X,this.roleAssignmentService=new ee,this.effectivePermissionService=new te}async onboardUserToTenantAndOrgUnit(t,i,r,a,...n){await this.membershipService.addUserToTenant(t,i,e.MembershipStatus.Active,...n),await this.orgMembershipService.addUserToOrgUnit(t,r,i,e.MembershipStatus.Active,...n);const o=await this.principalService.getUserPrincipal(t,i,...n),s=await this.roleService.getTenantRoleByKey(t,a,...n);return await this.roleAssignmentService.assignRole({tenantId:t,principalId:o.id,roleId:s.id,scopeKind:e.ScopeKind.OrgUnit,scopeId:r,inheritDown:!0},...n),await this.effectivePermissionService.rebuildForPrincipal(t,o.id,...n),{principalId:o.id}}async changeUserOrgRole(t,i,r,a,n,...o){const s=await this.roleService.getTenantRoleByKey(t,a,...o),d=await this.roleAssignmentService.listPrincipalAssignments(t,i,...o);for(const t of d.filter(t=>t.scopeKind===e.ScopeKind.OrgUnit&&t.scopeId===r))await this.roleAssignmentService.revokeAssignment(t.id,...o);await this.roleAssignmentService.assignRole({tenantId:t,principalId:i,roleId:s.id,scopeKind:e.ScopeKind.OrgUnit,scopeId:r,inheritDown:n},...o),await this.effectivePermissionService.rebuildForPrincipal(t,i,...o)}async suspendUserInTenant(t,i,r,...a){await this.membershipService.setStatus(t,e.MembershipStatus.Suspended,...a),await this.effectivePermissionService.deleteForPrincipal(i,r,...a)}async reactivateUserInTenant(t,i,r,...a){await this.membershipService.setStatus(t,e.MembershipStatus.Active,...a),await this.effectivePermissionService.rebuildForPrincipal(i,r,...a)}}o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[String,String,String,String,Object]),o.__metadata("design:returntype",Promise)],ne.prototype,"onboardUserToTenantAndOrgUnit",null),o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[String,String,String,String,Boolean,Object]),o.__metadata("design:returntype",Promise)],ne.prototype,"changeUserOrgRole",null),o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[String,String,String,Object]),o.__metadata("design:returntype",Promise)],ne.prototype,"suspendUserInTenant",null),o.__decorate([a.transactional(),o.__metadata("design:type",Function),o.__metadata("design:paramtypes",[String,String,String,Object]),o.__metadata("design:returntype",Promise)],ne.prototype,"reactivateUserInTenant",null),Object.defineProperty(e,"AuthorizationError",{enumerable:!0,get:()=>a.AuthorizationError}),Object.defineProperty(e,"transactional",{enumerable:!0,get:()=>a.transactional}),e.AuthorizationModel=C,e.AuthzService=class{constructor(e={}){this.dataSources=e}async canAccess(t,...i){const r=t.at??new Date;if(t.scopeKind&&t.scopeId)return K(await(this.dataSources.listEffectivePermissionsForScope?.(t.tenantId,t.scopeKind,t.scopeId))).some(e=>e.permissionKey===t.permissionKey&&M(r,e.startsAt,e.expiresAt));if(!t.resourceProtectedId)return!1;const a=await(this.dataSources.loadResource?.(t.tenantId,t.resourceProtectedId));if(!a)return!1;if(a.tenantId!==t.tenantId)return!1;if(a.ownerPrincipalId===t.principalId)return!0;if(K(await(this.dataSources.listResourceGrants?.(t.tenantId,t.resourceProtectedId))).filter(e=>e.principalId===t.principalId&&e.permissionKey===t.permissionKey&&M(r,e.startsAt,e.expiresAt)).length>0)return!0;const n=a.visibility;return n!==e.ResourceVisibility.Private&&n!==e.ResourceVisibility.ResourceAcl&&(n===e.ResourceVisibility.OrgUnit||n===e.ResourceVisibility.OrgSubtree?K(await(this.dataSources.listEffectivePermissionsForScope?.(t.tenantId,e.ScopeKind.OrgUnit,a.orgUnitId))).some(e=>e.permissionKey===t.permissionKey&&M(r,e.startsAt,e.expiresAt)):n===e.ResourceVisibility.Tenant&&K(await(this.dataSources.listEffectivePermissionsForScope?.(t.tenantId,e.ScopeKind.Tenant,t.tenantId))).some(e=>e.permissionKey===t.permissionKey&&M(r,e.startsAt,e.expiresAt)))}async requireAccess(t,...i){if(!await this.canAccess(t,...i))throw new a.AuthorizationError(`Access denied for ${t.permissionKey} on ${t.resourceProtectedId??(r=t.scopeKind??e.ScopeKind.Resource,n=t.scopeId??"",`${r}:${n}`)}`);var r,n}async buildAccessContext(e,t,...i){return x({tenantId:e,principalId:t,permissions:K(await(this.dataSources.listEffectivePermissions?.(e,t))),grants:K(await(this.dataSources.listPrincipalGrants?.(e,t)))})}async buildArangoContext(e,t,i,...r){const a=await this.buildAccessContext(e,t,...r),n=a.allowedOrgUnitIdsByPermission[i]??[],o=a.resourceGrants.filter(e=>e.permissionKey===i).map(e=>e.resourceId);return U({tenantId:e,principalId:t,permissionKey:i,allowedOrgUnitIds:n,allowedResourceIds:o})}async buildQdrantFilter(e,t,i,...r){const a=await this.buildAccessContext(e,t,...r);return I({tenantId:e,principalId:t,allowedOrgUnitIds:a.allowedOrgUnitIdsByPermission[i]??[],allowedResourceIds:a.resourceGrants.filter(e=>e.permissionKey===i).map(e=>e.resourceId)})}},e.BaseModelService=q,e.BootstrapService=ae,e.COMMIT="1deb3bb",e.EffectivePermissionService=te,e.FULL_VERSION="0.3.9-1deb3bb",e.GroupMembershipService=H,e.GroupService=class extends q{constructor(){super(e.Group)}async createGroup(e,t,i,r,...a){return this.create({tenant:e,orgUnit:i,name:t,metadata:r},...a)}async renameGroup(e,t,...i){return this.updateOne(e,{name:t},...i)}async moveGroupToOrgUnit(e,t,...i){return this.updateOne(e,{orgUnit:t},...i)}async listTenantGroups(e,...t){return(await this.listAll(...t)).filter(t=>j(t.tenant,e))}},e.InheritanceBlockService=N,e.IsolationTierOptions=g,e.MembershipStatusOptions=m,e.OrgUnitClosureService=E,e.OrgUnitMembershipService=Y,e.OrgUnitProfileService=F,e.OrgUnitService=$,e.PACKAGE_NAME="@decaf-ts/integrations",e.PermissionCategoryOptions=S,e.PermissionService=J,e.PrincipalKindOptions=h,e.PrincipalService=W,e.ProtectedResourceService=ie,e.REL_CASCADE_DEPENDENT=P,e.REL_CASCADE_INSERT_UPDATE=T,e.REL_NULLIFY=w,e.REL_RESTRICT=A,e.ResourceGrantService=re,e.ResourceLifecycleService=class{async unregisterResource(e,...t){await(new re).deleteAllForResource(e,...t),await(new ie).deleteById(e,...t)}async resolveResourceScope(e,...t){const i=await(new ie).getById(e,...t);return{tenantId:D(i.tenant),orgUnitId:D(i.orgUnit),visibility:i.visibility,ownerPrincipalId:i.owner?D(i.owner):void 0}}},e.ResourceVisibilityOptions=O,e.RoleAssignmentService=ee,e.RolePermissionService=Z,e.RoleService=X,e.ScopeKindOptions=v,e.StorageBindingKindOptions=b,e.StorageBindingService=class extends q{constructor(){super(e.StorageBinding)}async createBinding(e,...t){return this.create({tenant:e.tenantId,storageKind:e.storageKind,bindingKind:e.bindingKind,bindingKey:e.bindingKey,region:e.region,config:e.config},...t)}async listTenantBindings(e,...t){return(await this.listAll(...t)).filter(t=>D(t.tenant)===e)}async getBinding(e,t,...i){return(await this.listTenantBindings(e,...i)).find(e=>e.storageKind===t)}async setBindingConfig(e,t,...i){return this.updateOne(e,{config:t},...i)}async promoteToDedicated(t,i,r,a,...n){return this.updateOne(t,{bindingKind:e.StorageBindingKind.Dedicated,bindingKey:i,region:r,config:a},...n)}async setShared(t,i,r,a,...n){return this.updateOne(t,{bindingKind:e.StorageBindingKind.Shared,bindingKey:i,region:r,config:a},...n)}},e.StorageKindOptions=f,e.SystemManagementService=ne,e.TenantMembershipService=Q,e.TenantProfileService=G,e.TenantService=L,e.UserService=z,e.VERSION="0.3.9",e.asArray=K,e.buildAccessContext=x,e.buildArangoContext=U,e.buildQdrantFilter=I,e.execWithLogging=async(e,a,n,o=i.LogLevel.info)=>(n.debug("Executing: "+e),new Promise((i,s)=>{const d=t.exec(e,a),c=[],p=[];d.stdout?.on("data",e=>{c.push(e),n[o](e.trim())}),d.stderr?.on("data",e=>{p.push(e),n.debug(e.trim())}),d.on("close",e=>{0===e?(n.silly("Command completed successfully"),i({stdout:c.join("\n"),stderr:p.join("\n")})):(n.critical(`Command failed with code ${e}:\n ${p.join("\n")}`),s(new r.InternalError(`Command failed with code ${e}: ${p.join("\n")}`)))}),d.on("error",e=>{n.critical("Command execution error",e),s(e)})})),e.id=()=>crypto.randomUUID(),e.isTimeValid=M,e.lowerSlug=B,e.nowIso=()=>new Date,e.relationId=D,e.relationMatch=k,e.sameTenant=j},"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("child_process"),require("@decaf-ts/logging"),require("@decaf-ts/db-decorators"),require("@decaf-ts/core"),require("@decaf-ts/decorator-validation"),require("tslib")):"function"==typeof define&&define.amd?define(["exports","child_process","@decaf-ts/logging","@decaf-ts/db-decorators","@decaf-ts/core","@decaf-ts/decorator-validation","tslib"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).integrations={},e.childProcess,e.decafTsLogging,e.decafTsDbDecorators,e.decafTsCore,e.decafTsDecoratorValidation,e.tslib);
2
- //# sourceMappingURL=integrations.cjs.map
1
+ (function(global, factory) {
2
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("child_process"), require("@decaf-ts/logging"), require("@decaf-ts/db-decorators"), require("@decaf-ts/core"), require("@decaf-ts/decorator-validation"), require("tslib")) : typeof define === "function" && define.amd ? define([ "exports", "child_process", "@decaf-ts/logging", "@decaf-ts/db-decorators", "@decaf-ts/core", "@decaf-ts/decorator-validation", "tslib" ], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self,
3
+ factory(global.integrations = {}, global.childProcess, global.decafTsLogging, global.decafTsDbDecorators, global.decafTsCore, global.decafTsDecoratorValidation, global.tslib));
4
+ })(this, function(exports, child_process, logging, dbDecorators, core, decoratorValidation, tslib) {
5
+ "use strict";
6
+ async function execWithLogging(command, options, log, level = logging.LogLevel.info) {
7
+ log.debug(`Executing: ${command}`);
8
+ return new Promise((resolve, reject) => {
9
+ const child = child_process.exec(command, options);
10
+ const stdout = [];
11
+ const stderr = [];
12
+ child.stdout?.on("data", data => {
13
+ stdout.push(data);
14
+ log[level](data.trim());
15
+ });
16
+ child.stderr?.on("data", data => {
17
+ stderr.push(data);
18
+ log.debug(data.trim());
19
+ });
20
+ child.on("close", code => {
21
+ if (code === 0) {
22
+ log.silly(`Command completed successfully`);
23
+ resolve({
24
+ stdout: stdout.join("\n"),
25
+ stderr: stderr.join("\n")
26
+ });
27
+ } else {
28
+ log.critical(`Command failed with code ${code}:\n ${stderr.join("\n")}`);
29
+ reject(new dbDecorators.InternalError(`Command failed with code ${code}: ${stderr.join("\n")}`));
30
+ }
31
+ });
32
+ child.on("error", err => {
33
+ log.critical(`Command execution error`, err);
34
+ reject(err);
35
+ });
36
+ });
37
+ }
38
+ exports.IsolationTier = void 0;
39
+ (function(IsolationTier) {
40
+ IsolationTier["Pooled"] = "pooled";
41
+ IsolationTier["Bridge"] = "bridge";
42
+ IsolationTier["Silo"] = "silo";
43
+ })(exports.IsolationTier || (exports.IsolationTier = {}));
44
+ exports.MembershipStatus = void 0;
45
+ (function(MembershipStatus) {
46
+ MembershipStatus["Invited"] = "invited";
47
+ MembershipStatus["Active"] = "active";
48
+ MembershipStatus["Suspended"] = "suspended";
49
+ MembershipStatus["Removed"] = "removed";
50
+ })(exports.MembershipStatus || (exports.MembershipStatus = {}));
51
+ exports.PrincipalKind = void 0;
52
+ (function(PrincipalKind) {
53
+ PrincipalKind["User"] = "user";
54
+ PrincipalKind["Group"] = "group";
55
+ PrincipalKind["ServiceAccount"] = "service_account";
56
+ PrincipalKind["Agent"] = "agent";
57
+ PrincipalKind["ApiKey"] = "api_key";
58
+ })(exports.PrincipalKind || (exports.PrincipalKind = {}));
59
+ exports.ScopeKind = void 0;
60
+ (function(ScopeKind) {
61
+ ScopeKind["Tenant"] = "tenant";
62
+ ScopeKind["OrgUnit"] = "org_unit";
63
+ ScopeKind["Resource"] = "resource";
64
+ })(exports.ScopeKind || (exports.ScopeKind = {}));
65
+ exports.PermissionCategory = void 0;
66
+ (function(PermissionCategory) {
67
+ PermissionCategory["Admin"] = "admin";
68
+ PermissionCategory["ContentRead"] = "content_read";
69
+ PermissionCategory["ContentWrite"] = "content_write";
70
+ PermissionCategory["Memory"] = "memory";
71
+ PermissionCategory["Graph"] = "graph";
72
+ PermissionCategory["Vector"] = "vector";
73
+ PermissionCategory["Export"] = "export";
74
+ PermissionCategory["Billing"] = "billing";
75
+ PermissionCategory["Audit"] = "audit";
76
+ PermissionCategory["Security"] = "security";
77
+ PermissionCategory["Data"] = "data";
78
+ PermissionCategory["Automation"] = "automation";
79
+ })(exports.PermissionCategory || (exports.PermissionCategory = {}));
80
+ exports.ResourceVisibility = void 0;
81
+ (function(ResourceVisibility) {
82
+ ResourceVisibility["Private"] = "private";
83
+ ResourceVisibility["ResourceAcl"] = "resource_acl";
84
+ ResourceVisibility["OrgUnit"] = "org_unit";
85
+ ResourceVisibility["OrgSubtree"] = "org_subtree";
86
+ ResourceVisibility["Tenant"] = "tenant";
87
+ })(exports.ResourceVisibility || (exports.ResourceVisibility = {}));
88
+ exports.StorageKind = void 0;
89
+ (function(StorageKind) {
90
+ StorageKind["Postgres"] = "postgres";
91
+ StorageKind["Arango"] = "arango";
92
+ StorageKind["Qdrant"] = "qdrant";
93
+ StorageKind["ObjectStorage"] = "object_storage";
94
+ })(exports.StorageKind || (exports.StorageKind = {}));
95
+ exports.StorageBindingKind = void 0;
96
+ (function(StorageBindingKind) {
97
+ StorageBindingKind["Shared"] = "shared";
98
+ StorageBindingKind["Dedicated"] = "dedicated";
99
+ })(exports.StorageBindingKind || (exports.StorageBindingKind = {}));
100
+ const IsolationTierOptions = Object.values(exports.IsolationTier);
101
+ const MembershipStatusOptions = Object.values(exports.MembershipStatus);
102
+ const PrincipalKindOptions = Object.values(exports.PrincipalKind);
103
+ const ScopeKindOptions = Object.values(exports.ScopeKind);
104
+ const PermissionCategoryOptions = Object.values(exports.PermissionCategory);
105
+ const ResourceVisibilityOptions = Object.values(exports.ResourceVisibility);
106
+ const StorageKindOptions = Object.values(exports.StorageKind);
107
+ const StorageBindingKindOptions = Object.values(exports.StorageBindingKind);
108
+ const REL_RESTRICT = {
109
+ update: core.Cascade.NONE,
110
+ delete: core.Cascade.NONE,
111
+ nullable: false
112
+ };
113
+ const REL_NULLIFY = {
114
+ update: core.Cascade.NONE,
115
+ delete: core.Cascade.NONE,
116
+ nullable: true
117
+ };
118
+ const REL_CASCADE_DEPENDENT = {
119
+ update: core.Cascade.CASCADE,
120
+ delete: core.Cascade.CASCADE,
121
+ nullable: false
122
+ };
123
+ const REL_CASCADE_INSERT_UPDATE = {
124
+ update: core.Cascade.CASCADE,
125
+ delete: core.Cascade.NONE,
126
+ nullable: false
127
+ };
128
+ function buildArangoContext(options) {
129
+ return {
130
+ tenantId: options.tenantId,
131
+ principalId: options.principalId,
132
+ permissionKey: options.permissionKey,
133
+ allowedOrgUnitIds: [ ...options.allowedOrgUnitIds ],
134
+ allowedResourceIds: [ ...options.allowedResourceIds ]
135
+ };
136
+ }
137
+ function buildQdrantFilter(options) {
138
+ return {
139
+ must: [ {
140
+ key: "tenant_id",
141
+ match: {
142
+ value: options.tenantId
143
+ }
144
+ }, {
145
+ should: [ {
146
+ key: "org_unit_id",
147
+ match: {
148
+ any: options.allowedOrgUnitIds
149
+ }
150
+ }, {
151
+ key: "protected_resource_id",
152
+ match: {
153
+ any: options.allowedResourceIds
154
+ }
155
+ }, {
156
+ key: "owner_principal_id",
157
+ match: {
158
+ value: options.principalId
159
+ }
160
+ } ]
161
+ } ]
162
+ };
163
+ }
164
+ function scopeKey$1(scopeKind, scopeId) {
165
+ return `${scopeKind}:${scopeId}`;
166
+ }
167
+ function nowIso() {
168
+ return new Date;
169
+ }
170
+ function asArray(value) {
171
+ return value ?? [];
172
+ }
173
+ function sameTenant(rowTenant, tenantId) {
174
+ return relationId(rowTenant) === tenantId;
175
+ }
176
+ function relationMatch(value, target) {
177
+ return target ? relationId(value) === target : false;
178
+ }
179
+ function lowerSlug(value) {
180
+ return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "item";
181
+ }
182
+ function isTimeValid(at, startsAt, expiresAt) {
183
+ const instant = at ?? new Date;
184
+ if (startsAt && instant < startsAt) return false;
185
+ if (expiresAt && instant > expiresAt) return false;
186
+ return true;
187
+ }
188
+ function buildAccessContext(options) {
189
+ const permissionsByScope = {};
190
+ const allowedOrgUnitIdsByPermission = {};
191
+ for (const permission of options.permissions) {
192
+ const key = scopeKey$1(permission.scopeKind, permission.scopeId);
193
+ permissionsByScope[key] = permissionsByScope[key] ?? [];
194
+ permissionsByScope[key].push(permission.permissionKey);
195
+ if (permission.scopeKind === exports.ScopeKind.OrgUnit) {
196
+ allowedOrgUnitIdsByPermission[permission.permissionKey] = allowedOrgUnitIdsByPermission[permission.permissionKey] ?? [];
197
+ allowedOrgUnitIdsByPermission[permission.permissionKey].push(permission.scopeId);
198
+ }
199
+ }
200
+ return {
201
+ tenantId: options.tenantId,
202
+ principalId: options.principalId,
203
+ permissionsByScope: permissionsByScope,
204
+ allowedOrgUnitIdsByPermission: allowedOrgUnitIdsByPermission,
205
+ resourceGrants: options.grants.map(grant => ({
206
+ resourceId: grant.resourceId,
207
+ permissionKey: grant.permissionKey
208
+ }))
209
+ };
210
+ }
211
+ class BaseModelService extends core.ModelService {
212
+ constructor(clazz) {
213
+ super(clazz);
214
+ }
215
+ newModel(clazz, data) {
216
+ return Object.assign(new clazz, data);
217
+ }
218
+ async create(data, ...args) {
219
+ return this.repo.create(Object.assign({}, data), ...args);
220
+ }
221
+ async createOne(data, ...args) {
222
+ return this.create(data, ...args);
223
+ }
224
+ async getById(id, ...args) {
225
+ return this.repo.read(id, ...args);
226
+ }
227
+ async updateOne(id, patch, ...args) {
228
+ const existing = await this.repo.read(id, ...args);
229
+ return this.repo.update(Object.assign(existing, patch), ...args);
230
+ }
231
+ async deleteById(id, ...args) {
232
+ await this.repo.delete(id, ...args);
233
+ }
234
+ async findOneBy(key, value, ...args) {
235
+ return this.repo.findOneBy(key, value, ...args);
236
+ }
237
+ async findManyBy(key, value, ...args) {
238
+ return this.repo.select().where({
239
+ [key]: value
240
+ }).execute(...args);
241
+ }
242
+ async listAll(...args) {
243
+ return this.repo.select().execute(...args);
244
+ }
245
+ }
246
+ function id() {
247
+ return crypto.randomUUID();
248
+ }
249
+ function relationId(value) {
250
+ return typeof value === "string" ? value : value.id;
251
+ }
252
+ class AuthorizationModel extends decoratorValidation.Model {
253
+ constructor(data) {
254
+ super(data);
255
+ }
256
+ }
257
+ exports.TenantMembership = class TenantMembership extends AuthorizationModel {
258
+ constructor(data) {
259
+ super(data);
260
+ }
261
+ };
262
+ tslib.__decorate([ core.pk({
263
+ type: String
264
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.TenantMembership.prototype, "id", void 0);
265
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_tenant_memberships_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.TenantMembership.prototype, "tenant", void 0);
266
+ tslib.__decorate([ core.manyToOne(() => exports.User, REL_CASCADE_DEPENDENT, false, undefined, "fk_tenant_memberships_user"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.TenantMembership.prototype, "user", void 0);
267
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(MembershipStatusOptions), core.column(), tslib.__metadata("design:type", String) ], exports.TenantMembership.prototype, "status", void 0);
268
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.TenantMembership.prototype, "createdAt", void 0);
269
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.TenantMembership.prototype, "updatedAt", void 0);
270
+ exports.TenantMembership = tslib.__decorate([ core.table("tenant_memberships"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.TenantMembership);
271
+ exports.User = class User extends AuthorizationModel {
272
+ constructor(data) {
273
+ super(data);
274
+ }
275
+ };
276
+ tslib.__decorate([ core.pk({
277
+ type: String
278
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.User.prototype, "id", void 0);
279
+ tslib.__decorate([ core.unique(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.User.prototype, "email", void 0);
280
+ tslib.__decorate([ core.unique(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.User.prototype, "phone", void 0);
281
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.User.prototype, "displayName", void 0);
282
+ tslib.__decorate([ core.oneToMany(() => exports.TenantMembership, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.User.prototype, "tenantMemberships", void 0);
283
+ tslib.__decorate([ core.oneToMany(() => exports.OrgUnitMembership, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.User.prototype, "orgUnitMemberships", void 0);
284
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.User.prototype, "createdAt", void 0);
285
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.User.prototype, "updatedAt", void 0);
286
+ exports.User = tslib.__decorate([ core.table("users"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.User);
287
+ exports.OrgUnitMembership = class OrgUnitMembership extends AuthorizationModel {
288
+ constructor(data) {
289
+ super(data);
290
+ }
291
+ };
292
+ tslib.__decorate([ core.pk({
293
+ type: String
294
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.OrgUnitMembership.prototype, "id", void 0);
295
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_memberships_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.OrgUnitMembership.prototype, "tenant", void 0);
296
+ tslib.__decorate([ core.manyToOne(() => exports.OrgUnit, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_memberships_org_unit"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.OrgUnitMembership.prototype, "orgUnit", void 0);
297
+ tslib.__decorate([ core.manyToOne(() => exports.User, REL_RESTRICT, false, undefined, "fk_org_memberships_user"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.OrgUnitMembership.prototype, "user", void 0);
298
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(MembershipStatusOptions), core.column(), tslib.__metadata("design:type", String) ], exports.OrgUnitMembership.prototype, "status", void 0);
299
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.OrgUnitMembership.prototype, "createdAt", void 0);
300
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.OrgUnitMembership.prototype, "updatedAt", void 0);
301
+ exports.OrgUnitMembership = tslib.__decorate([ core.table("org_unit_memberships"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.OrgUnitMembership);
302
+ exports.OrgUnitClosure = class OrgUnitClosure extends AuthorizationModel {
303
+ constructor(data) {
304
+ super(data);
305
+ }
306
+ };
307
+ tslib.__decorate([ core.pk({
308
+ type: String
309
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.OrgUnitClosure.prototype, "id", void 0);
310
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_closure_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.OrgUnitClosure.prototype, "tenant", void 0);
311
+ tslib.__decorate([ core.manyToOne(() => exports.OrgUnit, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_closure_ancestor"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.OrgUnitClosure.prototype, "ancestor", void 0);
312
+ tslib.__decorate([ core.manyToOne(() => exports.OrgUnit, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_closure_descendant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.OrgUnitClosure.prototype, "descendant", void 0);
313
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(Number), core.column(), tslib.__metadata("design:type", Number) ], exports.OrgUnitClosure.prototype, "depth", void 0);
314
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.OrgUnitClosure.prototype, "createdAt", void 0);
315
+ exports.OrgUnitClosure = tslib.__decorate([ core.table("org_unit_closure"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.OrgUnitClosure);
316
+ exports.Permission = class Permission extends AuthorizationModel {
317
+ constructor(data) {
318
+ super(data);
319
+ }
320
+ };
321
+ tslib.__decorate([ core.pk({
322
+ type: String
323
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.Permission.prototype, "id", void 0);
324
+ tslib.__decorate([ core.unique(), decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.Permission.prototype, "key", void 0);
325
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(PermissionCategoryOptions), core.column(), tslib.__metadata("design:type", String) ], exports.Permission.prototype, "category", void 0);
326
+ tslib.__decorate([ decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.Permission.prototype, "description", void 0);
327
+ tslib.__decorate([ core.oneToMany(() => exports.RolePermission, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.Permission.prototype, "rolePermissions", void 0);
328
+ exports.Permission = tslib.__decorate([ core.table("permissions"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.Permission);
329
+ exports.RolePermission = class RolePermission extends AuthorizationModel {
330
+ constructor(data) {
331
+ super(data);
332
+ }
333
+ };
334
+ tslib.__decorate([ core.pk({
335
+ type: String
336
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.RolePermission.prototype, "id", void 0);
337
+ tslib.__decorate([ core.manyToOne(() => exports.Role, REL_CASCADE_DEPENDENT, false, undefined, "fk_role_permissions_role"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.RolePermission.prototype, "role", void 0);
338
+ tslib.__decorate([ core.manyToOne(() => exports.Permission, REL_CASCADE_DEPENDENT, false, undefined, "fk_role_permissions_permission"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.RolePermission.prototype, "permission", void 0);
339
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.RolePermission.prototype, "createdAt", void 0);
340
+ exports.RolePermission = tslib.__decorate([ core.table("role_permissions"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.RolePermission);
341
+ exports.Role = class Role extends AuthorizationModel {
342
+ constructor(data) {
343
+ super(data);
344
+ }
345
+ };
346
+ tslib.__decorate([ core.pk({
347
+ type: String
348
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.Role.prototype, "id", void 0);
349
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_NULLIFY, false, undefined, "fk_roles_tenant"), tslib.__metadata("design:type", Object) ], exports.Role.prototype, "tenant", void 0);
350
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.Role.prototype, "key", void 0);
351
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.Role.prototype, "name", void 0);
352
+ tslib.__decorate([ decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.Role.prototype, "description", void 0);
353
+ tslib.__decorate([ decoratorValidation.type(Object), core.column(), tslib.__metadata("design:type", Object) ], exports.Role.prototype, "metadata", void 0);
354
+ tslib.__decorate([ core.oneToMany(() => exports.RolePermission, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.Role.prototype, "rolePermissions", void 0);
355
+ tslib.__decorate([ core.oneToMany(() => exports.RoleAssignment, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.Role.prototype, "assignments", void 0);
356
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.Role.prototype, "createdAt", void 0);
357
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.Role.prototype, "updatedAt", void 0);
358
+ exports.Role = tslib.__decorate([ core.table("roles"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.Role);
359
+ exports.RoleAssignment = class RoleAssignment extends AuthorizationModel {
360
+ constructor(data) {
361
+ super(data);
362
+ }
363
+ };
364
+ tslib.__decorate([ core.pk({
365
+ type: String
366
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.RoleAssignment.prototype, "id", void 0);
367
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_role_assignments_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.RoleAssignment.prototype, "tenant", void 0);
368
+ tslib.__decorate([ core.manyToOne(() => exports.Principal, REL_CASCADE_DEPENDENT, false, undefined, "fk_role_assignments_principal"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.RoleAssignment.prototype, "principal", void 0);
369
+ tslib.__decorate([ core.manyToOne(() => exports.Role, REL_RESTRICT, false, undefined, "fk_role_assignments_role"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.RoleAssignment.prototype, "role", void 0);
370
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(ScopeKindOptions), core.column(), tslib.__metadata("design:type", String) ], exports.RoleAssignment.prototype, "scopeKind", void 0);
371
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.RoleAssignment.prototype, "scopeId", void 0);
372
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(Boolean), core.column(), tslib.__metadata("design:type", Boolean) ], exports.RoleAssignment.prototype, "inheritDown", void 0);
373
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Date) ], exports.RoleAssignment.prototype, "startsAt", void 0);
374
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Date) ], exports.RoleAssignment.prototype, "expiresAt", void 0);
375
+ tslib.__decorate([ decoratorValidation.type(Object), core.column(), tslib.__metadata("design:type", Object) ], exports.RoleAssignment.prototype, "conditions", void 0);
376
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.RoleAssignment.prototype, "createdAt", void 0);
377
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.RoleAssignment.prototype, "updatedAt", void 0);
378
+ exports.RoleAssignment = tslib.__decorate([ core.table("role_assignments"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.RoleAssignment);
379
+ exports.ResourceGrant = class ResourceGrant extends AuthorizationModel {
380
+ constructor(data) {
381
+ super(data);
382
+ }
383
+ };
384
+ tslib.__decorate([ core.pk({
385
+ type: String
386
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.ResourceGrant.prototype, "id", void 0);
387
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_resource_grants_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.ResourceGrant.prototype, "tenant", void 0);
388
+ tslib.__decorate([ core.manyToOne(() => exports.ProtectedResource, REL_CASCADE_DEPENDENT, false, undefined, "fk_resource_grants_resource"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.ResourceGrant.prototype, "resource", void 0);
389
+ tslib.__decorate([ core.manyToOne(() => exports.Principal, REL_CASCADE_DEPENDENT, false, undefined, "fk_resource_grants_principal"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.ResourceGrant.prototype, "principal", void 0);
390
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.ResourceGrant.prototype, "permissionKey", void 0);
391
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Date) ], exports.ResourceGrant.prototype, "startsAt", void 0);
392
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Date) ], exports.ResourceGrant.prototype, "expiresAt", void 0);
393
+ tslib.__decorate([ decoratorValidation.type(Object), core.column(), tslib.__metadata("design:type", Object) ], exports.ResourceGrant.prototype, "conditions", void 0);
394
+ tslib.__decorate([ core.manyToOne(() => exports.Principal, REL_RESTRICT, false, undefined, "fk_resource_grants_created_by"), tslib.__metadata("design:type", Object) ], exports.ResourceGrant.prototype, "createdBy", void 0);
395
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.ResourceGrant.prototype, "createdAt", void 0);
396
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.ResourceGrant.prototype, "updatedAt", void 0);
397
+ exports.ResourceGrant = tslib.__decorate([ core.table("resource_grants"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.ResourceGrant);
398
+ exports.Principal = class Principal extends AuthorizationModel {
399
+ constructor(data) {
400
+ super(data);
401
+ }
402
+ };
403
+ tslib.__decorate([ core.pk({
404
+ type: String
405
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.Principal.prototype, "id", void 0);
406
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_RESTRICT, false, undefined, "fk_principals_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.Principal.prototype, "tenant", void 0);
407
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(PrincipalKindOptions), core.column(), tslib.__metadata("design:type", String) ], exports.Principal.prototype, "kind", void 0);
408
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.Principal.prototype, "subjectId", void 0);
409
+ tslib.__decorate([ core.oneToMany(() => exports.RoleAssignment, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.Principal.prototype, "roleAssignments", void 0);
410
+ tslib.__decorate([ core.oneToMany(() => exports.ResourceGrant, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.Principal.prototype, "resourceGrants", void 0);
411
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.Principal.prototype, "createdAt", void 0);
412
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.Principal.prototype, "updatedAt", void 0);
413
+ exports.Principal = tslib.__decorate([ core.table("principals"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.Principal);
414
+ exports.ProtectedResource = class ProtectedResource extends AuthorizationModel {
415
+ constructor(data) {
416
+ super(data);
417
+ }
418
+ };
419
+ tslib.__decorate([ core.pk({
420
+ type: String
421
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.ProtectedResource.prototype, "id", void 0);
422
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_RESTRICT, false, undefined, "fk_protected_resources_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.ProtectedResource.prototype, "tenant", void 0);
423
+ tslib.__decorate([ core.manyToOne(() => exports.OrgUnit, REL_RESTRICT, false, undefined, "fk_protected_resources_org_unit"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.ProtectedResource.prototype, "orgUnit", void 0);
424
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.ProtectedResource.prototype, "resourceType", void 0);
425
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.ProtectedResource.prototype, "resourceId", void 0);
426
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(ResourceVisibilityOptions), core.column(), tslib.__metadata("design:type", String) ], exports.ProtectedResource.prototype, "visibility", void 0);
427
+ tslib.__decorate([ core.manyToOne(() => exports.Principal, REL_NULLIFY, false, undefined, "fk_protected_resources_owner"), tslib.__metadata("design:type", Object) ], exports.ProtectedResource.prototype, "owner", void 0);
428
+ tslib.__decorate([ decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.ProtectedResource.prototype, "sensitivity", void 0);
429
+ tslib.__decorate([ decoratorValidation.type(Object), core.column(), tslib.__metadata("design:type", Object) ], exports.ProtectedResource.prototype, "metadata", void 0);
430
+ tslib.__decorate([ core.oneToMany(() => exports.ResourceGrant, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.ProtectedResource.prototype, "grants", void 0);
431
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.ProtectedResource.prototype, "createdAt", void 0);
432
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.ProtectedResource.prototype, "updatedAt", void 0);
433
+ exports.ProtectedResource = tslib.__decorate([ core.table("protected_resources"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.ProtectedResource);
434
+ exports.InheritanceBlock = class InheritanceBlock extends AuthorizationModel {
435
+ constructor(data) {
436
+ super(data);
437
+ }
438
+ };
439
+ tslib.__decorate([ core.pk({
440
+ type: String
441
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.InheritanceBlock.prototype, "id", void 0);
442
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_inheritance_blocks_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.InheritanceBlock.prototype, "tenant", void 0);
443
+ tslib.__decorate([ core.manyToOne(() => exports.OrgUnit, REL_CASCADE_DEPENDENT, false, undefined, "fk_inheritance_blocks_org_unit"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.InheritanceBlock.prototype, "orgUnit", void 0);
444
+ tslib.__decorate([ core.manyToOne(() => exports.OrgUnit, REL_NULLIFY, false, undefined, "fk_inheritance_blocks_blocked_ancestor"), tslib.__metadata("design:type", Object) ], exports.InheritanceBlock.prototype, "blockedFromAncestor", void 0);
445
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(PermissionCategoryOptions), core.column(), tslib.__metadata("design:type", String) ], exports.InheritanceBlock.prototype, "permissionCategory", void 0);
446
+ tslib.__decorate([ decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.InheritanceBlock.prototype, "reason", void 0);
447
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.InheritanceBlock.prototype, "createdAt", void 0);
448
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.InheritanceBlock.prototype, "updatedAt", void 0);
449
+ exports.InheritanceBlock = tslib.__decorate([ core.table("inheritance_blocks"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.InheritanceBlock);
450
+ exports.OrgUnit = class OrgUnit extends AuthorizationModel {
451
+ constructor(data) {
452
+ super(data);
453
+ }
454
+ };
455
+ tslib.__decorate([ core.pk({
456
+ type: String
457
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.OrgUnit.prototype, "id", void 0);
458
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_RESTRICT, false, undefined, "fk_org_units_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.OrgUnit.prototype, "tenant", void 0);
459
+ tslib.__decorate([ core.manyToOne(() => exports.OrgUnit, REL_RESTRICT, false, undefined, "fk_org_units_parent"), tslib.__metadata("design:type", Object) ], exports.OrgUnit.prototype, "parent", void 0);
460
+ tslib.__decorate([ core.oneToMany(() => exports.OrgUnit, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.OrgUnit.prototype, "children", void 0);
461
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.OrgUnit.prototype, "name", void 0);
462
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.OrgUnit.prototype, "path", void 0);
463
+ tslib.__decorate([ decoratorValidation.type(Object), core.column(), tslib.__metadata("design:type", Object) ], exports.OrgUnit.prototype, "metadata", void 0);
464
+ tslib.__decorate([ core.oneToMany(() => exports.OrgUnitMembership, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.OrgUnit.prototype, "memberships", void 0);
465
+ tslib.__decorate([ core.oneToMany(() => exports.ProtectedResource, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.OrgUnit.prototype, "resources", void 0);
466
+ tslib.__decorate([ core.oneToMany(() => exports.InheritanceBlock, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.OrgUnit.prototype, "inheritanceBlocks", void 0);
467
+ tslib.__decorate([ core.oneToMany(() => exports.OrgUnitClosure, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.OrgUnit.prototype, "ancestorLinks", void 0);
468
+ tslib.__decorate([ core.oneToMany(() => exports.OrgUnitClosure, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.OrgUnit.prototype, "descendantLinks", void 0);
469
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.OrgUnit.prototype, "createdAt", void 0);
470
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.OrgUnit.prototype, "updatedAt", void 0);
471
+ exports.OrgUnit = tslib.__decorate([ core.table("org_units"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.OrgUnit);
472
+ exports.StorageBinding = class StorageBinding extends AuthorizationModel {
473
+ constructor(data) {
474
+ super(data);
475
+ }
476
+ };
477
+ tslib.__decorate([ core.pk({
478
+ type: String
479
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.StorageBinding.prototype, "id", void 0);
480
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_storage_bindings_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.StorageBinding.prototype, "tenant", void 0);
481
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(StorageKindOptions), core.column(), tslib.__metadata("design:type", String) ], exports.StorageBinding.prototype, "storageKind", void 0);
482
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(StorageBindingKindOptions), core.column(), tslib.__metadata("design:type", String) ], exports.StorageBinding.prototype, "bindingKind", void 0);
483
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.StorageBinding.prototype, "bindingKey", void 0);
484
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.StorageBinding.prototype, "region", void 0);
485
+ tslib.__decorate([ decoratorValidation.type(Object), core.column(), tslib.__metadata("design:type", Object) ], exports.StorageBinding.prototype, "config", void 0);
486
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.StorageBinding.prototype, "createdAt", void 0);
487
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.StorageBinding.prototype, "updatedAt", void 0);
488
+ exports.StorageBinding = tslib.__decorate([ core.table("storage_bindings"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.StorageBinding);
489
+ exports.Tenant = class Tenant extends AuthorizationModel {
490
+ constructor(data) {
491
+ super(data);
492
+ }
493
+ };
494
+ tslib.__decorate([ core.pk({
495
+ type: String
496
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.Tenant.prototype, "id", void 0);
497
+ tslib.__decorate([ core.unique(), decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.Tenant.prototype, "slug", void 0);
498
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.Tenant.prototype, "name", void 0);
499
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(IsolationTierOptions), core.column(), tslib.__metadata("design:type", String) ], exports.Tenant.prototype, "isolationTier", void 0);
500
+ tslib.__decorate([ core.oneToMany(() => exports.OrgUnit, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.Tenant.prototype, "orgUnits", void 0);
501
+ tslib.__decorate([ core.oneToMany(() => exports.TenantMembership, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.Tenant.prototype, "memberships", void 0);
502
+ tslib.__decorate([ core.oneToMany(() => exports.Principal, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.Tenant.prototype, "principals", void 0);
503
+ tslib.__decorate([ core.oneToMany(() => exports.StorageBinding, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.Tenant.prototype, "storageBindings", void 0);
504
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.Tenant.prototype, "createdAt", void 0);
505
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.Tenant.prototype, "updatedAt", void 0);
506
+ exports.Tenant = tslib.__decorate([ core.table("tenants"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.Tenant);
507
+ exports.TenantProfile = class TenantProfile extends AuthorizationModel {
508
+ constructor(data) {
509
+ super(data);
510
+ }
511
+ };
512
+ tslib.__decorate([ core.pk({
513
+ type: String
514
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.TenantProfile.prototype, "id", void 0);
515
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_tenant_profiles_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.TenantProfile.prototype, "tenant", void 0);
516
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.TenantProfile.prototype, "profileKey", void 0);
517
+ tslib.__decorate([ decoratorValidation.type(Object), core.column(), tslib.__metadata("design:type", Object) ], exports.TenantProfile.prototype, "metadata", void 0);
518
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.TenantProfile.prototype, "createdAt", void 0);
519
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.TenantProfile.prototype, "updatedAt", void 0);
520
+ exports.TenantProfile = tslib.__decorate([ core.table("tenant_profiles"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.TenantProfile);
521
+ exports.OrgUnitProfile = class OrgUnitProfile extends AuthorizationModel {
522
+ constructor(data) {
523
+ super(data);
524
+ }
525
+ };
526
+ tslib.__decorate([ core.pk({
527
+ type: String
528
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.OrgUnitProfile.prototype, "id", void 0);
529
+ tslib.__decorate([ core.manyToOne(() => exports.OrgUnit, REL_CASCADE_DEPENDENT, false, undefined, "fk_org_unit_profiles_org_unit"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.OrgUnitProfile.prototype, "orgUnit", void 0);
530
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.OrgUnitProfile.prototype, "profileKey", void 0);
531
+ tslib.__decorate([ decoratorValidation.type(Object), core.column(), tslib.__metadata("design:type", Object) ], exports.OrgUnitProfile.prototype, "metadata", void 0);
532
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.OrgUnitProfile.prototype, "createdAt", void 0);
533
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.OrgUnitProfile.prototype, "updatedAt", void 0);
534
+ exports.OrgUnitProfile = tslib.__decorate([ core.table("org_unit_profiles"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.OrgUnitProfile);
535
+ exports.GroupMembership = class GroupMembership extends AuthorizationModel {
536
+ constructor(data) {
537
+ super(data);
538
+ }
539
+ };
540
+ tslib.__decorate([ core.pk({
541
+ type: String
542
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.GroupMembership.prototype, "id", void 0);
543
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_group_memberships_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.GroupMembership.prototype, "tenant", void 0);
544
+ tslib.__decorate([ core.manyToOne(() => exports.Group, REL_CASCADE_DEPENDENT, false, undefined, "fk_group_memberships_group"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.GroupMembership.prototype, "group", void 0);
545
+ tslib.__decorate([ core.manyToOne(() => exports.Principal, REL_CASCADE_DEPENDENT, false, undefined, "fk_group_memberships_principal"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.GroupMembership.prototype, "principal", void 0);
546
+ tslib.__decorate([ decoratorValidation.type(Object), core.column(), tslib.__metadata("design:type", Object) ], exports.GroupMembership.prototype, "metadata", void 0);
547
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.GroupMembership.prototype, "createdAt", void 0);
548
+ exports.GroupMembership = tslib.__decorate([ core.table("group_memberships"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.GroupMembership);
549
+ exports.Group = class Group extends AuthorizationModel {
550
+ constructor(data) {
551
+ super(data);
552
+ }
553
+ };
554
+ tslib.__decorate([ core.pk({
555
+ type: String
556
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.Group.prototype, "id", void 0);
557
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_RESTRICT, false, undefined, "fk_groups_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.Group.prototype, "tenant", void 0);
558
+ tslib.__decorate([ core.manyToOne(() => exports.OrgUnit, REL_NULLIFY, false, undefined, "fk_groups_org_unit"), tslib.__metadata("design:type", Object) ], exports.Group.prototype, "orgUnit", void 0);
559
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.Group.prototype, "name", void 0);
560
+ tslib.__decorate([ decoratorValidation.type(Object), core.column(), tslib.__metadata("design:type", Object) ], exports.Group.prototype, "metadata", void 0);
561
+ tslib.__decorate([ core.oneToMany(() => exports.GroupMembership, REL_RESTRICT, false), tslib.__metadata("design:type", Array) ], exports.Group.prototype, "members", void 0);
562
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.Group.prototype, "createdAt", void 0);
563
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.Group.prototype, "updatedAt", void 0);
564
+ exports.Group = tslib.__decorate([ core.table("groups"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.Group);
565
+ exports.EffectivePermission = class EffectivePermission extends AuthorizationModel {
566
+ constructor(data) {
567
+ super(data);
568
+ }
569
+ };
570
+ tslib.__decorate([ core.pk({
571
+ type: String
572
+ }), core.uuid(), tslib.__metadata("design:type", String) ], exports.EffectivePermission.prototype, "id", void 0);
573
+ tslib.__decorate([ core.manyToOne(() => exports.Tenant, REL_CASCADE_DEPENDENT, false, undefined, "fk_effective_permissions_tenant"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.EffectivePermission.prototype, "tenant", void 0);
574
+ tslib.__decorate([ core.manyToOne(() => exports.Principal, REL_CASCADE_DEPENDENT, false, undefined, "fk_effective_permissions_principal"), decoratorValidation.required(), tslib.__metadata("design:type", Object) ], exports.EffectivePermission.prototype, "principal", void 0);
575
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.EffectivePermission.prototype, "permissionKey", void 0);
576
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), decoratorValidation.option(ScopeKindOptions), core.column(), tslib.__metadata("design:type", String) ], exports.EffectivePermission.prototype, "scopeKind", void 0);
577
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.EffectivePermission.prototype, "scopeId", void 0);
578
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.EffectivePermission.prototype, "sourceKind", void 0);
579
+ tslib.__decorate([ decoratorValidation.required(), decoratorValidation.type(String), core.column(), tslib.__metadata("design:type", String) ], exports.EffectivePermission.prototype, "sourceId", void 0);
580
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Date) ], exports.EffectivePermission.prototype, "startsAt", void 0);
581
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Date) ], exports.EffectivePermission.prototype, "expiresAt", void 0);
582
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.EffectivePermission.prototype, "createdAt", void 0);
583
+ exports.EffectivePermission = tslib.__decorate([ core.table("effective_permissions"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.EffectivePermission);
584
+ class TenantProfileService extends BaseModelService {
585
+ constructor() {
586
+ super(exports.TenantProfile);
587
+ }
588
+ async createProfile(tenantId, profileKey, metadata, ...args) {
589
+ return this.create({
590
+ tenant: tenantId,
591
+ profileKey: profileKey,
592
+ metadata: metadata
593
+ }, ...args);
594
+ }
595
+ async listForTenant(tenantId, ...args) {
596
+ return (await this.listAll(...args)).filter(profile => sameTenant(profile.tenant, tenantId));
597
+ }
598
+ async deleteForTenant(tenantId, ...args) {
599
+ for (const row of await this.listForTenant(tenantId, ...args)) {
600
+ await this.deleteById(row.id, ...args);
601
+ }
602
+ }
603
+ }
604
+ class OrgUnitProfileService extends BaseModelService {
605
+ constructor() {
606
+ super(exports.OrgUnitProfile);
607
+ }
608
+ async createProfile(orgUnitId, profileKey, metadata, ...args) {
609
+ return this.create({
610
+ orgUnit: orgUnitId,
611
+ profileKey: profileKey,
612
+ metadata: metadata
613
+ }, ...args);
614
+ }
615
+ async listForOrgUnit(orgUnitId, ...args) {
616
+ return (await this.listAll(...args)).filter(profile => relationMatch(profile.orgUnit, orgUnitId));
617
+ }
618
+ }
619
+ class OrgUnitClosureService extends BaseModelService {
620
+ constructor() {
621
+ super(exports.OrgUnitClosure);
622
+ }
623
+ async listAncestors(tenantId, orgUnitId, ...args) {
624
+ return (await this.listAll(...args)).filter(row => sameTenant(row.tenant, tenantId) && relationMatch(row.descendant, orgUnitId)).sort((left, right) => left.depth - right.depth);
625
+ }
626
+ async listDescendants(tenantId, orgUnitId, ...args) {
627
+ return (await this.listAll(...args)).filter(row => sameTenant(row.tenant, tenantId) && relationMatch(row.ancestor, orgUnitId)).sort((left, right) => left.depth - right.depth);
628
+ }
629
+ async isAncestorOf(tenantId, ancestorOrgUnitId, descendantOrgUnitId, ...args) {
630
+ return (await this.listAncestors(tenantId, descendantOrgUnitId, ...args)).some(row => relationMatch(row.ancestor, ancestorOrgUnitId));
631
+ }
632
+ async createSelfLink(tenantId, orgUnitId, ...args) {
633
+ return this.create({
634
+ tenant: tenantId,
635
+ ancestor: orgUnitId,
636
+ descendant: orgUnitId,
637
+ depth: 0
638
+ }, ...args);
639
+ }
640
+ async insertAncestorLinksForNewChild(tenantId, parentOrgUnitId, childOrgUnitId, ...args) {
641
+ const ancestorLinks = await this.listAncestors(tenantId, parentOrgUnitId, ...args);
642
+ for (const link of ancestorLinks) {
643
+ await this.create({
644
+ tenant: tenantId,
645
+ ancestor: link.ancestor,
646
+ descendant: childOrgUnitId,
647
+ depth: link.depth + 1
648
+ }, ...args);
649
+ }
650
+ }
651
+ async deleteLinksForSubtree(tenantId, orgUnitId, ...args) {
652
+ const subtree = await this.listDescendants(tenantId, orgUnitId, ...args);
653
+ const descendantIds = new Set([ orgUnitId, ...subtree.map(row => relationId(row.descendant)) ]);
654
+ const ancestorIds = new Set([ orgUnitId, ...subtree.map(row => relationId(row.ancestor)) ]);
655
+ const rows = (await this.listAll(...args)).filter(row => sameTenant(row.tenant, tenantId) && (descendantIds.has(relationId(row.descendant)) || ancestorIds.has(relationId(row.ancestor))));
656
+ for (const row of rows) {
657
+ await this.deleteById(row.id, ...args);
658
+ }
659
+ }
660
+ }
661
+ class InheritanceBlockService extends BaseModelService {
662
+ constructor() {
663
+ super(exports.InheritanceBlock);
664
+ }
665
+ async blockCategory(tenantId, orgUnitId, permissionCategory, blockedFromAncestorId, reason, ...args) {
666
+ return this.create({
667
+ tenant: tenantId,
668
+ orgUnit: orgUnitId,
669
+ blockedFromAncestor: blockedFromAncestorId,
670
+ permissionCategory: permissionCategory,
671
+ reason: reason
672
+ }, ...args);
673
+ }
674
+ async unblockCategory(blockId, ...args) {
675
+ await this.deleteById(blockId, ...args);
676
+ }
677
+ async listForOrgUnit(tenantId, orgUnitId, ...args) {
678
+ return (await this.listAll(...args)).filter(block => sameTenant(block.tenant, tenantId) && relationMatch(block.orgUnit, orgUnitId));
679
+ }
680
+ async categoryBlockedForAncestor(tenantId, orgUnitId, ancestorOrgUnitId, category, ...args) {
681
+ return (await this.listForOrgUnit(tenantId, orgUnitId, ...args)).some(block => block.permissionCategory === category && (!block.blockedFromAncestor || relationMatch(block.blockedFromAncestor, ancestorOrgUnitId)));
682
+ }
683
+ }
684
+ class TenantService extends BaseModelService {
685
+ constructor() {
686
+ super(exports.Tenant);
687
+ }
688
+ async createTenant(input, ...args) {
689
+ return this.create({
690
+ slug: input.slug,
691
+ name: input.name,
692
+ isolationTier: input.isolationTier ?? exports.IsolationTier.Pooled
693
+ }, ...args);
694
+ }
695
+ async getBySlug(slug, ...args) {
696
+ return this.findOneBy("slug", slug, ...args);
697
+ }
698
+ async renameTenant(tenantId, name, ...args) {
699
+ return this.updateOne(tenantId, {
700
+ name: name
701
+ }, ...args);
702
+ }
703
+ async changeSlug(tenantId, slug, ...args) {
704
+ return this.updateOne(tenantId, {
705
+ slug: slug
706
+ }, ...args);
707
+ }
708
+ async setIsolationTier(tenantId, isolationTier, ...args) {
709
+ return this.updateOne(tenantId, {
710
+ isolationTier: isolationTier
711
+ }, ...args);
712
+ }
713
+ async deleteTenantControlled(tenantId, ...args) {
714
+ await this.deleteById(tenantId, ...args);
715
+ }
716
+ }
717
+ async function deleteRowsById$1(service, rows, ...args) {
718
+ for (const row of rows) {
719
+ await service.deleteById(row.id, ...args);
720
+ }
721
+ }
722
+ class OrgUnitService extends BaseModelService {
723
+ constructor() {
724
+ super(exports.OrgUnit);
725
+ }
726
+ orgUnitPath(parentPath, name) {
727
+ const segment = lowerSlug(name);
728
+ return parentPath ? `${parentPath.replace(/\/+$/, "")}/${segment}` : `/${segment}`;
729
+ }
730
+ async createProfileIfNeeded(orgUnitId, profileKey, profileMetadata, ...args) {
731
+ if (!profileKey) return;
732
+ await (new OrgUnitProfileService).createProfile(orgUnitId, profileKey, profileMetadata, ...args);
733
+ }
734
+ async createRoot(tenantId, name, metadata, profileKey, profileMetadata, ...args) {
735
+ const orgUnit = await this.create({
736
+ tenant: tenantId,
737
+ name: name,
738
+ path: this.orgUnitPath(undefined, name),
739
+ metadata: metadata
740
+ }, ...args);
741
+ await this.createProfileIfNeeded(orgUnit.id, profileKey, profileMetadata, ...args);
742
+ await (new OrgUnitClosureService).createSelfLink(tenantId, orgUnit.id, ...args);
743
+ return orgUnit;
744
+ }
745
+ async createChild(input, ...args) {
746
+ const parent = input.parentOrgUnitId ? await this.getById(input.parentOrgUnitId, ...args) : undefined;
747
+ const orgUnit = await this.create({
748
+ tenant: input.tenantId,
749
+ parent: parent?.id ?? input.parentOrgUnitId,
750
+ name: input.name,
751
+ path: this.orgUnitPath(parent?.path, input.name),
752
+ metadata: input.metadata
753
+ }, ...args);
754
+ await this.createProfileIfNeeded(orgUnit.id, input.profileKey, input.profileMetadata, ...args);
755
+ const closureService = new OrgUnitClosureService;
756
+ await closureService.createSelfLink(input.tenantId, orgUnit.id, ...args);
757
+ if (input.parentOrgUnitId) {
758
+ await closureService.insertAncestorLinksForNewChild(input.tenantId, input.parentOrgUnitId, orgUnit.id, ...args);
759
+ }
760
+ return orgUnit;
761
+ }
762
+ async listChildren(parentOrgUnitId, ...args) {
763
+ return (await this.listAll(...args)).filter(orgUnit => relationMatch(orgUnit.parent, parentOrgUnitId));
764
+ }
765
+ async listTenantOrgUnits(tenantId, ...args) {
766
+ return (await this.listAll(...args)).filter(orgUnit => sameTenant(orgUnit.tenant, tenantId));
767
+ }
768
+ async listDescendantOrgUnits(tenantId, orgUnitId, includeSelf = false, ...args) {
769
+ const descendants = await (new OrgUnitClosureService).listDescendants(tenantId, orgUnitId, ...args);
770
+ const ids = new Set(descendants.map(row => relationId(row.descendant)));
771
+ if (includeSelf) ids.add(orgUnitId);
772
+ return (await this.listTenantOrgUnits(tenantId, ...args)).filter(orgUnit => ids.has(orgUnit.id));
773
+ }
774
+ async listAncestorOrgUnits(tenantId, orgUnitId, includeSelf = false, ...args) {
775
+ const ancestors = await (new OrgUnitClosureService).listAncestors(tenantId, orgUnitId, ...args);
776
+ const ids = new Set(ancestors.map(row => relationId(row.ancestor)));
777
+ if (includeSelf) ids.add(orgUnitId);
778
+ return (await this.listTenantOrgUnits(tenantId, ...args)).filter(orgUnit => ids.has(orgUnit.id));
779
+ }
780
+ async renameOrgUnit(orgUnitId, name, ...args) {
781
+ const existing = await this.getById(orgUnitId, ...args);
782
+ return this.updateOne(orgUnitId, {
783
+ name: name,
784
+ path: this.orgUnitPath(existing.path.includes("/") ? existing.path.replace(/\/[^/]+$/, "") : undefined, name)
785
+ }, ...args);
786
+ }
787
+ async moveOrgUnit(tenantId, orgUnitId, newParentOrgUnitId, ...args) {
788
+ const newParent = await this.getById(newParentOrgUnitId, ...args);
789
+ const existing = await this.getById(orgUnitId, ...args);
790
+ const updated = await this.updateOne(orgUnitId, {
791
+ parent: newParent.id,
792
+ path: this.orgUnitPath(newParent.path, existing.name)
793
+ }, ...args);
794
+ await this.rebuildTenantClosure(tenantId, ...args);
795
+ return updated;
796
+ }
797
+ async rebuildTenantClosure(tenantId, ...args) {
798
+ const closureService = new OrgUnitClosureService;
799
+ const existingLinks = await closureService.listAll(...args);
800
+ await deleteRowsById$1(closureService, existingLinks.filter(row => sameTenant(row.tenant, tenantId)), ...args);
801
+ const orgUnits = (await this.listTenantOrgUnits(tenantId, ...args)).sort((left, right) => {
802
+ const leftDepth = left.path.split("/").filter(Boolean).length;
803
+ const rightDepth = right.path.split("/").filter(Boolean).length;
804
+ return leftDepth - rightDepth;
805
+ });
806
+ for (const orgUnit of orgUnits) {
807
+ await closureService.createSelfLink(tenantId, orgUnit.id, ...args);
808
+ if (orgUnit.parent) {
809
+ await closureService.insertAncestorLinksForNewChild(tenantId, relationId(orgUnit.parent), orgUnit.id, ...args);
810
+ }
811
+ }
812
+ }
813
+ async deleteOrgUnitTree(tenantId, orgUnitId, ...args) {
814
+ const closureService = new OrgUnitClosureService;
815
+ const descendants = await this.listDescendantOrgUnits(tenantId, orgUnitId, true, ...args);
816
+ const descendantIds = new Set(descendants.map(orgUnit => orgUnit.id));
817
+ const orgUnits = (await this.listTenantOrgUnits(tenantId, ...args)).filter(orgUnit => descendantIds.has(orgUnit.id));
818
+ await deleteRowsById$1(this, orgUnits, ...args);
819
+ await closureService.deleteLinksForSubtree(tenantId, orgUnitId, ...args);
820
+ }
821
+ }
822
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ String, String, Object, String, Object, Object ]), tslib.__metadata("design:returntype", Promise) ], OrgUnitService.prototype, "createRoot", null);
823
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ Object, Object ]), tslib.__metadata("design:returntype", Promise) ], OrgUnitService.prototype, "createChild", null);
824
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ String, String, String, Object ]), tslib.__metadata("design:returntype", Promise) ], OrgUnitService.prototype, "moveOrgUnit", null);
825
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ String, Object ]), tslib.__metadata("design:returntype", Promise) ], OrgUnitService.prototype, "rebuildTenantClosure", null);
826
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ String, String, Object ]), tslib.__metadata("design:returntype", Promise) ], OrgUnitService.prototype, "deleteOrgUnitTree", null);
827
+ class UserService extends BaseModelService {
828
+ constructor() {
829
+ super(exports.User);
830
+ }
831
+ async createUser(input, ...args) {
832
+ return this.create({
833
+ email: input.email,
834
+ phone: input.phone,
835
+ displayName: input.displayName
836
+ }, ...args);
837
+ }
838
+ async getByEmail(email, ...args) {
839
+ return (await this.listAll(...args)).find(user => user.email === email);
840
+ }
841
+ async updateDisplayName(userId, displayName, ...args) {
842
+ return this.updateOne(userId, {
843
+ displayName: displayName
844
+ }, ...args);
845
+ }
846
+ async updateEmail(userId, email, ...args) {
847
+ return this.updateOne(userId, {
848
+ email: email
849
+ }, ...args);
850
+ }
851
+ async updatePhone(userId, phone, ...args) {
852
+ return this.updateOne(userId, {
853
+ phone: phone
854
+ }, ...args);
855
+ }
856
+ }
857
+ class PrincipalService extends BaseModelService {
858
+ constructor() {
859
+ super(exports.Principal);
860
+ }
861
+ async createPrincipal(tenantId, kind, subjectId, ...args) {
862
+ return this.create({
863
+ tenant: tenantId,
864
+ kind: kind,
865
+ subjectId: subjectId
866
+ }, ...args);
867
+ }
868
+ async getForSubject(tenantId, kind, subjectId, ...args) {
869
+ return (await this.listAll(...args)).find(principal => sameTenant(principal.tenant, tenantId) && principal.kind === kind && principal.subjectId === subjectId);
870
+ }
871
+ async getOrCreateForSubject(tenantId, kind, subjectId, ...args) {
872
+ return await this.getForSubject(tenantId, kind, subjectId, ...args) ?? await this.createPrincipal(tenantId, kind, subjectId, ...args);
873
+ }
874
+ async getUserPrincipal(tenantId, userId, ...args) {
875
+ return this.getOrCreateForSubject(tenantId, exports.PrincipalKind.User, userId, ...args);
876
+ }
877
+ async getGroupPrincipal(tenantId, groupId, ...args) {
878
+ return this.getOrCreateForSubject(tenantId, exports.PrincipalKind.Group, groupId, ...args);
879
+ }
880
+ }
881
+ class TenantMembershipService extends BaseModelService {
882
+ constructor() {
883
+ super(exports.TenantMembership);
884
+ }
885
+ async addUserToTenant(tenantId, userId, status = exports.MembershipStatus.Active, ...args) {
886
+ return this.create({
887
+ tenant: tenantId,
888
+ user: userId,
889
+ status: status
890
+ }, ...args);
891
+ }
892
+ async setStatus(membershipId, status, ...args) {
893
+ return this.updateOne(membershipId, {
894
+ status: status
895
+ }, ...args);
896
+ }
897
+ async listUserTenants(userId, ...args) {
898
+ return (await this.listAll(...args)).filter(membership => relationMatch(membership.user, userId));
899
+ }
900
+ async listTenantUsers(tenantId, ...args) {
901
+ return (await this.listAll(...args)).filter(membership => sameTenant(membership.tenant, tenantId));
902
+ }
903
+ async removeUserFromTenant(membershipId, ...args) {
904
+ await this.deleteById(membershipId, ...args);
905
+ }
906
+ }
907
+ class OrgUnitMembershipService extends BaseModelService {
908
+ constructor() {
909
+ super(exports.OrgUnitMembership);
910
+ }
911
+ async addUserToOrgUnit(tenantId, orgUnitId, userId, status = exports.MembershipStatus.Active, ...args) {
912
+ return this.create({
913
+ tenant: tenantId,
914
+ orgUnit: orgUnitId,
915
+ user: userId,
916
+ status: status
917
+ }, ...args);
918
+ }
919
+ async setStatus(membershipId, status, ...args) {
920
+ return this.updateOne(membershipId, {
921
+ status: status
922
+ }, ...args);
923
+ }
924
+ async listUserOrgUnits(userId, ...args) {
925
+ return (await this.listAll(...args)).filter(membership => relationMatch(membership.user, userId));
926
+ }
927
+ async listOrgUnitUsers(orgUnitId, ...args) {
928
+ return (await this.listAll(...args)).filter(membership => relationMatch(membership.orgUnit, orgUnitId));
929
+ }
930
+ async removeUserFromOrgUnit(membershipId, ...args) {
931
+ await this.deleteById(membershipId, ...args);
932
+ }
933
+ }
934
+ class GroupService extends BaseModelService {
935
+ constructor() {
936
+ super(exports.Group);
937
+ }
938
+ async createGroup(tenantId, name, orgUnitId, metadata, ...args) {
939
+ return this.create({
940
+ tenant: tenantId,
941
+ orgUnit: orgUnitId,
942
+ name: name,
943
+ metadata: metadata
944
+ }, ...args);
945
+ }
946
+ async renameGroup(groupId, name, ...args) {
947
+ return this.updateOne(groupId, {
948
+ name: name
949
+ }, ...args);
950
+ }
951
+ async moveGroupToOrgUnit(groupId, orgUnitId, ...args) {
952
+ return this.updateOne(groupId, {
953
+ orgUnit: orgUnitId
954
+ }, ...args);
955
+ }
956
+ async listTenantGroups(tenantId, ...args) {
957
+ return (await this.listAll(...args)).filter(group => sameTenant(group.tenant, tenantId));
958
+ }
959
+ }
960
+ class GroupMembershipService extends BaseModelService {
961
+ constructor() {
962
+ super(exports.GroupMembership);
963
+ }
964
+ async addPrincipalToGroup(tenantId, groupId, principalId, metadata, ...args) {
965
+ return this.create({
966
+ tenant: tenantId,
967
+ group: groupId,
968
+ principal: principalId,
969
+ metadata: metadata
970
+ }, ...args);
971
+ }
972
+ async listGroupMembers(groupId, ...args) {
973
+ return (await this.listAll(...args)).filter(membership => relationMatch(membership.group, groupId));
974
+ }
975
+ async listPrincipalGroups(principalId, ...args) {
976
+ return (await this.listAll(...args)).filter(membership => relationMatch(membership.principal, principalId));
977
+ }
978
+ async removePrincipalFromGroup(membershipId, ...args) {
979
+ await this.deleteById(membershipId, ...args);
980
+ }
981
+ async resolveGroupPrincipalIdsForPrincipal(principalId, ...args) {
982
+ const principalService = new PrincipalService;
983
+ const memberships = await this.listPrincipalGroups(principalId, ...args);
984
+ const principals = await Promise.all(memberships.map(async membership => {
985
+ const tenantId = relationId(membership.tenant);
986
+ const groupId = relationId(membership.group);
987
+ const principal = await principalService.getGroupPrincipal(tenantId, groupId, ...args);
988
+ return principal.id;
989
+ }));
990
+ return principals;
991
+ }
992
+ }
993
+ class PermissionService extends BaseModelService {
994
+ constructor() {
995
+ super(exports.Permission);
996
+ }
997
+ async createPermission(input, ...args) {
998
+ return this.create({
999
+ key: input.key,
1000
+ category: input.category,
1001
+ description: input.description
1002
+ }, ...args);
1003
+ }
1004
+ async getByKey(key, ...args) {
1005
+ return (await this.listAll(...args)).find(permission => permission.key === key);
1006
+ }
1007
+ async listByCategory(category, ...args) {
1008
+ return (await this.listAll(...args)).filter(permission => permission.category === category);
1009
+ }
1010
+ async updateDescription(permissionId, description, ...args) {
1011
+ return this.updateOne(permissionId, {
1012
+ description: description
1013
+ }, ...args);
1014
+ }
1015
+ }
1016
+ class RoleService extends BaseModelService {
1017
+ constructor() {
1018
+ super(exports.Role);
1019
+ }
1020
+ async createRole(input, ...args) {
1021
+ return this.create({
1022
+ tenant: input.tenantId,
1023
+ key: input.key,
1024
+ name: input.name,
1025
+ description: input.description,
1026
+ metadata: input.metadata
1027
+ }, ...args);
1028
+ }
1029
+ async getSystemRoleByKey(key, ...args) {
1030
+ const role = (await this.listAll(...args)).find(candidate => !candidate.tenant && candidate.key === key);
1031
+ if (!role) {
1032
+ throw new Error(`Role "${key}" not found`);
1033
+ }
1034
+ return role;
1035
+ }
1036
+ async getTenantRoleByKey(tenantId, key, ...args) {
1037
+ const role = (await this.listAll(...args)).find(candidate => sameTenant(candidate.tenant, tenantId) && candidate.key === key);
1038
+ if (!role) {
1039
+ throw new Error(`Role "${key}" not found for tenant ${tenantId}`);
1040
+ }
1041
+ return role;
1042
+ }
1043
+ async renameRole(roleId, name, ...args) {
1044
+ return this.updateOne(roleId, {
1045
+ name: name
1046
+ }, ...args);
1047
+ }
1048
+ async updateRoleMetadata(roleId, metadata, ...args) {
1049
+ return this.updateOne(roleId, {
1050
+ metadata: metadata
1051
+ }, ...args);
1052
+ }
1053
+ async listTenantRoles(tenantId, includeSystem = false, ...args) {
1054
+ return (await this.listAll(...args)).filter(role => includeSystem ? !role.tenant || sameTenant(role.tenant, tenantId) : sameTenant(role.tenant, tenantId));
1055
+ }
1056
+ }
1057
+ async function deleteRowsById(service, rows, ...args) {
1058
+ for (const row of rows) {
1059
+ await service.deleteById(row.id, ...args);
1060
+ }
1061
+ }
1062
+ class RolePermissionService extends BaseModelService {
1063
+ constructor() {
1064
+ super(exports.RolePermission);
1065
+ }
1066
+ async addPermissionToRole(roleId, permissionId, ...args) {
1067
+ return this.create({
1068
+ role: roleId,
1069
+ permission: permissionId
1070
+ }, ...args);
1071
+ }
1072
+ async addPermissionKeyToRole(roleId, permissionKey, ...args) {
1073
+ const permission = await (new PermissionService).getByKey(permissionKey, ...args);
1074
+ return this.addPermissionToRole(roleId, permission.id, ...args);
1075
+ }
1076
+ async removePermissionFromRole(rolePermissionId, ...args) {
1077
+ await this.deleteById(rolePermissionId, ...args);
1078
+ }
1079
+ async listRolePermissions(roleId, ...args) {
1080
+ return (await this.listAll(...args)).filter(rolePermission => relationMatch(rolePermission.role, roleId));
1081
+ }
1082
+ async listPermissionRoles(permissionId, ...args) {
1083
+ return (await this.listAll(...args)).filter(rolePermission => relationMatch(rolePermission.permission, permissionId));
1084
+ }
1085
+ async replaceRolePermissions(roleId, permissionIds, ...args) {
1086
+ const existing = await this.listRolePermissions(roleId, ...args);
1087
+ await deleteRowsById(this, existing, ...args);
1088
+ return Promise.all(permissionIds.map(permissionId => this.addPermissionToRole(roleId, permissionId, ...args)));
1089
+ }
1090
+ async createRoleWithPermissions(input, permissionKeys, ...args) {
1091
+ const role = await (new RoleService).createRole(input, ...args);
1092
+ for (const permissionKey of permissionKeys) {
1093
+ await this.addPermissionKeyToRole(role.id, permissionKey, ...args);
1094
+ }
1095
+ return role;
1096
+ }
1097
+ }
1098
+ class RoleAssignmentService extends BaseModelService {
1099
+ constructor() {
1100
+ super(exports.RoleAssignment);
1101
+ }
1102
+ async assignRole(input, ...args) {
1103
+ return this.create({
1104
+ tenant: input.tenantId,
1105
+ principal: input.principalId,
1106
+ role: input.roleId,
1107
+ scopeKind: input.scopeKind,
1108
+ scopeId: input.scopeId,
1109
+ inheritDown: input.inheritDown ?? false,
1110
+ startsAt: input.startsAt,
1111
+ expiresAt: input.expiresAt,
1112
+ conditions: input.conditions
1113
+ }, ...args);
1114
+ }
1115
+ async revokeAssignment(assignmentId, ...args) {
1116
+ await this.deleteById(assignmentId, ...args);
1117
+ }
1118
+ async listPrincipalAssignments(tenantId, principalId, ...args) {
1119
+ return (await this.listAll(...args)).filter(assignment => sameTenant(assignment.tenant, tenantId) && relationMatch(assignment.principal, principalId));
1120
+ }
1121
+ async listRoleAssignments(roleId, ...args) {
1122
+ return (await this.listAll(...args)).filter(assignment => relationMatch(assignment.role, roleId));
1123
+ }
1124
+ async listTenantAssignments(tenantId, ...args) {
1125
+ return (await this.listAll(...args)).filter(assignment => sameTenant(assignment.tenant, tenantId));
1126
+ }
1127
+ async updateAssignmentWindow(assignmentId, startsAt, expiresAt, ...args) {
1128
+ return this.updateOne(assignmentId, {
1129
+ startsAt: startsAt,
1130
+ expiresAt: expiresAt
1131
+ }, ...args);
1132
+ }
1133
+ }
1134
+ class EffectivePermissionService extends BaseModelService {
1135
+ constructor() {
1136
+ super(exports.EffectivePermission);
1137
+ }
1138
+ async listForPrincipal(tenantId, principalId, ...args) {
1139
+ return (await this.listAll(...args)).filter(permission => sameTenant(permission.tenant, tenantId) && relationMatch(permission.principal, principalId));
1140
+ }
1141
+ async listForScope(tenantId, scopeKind, scopeId, ...args) {
1142
+ return (await this.listAll(...args)).filter(permission => sameTenant(permission.tenant, tenantId) && permission.scopeKind === scopeKind && permission.scopeId === scopeId);
1143
+ }
1144
+ async hasPermission(tenantId, principalId, permissionKey, scopeKind, scopeId, at, ...args) {
1145
+ return (await this.listForPrincipal(tenantId, principalId, ...args)).some(permission => permission.permissionKey === permissionKey && permission.scopeKind === scopeKind && permission.scopeId === scopeId && (!permission.startsAt || !at || permission.startsAt <= at) && (!permission.expiresAt || !at || permission.expiresAt >= at));
1146
+ }
1147
+ async deleteForPrincipal(tenantId, principalId, ...args) {
1148
+ for (const row of await this.listForPrincipal(tenantId, principalId, ...args)) {
1149
+ await this.deleteById(row.id, ...args);
1150
+ }
1151
+ }
1152
+ async deleteForTenant(tenantId, ...args) {
1153
+ for (const row of (await this.listAll(...args)).filter(permission => sameTenant(permission.tenant, tenantId))) {
1154
+ await this.deleteById(row.id, ...args);
1155
+ }
1156
+ }
1157
+ async rebuildForPrincipal(tenantId, principalId, ...args) {
1158
+ await this.deleteForPrincipal(tenantId, principalId, ...args);
1159
+ const roleAssignmentService = new RoleAssignmentService;
1160
+ const rolePermissionService = new RolePermissionService;
1161
+ const permissionService = new PermissionService;
1162
+ const groupMembershipService = new GroupMembershipService;
1163
+ const principalService = new PrincipalService;
1164
+ const orgUnitClosureService = new OrgUnitClosureService;
1165
+ const inheritanceBlockService = new InheritanceBlockService;
1166
+ const materialized = [];
1167
+ const sourceAssignments = await roleAssignmentService.listPrincipalAssignments(tenantId, principalId, ...args);
1168
+ const groupMemberships = await groupMembershipService.listPrincipalGroups(principalId, ...args);
1169
+ const groupAssignments = (await Promise.all(groupMemberships.map(async membership => {
1170
+ const groupPrincipal = await principalService.getGroupPrincipal(relationId(membership.tenant), relationId(membership.group), ...args);
1171
+ return roleAssignmentService.listPrincipalAssignments(tenantId, groupPrincipal.id, ...args);
1172
+ }))).flat();
1173
+ const assignments = [ ...sourceAssignments, ...groupAssignments ];
1174
+ for (const assignment of assignments) {
1175
+ const rolePermissions = await rolePermissionService.listRolePermissions(relationId(assignment.role), ...args);
1176
+ const permissions = await Promise.all(rolePermissions.map(async rolePermission => permissionService.findOneBy("id", relationId(rolePermission.permission), ...args)));
1177
+ for (const permission of permissions) {
1178
+ if (!permission) continue;
1179
+ const scopeKind = assignment.scopeKind;
1180
+ const scopeId = assignment.scopeId;
1181
+ const scopes = [];
1182
+ if (scopeKind === exports.ScopeKind.Tenant) {
1183
+ scopes.push({
1184
+ scopeKind: scopeKind,
1185
+ scopeId: tenantId
1186
+ });
1187
+ } else if (scopeKind === exports.ScopeKind.Resource) {
1188
+ scopes.push({
1189
+ scopeKind: scopeKind,
1190
+ scopeId: scopeId
1191
+ });
1192
+ } else if (scopeKind === exports.ScopeKind.OrgUnit && !assignment.inheritDown) {
1193
+ scopes.push({
1194
+ scopeKind: scopeKind,
1195
+ scopeId: scopeId
1196
+ });
1197
+ } else if (scopeKind === exports.ScopeKind.OrgUnit && assignment.inheritDown) {
1198
+ const descendants = await orgUnitClosureService.listDescendants(tenantId, scopeId, ...args);
1199
+ scopes.push(...descendants.map(row => ({
1200
+ scopeKind: scopeKind,
1201
+ scopeId: relationId(row.descendant)
1202
+ })));
1203
+ }
1204
+ for (const scoped of scopes) {
1205
+ if (scopeKind === exports.ScopeKind.OrgUnit && assignment.inheritDown && scoped.scopeId !== scopeId && await inheritanceBlockService.categoryBlockedForAncestor(tenantId, scoped.scopeId, scopeId, permission.category, ...args)) {
1206
+ continue;
1207
+ }
1208
+ materialized.push({
1209
+ id: "",
1210
+ tenantId: tenantId,
1211
+ principalId: principalId,
1212
+ permissionKey: permission.key,
1213
+ scopeKind: scoped.scopeKind,
1214
+ scopeId: scoped.scopeId,
1215
+ sourceKind: "role_assignment",
1216
+ sourceId: assignment.id,
1217
+ startsAt: assignment.startsAt,
1218
+ expiresAt: assignment.expiresAt
1219
+ });
1220
+ }
1221
+ }
1222
+ }
1223
+ const created = await Promise.all(materialized.map(permission => this.create({
1224
+ tenant: permission.tenantId,
1225
+ principal: permission.principalId,
1226
+ permissionKey: permission.permissionKey,
1227
+ scopeKind: permission.scopeKind,
1228
+ scopeId: permission.scopeId,
1229
+ sourceKind: permission.sourceKind,
1230
+ sourceId: permission.sourceId,
1231
+ startsAt: permission.startsAt,
1232
+ expiresAt: permission.expiresAt
1233
+ }, ...args)));
1234
+ return created;
1235
+ }
1236
+ async rebuildForTenant(tenantId, ...args) {
1237
+ const principals = (await (new PrincipalService).listAll(...args)).filter(principal => sameTenant(principal.tenant, tenantId));
1238
+ for (const principal of principals) {
1239
+ await this.rebuildForPrincipal(tenantId, principal.id, ...args);
1240
+ }
1241
+ }
1242
+ }
1243
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ String, String, Object ]), tslib.__metadata("design:returntype", Promise) ], EffectivePermissionService.prototype, "rebuildForPrincipal", null);
1244
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ String, Object ]), tslib.__metadata("design:returntype", Promise) ], EffectivePermissionService.prototype, "rebuildForTenant", null);
1245
+ class ProtectedResourceService extends BaseModelService {
1246
+ constructor() {
1247
+ super(exports.ProtectedResource);
1248
+ }
1249
+ async registerResource(input, ...args) {
1250
+ return this.create({
1251
+ tenant: input.tenantId,
1252
+ orgUnit: input.orgUnitId,
1253
+ resourceType: input.resourceType,
1254
+ resourceId: input.resourceId,
1255
+ visibility: input.visibility,
1256
+ owner: input.ownerPrincipalId,
1257
+ sensitivity: input.sensitivity,
1258
+ metadata: input.metadata
1259
+ }, ...args);
1260
+ }
1261
+ async getByDomainResource(tenantId, resourceType, resourceId, ...args) {
1262
+ return (await this.listAll(...args)).find(resource => sameTenant(resource.tenant, tenantId) && resource.resourceType === resourceType && resource.resourceId === resourceId);
1263
+ }
1264
+ async moveResourceToOrgUnit(protectedResourceId, orgUnitId, ...args) {
1265
+ return this.updateOne(protectedResourceId, {
1266
+ orgUnit: orgUnitId
1267
+ }, ...args);
1268
+ }
1269
+ async setVisibility(protectedResourceId, visibility, ...args) {
1270
+ return this.updateOne(protectedResourceId, {
1271
+ visibility: visibility
1272
+ }, ...args);
1273
+ }
1274
+ async transferOwnership(protectedResourceId, ownerPrincipalId, ...args) {
1275
+ return this.updateOne(protectedResourceId, {
1276
+ owner: ownerPrincipalId
1277
+ }, ...args);
1278
+ }
1279
+ async listOrgUnitResources(orgUnitId, ...args) {
1280
+ return (await this.listAll(...args)).filter(resource => relationMatch(resource.orgUnit, orgUnitId));
1281
+ }
1282
+ async listTenantResources(tenantId, ...args) {
1283
+ return (await this.listAll(...args)).filter(resource => sameTenant(resource.tenant, tenantId));
1284
+ }
1285
+ }
1286
+ class ResourceGrantService extends BaseModelService {
1287
+ constructor() {
1288
+ super(exports.ResourceGrant);
1289
+ }
1290
+ async grantResource(input, ...args) {
1291
+ return this.create({
1292
+ tenant: input.tenantId,
1293
+ resource: input.resourceId,
1294
+ principal: input.principalId,
1295
+ permissionKey: input.permissionKey,
1296
+ startsAt: input.startsAt,
1297
+ expiresAt: input.expiresAt,
1298
+ conditions: input.conditions,
1299
+ createdBy: input.createdByPrincipalId
1300
+ }, ...args);
1301
+ }
1302
+ async revokeGrant(grantId, ...args) {
1303
+ await this.deleteById(grantId, ...args);
1304
+ }
1305
+ async listResourceGrants(protectedResourceId, ...args) {
1306
+ return (await this.listAll(...args)).filter(grant => relationMatch(grant.resource, protectedResourceId));
1307
+ }
1308
+ async listPrincipalGrants(tenantId, principalId, ...args) {
1309
+ return (await this.listAll(...args)).filter(grant => sameTenant(grant.tenant, tenantId) && relationMatch(grant.principal, principalId));
1310
+ }
1311
+ async hasGrant(tenantId, principalId, protectedResourceId, permissionKey, at, ...args) {
1312
+ return (await this.listPrincipalGrants(tenantId, principalId, ...args)).some(grant => relationMatch(grant.resource, protectedResourceId) && grant.permissionKey === permissionKey && (!grant.startsAt || !at || grant.startsAt <= at) && (!grant.expiresAt || !at || grant.expiresAt >= at));
1313
+ }
1314
+ async deleteAllForResource(protectedResourceId, ...args) {
1315
+ for (const row of await this.listResourceGrants(protectedResourceId, ...args)) {
1316
+ await this.deleteById(row.id, ...args);
1317
+ }
1318
+ }
1319
+ }
1320
+ class ResourceLifecycleService {
1321
+ async unregisterResource(protectedResourceId, ...args) {
1322
+ await (new ResourceGrantService).deleteAllForResource(protectedResourceId, ...args);
1323
+ await (new ProtectedResourceService).deleteById(protectedResourceId, ...args);
1324
+ }
1325
+ async resolveResourceScope(protectedResourceId, ...args) {
1326
+ const resource = await (new ProtectedResourceService).getById(protectedResourceId, ...args);
1327
+ return {
1328
+ tenantId: relationId(resource.tenant),
1329
+ orgUnitId: relationId(resource.orgUnit),
1330
+ visibility: resource.visibility,
1331
+ ownerPrincipalId: resource.owner ? relationId(resource.owner) : undefined
1332
+ };
1333
+ }
1334
+ }
1335
+ class StorageBindingService extends BaseModelService {
1336
+ constructor() {
1337
+ super(exports.StorageBinding);
1338
+ }
1339
+ async createBinding(input, ...args) {
1340
+ return this.create({
1341
+ tenant: input.tenantId,
1342
+ storageKind: input.storageKind,
1343
+ bindingKind: input.bindingKind,
1344
+ bindingKey: input.bindingKey,
1345
+ region: input.region,
1346
+ config: input.config
1347
+ }, ...args);
1348
+ }
1349
+ async listTenantBindings(tenantId, ...args) {
1350
+ return (await this.listAll(...args)).filter(binding => relationId(binding.tenant) === tenantId);
1351
+ }
1352
+ async getBinding(tenantId, storageKind, ...args) {
1353
+ return (await this.listTenantBindings(tenantId, ...args)).find(binding => binding.storageKind === storageKind);
1354
+ }
1355
+ async setBindingConfig(bindingId, config, ...args) {
1356
+ return this.updateOne(bindingId, {
1357
+ config: config
1358
+ }, ...args);
1359
+ }
1360
+ async promoteToDedicated(bindingId, bindingKey, region, config, ...args) {
1361
+ return this.updateOne(bindingId, {
1362
+ bindingKind: exports.StorageBindingKind.Dedicated,
1363
+ bindingKey: bindingKey,
1364
+ region: region,
1365
+ config: config
1366
+ }, ...args);
1367
+ }
1368
+ async setShared(bindingId, bindingKey, region, config, ...args) {
1369
+ return this.updateOne(bindingId, {
1370
+ bindingKind: exports.StorageBindingKind.Shared,
1371
+ bindingKey: bindingKey,
1372
+ region: region,
1373
+ config: config
1374
+ }, ...args);
1375
+ }
1376
+ }
1377
+ class BootstrapService {
1378
+ constructor() {
1379
+ this.tenantService = new TenantService;
1380
+ this.tenantProfileService = new TenantProfileService;
1381
+ this.orgUnitService = new OrgUnitService;
1382
+ this.orgUnitProfileService = new OrgUnitProfileService;
1383
+ this.userService = new UserService;
1384
+ this.membershipService = new TenantMembershipService;
1385
+ this.principalService = new PrincipalService;
1386
+ this.permissionService = new PermissionService;
1387
+ this.roleService = new RoleService;
1388
+ this.rolePermissionService = new RolePermissionService;
1389
+ this.roleAssignmentService = new RoleAssignmentService;
1390
+ this.effectivePermissionService = new EffectivePermissionService;
1391
+ }
1392
+ async bootstrapTenantFromTemplate(template, ...args) {
1393
+ const tenant = await this.tenantService.createTenant(template.tenant, ...args);
1394
+ if (template.tenant.profileKey) {
1395
+ await this.tenantProfileService.createProfile(tenant.id, template.tenant.profileKey, template.tenant.profileMetadata, ...args);
1396
+ }
1397
+ const createOrgTree = async (parentId, orgUnit) => {
1398
+ const created = parentId === undefined ? await this.orgUnitService.createRoot(tenant.id, orgUnit.name, orgUnit.metadata, orgUnit.profileKey, orgUnit.metadata, ...args) : await this.orgUnitService.createChild({
1399
+ tenantId: tenant.id,
1400
+ parentOrgUnitId: parentId,
1401
+ name: orgUnit.name,
1402
+ metadata: orgUnit.metadata,
1403
+ profileKey: orgUnit.profileKey,
1404
+ profileMetadata: orgUnit.metadata
1405
+ }, ...args);
1406
+ for (const child of orgUnit.children ?? []) {
1407
+ await createOrgTree(created.id, child);
1408
+ }
1409
+ return created;
1410
+ };
1411
+ const rootOrgUnit = await createOrgTree(undefined, template.rootOrgUnit);
1412
+ const owner = await this.userService.createUser(template.ownerUser, ...args);
1413
+ await this.membershipService.addUserToTenant(tenant.id, owner.id, exports.MembershipStatus.Active, ...args);
1414
+ const ownerPrincipal = await this.principalService.getUserPrincipal(tenant.id, owner.id, ...args);
1415
+ for (const permission of template.permissions) {
1416
+ await this.permissionService.createPermission(permission, ...args);
1417
+ }
1418
+ for (const role of template.roles) {
1419
+ const createdRole = await this.roleService.createRole({
1420
+ tenantId: tenant.id,
1421
+ key: role.key,
1422
+ name: role.name,
1423
+ description: role.description
1424
+ }, ...args);
1425
+ for (const permissionKey of role.permissionKeys) {
1426
+ await this.rolePermissionService.addPermissionKeyToRole(createdRole.id, permissionKey, ...args);
1427
+ }
1428
+ }
1429
+ const ownerRole = await this.roleService.getTenantRoleByKey(tenant.id, template.ownerRoleKey, ...args);
1430
+ await this.roleAssignmentService.assignRole({
1431
+ tenantId: tenant.id,
1432
+ principalId: ownerPrincipal.id,
1433
+ roleId: ownerRole.id,
1434
+ scopeKind: exports.ScopeKind.OrgUnit,
1435
+ scopeId: rootOrgUnit.id,
1436
+ inheritDown: true
1437
+ }, ...args);
1438
+ await this.effectivePermissionService.rebuildForPrincipal(tenant.id, ownerPrincipal.id, ...args);
1439
+ return {
1440
+ tenantId: tenant.id,
1441
+ rootOrgUnitId: rootOrgUnit.id,
1442
+ ownerUserId: owner.id,
1443
+ ownerPrincipalId: ownerPrincipal.id
1444
+ };
1445
+ }
1446
+ }
1447
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ Object, Object ]), tslib.__metadata("design:returntype", Promise) ], BootstrapService.prototype, "bootstrapTenantFromTemplate", null);
1448
+ class SystemManagementService {
1449
+ constructor() {
1450
+ this.membershipService = new TenantMembershipService;
1451
+ this.orgMembershipService = new OrgUnitMembershipService;
1452
+ this.principalService = new PrincipalService;
1453
+ this.roleService = new RoleService;
1454
+ this.roleAssignmentService = new RoleAssignmentService;
1455
+ this.effectivePermissionService = new EffectivePermissionService;
1456
+ }
1457
+ async onboardUserToTenantAndOrgUnit(tenantId, userId, orgUnitId, roleKey, ...args) {
1458
+ await this.membershipService.addUserToTenant(tenantId, userId, exports.MembershipStatus.Active, ...args);
1459
+ await this.orgMembershipService.addUserToOrgUnit(tenantId, orgUnitId, userId, exports.MembershipStatus.Active, ...args);
1460
+ const principal = await this.principalService.getUserPrincipal(tenantId, userId, ...args);
1461
+ const role = await this.roleService.getTenantRoleByKey(tenantId, roleKey, ...args);
1462
+ await this.roleAssignmentService.assignRole({
1463
+ tenantId: tenantId,
1464
+ principalId: principal.id,
1465
+ roleId: role.id,
1466
+ scopeKind: exports.ScopeKind.OrgUnit,
1467
+ scopeId: orgUnitId,
1468
+ inheritDown: true
1469
+ }, ...args);
1470
+ await this.effectivePermissionService.rebuildForPrincipal(tenantId, principal.id, ...args);
1471
+ return {
1472
+ principalId: principal.id
1473
+ };
1474
+ }
1475
+ async changeUserOrgRole(tenantId, principalId, orgUnitId, roleKey, inheritDown, ...args) {
1476
+ const role = await this.roleService.getTenantRoleByKey(tenantId, roleKey, ...args);
1477
+ const currentAssignments = await this.roleAssignmentService.listPrincipalAssignments(tenantId, principalId, ...args);
1478
+ for (const assignment of currentAssignments.filter(row => row.scopeKind === exports.ScopeKind.OrgUnit && row.scopeId === orgUnitId)) {
1479
+ await this.roleAssignmentService.revokeAssignment(assignment.id, ...args);
1480
+ }
1481
+ await this.roleAssignmentService.assignRole({
1482
+ tenantId: tenantId,
1483
+ principalId: principalId,
1484
+ roleId: role.id,
1485
+ scopeKind: exports.ScopeKind.OrgUnit,
1486
+ scopeId: orgUnitId,
1487
+ inheritDown: inheritDown
1488
+ }, ...args);
1489
+ await this.effectivePermissionService.rebuildForPrincipal(tenantId, principalId, ...args);
1490
+ }
1491
+ async suspendUserInTenant(tenantMembershipId, tenantId, principalId, ...args) {
1492
+ await this.membershipService.setStatus(tenantMembershipId, exports.MembershipStatus.Suspended, ...args);
1493
+ await this.effectivePermissionService.deleteForPrincipal(tenantId, principalId, ...args);
1494
+ }
1495
+ async reactivateUserInTenant(tenantMembershipId, tenantId, principalId, ...args) {
1496
+ await this.membershipService.setStatus(tenantMembershipId, exports.MembershipStatus.Active, ...args);
1497
+ await this.effectivePermissionService.rebuildForPrincipal(tenantId, principalId, ...args);
1498
+ }
1499
+ }
1500
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ String, String, String, String, Object ]), tslib.__metadata("design:returntype", Promise) ], SystemManagementService.prototype, "onboardUserToTenantAndOrgUnit", null);
1501
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ String, String, String, String, Boolean, Object ]), tslib.__metadata("design:returntype", Promise) ], SystemManagementService.prototype, "changeUserOrgRole", null);
1502
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ String, String, String, Object ]), tslib.__metadata("design:returntype", Promise) ], SystemManagementService.prototype, "suspendUserInTenant", null);
1503
+ tslib.__decorate([ core.transactional(), tslib.__metadata("design:type", Function), tslib.__metadata("design:paramtypes", [ String, String, String, Object ]), tslib.__metadata("design:returntype", Promise) ], SystemManagementService.prototype, "reactivateUserInTenant", null);
1504
+ function scopeKey(scopeKind, scopeId) {
1505
+ return `${scopeKind}:${scopeId}`;
1506
+ }
1507
+ class AuthzService {
1508
+ constructor(dataSources = {}) {
1509
+ this.dataSources = dataSources;
1510
+ }
1511
+ async canAccess(input, ...args) {
1512
+ const at = input.at ?? new Date;
1513
+ if (input.scopeKind && input.scopeId) {
1514
+ const permissions = await (this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, input.scopeKind, input.scopeId));
1515
+ return asArray(permissions).some(permission => permission.permissionKey === input.permissionKey && isTimeValid(at, permission.startsAt, permission.expiresAt));
1516
+ }
1517
+ if (!input.resourceProtectedId) return false;
1518
+ const resource = await (this.dataSources.loadResource?.(input.tenantId, input.resourceProtectedId));
1519
+ if (!resource) return false;
1520
+ if (resource.tenantId !== input.tenantId) return false;
1521
+ if (resource.ownerPrincipalId === input.principalId) return true;
1522
+ const grants = asArray(await (this.dataSources.listResourceGrants?.(input.tenantId, input.resourceProtectedId))).filter(grant => grant.principalId === input.principalId && grant.permissionKey === input.permissionKey && isTimeValid(at, grant.startsAt, grant.expiresAt));
1523
+ if (grants.length > 0) return true;
1524
+ const visibility = resource.visibility;
1525
+ if (visibility === exports.ResourceVisibility.Private || visibility === exports.ResourceVisibility.ResourceAcl) {
1526
+ return false;
1527
+ }
1528
+ if (visibility === exports.ResourceVisibility.OrgUnit || visibility === exports.ResourceVisibility.OrgSubtree) {
1529
+ const effectivePermissions = asArray(await (this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, exports.ScopeKind.OrgUnit, resource.orgUnitId)));
1530
+ return effectivePermissions.some(permission => permission.permissionKey === input.permissionKey && isTimeValid(at, permission.startsAt, permission.expiresAt));
1531
+ }
1532
+ if (visibility === exports.ResourceVisibility.Tenant) {
1533
+ const effectivePermissions = asArray(await (this.dataSources.listEffectivePermissionsForScope?.(input.tenantId, exports.ScopeKind.Tenant, input.tenantId)));
1534
+ return effectivePermissions.some(permission => permission.permissionKey === input.permissionKey && isTimeValid(at, permission.startsAt, permission.expiresAt));
1535
+ }
1536
+ return false;
1537
+ }
1538
+ async requireAccess(input, ...args) {
1539
+ if (!await this.canAccess(input, ...args)) {
1540
+ throw new core.AuthorizationError(`Access denied for ${input.permissionKey} on ${input.resourceProtectedId ?? scopeKey(input.scopeKind ?? exports.ScopeKind.Resource, input.scopeId ?? "")}`);
1541
+ }
1542
+ }
1543
+ async buildAccessContext(tenantId, principalId, ...args) {
1544
+ const permissions = asArray(await (this.dataSources.listEffectivePermissions?.(tenantId, principalId)));
1545
+ const grants = asArray(await (this.dataSources.listPrincipalGrants?.(tenantId, principalId)));
1546
+ return buildAccessContext({
1547
+ tenantId: tenantId,
1548
+ principalId: principalId,
1549
+ permissions: permissions,
1550
+ grants: grants
1551
+ });
1552
+ }
1553
+ async buildArangoContext(tenantId, principalId, permissionKey, ...args) {
1554
+ const access = await this.buildAccessContext(tenantId, principalId, ...args);
1555
+ const allowedOrgUnitIds = access.allowedOrgUnitIdsByPermission[permissionKey] ?? [];
1556
+ const allowedResourceIds = access.resourceGrants.filter(grant => grant.permissionKey === permissionKey).map(grant => grant.resourceId);
1557
+ return buildArangoContext({
1558
+ tenantId: tenantId,
1559
+ principalId: principalId,
1560
+ permissionKey: permissionKey,
1561
+ allowedOrgUnitIds: allowedOrgUnitIds,
1562
+ allowedResourceIds: allowedResourceIds
1563
+ });
1564
+ }
1565
+ async buildQdrantFilter(tenantId, principalId, permissionKey, ...args) {
1566
+ const access = await this.buildAccessContext(tenantId, principalId, ...args);
1567
+ const allowedOrgUnitIds = access.allowedOrgUnitIdsByPermission[permissionKey] ?? [];
1568
+ const allowedResourceIds = access.resourceGrants.filter(grant => grant.permissionKey === permissionKey).map(grant => grant.resourceId);
1569
+ return buildQdrantFilter({
1570
+ tenantId: tenantId,
1571
+ principalId: principalId,
1572
+ permissionKey: permissionKey,
1573
+ allowedOrgUnitIds: allowedOrgUnitIds,
1574
+ allowedResourceIds: allowedResourceIds
1575
+ });
1576
+ }
1577
+ }
1578
+ const VERSION = "0.3.11";
1579
+ const COMMIT = "e2c4409";
1580
+ const FULL_VERSION = "0.3.11-e2c4409";
1581
+ const PACKAGE_NAME = "@decaf-ts/integrations";
1582
+ Object.defineProperty(exports, "AuthorizationError", {
1583
+ enumerable: true,
1584
+ get: function() {
1585
+ return core.AuthorizationError;
1586
+ }
1587
+ });
1588
+ Object.defineProperty(exports, "transactional", {
1589
+ enumerable: true,
1590
+ get: function() {
1591
+ return core.transactional;
1592
+ }
1593
+ });
1594
+ exports.AuthorizationModel = AuthorizationModel;
1595
+ exports.AuthzService = AuthzService;
1596
+ exports.BaseModelService = BaseModelService;
1597
+ exports.BootstrapService = BootstrapService;
1598
+ exports.COMMIT = COMMIT;
1599
+ exports.EffectivePermissionService = EffectivePermissionService;
1600
+ exports.FULL_VERSION = FULL_VERSION;
1601
+ exports.GroupMembershipService = GroupMembershipService;
1602
+ exports.GroupService = GroupService;
1603
+ exports.InheritanceBlockService = InheritanceBlockService;
1604
+ exports.IsolationTierOptions = IsolationTierOptions;
1605
+ exports.MembershipStatusOptions = MembershipStatusOptions;
1606
+ exports.OrgUnitClosureService = OrgUnitClosureService;
1607
+ exports.OrgUnitMembershipService = OrgUnitMembershipService;
1608
+ exports.OrgUnitProfileService = OrgUnitProfileService;
1609
+ exports.OrgUnitService = OrgUnitService;
1610
+ exports.PACKAGE_NAME = PACKAGE_NAME;
1611
+ exports.PermissionCategoryOptions = PermissionCategoryOptions;
1612
+ exports.PermissionService = PermissionService;
1613
+ exports.PrincipalKindOptions = PrincipalKindOptions;
1614
+ exports.PrincipalService = PrincipalService;
1615
+ exports.ProtectedResourceService = ProtectedResourceService;
1616
+ exports.REL_CASCADE_DEPENDENT = REL_CASCADE_DEPENDENT;
1617
+ exports.REL_CASCADE_INSERT_UPDATE = REL_CASCADE_INSERT_UPDATE;
1618
+ exports.REL_NULLIFY = REL_NULLIFY;
1619
+ exports.REL_RESTRICT = REL_RESTRICT;
1620
+ exports.ResourceGrantService = ResourceGrantService;
1621
+ exports.ResourceLifecycleService = ResourceLifecycleService;
1622
+ exports.ResourceVisibilityOptions = ResourceVisibilityOptions;
1623
+ exports.RoleAssignmentService = RoleAssignmentService;
1624
+ exports.RolePermissionService = RolePermissionService;
1625
+ exports.RoleService = RoleService;
1626
+ exports.ScopeKindOptions = ScopeKindOptions;
1627
+ exports.StorageBindingKindOptions = StorageBindingKindOptions;
1628
+ exports.StorageBindingService = StorageBindingService;
1629
+ exports.StorageKindOptions = StorageKindOptions;
1630
+ exports.SystemManagementService = SystemManagementService;
1631
+ exports.TenantMembershipService = TenantMembershipService;
1632
+ exports.TenantProfileService = TenantProfileService;
1633
+ exports.TenantService = TenantService;
1634
+ exports.UserService = UserService;
1635
+ exports.VERSION = VERSION;
1636
+ exports.asArray = asArray;
1637
+ exports.buildAccessContext = buildAccessContext;
1638
+ exports.buildArangoContext = buildArangoContext;
1639
+ exports.buildQdrantFilter = buildQdrantFilter;
1640
+ exports.execWithLogging = execWithLogging;
1641
+ exports.id = id;
1642
+ exports.isTimeValid = isTimeValid;
1643
+ exports.lowerSlug = lowerSlug;
1644
+ exports.nowIso = nowIso;
1645
+ exports.relationId = relationId;
1646
+ exports.relationMatch = relationMatch;
1647
+ exports.sameTenant = sameTenant;
1648
+ });
1649
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb25zLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvdHlwZXMudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy91dGlscy50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9hdXRob3JpemF0aW9uLW1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3RlbmFudC1tZW1iZXJzaGlwLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3VzZXIubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvb3JnLXVuaXQtbWVtYmVyc2hpcC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC1jbG9zdXJlLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3Blcm1pc3Npb24ubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcm9sZS1wZXJtaXNzaW9uLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3JvbGUubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcm9sZS1hc3NpZ25tZW50Lm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3Jlc291cmNlLWdyYW50Lm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3ByaW5jaXBhbC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9wcm90ZWN0ZWQtcmVzb3VyY2UubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvaW5oZXJpdGFuY2UtYmxvY2subW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvb3JnLXVuaXQubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvc3RvcmFnZS1iaW5kaW5nLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3RlbmFudC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy90ZW5hbnQtcHJvZmlsZS5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC1wcm9maWxlLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL2dyb3VwLW1lbWJlcnNoaXAubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvZ3JvdXAubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvZWZmZWN0aXZlLXBlcm1pc3Npb24ubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy90ZW5hbnQtcHJvZmlsZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQtcHJvZmlsZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvaW5oZXJpdGFuY2UtYmxvY2suc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3RlbmFudC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3VzZXIuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3ByaW5jaXBhbC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL29yZy11bml0LW1lbWJlcnNoaXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2dyb3VwLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9ncm91cC1tZW1iZXJzaGlwLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9wZXJtaXNzaW9uLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9yb2xlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9yb2xlLXBlcm1pc3Npb24uc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3JvbGUtYXNzaWdubWVudC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvZWZmZWN0aXZlLXBlcm1pc3Npb24uc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3Byb3RlY3RlZC1yZXNvdXJjZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcmVzb3VyY2UtZ3JhbnQuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3Jlc291cmNlLWxpZmVjeWNsZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvc3RvcmFnZS1iaW5kaW5nLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9ib290c3RyYXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3N5c3RlbS1tYW5hZ2VtZW50LnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9hdXRoei5zZXJ2aWNlLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvdXRpbHNcbiAqIEBzdW1tYXJ5IFNoYXJlZCBpbnRlZ3JhdGlvbiB1dGlsaXRpZXMuXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBoZWxwZXJzIHVzZWQgYWNyb3NzIHRoZSBpbnRlZ3JhdGlvbnMgcGFja2FnZS5cbiAqL1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ0xldmVsIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjV2l0aExvZ2dpbmcoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0aW9uczogeyBjd2Q6IHN0cmluZyB9LFxuICBsb2c6IExvZ2dlcixcbiAgbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuaW5mb1xuKTogUHJvbWlzZTx7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9PiB7XG4gIGxvZy5kZWJ1ZyhgRXhlY3V0aW5nOiAke2NvbW1hbmR9YCk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGV4ZWMoY29tbWFuZCwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBzdGRvdXQ6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc3RkZXJyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgc3Rkb3V0LnB1c2goZGF0YSk7XG4gICAgICBsb2dbbGV2ZWxdKGRhdGEudHJpbSgpKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLnN0ZGVycj8ub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgIHN0ZGVyci5wdXNoKGRhdGEpO1xuICAgICAgbG9nLmRlYnVnKGRhdGEudHJpbSgpKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGU6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgbG9nLnNpbGx5KGBDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgKTtcbiAgICAgICAgcmVzb2x2ZSh7IHN0ZG91dDogc3Rkb3V0LmpvaW4oXCJcXG5cIiksIHN0ZGVycjogc3RkZXJyLmpvaW4oXCJcXG5cIikgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuY3JpdGljYWwoXG4gICAgICAgICAgYENvbW1hbmQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9OlxcbiAke3N0ZGVyci5qb2luKFwiXFxuXCIpfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYENvbW1hbmQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9OiAke3N0ZGVyci5qb2luKFwiXFxuXCIpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICBsb2cuY3JpdGljYWwoYENvbW1hbmQgZXhlY3V0aW9uIGVycm9yYCwgZXJyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImV4cG9ydCBlbnVtIElzb2xhdGlvblRpZXIge1xuICBQb29sZWQgPSBcInBvb2xlZFwiLFxuICBCcmlkZ2UgPSBcImJyaWRnZVwiLFxuICBTaWxvID0gXCJzaWxvXCIsXG59XG5cbmV4cG9ydCBlbnVtIE1lbWJlcnNoaXBTdGF0dXMge1xuICBJbnZpdGVkID0gXCJpbnZpdGVkXCIsXG4gIEFjdGl2ZSA9IFwiYWN0aXZlXCIsXG4gIFN1c3BlbmRlZCA9IFwic3VzcGVuZGVkXCIsXG4gIFJlbW92ZWQgPSBcInJlbW92ZWRcIixcbn1cblxuZXhwb3J0IGVudW0gUHJpbmNpcGFsS2luZCB7XG4gIFVzZXIgPSBcInVzZXJcIixcbiAgR3JvdXAgPSBcImdyb3VwXCIsXG4gIFNlcnZpY2VBY2NvdW50ID0gXCJzZXJ2aWNlX2FjY291bnRcIixcbiAgQWdlbnQgPSBcImFnZW50XCIsXG4gIEFwaUtleSA9IFwiYXBpX2tleVwiLFxufVxuXG5leHBvcnQgZW51bSBTY29wZUtpbmQge1xuICBUZW5hbnQgPSBcInRlbmFudFwiLFxuICBPcmdVbml0ID0gXCJvcmdfdW5pdFwiLFxuICBSZXNvdXJjZSA9IFwicmVzb3VyY2VcIixcbn1cblxuZXhwb3J0IGVudW0gUGVybWlzc2lvbkNhdGVnb3J5IHtcbiAgQWRtaW4gPSBcImFkbWluXCIsXG4gIENvbnRlbnRSZWFkID0gXCJjb250ZW50X3JlYWRcIixcbiAgQ29udGVudFdyaXRlID0gXCJjb250ZW50X3dyaXRlXCIsXG4gIE1lbW9yeSA9IFwibWVtb3J5XCIsXG4gIEdyYXBoID0gXCJncmFwaFwiLFxuICBWZWN0b3IgPSBcInZlY3RvclwiLFxuICBFeHBvcnQgPSBcImV4cG9ydFwiLFxuICBCaWxsaW5nID0gXCJiaWxsaW5nXCIsXG4gIEF1ZGl0ID0gXCJhdWRpdFwiLFxuICBTZWN1cml0eSA9IFwic2VjdXJpdHlcIixcbiAgRGF0YSA9IFwiZGF0YVwiLFxuICBBdXRvbWF0aW9uID0gXCJhdXRvbWF0aW9uXCIsXG59XG5cbmV4cG9ydCBlbnVtIFJlc291cmNlVmlzaWJpbGl0eSB7XG4gIFByaXZhdGUgPSBcInByaXZhdGVcIixcbiAgUmVzb3VyY2VBY2wgPSBcInJlc291cmNlX2FjbFwiLFxuICBPcmdVbml0ID0gXCJvcmdfdW5pdFwiLFxuICBPcmdTdWJ0cmVlID0gXCJvcmdfc3VidHJlZVwiLFxuICBUZW5hbnQgPSBcInRlbmFudFwiLFxufVxuXG5leHBvcnQgZW51bSBTdG9yYWdlS2luZCB7XG4gIFBvc3RncmVzID0gXCJwb3N0Z3Jlc1wiLFxuICBBcmFuZ28gPSBcImFyYW5nb1wiLFxuICBRZHJhbnQgPSBcInFkcmFudFwiLFxuICBPYmplY3RTdG9yYWdlID0gXCJvYmplY3Rfc3RvcmFnZVwiLFxufVxuXG5leHBvcnQgZW51bSBTdG9yYWdlQmluZGluZ0tpbmQge1xuICBTaGFyZWQgPSBcInNoYXJlZFwiLFxuICBEZWRpY2F0ZWQgPSBcImRlZGljYXRlZFwiLFxufVxuXG5leHBvcnQgY29uc3QgSXNvbGF0aW9uVGllck9wdGlvbnMgPSBPYmplY3QudmFsdWVzKElzb2xhdGlvblRpZXIpO1xuZXhwb3J0IGNvbnN0IE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhNZW1iZXJzaGlwU3RhdHVzKTtcbmV4cG9ydCBjb25zdCBQcmluY2lwYWxLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoUHJpbmNpcGFsS2luZCk7XG5leHBvcnQgY29uc3QgU2NvcGVLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoU2NvcGVLaW5kKTtcbmV4cG9ydCBjb25zdCBQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhQZXJtaXNzaW9uQ2F0ZWdvcnkpO1xuZXhwb3J0IGNvbnN0IFJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFJlc291cmNlVmlzaWJpbGl0eSk7XG5leHBvcnQgY29uc3QgU3RvcmFnZUtpbmRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhTdG9yYWdlS2luZCk7XG5leHBvcnQgY29uc3QgU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoU3RvcmFnZUJpbmRpbmdLaW5kKTtcblxuZXhwb3J0IHR5cGUgVHhBcmdzID0gYW55W107XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVGVuYW50SW5wdXQge1xuICBzbHVnOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNvbGF0aW9uVGllcj86IElzb2xhdGlvblRpZXI7XG4gIHByb2ZpbGVLZXk/OiBzdHJpbmc7XG4gIHByb2ZpbGVNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVVzZXJJbnB1dCB7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBwaG9uZT86IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPcmdVbml0SW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwYXJlbnRPcmdVbml0SWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZUtleT86IHN0cmluZztcbiAgcHJvZmlsZU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUm9sZUlucHV0IHtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVBlcm1pc3Npb25JbnB1dCB7XG4gIGtleTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3NpZ25Sb2xlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICByb2xlSWQ6IHN0cmluZztcbiAgc2NvcGVLaW5kOiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ6IHN0cmluZztcbiAgaW5oZXJpdERvd24/OiBib29sZWFuO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG4gIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclJlc291cmNlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBvcmdVbml0SWQ6IHN0cmluZztcbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHJlc291cmNlSWQ6IHN0cmluZztcbiAgdmlzaWJpbGl0eTogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICBvd25lclByaW5jaXBhbElkPzogc3RyaW5nO1xuICBzZW5zaXRpdml0eT86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmFudFJlc291cmNlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRCeVByaW5jaXBhbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbkFjY2Vzc0lucHV0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICByZXNvdXJjZVByb3RlY3RlZElkPzogc3RyaW5nO1xuICBzY29wZUtpbmQ/OiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ/OiBzdHJpbmc7XG4gIGF0PzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NDb250ZXh0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbnNCeVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIHJlc291cmNlR3JhbnRzOiBBcnJheTx7IHJlc291cmNlSWQ6IHN0cmluZzsgcGVybWlzc2lvbktleTogc3RyaW5nIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFyYW5nb0F1dGhDb250ZXh0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUWRyYW50QXV0aEZpbHRlciB7XG4gIG11c3Q6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgbXVzdF9ub3Q/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RvcmFnZUJpbmRpbmdJbnB1dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHN0b3JhZ2VLaW5kOiBTdG9yYWdlS2luZDtcbiAgYmluZGluZ0tpbmQ6IFN0b3JhZ2VCaW5kaW5nS2luZDtcbiAgYmluZGluZ0tleTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwUGVybWlzc2lvbiB7XG4gIGtleTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBSb2xlIHtcbiAga2V5OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXlzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBPcmdVbml0IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwcm9maWxlS2V5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjaGlsZHJlbj86IEJvb3RzdHJhcE9yZ1VuaXRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBUZW1wbGF0ZSB7XG4gIHRlbmFudDogQ3JlYXRlVGVuYW50SW5wdXQ7XG4gIHJvb3RPcmdVbml0OiBCb290c3RyYXBPcmdVbml0O1xuICBwZXJtaXNzaW9uczogQm9vdHN0cmFwUGVybWlzc2lvbltdO1xuICByb2xlczogQm9vdHN0cmFwUm9sZVtdO1xuICBvd25lclVzZXI6IENyZWF0ZVVzZXJJbnB1dDtcbiAgb3duZXJSb2xlS2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VTbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIG9yZ1VuaXRJZDogc3RyaW5nO1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gIG93bmVyUHJpbmNpcGFsSWQ/OiBzdHJpbmc7XG4gIHNlbnNpdGl2aXR5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50U25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRCeVByaW5jaXBhbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc2NvcGVLaW5kOiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ6IHN0cmluZztcbiAgc291cmNlS2luZDogc3RyaW5nO1xuICBzb3VyY2VJZDogc3RyaW5nO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aHpEYXRhU291cmNlcyB7XG4gIGxvYWRSZXNvdXJjZT86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcpID0+IFByb21pc2U8UmVzb3VyY2VTbmFwc2hvdCB8IHVuZGVmaW5lZD47XG4gIGxpc3RSZXNvdXJjZUdyYW50cz86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcpID0+IFByb21pc2U8R3JhbnRTbmFwc2hvdFtdPjtcbiAgbGlzdFByaW5jaXBhbEdyYW50cz86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nKSA9PiBQcm9taXNlPEdyYW50U25hcHNob3RbXT47XG4gIGxpc3RFZmZlY3RpdmVQZXJtaXNzaW9ucz86IChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbiAgbGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/OiAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbn1cbiIsImltcG9ydCB7IENhc2NhZGUsIE1vZGVsU2VydmljZSwgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBBY2Nlc3NDb250ZXh0LFxuICBBcmFuZ29BdXRoQ29udGV4dCxcbiAgRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90LFxuICBHcmFudFNuYXBzaG90LFxuICBRZHJhbnRBdXRoRmlsdGVyLFxuICBTY29wZUtpbmQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBSRUxfUkVTVFJJQ1QgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5OT05FLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbiAgbnVsbGFibGU6IGZhbHNlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9OVUxMSUZZID0ge1xuICB1cGRhdGU6IENhc2NhZGUuTk9ORSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG4gIG51bGxhYmxlOiB0cnVlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9DQVNDQURFX0RFUEVOREVOVCA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBudWxsYWJsZTogZmFsc2UsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUkVMX0NBU0NBREVfSU5TRVJUX1VQREFURSA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5OT05FLFxuICBudWxsYWJsZTogZmFsc2UsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBcmFuZ29Db250ZXh0KG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59KTogQXJhbmdvQXV0aENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkLFxuICAgIHByaW5jaXBhbElkOiBvcHRpb25zLnByaW5jaXBhbElkLFxuICAgIHBlcm1pc3Npb25LZXk6IG9wdGlvbnMucGVybWlzc2lvbktleSxcbiAgICBhbGxvd2VkT3JnVW5pdElkczogWy4uLm9wdGlvbnMuYWxsb3dlZE9yZ1VuaXRJZHNdLFxuICAgIGFsbG93ZWRSZXNvdXJjZUlkczogWy4uLm9wdGlvbnMuYWxsb3dlZFJlc291cmNlSWRzXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUWRyYW50RmlsdGVyKG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59KTogUWRyYW50QXV0aEZpbHRlciB7XG4gIHJldHVybiB7XG4gICAgbXVzdDogW1xuICAgICAge1xuICAgICAgICBrZXk6IFwidGVuYW50X2lkXCIsXG4gICAgICAgIG1hdGNoOiB7IHZhbHVlOiBvcHRpb25zLnRlbmFudElkIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzaG91bGQ6IFtcbiAgICAgICAgICB7IGtleTogXCJvcmdfdW5pdF9pZFwiLCBtYXRjaDogeyBhbnk6IG9wdGlvbnMuYWxsb3dlZE9yZ1VuaXRJZHMgfSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogXCJwcm90ZWN0ZWRfcmVzb3VyY2VfaWRcIixcbiAgICAgICAgICAgIG1hdGNoOiB7IGFueTogb3B0aW9ucy5hbGxvd2VkUmVzb3VyY2VJZHMgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsga2V5OiBcIm93bmVyX3ByaW5jaXBhbF9pZFwiLCBtYXRjaDogeyB2YWx1ZTogb3B0aW9ucy5wcmluY2lwYWxJZCB9IH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNjb3BlS2V5KHNjb3BlS2luZDogU2NvcGVLaW5kLCBzY29wZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2NvcGVLaW5kfToke3Njb3BlSWR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vd0lzbygpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc0FycmF5PFQ+KHZhbHVlOiBUW10gfCB1bmRlZmluZWQpOiBUW10ge1xuICByZXR1cm4gdmFsdWUgPz8gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lVGVuYW50KHJvd1RlbmFudDogdW5rbm93biwgdGVuYW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVsYXRpb25JZChyb3dUZW5hbnQgYXMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmcpID09PSB0ZW5hbnRJZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aW9uTWF0Y2goXG4gIHZhbHVlOiB1bmtub3duLFxuICB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiB0YXJnZXRcbiAgICA/IHJlbGF0aW9uSWQodmFsdWUgYXMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmcpID09PSB0YXJnZXRcbiAgICA6IGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG93ZXJTbHVnKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHZhbHVlXG4gICAgICAudHJpbSgpXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCItXCIpXG4gICAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCBcIlwiKSB8fCBcIml0ZW1cIlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUaW1lVmFsaWQoXG4gIGF0OiBEYXRlIHwgdW5kZWZpbmVkLFxuICBzdGFydHNBdD86IERhdGUsXG4gIGV4cGlyZXNBdD86IERhdGVcbik6IGJvb2xlYW4ge1xuICBjb25zdCBpbnN0YW50ID0gYXQgPz8gbmV3IERhdGUoKTtcbiAgaWYgKHN0YXJ0c0F0ICYmIGluc3RhbnQgPCBzdGFydHNBdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZXhwaXJlc0F0ICYmIGluc3RhbnQgPiBleHBpcmVzQXQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFjY2Vzc0NvbnRleHQob3B0aW9uczoge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90W107XG4gIGdyYW50czogR3JhbnRTbmFwc2hvdFtdO1xufSk6IEFjY2Vzc0NvbnRleHQge1xuICBjb25zdCBwZXJtaXNzaW9uc0J5U2NvcGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBjb25zdCBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIG9wdGlvbnMucGVybWlzc2lvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBzY29wZUtleShwZXJtaXNzaW9uLnNjb3BlS2luZCwgcGVybWlzc2lvbi5zY29wZUlkKTtcbiAgICBwZXJtaXNzaW9uc0J5U2NvcGVba2V5XSA9IHBlcm1pc3Npb25zQnlTY29wZVtrZXldID8/IFtdO1xuICAgIHBlcm1pc3Npb25zQnlTY29wZVtrZXldLnB1c2gocGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5KTtcbiAgICBpZiAocGVybWlzc2lvbi5zY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0KSB7XG4gICAgICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXldID1cbiAgICAgICAgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb24ucGVybWlzc2lvbktleV0ucHVzaChcbiAgICAgICAgcGVybWlzc2lvbi5zY29wZUlkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGVuYW50SWQ6IG9wdGlvbnMudGVuYW50SWQsXG4gICAgcHJpbmNpcGFsSWQ6IG9wdGlvbnMucHJpbmNpcGFsSWQsXG4gICAgcGVybWlzc2lvbnNCeVNjb3BlLFxuICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uLFxuICAgIHJlc291cmNlR3JhbnRzOiBvcHRpb25zLmdyYW50cy5tYXAoKGdyYW50KSA9PiAoe1xuICAgICAgcmVzb3VyY2VJZDogZ3JhbnQucmVzb3VyY2VJZCxcbiAgICAgIHBlcm1pc3Npb25LZXk6IGdyYW50LnBlcm1pc3Npb25LZXksXG4gICAgfSkpLFxuICB9O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsU2VydmljZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+ICYgeyBpZDogc3RyaW5nIH0sXG4+IGV4dGVuZHMgTW9kZWxTZXJ2aWNlPE0sIFJlcG9zaXRvcnk8TSwgYW55Pj4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xheno6IG5ldyAoKSA9PiBNKSB7XG4gICAgc3VwZXIoY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld01vZGVsPFQ+KGNsYXp6OiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBjbGF6eigpIGFzIG9iamVjdCwgZGF0YSBhcyBvYmplY3QpIGFzIFQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGUoZGF0YTogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmNyZWF0ZShPYmplY3QuYXNzaWduKHt9IGFzIE0sIGRhdGEgYXMgb2JqZWN0KSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPbmUoZGF0YTogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoZGF0YSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBnZXRCeUlkKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5yZWFkKGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU9uZShpZDogc3RyaW5nLCBwYXRjaDogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMucmVwby5yZWFkKGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnVwZGF0ZShPYmplY3QuYXNzaWduKGV4aXN0aW5nLCBwYXRjaCksIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQnlJZChpZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVwby5kZWxldGUoaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZUJ5PEsgZXh0ZW5kcyBrZXlvZiBNICYgc3RyaW5nPihcbiAgICBrZXk6IEssXG4gICAgdmFsdWU6IE1bS10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5maW5kT25lQnkoa2V5LCB2YWx1ZSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kTWFueUJ5PEsgZXh0ZW5kcyBrZXlvZiBNICYgc3RyaW5nPihcbiAgICBrZXk6IEssXG4gICAgdmFsdWU6IE1bS10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvXG4gICAgICAuc2VsZWN0KClcbiAgICAgIC53aGVyZSh7IFtrZXldOiB2YWx1ZSB9IGFzIGFueSlcbiAgICAgIC5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEFsbCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5zZWxlY3QoKS5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZCgpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aW9uSWQodmFsdWU6IHN0cmluZyB8IHsgaWQ6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUuaWQ7XG59XG5cbmV4cG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciwgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdXRob3JpemF0aW9uTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSBhcyBuZXZlcik7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi91c2VyLm1vZGVsXCI7XG5cbkB0YWJsZShcInRlbmFudF9tZW1iZXJzaGlwc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnRNZW1iZXJzaGlwIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3RlbmFudF9tZW1iZXJzaGlwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFVzZXIsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma190ZW5hbnRfbWVtYmVyc2hpcHNfdXNlclwiKVxuICBAcmVxdWlyZWQoKVxuICB1c2VyITogVXNlciB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMpIEBjb2x1bW4oKSBzdGF0dXMhOiBNZW1iZXJzaGlwU3RhdHVzO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgb25lVG9NYW55LFxuICBwayxcbiAgdGFibGUsXG4gIHVuaXF1ZSxcbiAgdXBkYXRlZEF0LFxuICB1dWlkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcCB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcCB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAubW9kZWxcIjtcblxuQHRhYmxlKFwidXNlcnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgVXNlciBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICBAdXVpZCgpXG4gIGlkITogc3RyaW5nO1xuXG4gIEB1bmlxdWUoKVxuICBAdHlwZShTdHJpbmcpXG4gIEBjb2x1bW4oKVxuICBlbWFpbD86IHN0cmluZztcblxuICBAdW5pcXVlKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgcGhvbmU/OiBzdHJpbmc7XG5cbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgZGlzcGxheU5hbWUhOiBzdHJpbmc7XG5cbiAgQG9uZVRvTWFueSgoKSA9PiBUZW5hbnRNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKVxuICB0ZW5hbnRNZW1iZXJzaGlwcz86IFRlbmFudE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuXG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpXG4gIG9yZ1VuaXRNZW1iZXJzaGlwcz86IE9yZ1VuaXRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcblxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCIuL3VzZXIubW9kZWxcIjtcblxuQHRhYmxlKFwib3JnX3VuaXRfbWVtYmVyc2hpcHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgT3JnVW5pdE1lbWJlcnNoaXAgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX21lbWJlcnNoaXBzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19tZW1iZXJzaGlwc19vcmdfdW5pdFwiKVxuICBAcmVxdWlyZWQoKVxuICBvcmdVbml0ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBVc2VyLCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX21lbWJlcnNoaXBzX3VzZXJcIilcbiAgQHJlcXVpcmVkKClcbiAgdXNlciE6IFVzZXIgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zKSBAY29sdW1uKCkgc3RhdHVzITogTWVtYmVyc2hpcFN0YXR1cztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdF9jbG9zdXJlXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRDbG9zdXJlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19jbG9zdXJlX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19jbG9zdXJlX2FuY2VzdG9yXCIpXG4gIEByZXF1aXJlZCgpXG4gIGFuY2VzdG9yITogT3JnVW5pdCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX2Nsb3N1cmVfZGVzY2VuZGFudFwiKVxuICBAcmVxdWlyZWQoKVxuICBkZXNjZW5kYW50ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihOdW1iZXIpIEBjb2x1bW4oKSBkZXB0aCE6IG51bWJlcjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1bmlxdWUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcm1pc3Npb25DYXRlZ29yeSwgUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlUGVybWlzc2lvbiB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5tb2RlbFwiO1xuXG5AdGFibGUoXCJwZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAdW5pcXVlKCkgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBrZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMpIEBjb2x1bW4oKSBjYXRlZ29yeSE6IFBlcm1pc3Npb25DYXRlZ29yeTtcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlUGVybWlzc2lvbiwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcm9sZVBlcm1pc3Npb25zPzogUm9sZVBlcm1pc3Npb25bXSB8IHN0cmluZ1tdO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlIH0gZnJvbSBcIi4vcm9sZS5tb2RlbFwiO1xuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gXCIuL3Blcm1pc3Npb24ubW9kZWxcIjtcblxuQHRhYmxlKFwicm9sZV9wZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSb2xlUGVybWlzc2lvbiBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBSb2xlLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9wZXJtaXNzaW9uc19yb2xlXCIpXG4gIEByZXF1aXJlZCgpXG4gIHJvbGUhOiBSb2xlIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFBlcm1pc3Npb24sIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX3Blcm1pc3Npb25zX3Blcm1pc3Npb25cIilcbiAgQHJlcXVpcmVkKClcbiAgcGVybWlzc2lvbiE6IFBlcm1pc3Npb24gfCBzdHJpbmc7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9OVUxMSUZZLCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb24gfSBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24ubW9kZWxcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50IH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInJvbGVzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFJvbGUgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlc190ZW5hbnRcIilcbiAgdGVuYW50PzogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGtleSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBuYW1lITogc3RyaW5nO1xuICBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gUm9sZVBlcm1pc3Npb24sIFJFTF9SRVNUUklDVCwgZmFsc2UpIHJvbGVQZXJtaXNzaW9ucz86IFJvbGVQZXJtaXNzaW9uW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlQXNzaWdubWVudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgYXNzaWdubWVudHM/OiBSb2xlQXNzaWdubWVudFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTY29wZUtpbmQsIFNjb3BlS2luZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuL3JvbGUubW9kZWxcIjtcblxuQHRhYmxlKFwicm9sZV9hc3NpZ25tZW50c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSb2xlQXNzaWdubWVudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX2Fzc2lnbm1lbnRzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9hc3NpZ25tZW50c19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFJvbGUsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX2Fzc2lnbm1lbnRzX3JvbGVcIilcbiAgQHJlcXVpcmVkKClcbiAgcm9sZSE6IFJvbGUgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFNjb3BlS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBzY29wZUtpbmQhOiBTY29wZUtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2NvcGVJZCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihCb29sZWFuKSBAY29sdW1uKCkgaW5oZXJpdERvd24hOiBib29sZWFuO1xuICBAY29sdW1uKCkgc3RhcnRzQXQ/OiBEYXRlO1xuICBAY29sdW1uKCkgZXhwaXJlc0F0PzogRGF0ZTtcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZSB9IGZyb20gXCIuL3Byb3RlY3RlZC1yZXNvdXJjZS5tb2RlbFwiO1xuXG5AdGFibGUoXCJyZXNvdXJjZV9ncmFudHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VHcmFudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcm90ZWN0ZWRSZXNvdXJjZSwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Jlc291cmNlX2dyYW50c19yZXNvdXJjZVwiKVxuICBAcmVxdWlyZWQoKVxuICByZXNvdXJjZSE6IFByb3RlY3RlZFJlc291cmNlIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Jlc291cmNlX2dyYW50c19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHBlcm1pc3Npb25LZXkhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKSBzdGFydHNBdD86IERhdGU7XG4gIEBjb2x1bW4oKSBleHBpcmVzQXQ/OiBEYXRlO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfY3JlYXRlZF9ieVwiKVxuICBjcmVhdGVkQnk/OiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFByaW5jaXBhbEtpbmQsIFByaW5jaXBhbEtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQubW9kZWxcIjtcbmltcG9ydCB7IFJlc291cmNlR3JhbnQgfSBmcm9tIFwiLi9yZXNvdXJjZS1ncmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJwcmluY2lwYWxzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFByaW5jaXBhbCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcmluY2lwYWxzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFByaW5jaXBhbEtpbmRPcHRpb25zKSBAY29sdW1uKCkga2luZCE6IFByaW5jaXBhbEtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc3ViamVjdElkITogc3RyaW5nO1xuICBAb25lVG9NYW55KCgpID0+IFJvbGVBc3NpZ25tZW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByb2xlQXNzaWdubWVudHM/OiBSb2xlQXNzaWdubWVudFtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUmVzb3VyY2VHcmFudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcmVzb3VyY2VHcmFudHM/OiBSZXNvdXJjZUdyYW50W10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX05VTExJRlksIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VWaXNpYmlsaXR5LCBSZXNvdXJjZVZpc2liaWxpdHlPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYW50IH0gZnJvbSBcIi4vcmVzb3VyY2UtZ3JhbnQubW9kZWxcIjtcblxuQHRhYmxlKFwicHJvdGVjdGVkX3Jlc291cmNlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBQcm90ZWN0ZWRSZXNvdXJjZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcm90ZWN0ZWRfcmVzb3VyY2VzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Byb3RlY3RlZF9yZXNvdXJjZXNfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcmVzb3VyY2VUeXBlITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlc291cmNlSWQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMpIEBjb2x1bW4oKSB2aXNpYmlsaXR5ITogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX05VTExJRlksIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcHJvdGVjdGVkX3Jlc291cmNlc19vd25lclwiKVxuICBvd25lcj86IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzZW5zaXRpdml0eT86IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IFJlc291cmNlR3JhbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGdyYW50cz86IFJlc291cmNlR3JhbnRbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNhdGVnb3J5LCBQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIFJFTF9OVUxMSUZZIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJpbmhlcml0YW5jZV9ibG9ja3NcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgSW5oZXJpdGFuY2VCbG9jayBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19pbmhlcml0YW5jZV9ibG9ja3NfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfaW5oZXJpdGFuY2VfYmxvY2tzX29yZ191bml0XCIpXG4gIEByZXF1aXJlZCgpXG4gIG9yZ1VuaXQhOiBPcmdVbml0IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9OVUxMSUZZLCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2luaGVyaXRhbmNlX2Jsb2Nrc19ibG9ja2VkX2FuY2VzdG9yXCIpXG4gIGJsb2NrZWRGcm9tQW5jZXN0b3I/OiBPcmdVbml0IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zKSBAY29sdW1uKCkgcGVybWlzc2lvbkNhdGVnb3J5ITogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlYXNvbj86IHN0cmluZztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcCB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlIH0gZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5tb2RlbFwiO1xuaW1wb3J0IHsgUHJvdGVjdGVkUmVzb3VyY2UgfSBmcm9tIFwiLi9wcm90ZWN0ZWQtcmVzb3VyY2UubW9kZWxcIjtcbmltcG9ydCB7IEluaGVyaXRhbmNlQmxvY2sgfSBmcm9tIFwiLi9pbmhlcml0YW5jZS1ibG9jay5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgT3JnVW5pdCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfdW5pdHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX3VuaXRzX3BhcmVudFwiKVxuICBwYXJlbnQ/OiBPcmdVbml0IHwgc3RyaW5nO1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGNoaWxkcmVuPzogT3JnVW5pdFtdIHwgc3RyaW5nW107XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwYXRoITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG1lbWJlcnNoaXBzPzogT3JnVW5pdE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFByb3RlY3RlZFJlc291cmNlLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByZXNvdXJjZXM/OiBQcm90ZWN0ZWRSZXNvdXJjZVtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gSW5oZXJpdGFuY2VCbG9jaywgUkVMX1JFU1RSSUNULCBmYWxzZSkgaW5oZXJpdGFuY2VCbG9ja3M/OiBJbmhlcml0YW5jZUJsb2NrW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0Q2xvc3VyZSwgUkVMX1JFU1RSSUNULCBmYWxzZSkgYW5jZXN0b3JMaW5rcz86IE9yZ1VuaXRDbG9zdXJlW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0Q2xvc3VyZSwgUkVMX1JFU1RSSUNULCBmYWxzZSkgZGVzY2VuZGFudExpbmtzPzogT3JnVW5pdENsb3N1cmVbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU3RvcmFnZUJpbmRpbmdLaW5kLCBTdG9yYWdlQmluZGluZ0tpbmRPcHRpb25zLCBTdG9yYWdlS2luZCwgU3RvcmFnZUtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJzdG9yYWdlX2JpbmRpbmdzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VCaW5kaW5nIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3N0b3JhZ2VfYmluZGluZ3NfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU3RvcmFnZUtpbmRPcHRpb25zKSBAY29sdW1uKCkgc3RvcmFnZUtpbmQhOiBTdG9yYWdlS2luZDtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucykgQGNvbHVtbigpIGJpbmRpbmdLaW5kITogU3RvcmFnZUJpbmRpbmdLaW5kO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGJpbmRpbmdLZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcmVnaW9uITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgb25lVG9NYW55LFxuICBwayxcbiAgdGFibGUsXG4gIHVuaXF1ZSxcbiAgdXBkYXRlZEF0LFxuICB1dWlkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIG1vZGVsLFxuICBvcHRpb24sXG4gIHJlcXVpcmVkLFxuICB0eXBlIGFzIHR5cGVPZixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSXNvbGF0aW9uVGllciwgSXNvbGF0aW9uVGllck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgU3RvcmFnZUJpbmRpbmcgfSBmcm9tIFwiLi9zdG9yYWdlLWJpbmRpbmcubW9kZWxcIjtcblxuQHRhYmxlKFwidGVuYW50c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEB1bmlxdWUoKSBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNsdWchOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKClcbiAgQHR5cGVPZihTdHJpbmcpXG4gIEBvcHRpb24oSXNvbGF0aW9uVGllck9wdGlvbnMpXG4gIEBjb2x1bW4oKVxuICBpc29sYXRpb25UaWVyITogSXNvbGF0aW9uVGllcjtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBvcmdVbml0cz86XG4gICAgfCBPcmdVbml0W11cbiAgICB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFRlbmFudE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG1lbWJlcnNoaXBzPzpcbiAgICB8IFRlbmFudE1lbWJlcnNoaXBbXVxuICAgIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUHJpbmNpcGFsLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBwcmluY2lwYWxzPzpcbiAgICB8IFByaW5jaXBhbFtdXG4gICAgfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBTdG9yYWdlQmluZGluZywgUkVMX1JFU1RSSUNULCBmYWxzZSkgc3RvcmFnZUJpbmRpbmdzPzpcbiAgICB8IFN0b3JhZ2VCaW5kaW5nW11cbiAgICB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInRlbmFudF9wcm9maWxlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnRQcm9maWxlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3RlbmFudF9wcm9maWxlc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHByb2ZpbGVLZXkhOiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdF9wcm9maWxlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBPcmdVbml0UHJvZmlsZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX3VuaXRfcHJvZmlsZXNfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcHJvZmlsZUtleSE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi9ncm91cC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5cbkB0YWJsZShcImdyb3VwX21lbWJlcnNoaXBzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEdyb3VwTWVtYmVyc2hpcCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cF9tZW1iZXJzaGlwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IEdyb3VwLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZ3JvdXBfbWVtYmVyc2hpcHNfZ3JvdXBcIilcbiAgQHJlcXVpcmVkKClcbiAgZ3JvdXAhOiBHcm91cCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cF9tZW1iZXJzaGlwc19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9OVUxMSUZZLCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXAgfSBmcm9tIFwiLi9ncm91cC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbkB0YWJsZShcImdyb3Vwc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBHcm91cCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cHNfb3JnX3VuaXRcIilcbiAgb3JnVW5pdD86IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IEdyb3VwTWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgbWVtYmVycz86IEdyb3VwTWVtYmVyc2hpcFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2NvcGVLaW5kLCBTY29wZUtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5cbkB0YWJsZShcImVmZmVjdGl2ZV9wZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFZmZlY3RpdmVQZXJtaXNzaW9uIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2VmZmVjdGl2ZV9wZXJtaXNzaW9uc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2VmZmVjdGl2ZV9wZXJtaXNzaW9uc19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHBlcm1pc3Npb25LZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFNjb3BlS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBzY29wZUtpbmQhOiBTY29wZUtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2NvcGVJZCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzb3VyY2VLaW5kITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNvdXJjZUlkITogc3RyaW5nO1xuICBAY29sdW1uKCkgc3RhcnRzQXQ/OiBEYXRlO1xuICBAY29sdW1uKCkgZXhwaXJlc0F0PzogRGF0ZTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBUZW5hbnRQcm9maWxlIH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQtcHJvZmlsZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgVGVuYW50UHJvZmlsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudFByb2ZpbGU+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoVGVuYW50UHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9maWxlKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJvZmlsZUtleTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnRQcm9maWxlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBwcm9maWxlS2V5LFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JUZW5hbnQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFRlbmFudFByb2ZpbGVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHByb2ZpbGUpID0+XG4gICAgICBzYW1lVGVuYW50KHByb2ZpbGUudGVuYW50LCB0ZW5hbnRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRm9yVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgYXdhaXQgdGhpcy5saXN0Rm9yVGVuYW50KHRlbmFudElkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBPcmdVbml0UHJvZmlsZSB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQtcHJvZmlsZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgT3JnVW5pdFByb2ZpbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0UHJvZmlsZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihPcmdVbml0UHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9maWxlKFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHByb2ZpbGVLZXk6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdFByb2ZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgcHJvZmlsZUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yT3JnVW5pdChcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRQcm9maWxlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwcm9maWxlKSA9PlxuICAgICAgcmVsYXRpb25NYXRjaChwcm9maWxlLm9yZ1VuaXQsIG9yZ1VuaXRJZClcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCYXNlTW9kZWxTZXJ2aWNlLFxuICByZWxhdGlvbklkLFxuICByZWxhdGlvbk1hdGNoLFxuICBzYW1lVGVuYW50LFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlIH0gZnJvbSBcIi4uL21vZGVscy9vcmctdW5pdC1jbG9zdXJlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPE9yZ1VuaXRDbG9zdXJlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXRDbG9zdXJlKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBbmNlc3RvcnMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChyb3cpID0+XG4gICAgICAgICAgc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKHJvdy5kZXNjZW5kYW50LCBvcmdVbml0SWQpXG4gICAgICApXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQuZGVwdGggLSByaWdodC5kZXB0aCk7XG4gIH1cblxuICBhc3luYyBsaXN0RGVzY2VuZGFudHMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChyb3cpID0+XG4gICAgICAgICAgc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKHJvdy5hbmNlc3Rvciwgb3JnVW5pdElkKVxuICAgICAgKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmRlcHRoIC0gcmlnaHQuZGVwdGgpO1xuICB9XG5cbiAgYXN5bmMgaXNBbmNlc3Rvck9mKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgYW5jZXN0b3JPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBkZXNjZW5kYW50T3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IHRoaXMubGlzdEFuY2VzdG9ycyh0ZW5hbnRJZCwgZGVzY2VuZGFudE9yZ1VuaXRJZCwgLi4uYXJncylcbiAgICApLnNvbWUoKHJvdykgPT4gcmVsYXRpb25NYXRjaChyb3cuYW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZWxmTGluayhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdENsb3N1cmU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIGFuY2VzdG9yOiBvcmdVbml0SWQsXG4gICAgICAgIGRlc2NlbmRhbnQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgZGVwdGg6IDAsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBpbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwYXJlbnRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBjaGlsZE9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFuY2VzdG9yTGlua3MgPSBhd2FpdCB0aGlzLmxpc3RBbmNlc3RvcnMoXG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHBhcmVudE9yZ1VuaXRJZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGZvciAoY29uc3QgbGluayBvZiBhbmNlc3RvckxpbmtzKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgICAgYW5jZXN0b3I6IGxpbmsuYW5jZXN0b3IsXG4gICAgICAgICAgZGVzY2VuZGFudDogY2hpbGRPcmdVbml0SWQsXG4gICAgICAgICAgZGVwdGg6IGxpbmsuZGVwdGggKyAxLFxuICAgICAgICB9LFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUxpbmtzRm9yU3VidHJlZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN1YnRyZWUgPSBhd2FpdCB0aGlzLmxpc3REZXNjZW5kYW50cyh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBkZXNjZW5kYW50SWRzID0gbmV3IFNldChbXG4gICAgICBvcmdVbml0SWQsXG4gICAgICAuLi5zdWJ0cmVlLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSksXG4gICAgXSk7XG4gICAgY29uc3QgYW5jZXN0b3JJZHMgPSBuZXcgU2V0KFtcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIC4uLnN1YnRyZWUubWFwKChyb3cpID0+IHJlbGF0aW9uSWQocm93LmFuY2VzdG9yKSksXG4gICAgXSk7XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChyb3cpID0+XG4gICAgICAgIHNhbWVUZW5hbnQocm93LnRlbmFudCwgdGVuYW50SWQpICYmXG4gICAgICAgIChkZXNjZW5kYW50SWRzLmhhcyhyZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSkgfHxcbiAgICAgICAgICBhbmNlc3Rvcklkcy5oYXMocmVsYXRpb25JZChyb3cuYW5jZXN0b3IpKSlcbiAgICApO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNhdGVnb3J5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJbmhlcml0YW5jZUJsb2NrIH0gZnJvbSBcIi4uL21vZGVscy9pbmhlcml0YW5jZS1ibG9jay5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEluaGVyaXRhbmNlQmxvY2s+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoSW5oZXJpdGFuY2VCbG9jayk7XG4gIH1cblxuICBhc3luYyBibG9ja0NhdGVnb3J5KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbkNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgYmxvY2tlZEZyb21BbmNlc3RvcklkPzogc3RyaW5nLFxuICAgIHJlYXNvbj86IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEluaGVyaXRhbmNlQmxvY2s+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgYmxvY2tlZEZyb21BbmNlc3RvcjogYmxvY2tlZEZyb21BbmNlc3RvcklkLFxuICAgICAgICBwZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVuYmxvY2tDYXRlZ29yeShibG9ja0lkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKGJsb2NrSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZvck9yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEluaGVyaXRhbmNlQmxvY2tbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAoYmxvY2spID0+XG4gICAgICAgIHNhbWVUZW5hbnQoYmxvY2sudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgcmVsYXRpb25NYXRjaChibG9jay5vcmdVbml0LCBvcmdVbml0SWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNhdGVnb3J5QmxvY2tlZEZvckFuY2VzdG9yKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgYW5jZXN0b3JPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0Rm9yT3JnVW5pdCh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKSkuc29tZShcbiAgICAgIChibG9jaykgPT5cbiAgICAgICAgYmxvY2sucGVybWlzc2lvbkNhdGVnb3J5ID09PSBjYXRlZ29yeSAmJlxuICAgICAgICAoIWJsb2NrLmJsb2NrZWRGcm9tQW5jZXN0b3IgfHxcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKGJsb2NrLmJsb2NrZWRGcm9tQW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKSlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJc29sYXRpb25UaWVyLCBDcmVhdGVUZW5hbnRJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFRlbmFudFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihUZW5hbnQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVGVuYW50KGlucHV0OiBDcmVhdGVUZW5hbnRJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2x1ZzogaW5wdXQuc2x1ZyxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgaXNvbGF0aW9uVGllcjogaW5wdXQuaXNvbGF0aW9uVGllciA/PyBJc29sYXRpb25UaWVyLlBvb2xlZCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5U2x1ZyhzbHVnOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kT25lQnkoXCJzbHVnXCIsIHNsdWcgYXMgbmV2ZXIsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVuYW1lVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh0ZW5hbnRJZCwgeyBuYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgY2hhbmdlU2x1Zyh0ZW5hbnRJZDogc3RyaW5nLCBzbHVnOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodGVuYW50SWQsIHsgc2x1ZyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldElzb2xhdGlvblRpZXIoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBpc29sYXRpb25UaWVyOiBJc29sYXRpb25UaWVyLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8VGVuYW50PiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHRlbmFudElkLCB7IGlzb2xhdGlvblRpZXIgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBkZWxldGVUZW5hbnRDb250cm9sbGVkKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHRlbmFudElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgbG93ZXJTbHVnLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IENyZWF0ZU9yZ1VuaXRJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXRQcm9maWxlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdENsb3N1cmVTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVJvd3NCeUlkKFxuICBzZXJ2aWNlOiBCYXNlTW9kZWxTZXJ2aWNlPGFueT4sXG4gIHJvd3M6IEFycmF5PHsgaWQ6IHN0cmluZyB9PixcbiAgLi4uYXJnczogYW55W11cbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgYXdhaXQgc2VydmljZS5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcmdVbml0UGF0aChwYXJlbnRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IGxvd2VyU2x1ZyhuYW1lKTtcbiAgICByZXR1cm4gcGFyZW50UGF0aCA/IGAke3BhcmVudFBhdGgucmVwbGFjZSgvXFwvKyQvLCBcIlwiKX0vJHtzZWdtZW50fWAgOiBgLyR7c2VnbWVudH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQcm9maWxlSWZOZWVkZWQoXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcHJvZmlsZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHByb2ZpbGVNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFwcm9maWxlS2V5KSByZXR1cm47XG4gICAgYXdhaXQgbmV3IE9yZ1VuaXRQcm9maWxlU2VydmljZSgpLmNyZWF0ZVByb2ZpbGUob3JnVW5pdElkLCBwcm9maWxlS2V5LCBwcm9maWxlTWV0YWRhdGEsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjcmVhdGVSb290KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcHJvZmlsZUtleT86IHN0cmluZyxcbiAgICBwcm9maWxlTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBvcmdVbml0ID0gYXdhaXQgdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBhdGg6IHRoaXMub3JnVW5pdFBhdGgodW5kZWZpbmVkLCBuYW1lKSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9maWxlSWZOZWVkZWQob3JnVW5pdC5pZCwgcHJvZmlsZUtleSwgcHJvZmlsZU1ldGFkYXRhLCAuLi5hcmdzKTtcbiAgICBhd2FpdCBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCkuY3JlYXRlU2VsZkxpbmsodGVuYW50SWQsIG9yZ1VuaXQuaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBvcmdVbml0O1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjcmVhdGVDaGlsZChpbnB1dDogQ3JlYXRlT3JnVW5pdElucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdD4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGlucHV0LnBhcmVudE9yZ1VuaXRJZCA/IGF3YWl0IHRoaXMuZ2V0QnlJZChpbnB1dC5wYXJlbnRPcmdVbml0SWQsIC4uLmFyZ3MpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9yZ1VuaXQgPSBhd2FpdCB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQ/LmlkID8/IGlucHV0LnBhcmVudE9yZ1VuaXRJZCxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgcGF0aDogdGhpcy5vcmdVbml0UGF0aChwYXJlbnQ/LnBhdGgsIGlucHV0Lm5hbWUpLFxuICAgICAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9maWxlSWZOZWVkZWQob3JnVW5pdC5pZCwgaW5wdXQucHJvZmlsZUtleSwgaW5wdXQucHJvZmlsZU1ldGFkYXRhLCAuLi5hcmdzKTtcbiAgICBjb25zdCBjbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5jcmVhdGVTZWxmTGluayhpbnB1dC50ZW5hbnRJZCwgb3JnVW5pdC5pZCwgLi4uYXJncyk7XG4gICAgaWYgKGlucHV0LnBhcmVudE9yZ1VuaXRJZCkge1xuICAgICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuaW5zZXJ0QW5jZXN0b3JMaW5rc0Zvck5ld0NoaWxkKFxuICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgaW5wdXQucGFyZW50T3JnVW5pdElkLFxuICAgICAgICBvcmdVbml0LmlkLFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb3JnVW5pdDtcbiAgfVxuXG4gIGFzeW5jIGxpc3RDaGlsZHJlbihwYXJlbnRPcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG9yZ1VuaXQpID0+IHJlbGF0aW9uTWF0Y2gob3JnVW5pdC5wYXJlbnQsIHBhcmVudE9yZ1VuaXRJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBzYW1lVGVuYW50KG9yZ1VuaXQudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdERlc2NlbmRhbnRPcmdVbml0cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGluY2x1ZGVTZWxmID0gZmFsc2UsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0W10+IHtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IGF3YWl0IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKS5saXN0RGVzY2VuZGFudHModGVuYW50SWQsIG9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgaWRzID0gbmV3IFNldChkZXNjZW5kYW50cy5tYXAoKHJvdykgPT4gcmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkpKTtcbiAgICBpZiAoaW5jbHVkZVNlbGYpIGlkcy5hZGQob3JnVW5pdElkKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBpZHMuaGFzKG9yZ1VuaXQuaWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBbmNlc3Rvck9yZ1VuaXRzKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgaW5jbHVkZVNlbGYgPSBmYWxzZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRbXT4ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGF3YWl0IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKS5saXN0QW5jZXN0b3JzKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQoYW5jZXN0b3JzLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5hbmNlc3RvcikpKTtcbiAgICBpZiAoaW5jbHVkZVNlbGYpIGlkcy5hZGQob3JnVW5pdElkKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBpZHMuaGFzKG9yZ1VuaXQuaWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbmFtZU9yZ1VuaXQob3JnVW5pdElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0QnlJZChvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIHsgbmFtZSwgcGF0aDogdGhpcy5vcmdVbml0UGF0aChleGlzdGluZy5wYXRoLmluY2x1ZGVzKFwiL1wiKSA/IGV4aXN0aW5nLnBhdGgucmVwbGFjZSgvXFwvW14vXSskLywgXCJcIikgOiB1bmRlZmluZWQsIG5hbWUpIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgbW92ZU9yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBuZXdQYXJlbnRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBuZXdQYXJlbnQgPSBhd2FpdCB0aGlzLmdldEJ5SWQobmV3UGFyZW50T3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0QnlJZChvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnVwZGF0ZU9uZShcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIHtcbiAgICAgICAgcGFyZW50OiBuZXdQYXJlbnQuaWQsXG4gICAgICAgIHBhdGg6IHRoaXMub3JnVW5pdFBhdGgobmV3UGFyZW50LnBhdGgsIGV4aXN0aW5nLm5hbWUpLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucmVidWlsZFRlbmFudENsb3N1cmUodGVuYW50SWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyByZWJ1aWxkVGVuYW50Q2xvc3VyZSh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsb3N1cmVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpO1xuICAgIGNvbnN0IGV4aXN0aW5nTGlua3MgPSBhd2FpdCBjbG9zdXJlU2VydmljZS5saXN0QWxsKC4uLmFyZ3MpO1xuICAgIGF3YWl0IGRlbGV0ZVJvd3NCeUlkKFxuICAgICAgY2xvc3VyZVNlcnZpY2UsXG4gICAgICBleGlzdGluZ0xpbmtzLmZpbHRlcigocm93KSA9PiBzYW1lVGVuYW50KHJvdy50ZW5hbnQsIHRlbmFudElkKSksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcblxuICAgIGNvbnN0IG9yZ1VuaXRzID0gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICAgIGNvbnN0IGxlZnREZXB0aCA9IGxlZnQucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJpZ2h0RGVwdGggPSByaWdodC5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlZnREZXB0aCAtIHJpZ2h0RGVwdGg7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IG9yZ1VuaXQgb2Ygb3JnVW5pdHMpIHtcbiAgICAgIGF3YWl0IGNsb3N1cmVTZXJ2aWNlLmNyZWF0ZVNlbGZMaW5rKHRlbmFudElkLCBvcmdVbml0LmlkLCAuLi5hcmdzKTtcbiAgICAgIGlmIChvcmdVbml0LnBhcmVudCkge1xuICAgICAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5pbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQoXG4gICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgcmVsYXRpb25JZChvcmdVbml0LnBhcmVudCksXG4gICAgICAgICAgb3JnVW5pdC5pZCxcbiAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBkZWxldGVPcmdVbml0VHJlZSh0ZW5hbnRJZDogc3RyaW5nLCBvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IGF3YWl0IHRoaXMubGlzdERlc2NlbmRhbnRPcmdVbml0cyh0ZW5hbnRJZCwgb3JnVW5pdElkLCB0cnVlLCAuLi5hcmdzKTtcbiAgICBjb25zdCBkZXNjZW5kYW50SWRzID0gbmV3IFNldChkZXNjZW5kYW50cy5tYXAoKG9yZ1VuaXQpID0+IG9yZ1VuaXQuaWQpKTtcbiAgICBjb25zdCBvcmdVbml0cyA9IChhd2FpdCB0aGlzLmxpc3RUZW5hbnRPcmdVbml0cyh0ZW5hbnRJZCwgLi4uYXJncykpLmZpbHRlcigob3JnVW5pdCkgPT5cbiAgICAgIGRlc2NlbmRhbnRJZHMuaGFzKG9yZ1VuaXQuaWQpXG4gICAgKTtcbiAgICBhd2FpdCBkZWxldGVSb3dzQnlJZCh0aGlzLCBvcmdVbml0cywgLi4uYXJncyk7XG4gICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuZGVsZXRlTGlua3NGb3JTdWJ0cmVlKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVVc2VySW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi4vbW9kZWxzL3VzZXIubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFVzZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxVc2VyPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFVzZXIpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVXNlcihpbnB1dDogQ3JlYXRlVXNlcklucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgZW1haWw6IGlucHV0LmVtYWlsLFxuICAgICAgICBwaG9uZTogaW5wdXQucGhvbmUsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBpbnB1dC5kaXNwbGF5TmFtZSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5RW1haWwoZW1haWw6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZCgodXNlcikgPT4gdXNlci5lbWFpbCA9PT0gZW1haWwpIGFzIFVzZXI7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEaXNwbGF5TmFtZSh1c2VySWQ6IHN0cmluZywgZGlzcGxheU5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodXNlcklkLCB7IGRpc3BsYXlOYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRW1haWwodXNlcklkOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHVzZXJJZCwgeyBlbWFpbCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVBob25lKHVzZXJJZDogc3RyaW5nLCBwaG9uZTogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh1c2VySWQsIHsgcGhvbmUgfSwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFByaW5jaXBhbEtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuLi9tb2RlbHMvcHJpbmNpcGFsLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBQcmluY2lwYWxTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxQcmluY2lwYWw+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUHJpbmNpcGFsKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVByaW5jaXBhbChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIGtpbmQ6IFByaW5jaXBhbEtpbmQsXG4gICAgc3ViamVjdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxQcmluY2lwYWw+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIHN1YmplY3RJZCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZvclN1YmplY3QoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBraW5kOiBQcmluY2lwYWxLaW5kLFxuICAgIHN1YmplY3RJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UHJpbmNpcGFsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoXG4gICAgICAocHJpbmNpcGFsKSA9PlxuICAgICAgICBzYW1lVGVuYW50KHByaW5jaXBhbC50ZW5hbnQsIHRlbmFudElkKSAmJlxuICAgICAgICBwcmluY2lwYWwua2luZCA9PT0ga2luZCAmJlxuICAgICAgICBwcmluY2lwYWwuc3ViamVjdElkID09PSBzdWJqZWN0SWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0T3JDcmVhdGVGb3JTdWJqZWN0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAga2luZDogUHJpbmNpcGFsS2luZCxcbiAgICBzdWJqZWN0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFByaW5jaXBhbD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRGb3JTdWJqZWN0KHRlbmFudElkLCBraW5kLCBzdWJqZWN0SWQsIC4uLmFyZ3MpKSA/PyAoYXdhaXQgdGhpcy5jcmVhdGVQcmluY2lwYWwodGVuYW50SWQsIGtpbmQsIHN1YmplY3RJZCwgLi4uYXJncykpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXNlclByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByaW5jaXBhbD4ge1xuICAgIHJldHVybiB0aGlzLmdldE9yQ3JlYXRlRm9yU3ViamVjdCh0ZW5hbnRJZCwgUHJpbmNpcGFsS2luZC5Vc2VyLCB1c2VySWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZ2V0R3JvdXBQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJpbmNpcGFsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGVGb3JTdWJqZWN0KHRlbmFudElkLCBQcmluY2lwYWxLaW5kLkdyb3VwLCBncm91cElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcCB9IGZyb20gXCIuLi9tb2RlbHMvdGVuYW50LW1lbWJlcnNoaXAubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxUZW5hbnRNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFRlbmFudE1lbWJlcnNoaXApO1xuICB9XG5cbiAgYXN5bmMgYWRkVXNlclRvVGVuYW50KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBNZW1iZXJzaGlwU3RhdHVzID0gTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnRNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICB1c2VyOiB1c2VySWQsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNldFN0YXR1cyhtZW1iZXJzaGlwSWQ6IHN0cmluZywgc3RhdHVzOiBNZW1iZXJzaGlwU3RhdHVzLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50TWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShtZW1iZXJzaGlwSWQsIHsgc3RhdHVzIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFVzZXJUZW5hbnRzKHVzZXJJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50TWVtYmVyc2hpcFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigobWVtYmVyc2hpcCkgPT4gcmVsYXRpb25NYXRjaChtZW1iZXJzaGlwLnVzZXIsIHVzZXJJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudFVzZXJzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnRNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiBzYW1lVGVuYW50KG1lbWJlcnNoaXAudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlVXNlckZyb21UZW5hbnQobWVtYmVyc2hpcElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKG1lbWJlcnNoaXBJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE9yZ1VuaXRNZW1iZXJzaGlwIH0gZnJvbSBcIi4uL21vZGVscy9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBPcmdVbml0TWVtYmVyc2hpcFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPE9yZ1VuaXRNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXRNZW1iZXJzaGlwKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFVzZXJUb09yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBzdGF0dXM6IE1lbWJlcnNoaXBTdGF0dXMgPSBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBvcmdVbml0SWQsXG4gICAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2V0U3RhdHVzKG1lbWJlcnNoaXBJZDogc3RyaW5nLCBzdGF0dXM6IE1lbWJlcnNoaXBTdGF0dXMsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0TWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShtZW1iZXJzaGlwSWQsIHsgc3RhdHVzIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFVzZXJPcmdVbml0cyh1c2VySWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAudXNlciwgdXNlcklkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0T3JnVW5pdFVzZXJzKG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC5vcmdVbml0LCBvcmdVbml0SWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVVzZXJGcm9tT3JnVW5pdChtZW1iZXJzaGlwSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQobWVtYmVyc2hpcElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vbW9kZWxzL2dyb3VwLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBHcm91cFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEdyb3VwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEdyb3VwKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUdyb3VwKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZD86IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8R3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZW5hbWVHcm91cChncm91cElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEdyb3VwPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGdyb3VwSWQsIHsgbmFtZSB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVHcm91cFRvT3JnVW5pdChncm91cElkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoZ3JvdXBJZCwgeyBvcmdVbml0OiBvcmdVbml0SWQgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50R3JvdXBzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoZ3JvdXApID0+IHNhbWVUZW5hbnQoZ3JvdXAudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXAgfSBmcm9tIFwiLi4vbW9kZWxzL2dyb3VwLW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tIFwiLi9wcmluY2lwYWwuc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgR3JvdXBNZW1iZXJzaGlwU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8R3JvdXBNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEdyb3VwTWVtYmVyc2hpcCk7XG4gIH1cblxuICBhc3luYyBhZGRQcmluY2lwYWxUb0dyb3VwKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgZ3JvdXBJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEdyb3VwTWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgZ3JvdXA6IGdyb3VwSWQsXG4gICAgICAgIHByaW5jaXBhbDogcHJpbmNpcGFsSWQsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdEdyb3VwTWVtYmVycyhncm91cElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC5ncm91cCwgZ3JvdXBJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFByaW5jaXBhbEdyb3VwcyhwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXBNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAucHJpbmNpcGFsLCBwcmluY2lwYWxJZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlUHJpbmNpcGFsRnJvbUdyb3VwKG1lbWJlcnNoaXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChtZW1iZXJzaGlwSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZUdyb3VwUHJpbmNpcGFsSWRzRm9yUHJpbmNpcGFsKHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHByaW5jaXBhbFNlcnZpY2UgPSBuZXcgUHJpbmNpcGFsU2VydmljZSgpO1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5saXN0UHJpbmNpcGFsR3JvdXBzKHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBwcmluY2lwYWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtZW1iZXJzaGlwcy5tYXAoYXN5bmMgKG1lbWJlcnNoaXApID0+IHtcbiAgICAgICAgY29uc3QgdGVuYW50SWQgPSByZWxhdGlvbklkKG1lbWJlcnNoaXAudGVuYW50KTtcbiAgICAgICAgY29uc3QgZ3JvdXBJZCA9IHJlbGF0aW9uSWQobWVtYmVyc2hpcC5ncm91cCk7XG4gICAgICAgIGNvbnN0IHByaW5jaXBhbCA9IGF3YWl0IHByaW5jaXBhbFNlcnZpY2UuZ2V0R3JvdXBQcmluY2lwYWwodGVuYW50SWQsIGdyb3VwSWQsIC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gcHJpbmNpcGFsLmlkO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBwcmluY2lwYWxzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2F0ZWdvcnksIENyZWF0ZVBlcm1pc3Npb25JbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gXCIuLi9tb2RlbHMvcGVybWlzc2lvbi5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFBlcm1pc3Npb24+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUGVybWlzc2lvbik7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQZXJtaXNzaW9uKGlucHV0OiBDcmVhdGVQZXJtaXNzaW9uSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQZXJtaXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICBrZXk6IGlucHV0LmtleSxcbiAgICAgICAgY2F0ZWdvcnk6IGlucHV0LmNhdGVnb3J5LFxuICAgICAgICBkZXNjcmlwdGlvbjogaW5wdXQuZGVzY3JpcHRpb24sXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRCeUtleShrZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZCgocGVybWlzc2lvbikgPT4gcGVybWlzc2lvbi5rZXkgPT09IGtleSkgYXMgUGVybWlzc2lvbjtcbiAgfVxuXG4gIGFzeW5jIGxpc3RCeUNhdGVnb3J5KGNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwZXJtaXNzaW9uKSA9PiBwZXJtaXNzaW9uLmNhdGVnb3J5ID09PSBjYXRlZ29yeSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZXNjcmlwdGlvbihwZXJtaXNzaW9uSWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocGVybWlzc2lvbklkLCB7IGRlc2NyaXB0aW9uIH0sIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVSb2xlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi4vbW9kZWxzL3JvbGUubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFJvbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSb2xlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJvbGUpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUm9sZShpbnB1dDogQ3JlYXRlUm9sZUlucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAga2V5OiBpbnB1dC5rZXksXG4gICAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBpbnB1dC5kZXNjcmlwdGlvbixcbiAgICAgICAgbWV0YWRhdGE6IGlucHV0Lm1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3lzdGVtUm9sZUJ5S2V5KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZT4ge1xuICAgIGNvbnN0IHJvbGUgPSAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKChjYW5kaWRhdGUpID0+ICFjYW5kaWRhdGUudGVuYW50ICYmIGNhbmRpZGF0ZS5rZXkgPT09IGtleSk7XG4gICAgaWYgKCFyb2xlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvbGUgXCIke2tleX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBhc3luYyBnZXRUZW5hbnRSb2xlQnlLZXkodGVuYW50SWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgY29uc3Qgcm9sZSA9IChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBzYW1lVGVuYW50KGNhbmRpZGF0ZS50ZW5hbnQsIHRlbmFudElkKSAmJiBjYW5kaWRhdGUua2V5ID09PSBrZXlcbiAgICApO1xuICAgIGlmICghcm9sZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb2xlIFwiJHtrZXl9XCIgbm90IGZvdW5kIGZvciB0ZW5hbnQgJHt0ZW5hbnRJZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBhc3luYyByZW5hbWVSb2xlKHJvbGVJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHJvbGVJZCwgeyBuYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlUm9sZU1ldGFkYXRhKFxuICAgIHJvbGVJZDogc3RyaW5nLFxuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJvbGU+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocm9sZUlkLCB7IG1ldGFkYXRhIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudFJvbGVzKHRlbmFudElkOiBzdHJpbmcsIGluY2x1ZGVTeXN0ZW0gPSBmYWxzZSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJvbGUpID0+XG4gICAgICBpbmNsdWRlU3lzdGVtID8gIXJvbGUudGVuYW50IHx8IHNhbWVUZW5hbnQocm9sZS50ZW5hbnQsIHRlbmFudElkKSA6IHNhbWVUZW5hbnQocm9sZS50ZW5hbnQsIHRlbmFudElkKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uIH0gZnJvbSBcIi4uL21vZGVscy9yb2xlLXBlcm1pc3Npb24ubW9kZWxcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gXCIuL3JvbGUuc2VydmljZVwiO1xuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVSb3dzQnlJZChcbiAgc2VydmljZTogQmFzZU1vZGVsU2VydmljZTxhbnk+LFxuICByb3dzOiBBcnJheTx7IGlkOiBzdHJpbmcgfT4sXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGF3YWl0IHNlcnZpY2UuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSb2xlUGVybWlzc2lvblNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFJvbGVQZXJtaXNzaW9uPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJvbGVQZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFBlcm1pc3Npb25Ub1JvbGUocm9sZUlkOiBzdHJpbmcsIHBlcm1pc3Npb25JZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHJvbGU6IHJvbGVJZCxcbiAgICAgICAgcGVybWlzc2lvbjogcGVybWlzc2lvbklkLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYWRkUGVybWlzc2lvbktleVRvUm9sZShyb2xlSWQ6IHN0cmluZywgcGVybWlzc2lvbktleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb24+IHtcbiAgICBjb25zdCBwZXJtaXNzaW9uID0gYXdhaXQgbmV3IFBlcm1pc3Npb25TZXJ2aWNlKCkuZ2V0QnlLZXkocGVybWlzc2lvbktleSwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRkUGVybWlzc2lvblRvUm9sZShyb2xlSWQsIHBlcm1pc3Npb24uaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlUGVybWlzc2lvbkZyb21Sb2xlKHJvbGVQZXJtaXNzaW9uSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm9sZVBlcm1pc3Npb25JZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0Um9sZVBlcm1pc3Npb25zKHJvbGVJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJvbGVQZXJtaXNzaW9uKSA9PiByZWxhdGlvbk1hdGNoKHJvbGVQZXJtaXNzaW9uLnJvbGUsIHJvbGVJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFBlcm1pc3Npb25Sb2xlcyhwZXJtaXNzaW9uSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyb2xlUGVybWlzc2lvbikgPT4gcmVsYXRpb25NYXRjaChyb2xlUGVybWlzc2lvbi5wZXJtaXNzaW9uLCBwZXJtaXNzaW9uSWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlcGxhY2VSb2xlUGVybWlzc2lvbnMocm9sZUlkOiBzdHJpbmcsIHBlcm1pc3Npb25JZHM6IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb25bXT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5saXN0Um9sZVBlcm1pc3Npb25zKHJvbGVJZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgZGVsZXRlUm93c0J5SWQodGhpcywgZXhpc3RpbmcsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwZXJtaXNzaW9uSWRzLm1hcCgocGVybWlzc2lvbklkKSA9PiB0aGlzLmFkZFBlcm1pc3Npb25Ub1JvbGUocm9sZUlkLCBwZXJtaXNzaW9uSWQsIC4uLmFyZ3MpKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVSb2xlV2l0aFBlcm1pc3Npb25zKFxuICAgIGlucHV0OiBpbXBvcnQoXCIuLi90eXBlc1wiKS5DcmVhdGVSb2xlSW5wdXQsXG4gICAgcGVybWlzc2lvbktleXM6IHN0cmluZ1tdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8aW1wb3J0KFwiLi4vbW9kZWxzL3JvbGUubW9kZWxcIikuUm9sZT4ge1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCBuZXcgUm9sZVNlcnZpY2UoKS5jcmVhdGVSb2xlKGlucHV0LCAuLi5hcmdzKTtcbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb25LZXkgb2YgcGVybWlzc2lvbktleXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkUGVybWlzc2lvbktleVRvUm9sZShyb2xlLmlkLCBwZXJtaXNzaW9uS2V5LCAuLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEFzc2lnblJvbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiLi4vbW9kZWxzL3JvbGUtYXNzaWdubWVudC5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSb2xlQXNzaWdubWVudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihSb2xlQXNzaWdubWVudCk7XG4gIH1cblxuICBhc3luYyBhc3NpZ25Sb2xlKFxuICAgIGlucHV0OiBBc3NpZ25Sb2xlSW5wdXQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcHJpbmNpcGFsOiBpbnB1dC5wcmluY2lwYWxJZCxcbiAgICAgICAgcm9sZTogaW5wdXQucm9sZUlkLFxuICAgICAgICBzY29wZUtpbmQ6IGlucHV0LnNjb3BlS2luZCxcbiAgICAgICAgc2NvcGVJZDogaW5wdXQuc2NvcGVJZCxcbiAgICAgICAgaW5oZXJpdERvd246IGlucHV0LmluaGVyaXREb3duID8/IGZhbHNlLFxuICAgICAgICBzdGFydHNBdDogaW5wdXQuc3RhcnRzQXQsXG4gICAgICAgIGV4cGlyZXNBdDogaW5wdXQuZXhwaXJlc0F0LFxuICAgICAgICBjb25kaXRpb25zOiBpbnB1dC5jb25kaXRpb25zLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmV2b2tlQXNzaWdubWVudChhc3NpZ25tZW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQoYXNzaWdubWVudElkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChhc3NpZ25tZW50KSA9PlxuICAgICAgICBzYW1lVGVuYW50KGFzc2lnbm1lbnQudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgcmVsYXRpb25NYXRjaChhc3NpZ25tZW50LnByaW5jaXBhbCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RSb2xlQXNzaWdubWVudHMoXG4gICAgcm9sZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoYXNzaWdubWVudCkgPT5cbiAgICAgIHJlbGF0aW9uTWF0Y2goYXNzaWdubWVudC5yb2xlLCByb2xlSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRBc3NpZ25tZW50cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Um9sZUFzc2lnbm1lbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGFzc2lnbm1lbnQpID0+XG4gICAgICBzYW1lVGVuYW50KGFzc2lnbm1lbnQudGVuYW50LCB0ZW5hbnRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQXNzaWdubWVudFdpbmRvdyhcbiAgICBhc3NpZ25tZW50SWQ6IHN0cmluZyxcbiAgICBzdGFydHNBdDogRGF0ZSB8IHVuZGVmaW5lZCxcbiAgICBleHBpcmVzQXQ6IERhdGUgfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShhc3NpZ25tZW50SWQsIHsgc3RhcnRzQXQsIGV4cGlyZXNBdCB9LCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25JZCwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCwgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90LCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb24gfSBmcm9tIFwiLi4vbW9kZWxzL2VmZmVjdGl2ZS1wZXJtaXNzaW9uLm1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vZ3JvdXAtbWVtYmVyc2hpcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4vcHJpbmNpcGFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LWNsb3N1cmUuc2VydmljZVwiO1xuaW1wb3J0IHsgSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UgfSBmcm9tIFwiLi9pbmhlcml0YW5jZS1ibG9jay5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8RWZmZWN0aXZlUGVybWlzc2lvbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFZmZlY3RpdmVQZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAocGVybWlzc2lvbikgPT4gc2FtZVRlbmFudChwZXJtaXNzaW9uLnRlbmFudCwgdGVuYW50SWQpICYmIHJlbGF0aW9uTWF0Y2gocGVybWlzc2lvbi5wcmluY2lwYWwsIHByaW5jaXBhbElkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yU2NvcGUoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxFZmZlY3RpdmVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKHBlcm1pc3Npb24pID0+IHNhbWVUZW5hbnQocGVybWlzc2lvbi50ZW5hbnQsIHRlbmFudElkKSAmJiBwZXJtaXNzaW9uLnNjb3BlS2luZCA9PT0gc2NvcGVLaW5kICYmIHBlcm1pc3Npb24uc2NvcGVJZCA9PT0gc2NvcGVJZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBoYXNQZXJtaXNzaW9uKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgc2NvcGVLaW5kOiBTY29wZUtpbmQsXG4gICAgc2NvcGVJZDogc3RyaW5nLFxuICAgIGF0PzogRGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpKS5zb21lKFxuICAgICAgKHBlcm1pc3Npb24pID0+XG4gICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSAmJlxuICAgICAgICBwZXJtaXNzaW9uLnNjb3BlS2luZCA9PT0gc2NvcGVLaW5kICYmXG4gICAgICAgIHBlcm1pc3Npb24uc2NvcGVJZCA9PT0gc2NvcGVJZCAmJlxuICAgICAgICAoIXBlcm1pc3Npb24uc3RhcnRzQXQgfHwgIWF0IHx8IHBlcm1pc3Npb24uc3RhcnRzQXQgPD0gYXQpICYmXG4gICAgICAgICghcGVybWlzc2lvbi5leHBpcmVzQXQgfHwgIWF0IHx8IHBlcm1pc3Npb24uZXhwaXJlc0F0ID49IGF0KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGVGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhd2FpdCB0aGlzLmxpc3RGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlRm9yVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwZXJtaXNzaW9uKSA9PiBzYW1lVGVuYW50KHBlcm1pc3Npb24udGVuYW50LCB0ZW5hbnRJZCkpKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25bXT4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG5cbiAgICBjb25zdCByb2xlQXNzaWdubWVudFNlcnZpY2UgPSBuZXcgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlKCk7XG4gICAgY29uc3Qgcm9sZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFJvbGVQZXJtaXNzaW9uU2VydmljZSgpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFBlcm1pc3Npb25TZXJ2aWNlKCk7XG4gICAgY29uc3QgZ3JvdXBNZW1iZXJzaGlwU2VydmljZSA9IG5ldyBHcm91cE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gICAgY29uc3QgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gICAgY29uc3Qgb3JnVW5pdENsb3N1cmVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpO1xuICAgIGNvbnN0IGluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlID0gbmV3IEluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlKCk7XG5cbiAgICBjb25zdCBtYXRlcmlhbGl6ZWQ6IEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdID0gW107XG4gICAgY29uc3Qgc291cmNlQXNzaWdubWVudHMgPSBhd2FpdCByb2xlQXNzaWdubWVudFNlcnZpY2UubGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZ3JvdXBNZW1iZXJzaGlwcyA9IGF3YWl0IGdyb3VwTWVtYmVyc2hpcFNlcnZpY2UubGlzdFByaW5jaXBhbEdyb3VwcyhwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZ3JvdXBBc3NpZ25tZW50cyA9IChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBncm91cE1lbWJlcnNoaXBzLm1hcChhc3luYyAobWVtYmVyc2hpcCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdyb3VwUHJpbmNpcGFsID0gYXdhaXQgcHJpbmNpcGFsU2VydmljZS5nZXRHcm91cFByaW5jaXBhbChyZWxhdGlvbklkKG1lbWJlcnNoaXAudGVuYW50KSwgcmVsYXRpb25JZChtZW1iZXJzaGlwLmdyb3VwKSwgLi4uYXJncyk7XG4gICAgICAgICAgcmV0dXJuIHJvbGVBc3NpZ25tZW50U2VydmljZS5saXN0UHJpbmNpcGFsQXNzaWdubWVudHModGVuYW50SWQsIGdyb3VwUHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApLmZsYXQoKTtcblxuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gWy4uLnNvdXJjZUFzc2lnbm1lbnRzLCAuLi5ncm91cEFzc2lnbm1lbnRzXTtcbiAgICBmb3IgKGNvbnN0IGFzc2lnbm1lbnQgb2YgYXNzaWdubWVudHMpIHtcbiAgICAgIGNvbnN0IHJvbGVQZXJtaXNzaW9ucyA9IGF3YWl0IHJvbGVQZXJtaXNzaW9uU2VydmljZS5saXN0Um9sZVBlcm1pc3Npb25zKHJlbGF0aW9uSWQoYXNzaWdubWVudC5yb2xlKSwgLi4uYXJncyk7XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByb2xlUGVybWlzc2lvbnMubWFwKGFzeW5jIChyb2xlUGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uU2VydmljZS5maW5kT25lQnkoXCJpZFwiLCByZWxhdGlvbklkKHJvbGVQZXJtaXNzaW9uLnBlcm1pc3Npb24pIGFzIG5ldmVyLCAuLi5hcmdzKVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGlmICghcGVybWlzc2lvbikgY29udGludWU7XG4gICAgICAgIGNvbnN0IHNjb3BlS2luZCA9IGFzc2lnbm1lbnQuc2NvcGVLaW5kO1xuICAgICAgICBjb25zdCBzY29wZUlkID0gYXNzaWdubWVudC5zY29wZUlkO1xuICAgICAgICBjb25zdCBzY29wZXM6IEFycmF5PHsgc2NvcGVLaW5kOiBTY29wZUtpbmQ7IHNjb3BlSWQ6IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuVGVuYW50KSB7XG4gICAgICAgICAgc2NvcGVzLnB1c2goeyBzY29wZUtpbmQsIHNjb3BlSWQ6IHRlbmFudElkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLlJlc291cmNlKSB7XG4gICAgICAgICAgc2NvcGVzLnB1c2goeyBzY29wZUtpbmQsIHNjb3BlSWQgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCAmJiAhYXNzaWdubWVudC5pbmhlcml0RG93bikge1xuICAgICAgICAgIHNjb3Blcy5wdXNoKHsgc2NvcGVLaW5kLCBzY29wZUlkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiYgYXNzaWdubWVudC5pbmhlcml0RG93bikge1xuICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gYXdhaXQgb3JnVW5pdENsb3N1cmVTZXJ2aWNlLmxpc3REZXNjZW5kYW50cyh0ZW5hbnRJZCwgc2NvcGVJZCwgLi4uYXJncyk7XG4gICAgICAgICAgc2NvcGVzLnB1c2goLi4uZGVzY2VuZGFudHMubWFwKChyb3cpID0+ICh7IHNjb3BlS2luZCwgc2NvcGVJZDogcmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkgfSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGVkIG9mIHNjb3Blcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiZcbiAgICAgICAgICAgIGFzc2lnbm1lbnQuaW5oZXJpdERvd24gJiZcbiAgICAgICAgICAgIHNjb3BlZC5zY29wZUlkICE9PSBzY29wZUlkICYmXG4gICAgICAgICAgICAoYXdhaXQgaW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UuY2F0ZWdvcnlCbG9ja2VkRm9yQW5jZXN0b3IoXG4gICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICBzY29wZWQuc2NvcGVJZCxcbiAgICAgICAgICAgICAgc2NvcGVJZCxcbiAgICAgICAgICAgICAgcGVybWlzc2lvbi5jYXRlZ29yeSxcbiAgICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICAgICAgKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXRlcmlhbGl6ZWQucHVzaCh7XG4gICAgICAgICAgICBpZDogXCJcIixcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uS2V5OiBwZXJtaXNzaW9uLmtleSxcbiAgICAgICAgICAgIHNjb3BlS2luZDogc2NvcGVkLnNjb3BlS2luZCxcbiAgICAgICAgICAgIHNjb3BlSWQ6IHNjb3BlZC5zY29wZUlkLFxuICAgICAgICAgICAgc291cmNlS2luZDogXCJyb2xlX2Fzc2lnbm1lbnRcIixcbiAgICAgICAgICAgIHNvdXJjZUlkOiBhc3NpZ25tZW50LmlkLFxuICAgICAgICAgICAgc3RhcnRzQXQ6IGFzc2lnbm1lbnQuc3RhcnRzQXQsXG4gICAgICAgICAgICBleHBpcmVzQXQ6IGFzc2lnbm1lbnQuZXhwaXJlc0F0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWF0ZXJpYWxpemVkLm1hcCgocGVybWlzc2lvbikgPT5cbiAgICAgICAgdGhpcy5jcmVhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGVuYW50OiBwZXJtaXNzaW9uLnRlbmFudElkLFxuICAgICAgICAgICAgcHJpbmNpcGFsOiBwZXJtaXNzaW9uLnByaW5jaXBhbElkLFxuICAgICAgICAgICAgcGVybWlzc2lvbktleTogcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5LFxuICAgICAgICAgICAgc2NvcGVLaW5kOiBwZXJtaXNzaW9uLnNjb3BlS2luZCxcbiAgICAgICAgICAgIHNjb3BlSWQ6IHBlcm1pc3Npb24uc2NvcGVJZCxcbiAgICAgICAgICAgIHNvdXJjZUtpbmQ6IHBlcm1pc3Npb24uc291cmNlS2luZCxcbiAgICAgICAgICAgIHNvdXJjZUlkOiBwZXJtaXNzaW9uLnNvdXJjZUlkLFxuICAgICAgICAgICAgc3RhcnRzQXQ6IHBlcm1pc3Npb24uc3RhcnRzQXQsXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHBlcm1pc3Npb24uZXhwaXJlc0F0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYXJnc1xuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgcmVidWlsZEZvclRlbmFudCh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByaW5jaXBhbHMgPSAoYXdhaXQgbmV3IFByaW5jaXBhbFNlcnZpY2UoKS5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHByaW5jaXBhbCkgPT4gc2FtZVRlbmFudChwcmluY2lwYWwudGVuYW50LCB0ZW5hbnRJZCkpO1xuICAgIGZvciAoY29uc3QgcHJpbmNpcGFsIG9mIHByaW5jaXBhbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJlZ2lzdGVyUmVzb3VyY2VJbnB1dCwgUmVzb3VyY2VWaXNpYmlsaXR5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZSB9IGZyb20gXCIuLi9tb2RlbHMvcHJvdGVjdGVkLXJlc291cmNlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByb3RlY3RlZFJlc291cmNlKTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyUmVzb3VyY2UoaW5wdXQ6IFJlZ2lzdGVyUmVzb3VyY2VJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IGlucHV0LnRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBpbnB1dC5vcmdVbml0SWQsXG4gICAgICAgIHJlc291cmNlVHlwZTogaW5wdXQucmVzb3VyY2VUeXBlLFxuICAgICAgICByZXNvdXJjZUlkOiBpbnB1dC5yZXNvdXJjZUlkLFxuICAgICAgICB2aXNpYmlsaXR5OiBpbnB1dC52aXNpYmlsaXR5LFxuICAgICAgICBvd25lcjogaW5wdXQub3duZXJQcmluY2lwYWxJZCxcbiAgICAgICAgc2Vuc2l0aXZpdHk6IGlucHV0LnNlbnNpdGl2aXR5LFxuICAgICAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRCeURvbWFpblJlc291cmNlKHRlbmFudElkOiBzdHJpbmcsIHJlc291cmNlVHlwZTogc3RyaW5nLCByZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKFxuICAgICAgKHJlc291cmNlKSA9PiBzYW1lVGVuYW50KHJlc291cmNlLnRlbmFudCwgdGVuYW50SWQpICYmIHJlc291cmNlLnJlc291cmNlVHlwZSA9PT0gcmVzb3VyY2VUeXBlICYmIHJlc291cmNlLnJlc291cmNlSWQgPT09IHJlc291cmNlSWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbW92ZVJlc291cmNlVG9PcmdVbml0KHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgb3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCB7IG9yZ1VuaXQ6IG9yZ1VuaXRJZCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldFZpc2liaWxpdHkocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCB7IHZpc2liaWxpdHkgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyB0cmFuc2Zlck93bmVyc2hpcChwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIG93bmVyUHJpbmNpcGFsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHByb3RlY3RlZFJlc291cmNlSWQsIHsgb3duZXI6IG93bmVyUHJpbmNpcGFsSWQgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0T3JnVW5pdFJlc291cmNlcyhvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyZXNvdXJjZSkgPT4gcmVsYXRpb25NYXRjaChyZXNvdXJjZS5vcmdVbml0LCBvcmdVbml0SWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRSZXNvdXJjZXModGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyZXNvdXJjZSkgPT4gc2FtZVRlbmFudChyZXNvdXJjZS50ZW5hbnQsIHRlbmFudElkKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEdyYW50UmVzb3VyY2VJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudCB9IGZyb20gXCIuLi9tb2RlbHMvcmVzb3VyY2UtZ3JhbnQubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlR3JhbnRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSZXNvdXJjZUdyYW50PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJlc291cmNlR3JhbnQpO1xuICB9XG5cbiAgYXN5bmMgZ3JhbnRSZXNvdXJjZShpbnB1dDogR3JhbnRSZXNvdXJjZUlucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UmVzb3VyY2VHcmFudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcmVzb3VyY2U6IGlucHV0LnJlc291cmNlSWQsXG4gICAgICAgIHByaW5jaXBhbDogaW5wdXQucHJpbmNpcGFsSWQsXG4gICAgICAgIHBlcm1pc3Npb25LZXk6IGlucHV0LnBlcm1pc3Npb25LZXksXG4gICAgICAgIHN0YXJ0c0F0OiBpbnB1dC5zdGFydHNBdCxcbiAgICAgICAgZXhwaXJlc0F0OiBpbnB1dC5leHBpcmVzQXQsXG4gICAgICAgIGNvbmRpdGlvbnM6IGlucHV0LmNvbmRpdGlvbnMsXG4gICAgICAgIGNyZWF0ZWRCeTogaW5wdXQuY3JlYXRlZEJ5UHJpbmNpcGFsSWQsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZXZva2VHcmFudChncmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKGdyYW50SWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFJlc291cmNlR3JhbnRzKHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJlc291cmNlR3JhbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGdyYW50KSA9PiByZWxhdGlvbk1hdGNoKGdyYW50LnJlc291cmNlLCBwcm90ZWN0ZWRSZXNvdXJjZUlkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0UHJpbmNpcGFsR3JhbnRzKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSZXNvdXJjZUdyYW50W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKGdyYW50KSA9PiBzYW1lVGVuYW50KGdyYW50LnRlbmFudCwgdGVuYW50SWQpICYmIHJlbGF0aW9uTWF0Y2goZ3JhbnQucHJpbmNpcGFsLCBwcmluY2lwYWxJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaGFzR3JhbnQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgYXQ/OiBEYXRlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0UHJpbmNpcGFsR3JhbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncykpLnNvbWUoXG4gICAgICAoZ3JhbnQpID0+XG4gICAgICAgIHJlbGF0aW9uTWF0Y2goZ3JhbnQucmVzb3VyY2UsIHByb3RlY3RlZFJlc291cmNlSWQpICYmXG4gICAgICAgIGdyYW50LnBlcm1pc3Npb25LZXkgPT09IHBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgKCFncmFudC5zdGFydHNBdCB8fCAhYXQgfHwgZ3JhbnQuc3RhcnRzQXQgPD0gYXQpICYmXG4gICAgICAgICghZ3JhbnQuZXhwaXJlc0F0IHx8ICFhdCB8fCBncmFudC5leHBpcmVzQXQgPj0gYXQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbEZvclJlc291cmNlKHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhd2FpdCB0aGlzLmxpc3RSZXNvdXJjZUdyYW50cyhwcm90ZWN0ZWRSZXNvdXJjZUlkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UgfSBmcm9tIFwiLi9wcm90ZWN0ZWQtcmVzb3VyY2Uuc2VydmljZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudFNlcnZpY2UgfSBmcm9tIFwiLi9yZXNvdXJjZS1ncmFudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyByZWxhdGlvbklkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVZpc2liaWxpdHkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlTGlmZWN5Y2xlU2VydmljZSB7XG4gIGFzeW5jIHVucmVnaXN0ZXJSZXNvdXJjZShwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV3IFJlc291cmNlR3JhbnRTZXJ2aWNlKCkuZGVsZXRlQWxsRm9yUmVzb3VyY2UocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgbmV3IFByb3RlY3RlZFJlc291cmNlU2VydmljZSgpLmRlbGV0ZUJ5SWQocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyByZXNvbHZlUmVzb3VyY2VTY29wZShcbiAgICBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx7XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgICBvcmdVbml0SWQ6IHN0cmluZztcbiAgICB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gICAgb3duZXJQcmluY2lwYWxJZD86IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgbmV3IFByb3RlY3RlZFJlc291cmNlU2VydmljZSgpLmdldEJ5SWQocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbmFudElkOiByZWxhdGlvbklkKHJlc291cmNlLnRlbmFudCksXG4gICAgICBvcmdVbml0SWQ6IHJlbGF0aW9uSWQocmVzb3VyY2Uub3JnVW5pdCksXG4gICAgICB2aXNpYmlsaXR5OiByZXNvdXJjZS52aXNpYmlsaXR5LFxuICAgICAgb3duZXJQcmluY2lwYWxJZDogcmVzb3VyY2Uub3duZXIgPyByZWxhdGlvbklkKHJlc291cmNlLm93bmVyKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbklkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVTdG9yYWdlQmluZGluZ0lucHV0LCBTdG9yYWdlQmluZGluZ0tpbmQsIFN0b3JhZ2VLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTdG9yYWdlQmluZGluZyB9IGZyb20gXCIuLi9tb2RlbHMvc3RvcmFnZS1iaW5kaW5nLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlQmluZGluZ1NlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFN0b3JhZ2VCaW5kaW5nKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUJpbmRpbmcoaW5wdXQ6IENyZWF0ZVN0b3JhZ2VCaW5kaW5nSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgc3RvcmFnZUtpbmQ6IGlucHV0LnN0b3JhZ2VLaW5kLFxuICAgICAgICBiaW5kaW5nS2luZDogaW5wdXQuYmluZGluZ0tpbmQsXG4gICAgICAgIGJpbmRpbmdLZXk6IGlucHV0LmJpbmRpbmdLZXksXG4gICAgICAgIHJlZ2lvbjogaW5wdXQucmVnaW9uLFxuICAgICAgICBjb25maWc6IGlucHV0LmNvbmZpZyxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRCaW5kaW5ncyh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmdbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGJpbmRpbmcpID0+IHJlbGF0aW9uSWQoYmluZGluZy50ZW5hbnQpID09PSB0ZW5hbnRJZCk7XG4gIH1cblxuICBhc3luYyBnZXRCaW5kaW5nKHRlbmFudElkOiBzdHJpbmcsIHN0b3JhZ2VLaW5kOiBTdG9yYWdlS2luZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RUZW5hbnRCaW5kaW5ncyh0ZW5hbnRJZCwgLi4uYXJncykpLmZpbmQoKGJpbmRpbmcpID0+IGJpbmRpbmcuc3RvcmFnZUtpbmQgPT09IHN0b3JhZ2VLaW5kKTtcbiAgfVxuXG4gIGFzeW5jIHNldEJpbmRpbmdDb25maWcoXG4gICAgYmluZGluZ0lkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGJpbmRpbmdJZCwgeyBjb25maWcgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBwcm9tb3RlVG9EZWRpY2F0ZWQoXG4gICAgYmluZGluZ0lkOiBzdHJpbmcsXG4gICAgYmluZGluZ0tleTogc3RyaW5nLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmc+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoYmluZGluZ0lkLCB7IGJpbmRpbmdLaW5kOiBTdG9yYWdlQmluZGluZ0tpbmQuRGVkaWNhdGVkLCBiaW5kaW5nS2V5LCByZWdpb24sIGNvbmZpZyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldFNoYXJlZChcbiAgICBiaW5kaW5nSWQ6IHN0cmluZyxcbiAgICBiaW5kaW5nS2V5OiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShiaW5kaW5nSWQsIHsgYmluZGluZ0tpbmQ6IFN0b3JhZ2VCaW5kaW5nS2luZC5TaGFyZWQsIGJpbmRpbmdLZXksIHJlZ2lvbiwgY29uZmlnIH0sIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEJvb3RzdHJhcE9yZ1VuaXQsIEJvb3RzdHJhcFRlbXBsYXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFRlbmFudFNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgVGVuYW50UHJvZmlsZVNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQtcHJvZmlsZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0U2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRQcm9maWxlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tIFwiLi91c2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3Blcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9lZmZlY3RpdmUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBCb290c3RyYXBTZXJ2aWNlIHtcbiAgcHJpdmF0ZSB0ZW5hbnRTZXJ2aWNlID0gbmV3IFRlbmFudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSB0ZW5hbnRQcm9maWxlU2VydmljZSA9IG5ldyBUZW5hbnRQcm9maWxlU2VydmljZSgpO1xuICBwcml2YXRlIG9yZ1VuaXRTZXJ2aWNlID0gbmV3IE9yZ1VuaXRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgb3JnVW5pdFByb2ZpbGVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRQcm9maWxlU2VydmljZSgpO1xuICBwcml2YXRlIHVzZXJTZXJ2aWNlID0gbmV3IFVzZXJTZXJ2aWNlKCk7XG4gIHByaXZhdGUgbWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwcmluY2lwYWxTZXJ2aWNlID0gbmV3IFByaW5jaXBhbFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uU2VydmljZSA9IG5ldyBQZXJtaXNzaW9uU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVTZXJ2aWNlID0gbmV3IFJvbGVTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFJvbGVQZXJtaXNzaW9uU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVBc3NpZ25tZW50U2VydmljZSA9IG5ldyBSb2xlQXNzaWdubWVudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBlZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSgpO1xuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgYm9vdHN0cmFwVGVuYW50RnJvbVRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBCb290c3RyYXBUZW1wbGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHtcbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICAgIHJvb3RPcmdVbml0SWQ6IHN0cmluZztcbiAgICBvd25lclVzZXJJZDogc3RyaW5nO1xuICAgIG93bmVyUHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMudGVuYW50U2VydmljZS5jcmVhdGVUZW5hbnQoXG4gICAgICB0ZW1wbGF0ZS50ZW5hbnQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAodGVtcGxhdGUudGVuYW50LnByb2ZpbGVLZXkpIHtcbiAgICAgIGF3YWl0IHRoaXMudGVuYW50UHJvZmlsZVNlcnZpY2UuY3JlYXRlUHJvZmlsZShcbiAgICAgICAgdGVuYW50LmlkLFxuICAgICAgICB0ZW1wbGF0ZS50ZW5hbnQucHJvZmlsZUtleSxcbiAgICAgICAgdGVtcGxhdGUudGVuYW50LnByb2ZpbGVNZXRhZGF0YSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVPcmdUcmVlID0gYXN5bmMgKFxuICAgICAgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIG9yZ1VuaXQ6IEJvb3RzdHJhcE9yZ1VuaXRcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQgPVxuICAgICAgICBwYXJlbnRJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLm9yZ1VuaXRTZXJ2aWNlLmNyZWF0ZVJvb3QoXG4gICAgICAgICAgICAgIHRlbmFudC5pZCxcbiAgICAgICAgICAgICAgb3JnVW5pdC5uYW1lLFxuICAgICAgICAgICAgICBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICBvcmdVbml0LnByb2ZpbGVLZXksXG4gICAgICAgICAgICAgIG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMub3JnVW5pdFNlcnZpY2UuY3JlYXRlQ2hpbGQoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZDogdGVuYW50LmlkLFxuICAgICAgICAgICAgICAgIHBhcmVudE9yZ1VuaXRJZDogcGFyZW50SWQsXG4gICAgICAgICAgICAgICAgbmFtZTogb3JnVW5pdC5uYW1lLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHByb2ZpbGVLZXk6IG9yZ1VuaXQucHJvZmlsZUtleSxcbiAgICAgICAgICAgICAgICBwcm9maWxlTWV0YWRhdGE6IG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG9yZ1VuaXQuY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlT3JnVHJlZShjcmVhdGVkLmlkLCBjaGlsZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuXG4gICAgY29uc3Qgcm9vdE9yZ1VuaXQgPSBhd2FpdCBjcmVhdGVPcmdUcmVlKHVuZGVmaW5lZCwgdGVtcGxhdGUucm9vdE9yZ1VuaXQpO1xuICAgIGNvbnN0IG93bmVyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVVc2VyKFxuICAgICAgdGVtcGxhdGUub3duZXJVc2VyLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5hZGRVc2VyVG9UZW5hbnQoXG4gICAgICB0ZW5hbnQuaWQsXG4gICAgICBvd25lci5pZCxcbiAgICAgIE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgY29uc3Qgb3duZXJQcmluY2lwYWwgPSBhd2FpdCB0aGlzLnByaW5jaXBhbFNlcnZpY2UuZ2V0VXNlclByaW5jaXBhbChcbiAgICAgIHRlbmFudC5pZCxcbiAgICAgIG93bmVyLmlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgdGVtcGxhdGUucGVybWlzc2lvbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMucGVybWlzc2lvblNlcnZpY2UuY3JlYXRlUGVybWlzc2lvbihwZXJtaXNzaW9uLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHRlbXBsYXRlLnJvbGVzKSB7XG4gICAgICBjb25zdCBjcmVhdGVkUm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuY3JlYXRlUm9sZShcbiAgICAgICAge1xuICAgICAgICAgIHRlbmFudElkOiB0ZW5hbnQuaWQsXG4gICAgICAgICAga2V5OiByb2xlLmtleSxcbiAgICAgICAgICBuYW1lOiByb2xlLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHJvbGUuZGVzY3JpcHRpb24sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb25LZXkgb2Ygcm9sZS5wZXJtaXNzaW9uS2V5cykge1xuICAgICAgICBhd2FpdCB0aGlzLnJvbGVQZXJtaXNzaW9uU2VydmljZS5hZGRQZXJtaXNzaW9uS2V5VG9Sb2xlKFxuICAgICAgICAgIGNyZWF0ZWRSb2xlLmlkLFxuICAgICAgICAgIHBlcm1pc3Npb25LZXksXG4gICAgICAgICAgLi4uYXJnc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG93bmVyUm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuZ2V0VGVuYW50Um9sZUJ5S2V5KFxuICAgICAgdGVuYW50LmlkLFxuICAgICAgdGVtcGxhdGUub3duZXJSb2xlS2V5LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgICAgcHJpbmNpcGFsSWQ6IG93bmVyUHJpbmNpcGFsLmlkLFxuICAgICAgICByb2xlSWQ6IG93bmVyUm9sZS5pZCxcbiAgICAgICAgc2NvcGVLaW5kOiBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgc2NvcGVJZDogcm9vdE9yZ1VuaXQuaWQsXG4gICAgICAgIGluaGVyaXREb3duOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbChcbiAgICAgIHRlbmFudC5pZCxcbiAgICAgIG93bmVyUHJpbmNpcGFsLmlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgIHJvb3RPcmdVbml0SWQ6IHJvb3RPcmdVbml0LmlkLFxuICAgICAgb3duZXJVc2VySWQ6IG93bmVyLmlkLFxuICAgICAgb3duZXJQcmluY2lwYWxJZDogb3duZXJQcmluY2lwYWwuaWQsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgU2NvcGVLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gXCIuL3JvbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vZWZmZWN0aXZlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgU3lzdGVtTWFuYWdlbWVudFNlcnZpY2Uge1xuICBwcml2YXRlIG1lbWJlcnNoaXBTZXJ2aWNlID0gbmV3IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gIHByaXZhdGUgb3JnTWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgT3JnVW5pdE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZVNlcnZpY2UgPSBuZXcgUm9sZVNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlQXNzaWdubWVudFNlcnZpY2UgPSBuZXcgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgPSBuZXcgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UoKTtcblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIG9uYm9hcmRVc2VyVG9UZW5hbnRBbmRPcmdVbml0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcm9sZUtleTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8eyBwcmluY2lwYWxJZDogc3RyaW5nIH0+IHtcbiAgICBhd2FpdCB0aGlzLm1lbWJlcnNoaXBTZXJ2aWNlLmFkZFVzZXJUb1RlbmFudCh0ZW5hbnRJZCwgdXNlcklkLCBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5vcmdNZW1iZXJzaGlwU2VydmljZS5hZGRVc2VyVG9PcmdVbml0KHRlbmFudElkLCBvcmdVbml0SWQsIHVzZXJJZCwgTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHByaW5jaXBhbCA9IGF3YWl0IHRoaXMucHJpbmNpcGFsU2VydmljZS5nZXRVc2VyUHJpbmNpcGFsKHRlbmFudElkLCB1c2VySWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmdldFRlbmFudFJvbGVCeUtleSh0ZW5hbnRJZCwgcm9sZUtleSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICAgIHByaW5jaXBhbElkOiBwcmluY2lwYWwuaWQsXG4gICAgICAgIHJvbGVJZDogcm9sZS5pZCxcbiAgICAgICAgc2NvcGVLaW5kOiBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgc2NvcGVJZDogb3JnVW5pdElkLFxuICAgICAgICBpbmhlcml0RG93bjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlLnJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbC5pZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHsgcHJpbmNpcGFsSWQ6IHByaW5jaXBhbC5pZCB9O1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjaGFuZ2VVc2VyT3JnUm9sZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcm9sZUtleTogc3RyaW5nLFxuICAgIGluaGVyaXREb3duOiBib29sZWFuLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmdldFRlbmFudFJvbGVCeUtleSh0ZW5hbnRJZCwgcm9sZUtleSwgLi4uYXJncyk7XG4gICAgY29uc3QgY3VycmVudEFzc2lnbm1lbnRzID0gYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UubGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgZm9yIChjb25zdCBhc3NpZ25tZW50IG9mIGN1cnJlbnRBc3NpZ25tZW50cy5maWx0ZXIoKHJvdykgPT4gcm93LnNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiYgcm93LnNjb3BlSWQgPT09IG9yZ1VuaXRJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLnJldm9rZUFzc2lnbm1lbnQoYXNzaWdubWVudC5pZCwgLi4uYXJncyk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmFzc2lnblJvbGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudElkLFxuICAgICAgICBwcmluY2lwYWxJZCxcbiAgICAgICAgcm9sZUlkOiByb2xlLmlkLFxuICAgICAgICBzY29wZUtpbmQ6IFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICBzY29wZUlkOiBvcmdVbml0SWQsXG4gICAgICAgIGluaGVyaXREb3duLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBzdXNwZW5kVXNlckluVGVuYW50KHRlbmFudE1lbWJlcnNoaXBJZDogc3RyaW5nLCB0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubWVtYmVyc2hpcFNlcnZpY2Uuc2V0U3RhdHVzKHRlbmFudE1lbWJlcnNoaXBJZCwgTWVtYmVyc2hpcFN0YXR1cy5TdXNwZW5kZWQsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UuZGVsZXRlRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYWN0aXZhdGVVc2VySW5UZW5hbnQodGVuYW50TWVtYmVyc2hpcElkOiBzdHJpbmcsIHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5zZXRTdGF0dXModGVuYW50TWVtYmVyc2hpcElkLCBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZS5yZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQXV0aHpEYXRhU291cmNlcyxcbiAgQ2FuQWNjZXNzSW5wdXQsXG4gIFJlc291cmNlVmlzaWJpbGl0eSxcbiAgU2NvcGVLaW5kLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGFzQXJyYXksXG4gIGJ1aWxkQWNjZXNzQ29udGV4dCxcbiAgYnVpbGRBcmFuZ29Db250ZXh0LFxuICBidWlsZFFkcmFudEZpbHRlcixcbiAgaXNUaW1lVmFsaWQsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuXG5mdW5jdGlvbiBzY29wZUtleShzY29wZUtpbmQ6IFNjb3BlS2luZCwgc2NvcGVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3Njb3BlS2luZH06JHtzY29wZUlkfWA7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoelNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2VzOiBBdXRoekRhdGFTb3VyY2VzO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2VzOiBBdXRoekRhdGFTb3VyY2VzID0ge30pIHtcbiAgICB0aGlzLmRhdGFTb3VyY2VzID0gZGF0YVNvdXJjZXM7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGNhbkFjY2VzcyhpbnB1dDogQ2FuQWNjZXNzSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYXQgPSBpbnB1dC5hdCA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgaWYgKGlucHV0LnNjb3BlS2luZCAmJiBpbnB1dC5zY29wZUlkKSB7XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9XG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihcbiAgICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgICBpbnB1dC5zY29wZUtpbmQsXG4gICAgICAgICAgaW5wdXQuc2NvcGVJZFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFzQXJyYXkocGVybWlzc2lvbnMpLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICAgIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubG9hZFJlc291cmNlPy4oXG4gICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgIGlucHV0LnJlc291cmNlUHJvdGVjdGVkSWRcbiAgICApO1xuICAgIGlmICghcmVzb3VyY2UpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocmVzb3VyY2UudGVuYW50SWQgIT09IGlucHV0LnRlbmFudElkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAocmVzb3VyY2Uub3duZXJQcmluY2lwYWxJZCA9PT0gaW5wdXQucHJpbmNpcGFsSWQpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgZ3JhbnRzID0gYXNBcnJheShcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdFJlc291cmNlR3JhbnRzPy4oXG4gICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICBpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkXG4gICAgICApXG4gICAgKS5maWx0ZXIoXG4gICAgICAoZ3JhbnQpID0+XG4gICAgICAgIGdyYW50LnByaW5jaXBhbElkID09PSBpbnB1dC5wcmluY2lwYWxJZCAmJlxuICAgICAgICBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgIGlzVGltZVZhbGlkKGF0LCBncmFudC5zdGFydHNBdCwgZ3JhbnQuZXhwaXJlc0F0KVxuICAgICk7XG4gICAgaWYgKGdyYW50cy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHZpc2liaWxpdHkgPSByZXNvdXJjZS52aXNpYmlsaXR5O1xuICAgIGlmIChcbiAgICAgIHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5Qcml2YXRlIHx8XG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuUmVzb3VyY2VBY2xcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuT3JnVW5pdCB8fFxuICAgICAgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5Lk9yZ1N1YnRyZWVcbiAgICApIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKFxuICAgICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICAgIFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICAgIHJlc291cmNlLm9yZ1VuaXRJZFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVmZmVjdGl2ZVBlcm1pc3Npb25zLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICAgIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5UZW5hbnQpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKFxuICAgICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICAgIFNjb3BlS2luZC5UZW5hbnQsXG4gICAgICAgICAgaW5wdXQudGVuYW50SWRcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBlZmZlY3RpdmVQZXJtaXNzaW9ucy5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgICBpc1RpbWVWYWxpZChhdCwgcGVybWlzc2lvbi5zdGFydHNBdCwgcGVybWlzc2lvbi5leHBpcmVzQXQpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVpcmVBY2Nlc3MoaW5wdXQ6IENhbkFjY2Vzc0lucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghKGF3YWl0IHRoaXMuY2FuQWNjZXNzKGlucHV0LCAuLi5hcmdzKSkpIHtcbiAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgIGBBY2Nlc3MgZGVuaWVkIGZvciAke2lucHV0LnBlcm1pc3Npb25LZXl9IG9uICR7aW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZCA/PyBzY29wZUtleShpbnB1dC5zY29wZUtpbmQgPz8gU2NvcGVLaW5kLlJlc291cmNlLCBpbnB1dC5zY29wZUlkID8/IFwiXCIpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnVpbGRBY2Nlc3NDb250ZXh0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxpbXBvcnQoXCIuLi90eXBlc1wiKS5BY2Nlc3NDb250ZXh0PiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhc0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnM/Lih0ZW5hbnRJZCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgICBjb25zdCBncmFudHMgPSBhc0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0UHJpbmNpcGFsR3JhbnRzPy4odGVuYW50SWQsIHByaW5jaXBhbElkKVxuICAgICk7XG4gICAgcmV0dXJuIGJ1aWxkQWNjZXNzQ29udGV4dCh7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbnMsXG4gICAgICBncmFudHMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZEFyYW5nb0NvbnRleHQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25LZXk6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBhY2Nlc3MgPSBhd2FpdCB0aGlzLmJ1aWxkQWNjZXNzQ29udGV4dChcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBjb25zdCBhbGxvd2VkT3JnVW5pdElkcyA9XG4gICAgICBhY2Nlc3MuYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbktleV0gPz8gW107XG4gICAgY29uc3QgYWxsb3dlZFJlc291cmNlSWRzID0gYWNjZXNzLnJlc291cmNlR3JhbnRzXG4gICAgICAuZmlsdGVyKChncmFudCkgPT4gZ3JhbnQucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSlcbiAgICAgIC5tYXAoKGdyYW50KSA9PiBncmFudC5yZXNvdXJjZUlkKTtcbiAgICByZXR1cm4gYnVpbGRBcmFuZ29Db250ZXh0KHtcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICBwZXJtaXNzaW9uS2V5LFxuICAgICAgYWxsb3dlZE9yZ1VuaXRJZHMsXG4gICAgICBhbGxvd2VkUmVzb3VyY2VJZHMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZFFkcmFudEZpbHRlcihcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbktleTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IGFjY2VzcyA9IGF3YWl0IHRoaXMuYnVpbGRBY2Nlc3NDb250ZXh0KFxuICAgICAgdGVuYW50SWQsXG4gICAgICBwcmluY2lwYWxJZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGNvbnN0IGFsbG93ZWRPcmdVbml0SWRzID1cbiAgICAgIGFjY2Vzcy5hbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICBjb25zdCBhbGxvd2VkUmVzb3VyY2VJZHMgPSBhY2Nlc3MucmVzb3VyY2VHcmFudHNcbiAgICAgIC5maWx0ZXIoKGdyYW50KSA9PiBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5KVxuICAgICAgLm1hcCgoZ3JhbnQpID0+IGdyYW50LnJlc291cmNlSWQpO1xuICAgIHJldHVybiBidWlsZFFkcmFudEZpbHRlcih7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbktleSxcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzLFxuICAgICAgYWxsb3dlZFJlc291cmNlSWRzLFxuICAgIH0pO1xuICB9XG59XG4iLCIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zXG4gKiBAc3VtbWFyeSBQYWNrYWdlIGVudHJ5IHBvaW50IGZvciBzaGFyZWQgaW50ZWdyYXRpb24gaGVscGVycy5cbiAqIEBkZXNjcmlwdGlvbiBFeHBvc2VzIHRoZSBwYWNrYWdlIHV0aWxpdGllcyBhbmQgYnVpbGQtdGltZSB2ZXJzaW9uIG1ldGFkYXRhIGZvciBgQGRlY2FmLXRzL2ludGVncmF0aW9uc2AuXG4gKi9cbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9uYW1lc3BhY2VzXCI7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OOiBzdHJpbmcgPSBcIiMjVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBDT01NSVQgPSBcIiMjQ09NTUlUIyNcIjtcblxuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FOiBzdHJpbmcgPSBcIiMjUEFDS0FHRSMjXCI7XG4iXSwibmFtZXMiOlsiYXN5bmMiLCJleGVjV2l0aExvZ2dpbmciLCJjb21tYW5kIiwib3B0aW9ucyIsImxvZyIsImxldmVsIiwiTG9nTGV2ZWwiLCJpbmZvIiwiZGVidWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImNoaWxkIiwiZXhlYyIsInN0ZG91dCIsInN0ZGVyciIsIm9uIiwiZGF0YSIsInB1c2giLCJ0cmltIiwiY29kZSIsInNpbGx5Iiwiam9pbiIsImNyaXRpY2FsIiwiSW50ZXJuYWxFcnJvciIsImVyciIsIklzb2xhdGlvblRpZXIiLCJNZW1iZXJzaGlwU3RhdHVzIiwiUHJpbmNpcGFsS2luZCIsIlNjb3BlS2luZCIsIlBlcm1pc3Npb25DYXRlZ29yeSIsIlJlc291cmNlVmlzaWJpbGl0eSIsIlN0b3JhZ2VLaW5kIiwiU3RvcmFnZUJpbmRpbmdLaW5kIiwiSXNvbGF0aW9uVGllck9wdGlvbnMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucyIsIlByaW5jaXBhbEtpbmRPcHRpb25zIiwiU2NvcGVLaW5kT3B0aW9ucyIsIlBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMiLCJSZXNvdXJjZVZpc2liaWxpdHlPcHRpb25zIiwiU3RvcmFnZUtpbmRPcHRpb25zIiwiU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucyIsIlJFTF9SRVNUUklDVCIsInVwZGF0ZSIsIkNhc2NhZGUiLCJOT05FIiwiZGVsZXRlIiwibnVsbGFibGUiLCJSRUxfTlVMTElGWSIsIlJFTF9DQVNDQURFX0RFUEVOREVOVCIsIkNBU0NBREUiLCJSRUxfQ0FTQ0FERV9JTlNFUlRfVVBEQVRFIiwiYnVpbGRBcmFuZ29Db250ZXh0IiwidGVuYW50SWQiLCJwcmluY2lwYWxJZCIsInBlcm1pc3Npb25LZXkiLCJhbGxvd2VkT3JnVW5pdElkcyIsImFsbG93ZWRSZXNvdXJjZUlkcyIsImJ1aWxkUWRyYW50RmlsdGVyIiwibXVzdCIsImtleSIsIm1hdGNoIiwidmFsdWUiLCJzaG91bGQiLCJhbnkiLCJzY29wZUtleSIsInNjb3BlS2luZCIsInNjb3BlSWQiLCJub3dJc28iLCJEYXRlIiwiYXNBcnJheSIsInNhbWVUZW5hbnQiLCJyb3dUZW5hbnQiLCJyZWxhdGlvbklkIiwicmVsYXRpb25NYXRjaCIsInRhcmdldCIsImxvd2VyU2x1ZyIsInRvTG93ZXJDYXNlIiwicmVwbGFjZSIsImlzVGltZVZhbGlkIiwiYXQiLCJzdGFydHNBdCIsImV4cGlyZXNBdCIsImluc3RhbnQiLCJidWlsZEFjY2Vzc0NvbnRleHQiLCJwZXJtaXNzaW9uc0J5U2NvcGUiLCJhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJwZXJtaXNzaW9ucyIsIk9yZ1VuaXQiLCJyZXNvdXJjZUdyYW50cyIsImdyYW50cyIsIm1hcCIsImdyYW50IiwicmVzb3VyY2VJZCIsIkJhc2VNb2RlbFNlcnZpY2UiLCJNb2RlbFNlcnZpY2UiLCJjb25zdHJ1Y3RvciIsImNsYXp6Iiwic3VwZXIiLCJuZXdNb2RlbCIsImFzc2lnbiIsImNyZWF0ZSIsImFyZ3MiLCJ0aGlzIiwicmVwbyIsImNyZWF0ZU9uZSIsImdldEJ5SWQiLCJpZCIsInJlYWQiLCJ1cGRhdGVPbmUiLCJwYXRjaCIsImV4aXN0aW5nIiwiZGVsZXRlQnlJZCIsImZpbmRPbmVCeSIsImZpbmRNYW55QnkiLCJzZWxlY3QiLCJ3aGVyZSIsImV4ZWN1dGUiLCJsaXN0QWxsIiwiY3J5cHRvIiwicmFuZG9tVVVJRCIsIkF1dGhvcml6YXRpb25Nb2RlbCIsIk1vZGVsIiwiVGVuYW50TWVtYmVyc2hpcCIsIl9fZGVjb3JhdGUiLCJwayIsInR5cGUiLCJTdHJpbmciLCJ1dWlkIiwicHJvdG90eXBlIiwibWFueVRvT25lIiwiVGVuYW50IiwidW5kZWZpbmVkIiwicmVxdWlyZWQiLCJVc2VyIiwidHlwZU9mIiwib3B0aW9uIiwiY29sdW1uIiwiY3JlYXRlZEF0IiwidXBkYXRlZEF0IiwidGFibGUiLCJtb2RlbCIsInVuaXF1ZSIsIm9uZVRvTWFueSIsIk9yZ1VuaXRNZW1iZXJzaGlwIiwiT3JnVW5pdENsb3N1cmUiLCJOdW1iZXIiLCJQZXJtaXNzaW9uIiwiUm9sZVBlcm1pc3Npb24iLCJSb2xlIiwiUm9sZUFzc2lnbm1lbnQiLCJQcmluY2lwYWwiLCJCb29sZWFuIiwiUmVzb3VyY2VHcmFudCIsIlByb3RlY3RlZFJlc291cmNlIiwiSW5oZXJpdGFuY2VCbG9jayIsIlN0b3JhZ2VCaW5kaW5nIiwiVGVuYW50UHJvZmlsZSIsIk9yZ1VuaXRQcm9maWxlIiwiR3JvdXBNZW1iZXJzaGlwIiwiR3JvdXAiLCJFZmZlY3RpdmVQZXJtaXNzaW9uIiwiVGVuYW50UHJvZmlsZVNlcnZpY2UiLCJjcmVhdGVQcm9maWxlIiwicHJvZmlsZUtleSIsIm1ldGFkYXRhIiwidGVuYW50IiwibGlzdEZvclRlbmFudCIsImZpbHRlciIsInByb2ZpbGUiLCJkZWxldGVGb3JUZW5hbnQiLCJyb3ciLCJPcmdVbml0UHJvZmlsZVNlcnZpY2UiLCJvcmdVbml0SWQiLCJvcmdVbml0IiwibGlzdEZvck9yZ1VuaXQiLCJPcmdVbml0Q2xvc3VyZVNlcnZpY2UiLCJsaXN0QW5jZXN0b3JzIiwiZGVzY2VuZGFudCIsInNvcnQiLCJsZWZ0IiwicmlnaHQiLCJkZXB0aCIsImxpc3REZXNjZW5kYW50cyIsImFuY2VzdG9yIiwiaXNBbmNlc3Rvck9mIiwiYW5jZXN0b3JPcmdVbml0SWQiLCJkZXNjZW5kYW50T3JnVW5pdElkIiwic29tZSIsImNyZWF0ZVNlbGZMaW5rIiwiaW5zZXJ0QW5jZXN0b3JMaW5rc0Zvck5ld0NoaWxkIiwicGFyZW50T3JnVW5pdElkIiwiY2hpbGRPcmdVbml0SWQiLCJhbmNlc3RvckxpbmtzIiwibGluayIsImRlbGV0ZUxpbmtzRm9yU3VidHJlZSIsInN1YnRyZWUiLCJkZXNjZW5kYW50SWRzIiwiU2V0IiwiYW5jZXN0b3JJZHMiLCJyb3dzIiwiaGFzIiwiSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UiLCJibG9ja0NhdGVnb3J5IiwicGVybWlzc2lvbkNhdGVnb3J5IiwiYmxvY2tlZEZyb21BbmNlc3RvcklkIiwicmVhc29uIiwiYmxvY2tlZEZyb21BbmNlc3RvciIsInVuYmxvY2tDYXRlZ29yeSIsImJsb2NrSWQiLCJibG9jayIsImNhdGVnb3J5QmxvY2tlZEZvckFuY2VzdG9yIiwiY2F0ZWdvcnkiLCJUZW5hbnRTZXJ2aWNlIiwiY3JlYXRlVGVuYW50IiwiaW5wdXQiLCJzbHVnIiwibmFtZSIsImlzb2xhdGlvblRpZXIiLCJQb29sZWQiLCJnZXRCeVNsdWciLCJyZW5hbWVUZW5hbnQiLCJjaGFuZ2VTbHVnIiwic2V0SXNvbGF0aW9uVGllciIsImRlbGV0ZVRlbmFudENvbnRyb2xsZWQiLCJkZWxldGVSb3dzQnlJZCIsInNlcnZpY2UiLCJPcmdVbml0U2VydmljZSIsIm9yZ1VuaXRQYXRoIiwicGFyZW50UGF0aCIsInNlZ21lbnQiLCJjcmVhdGVQcm9maWxlSWZOZWVkZWQiLCJwcm9maWxlTWV0YWRhdGEiLCJjcmVhdGVSb290IiwicGF0aCIsImNyZWF0ZUNoaWxkIiwicGFyZW50IiwiY2xvc3VyZVNlcnZpY2UiLCJsaXN0Q2hpbGRyZW4iLCJsaXN0VGVuYW50T3JnVW5pdHMiLCJsaXN0RGVzY2VuZGFudE9yZ1VuaXRzIiwiaW5jbHVkZVNlbGYiLCJkZXNjZW5kYW50cyIsImlkcyIsImFkZCIsImxpc3RBbmNlc3Rvck9yZ1VuaXRzIiwiYW5jZXN0b3JzIiwicmVuYW1lT3JnVW5pdCIsImluY2x1ZGVzIiwibW92ZU9yZ1VuaXQiLCJuZXdQYXJlbnRPcmdVbml0SWQiLCJuZXdQYXJlbnQiLCJ1cGRhdGVkIiwicmVidWlsZFRlbmFudENsb3N1cmUiLCJleGlzdGluZ0xpbmtzIiwib3JnVW5pdHMiLCJsZWZ0RGVwdGgiLCJzcGxpdCIsImxlbmd0aCIsInJpZ2h0RGVwdGgiLCJkZWxldGVPcmdVbml0VHJlZSIsInRyYW5zYWN0aW9uYWwiLCJVc2VyU2VydmljZSIsImNyZWF0ZVVzZXIiLCJlbWFpbCIsInBob25lIiwiZGlzcGxheU5hbWUiLCJnZXRCeUVtYWlsIiwiZmluZCIsInVzZXIiLCJ1cGRhdGVEaXNwbGF5TmFtZSIsInVzZXJJZCIsInVwZGF0ZUVtYWlsIiwidXBkYXRlUGhvbmUiLCJQcmluY2lwYWxTZXJ2aWNlIiwiY3JlYXRlUHJpbmNpcGFsIiwia2luZCIsInN1YmplY3RJZCIsImdldEZvclN1YmplY3QiLCJwcmluY2lwYWwiLCJnZXRPckNyZWF0ZUZvclN1YmplY3QiLCJnZXRVc2VyUHJpbmNpcGFsIiwiZ2V0R3JvdXBQcmluY2lwYWwiLCJncm91cElkIiwiVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UiLCJhZGRVc2VyVG9UZW5hbnQiLCJzdGF0dXMiLCJBY3RpdmUiLCJzZXRTdGF0dXMiLCJtZW1iZXJzaGlwSWQiLCJsaXN0VXNlclRlbmFudHMiLCJtZW1iZXJzaGlwIiwibGlzdFRlbmFudFVzZXJzIiwicmVtb3ZlVXNlckZyb21UZW5hbnQiLCJPcmdVbml0TWVtYmVyc2hpcFNlcnZpY2UiLCJhZGRVc2VyVG9PcmdVbml0IiwibGlzdFVzZXJPcmdVbml0cyIsImxpc3RPcmdVbml0VXNlcnMiLCJyZW1vdmVVc2VyRnJvbU9yZ1VuaXQiLCJHcm91cFNlcnZpY2UiLCJjcmVhdGVHcm91cCIsInJlbmFtZUdyb3VwIiwibW92ZUdyb3VwVG9PcmdVbml0IiwibGlzdFRlbmFudEdyb3VwcyIsImdyb3VwIiwiR3JvdXBNZW1iZXJzaGlwU2VydmljZSIsImFkZFByaW5jaXBhbFRvR3JvdXAiLCJsaXN0R3JvdXBNZW1iZXJzIiwibGlzdFByaW5jaXBhbEdyb3VwcyIsInJlbW92ZVByaW5jaXBhbEZyb21Hcm91cCIsInJlc29sdmVHcm91cFByaW5jaXBhbElkc0ZvclByaW5jaXBhbCIsInByaW5jaXBhbFNlcnZpY2UiLCJtZW1iZXJzaGlwcyIsInByaW5jaXBhbHMiLCJhbGwiLCJQZXJtaXNzaW9uU2VydmljZSIsImNyZWF0ZVBlcm1pc3Npb24iLCJkZXNjcmlwdGlvbiIsImdldEJ5S2V5IiwibGlzdEJ5Q2F0ZWdvcnkiLCJ1cGRhdGVEZXNjcmlwdGlvbiIsInBlcm1pc3Npb25JZCIsIlJvbGVTZXJ2aWNlIiwiY3JlYXRlUm9sZSIsImdldFN5c3RlbVJvbGVCeUtleSIsInJvbGUiLCJjYW5kaWRhdGUiLCJFcnJvciIsImdldFRlbmFudFJvbGVCeUtleSIsInJlbmFtZVJvbGUiLCJyb2xlSWQiLCJ1cGRhdGVSb2xlTWV0YWRhdGEiLCJsaXN0VGVuYW50Um9sZXMiLCJpbmNsdWRlU3lzdGVtIiwiUm9sZVBlcm1pc3Npb25TZXJ2aWNlIiwiYWRkUGVybWlzc2lvblRvUm9sZSIsImFkZFBlcm1pc3Npb25LZXlUb1JvbGUiLCJyZW1vdmVQZXJtaXNzaW9uRnJvbVJvbGUiLCJyb2xlUGVybWlzc2lvbklkIiwibGlzdFJvbGVQZXJtaXNzaW9ucyIsInJvbGVQZXJtaXNzaW9uIiwibGlzdFBlcm1pc3Npb25Sb2xlcyIsInJlcGxhY2VSb2xlUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uSWRzIiwiY3JlYXRlUm9sZVdpdGhQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25LZXlzIiwiUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIiwiYXNzaWduUm9sZSIsImluaGVyaXREb3duIiwiY29uZGl0aW9ucyIsInJldm9rZUFzc2lnbm1lbnQiLCJhc3NpZ25tZW50SWQiLCJsaXN0UHJpbmNpcGFsQXNzaWdubWVudHMiLCJhc3NpZ25tZW50IiwibGlzdFJvbGVBc3NpZ25tZW50cyIsImxpc3RUZW5hbnRBc3NpZ25tZW50cyIsInVwZGF0ZUFzc2lnbm1lbnRXaW5kb3ciLCJFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSIsImxpc3RGb3JQcmluY2lwYWwiLCJsaXN0Rm9yU2NvcGUiLCJoYXNQZXJtaXNzaW9uIiwiZGVsZXRlRm9yUHJpbmNpcGFsIiwicmVidWlsZEZvclByaW5jaXBhbCIsInJvbGVBc3NpZ25tZW50U2VydmljZSIsInJvbGVQZXJtaXNzaW9uU2VydmljZSIsInBlcm1pc3Npb25TZXJ2aWNlIiwiZ3JvdXBNZW1iZXJzaGlwU2VydmljZSIsIm9yZ1VuaXRDbG9zdXJlU2VydmljZSIsImluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlIiwibWF0ZXJpYWxpemVkIiwic291cmNlQXNzaWdubWVudHMiLCJncm91cE1lbWJlcnNoaXBzIiwiZ3JvdXBBc3NpZ25tZW50cyIsImdyb3VwUHJpbmNpcGFsIiwiZmxhdCIsImFzc2lnbm1lbnRzIiwicm9sZVBlcm1pc3Npb25zIiwic2NvcGVzIiwiUmVzb3VyY2UiLCJzY29wZWQiLCJzb3VyY2VLaW5kIiwic291cmNlSWQiLCJjcmVhdGVkIiwicmVidWlsZEZvclRlbmFudCIsIlByb3RlY3RlZFJlc291cmNlU2VydmljZSIsInJlZ2lzdGVyUmVzb3VyY2UiLCJyZXNvdXJjZVR5cGUiLCJ2aXNpYmlsaXR5Iiwib3duZXIiLCJvd25lclByaW5jaXBhbElkIiwic2Vuc2l0aXZpdHkiLCJnZXRCeURvbWFpblJlc291cmNlIiwicmVzb3VyY2UiLCJtb3ZlUmVzb3VyY2VUb09yZ1VuaXQiLCJwcm90ZWN0ZWRSZXNvdXJjZUlkIiwic2V0VmlzaWJpbGl0eSIsInRyYW5zZmVyT3duZXJzaGlwIiwibGlzdE9yZ1VuaXRSZXNvdXJjZXMiLCJsaXN0VGVuYW50UmVzb3VyY2VzIiwiUmVzb3VyY2VHcmFudFNlcnZpY2UiLCJncmFudFJlc291cmNlIiwiY3JlYXRlZEJ5IiwiY3JlYXRlZEJ5UHJpbmNpcGFsSWQiLCJyZXZva2VHcmFudCIsImdyYW50SWQiLCJsaXN0UmVzb3VyY2VHcmFudHMiLCJsaXN0UHJpbmNpcGFsR3JhbnRzIiwiaGFzR3JhbnQiLCJkZWxldGVBbGxGb3JSZXNvdXJjZSIsIlJlc291cmNlTGlmZWN5Y2xlU2VydmljZSIsInVucmVnaXN0ZXJSZXNvdXJjZSIsInJlc29sdmVSZXNvdXJjZVNjb3BlIiwiU3RvcmFnZUJpbmRpbmdTZXJ2aWNlIiwiY3JlYXRlQmluZGluZyIsInN0b3JhZ2VLaW5kIiwiYmluZGluZ0tpbmQiLCJiaW5kaW5nS2V5IiwicmVnaW9uIiwiY29uZmlnIiwibGlzdFRlbmFudEJpbmRpbmdzIiwiYmluZGluZyIsImdldEJpbmRpbmciLCJzZXRCaW5kaW5nQ29uZmlnIiwiYmluZGluZ0lkIiwicHJvbW90ZVRvRGVkaWNhdGVkIiwiRGVkaWNhdGVkIiwic2V0U2hhcmVkIiwiU2hhcmVkIiwiQm9vdHN0cmFwU2VydmljZSIsInRlbmFudFNlcnZpY2UiLCJ0ZW5hbnRQcm9maWxlU2VydmljZSIsIm9yZ1VuaXRTZXJ2aWNlIiwib3JnVW5pdFByb2ZpbGVTZXJ2aWNlIiwidXNlclNlcnZpY2UiLCJtZW1iZXJzaGlwU2VydmljZSIsInJvbGVTZXJ2aWNlIiwiZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UiLCJib290c3RyYXBUZW5hbnRGcm9tVGVtcGxhdGUiLCJ0ZW1wbGF0ZSIsImNyZWF0ZU9yZ1RyZWUiLCJwYXJlbnRJZCIsImNoaWxkcmVuIiwicm9vdE9yZ1VuaXQiLCJvd25lclVzZXIiLCJvd25lclByaW5jaXBhbCIsInJvbGVzIiwiY3JlYXRlZFJvbGUiLCJvd25lclJvbGUiLCJvd25lclJvbGVLZXkiLCJyb290T3JnVW5pdElkIiwib3duZXJVc2VySWQiLCJTeXN0ZW1NYW5hZ2VtZW50U2VydmljZSIsIm9yZ01lbWJlcnNoaXBTZXJ2aWNlIiwib25ib2FyZFVzZXJUb1RlbmFudEFuZE9yZ1VuaXQiLCJyb2xlS2V5IiwiY2hhbmdlVXNlck9yZ1JvbGUiLCJjdXJyZW50QXNzaWdubWVudHMiLCJzdXNwZW5kVXNlckluVGVuYW50IiwidGVuYW50TWVtYmVyc2hpcElkIiwiU3VzcGVuZGVkIiwicmVhY3RpdmF0ZVVzZXJJblRlbmFudCIsIkF1dGh6U2VydmljZSIsImRhdGFTb3VyY2VzIiwiY2FuQWNjZXNzIiwibGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGUiLCJyZXNvdXJjZVByb3RlY3RlZElkIiwibG9hZFJlc291cmNlIiwiUHJpdmF0ZSIsIlJlc291cmNlQWNsIiwiT3JnU3VidHJlZSIsImVmZmVjdGl2ZVBlcm1pc3Npb25zIiwicmVxdWlyZUFjY2VzcyIsIkF1dGhvcml6YXRpb25FcnJvciIsImxpc3RFZmZlY3RpdmVQZXJtaXNzaW9ucyIsImFjY2VzcyIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiXSwibWFwcGluZ3MiOiI7Ozs7O0lBU09BLGVBQWVDLGdCQUNwQkMsU0FDQUMsU0FDQUMsS0FDQUMsUUFBa0JDLFFBQUFBLFNBQVNDO1FBRTNCSCxJQUFJSSxNQUFNLGNBQWNOO1FBRXhCLE9BQU8sSUFBSU8sUUFBUSxDQUFDQyxTQUFTQztZQUMzQixNQUFNQyxRQUFRQyxjQUFBQSxLQUFLWCxTQUFTQztZQUU1QixNQUFNVyxTQUFtQjtZQUN6QixNQUFNQyxTQUFtQjtZQUV6QkgsTUFBTUUsUUFBUUUsR0FBRyxRQUFTQztnQkFDeEJILE9BQU9JLEtBQUtEO2dCQUNaYixJQUFJQyxPQUFPWSxLQUFLRTs7WUFHbEJQLE1BQU1HLFFBQVFDLEdBQUcsUUFBU0M7Z0JBQ3hCRixPQUFPRyxLQUFLRDtnQkFDWmIsSUFBSUksTUFBTVMsS0FBS0U7O1lBR2pCUCxNQUFNSSxHQUFHLFNBQVVJO2dCQUNqQixJQUFJQSxTQUFTLEdBQUc7b0JBQ2RoQixJQUFJaUIsTUFBTTtvQkFDVlgsUUFBUTt3QkFBRUksUUFBUUEsT0FBT1EsS0FBSzt3QkFBT1AsUUFBUUEsT0FBT08sS0FBSzs7QUFDM0QsdUJBQU87b0JBQ0xsQixJQUFJbUIsU0FDRiw0QkFBNEJILFdBQVdMLE9BQU9PLEtBQUs7b0JBRXJEWCxPQUNFLElBQUlhLGFBQUFBLGNBQ0YsNEJBQTRCSixT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