@decaf-ts/integrations 0.3.8 → 0.3.10
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.
- package/dist/integrations.cjs +2 -1649
- package/dist/integrations.cjs.map +1 -0
- package/dist/integrations.js +2 -1885
- package/dist/integrations.js.map +1 -0
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/azure/index.cjs +2 -2
- package/lib/cjs/blob/azure/index.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobErrors.cjs +2 -2
- package/lib/cjs/blob/core/BlobErrors.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobKey.cjs +2 -2
- package/lib/cjs/blob/core/BlobKey.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobStoreFactory.cjs +2 -2
- package/lib/cjs/blob/core/BlobStoreFactory.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/core/BlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobTypes.cjs +2 -2
- package/lib/cjs/blob/core/BlobTypes.cjs.map +1 -0
- package/lib/cjs/blob/core/BlobValue.cjs +2 -2
- package/lib/cjs/blob/core/BlobValue.cjs.map +1 -0
- package/lib/cjs/blob/core/index.cjs +2 -2
- package/lib/cjs/blob/core/index.cjs.map +1 -0
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/gcp/index.cjs +2 -2
- package/lib/cjs/blob/gcp/index.cjs.map +1 -0
- package/lib/cjs/blob/index.cjs +2 -2
- package/lib/cjs/blob/index.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/ipfs/IpfsBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/IpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/LocalJsonIpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/MemoryIpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs +2 -2
- package/lib/cjs/blob/ipfs/PostgresIpfsKeyIndex.cjs.map +1 -0
- package/lib/cjs/blob/ipfs/index.cjs +2 -2
- package/lib/cjs/blob/ipfs/index.cjs.map +1 -0
- package/lib/cjs/blob/local/LocalBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/local/LocalBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/local/index.cjs +2 -2
- package/lib/cjs/blob/local/index.cjs.map +1 -0
- package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/memory/MemoryBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/memory/index.cjs +2 -2
- package/lib/cjs/blob/memory/index.cjs.map +1 -0
- package/lib/cjs/blob/s3/MinioBlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/MinioBlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/s3/R2BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/R2BlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs +2 -2
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +1 -0
- package/lib/cjs/blob/s3/index.cjs +2 -2
- package/lib/cjs/blob/s3/index.cjs.map +1 -0
- package/lib/cjs/docker/DockerComposeService.cjs +2 -2
- package/lib/cjs/docker/DockerComposeService.cjs.map +1 -0
- package/lib/cjs/docker/index.cjs +2 -2
- package/lib/cjs/docker/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/constants.cjs +58 -0
- package/lib/cjs/graph/engine/constants.cjs.map +1 -0
- package/lib/cjs/graph/engine/decorators.cjs +4 -0
- package/lib/cjs/graph/engine/decorators.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphCycleError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphCycleError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs +27 -0
- package/lib/cjs/graph/engine/errors/GraphExecutionError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphInputError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphInputError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphLoopLimitError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphPinningError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphPinningError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphPortError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphPortError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphStoreError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphStoreError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs +20 -0
- package/lib/cjs/graph/engine/errors/GraphTopologyError.cjs.map +1 -0
- package/lib/cjs/graph/engine/errors/index.cjs +31 -0
- package/lib/cjs/graph/engine/errors/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs +4 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEvent.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs +40 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventEmitter.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs +37 -0
- package/lib/cjs/graph/engine/events/GraphExecutionEventFactory.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs +4 -0
- package/lib/cjs/graph/engine/events/GraphExecutionObserver.cjs.map +1 -0
- package/lib/cjs/graph/engine/events/index.cjs +27 -0
- package/lib/cjs/graph/engine/events/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs +4 -0
- package/lib/cjs/graph/engine/execution/CodeSandboxEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs +79 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionContext.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs +413 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionEngine.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs +32 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionFrame.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs +30 -0
- package/lib/cjs/graph/engine/execution/GraphExecutionResult.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs +4 -0
- package/lib/cjs/graph/engine/execution/GraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +103 -0
- package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/execution/index.cjs +30 -0
- package/lib/cjs/graph/engine/execution/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/index.cjs +84 -0
- package/lib/cjs/graph/engine/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs +87 -0
- package/lib/cjs/graph/engine/loops/ConditionExpressionEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs +85 -0
- package/lib/cjs/graph/engine/loops/ForeachGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs +85 -0
- package/lib/cjs/graph/engine/loops/GraphConditionEvaluator.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs +16 -0
- package/lib/cjs/graph/engine/loops/GraphLoopExecutionContext.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs +77 -0
- package/lib/cjs/graph/engine/loops/UntilGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs +78 -0
- package/lib/cjs/graph/engine/loops/WhileGraphNodeExecutor.cjs.map +1 -0
- package/lib/cjs/graph/engine/loops/index.cjs +29 -0
- package/lib/cjs/graph/engine/loops/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs +28 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningDependencyResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs +20 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningMetadata.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs +34 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningPolicy.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs +191 -0
- package/lib/cjs/graph/engine/pinning/GraphPinningService.cjs.map +1 -0
- package/lib/cjs/graph/engine/pinning/index.cjs +27 -0
- package/lib/cjs/graph/engine/pinning/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlan.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanEdge.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanLayer.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs +4 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanNode.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs +197 -0
- package/lib/cjs/graph/engine/planning/GraphExecutionPlanner.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs +172 -0
- package/lib/cjs/graph/engine/planning/GraphRelationResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/GraphTopology.cjs +57 -0
- package/lib/cjs/graph/engine/planning/GraphTopology.cjs.map +1 -0
- package/lib/cjs/graph/engine/planning/index.cjs +30 -0
- package/lib/cjs/graph/engine/planning/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs +44 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorRegistry.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs +27 -0
- package/lib/cjs/graph/engine/registry/GraphNodeExecutorResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/registry/index.cjs +25 -0
- package/lib/cjs/graph/engine/registry/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs +53 -0
- package/lib/cjs/graph/engine/snapshots/GraphExecutionSnapshotMapper.cjs.map +1 -0
- package/lib/cjs/graph/engine/snapshots/index.cjs +24 -0
- package/lib/cjs/graph/engine/snapshots/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphCachedValue.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphCachedValue.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueKey.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphValueKey.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueStore.cjs +76 -0
- package/lib/cjs/graph/engine/store/GraphValueStore.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs +4 -0
- package/lib/cjs/graph/engine/store/GraphValueStoreAdapter.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs +69 -0
- package/lib/cjs/graph/engine/store/InMemoryGraphValueStoreAdapter.cjs.map +1 -0
- package/lib/cjs/graph/engine/store/index.cjs +28 -0
- package/lib/cjs/graph/engine/store/index.cjs.map +1 -0
- package/lib/cjs/graph/engine/types.cjs +4 -0
- package/lib/cjs/graph/engine/types.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs +33 -0
- package/lib/cjs/graph/engine/validation/GraphDefinitionValidator.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs +58 -0
- package/lib/cjs/graph/engine/validation/GraphPortSchemaResolver.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs +52 -0
- package/lib/cjs/graph/engine/validation/GraphValueValidator.cjs.map +1 -0
- package/lib/cjs/graph/engine/validation/index.cjs +26 -0
- package/lib/cjs/graph/engine/validation/index.cjs.map +1 -0
- package/lib/cjs/graph/index.cjs +10 -60
- package/lib/cjs/graph/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/constants.cjs +44 -0
- package/lib/cjs/graph/shared/constants.cjs.map +1 -0
- package/lib/cjs/graph/shared/index.cjs +38 -0
- package/lib/cjs/graph/shared/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/agent.cjs +110 -0
- package/lib/cjs/graph/shared/nodes/agent.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/base.cjs +36 -0
- package/lib/cjs/graph/shared/nodes/base.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/category-styles.cjs +38 -0
- package/lib/cjs/graph/shared/nodes/category-styles.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/flow-control.cjs +464 -0
- package/lib/cjs/graph/shared/nodes/flow-control.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/index.cjs +35 -0
- package/lib/cjs/graph/shared/nodes/index.cjs.map +1 -0
- package/lib/cjs/graph/shared/nodes/triggers.cjs +250 -0
- package/lib/cjs/graph/shared/nodes/triggers.cjs.map +1 -0
- package/lib/cjs/graph/shared/types.cjs +4 -0
- package/lib/cjs/graph/shared/types.cjs.map +1 -0
- package/lib/cjs/index.cjs +5 -5
- package/lib/cjs/index.cjs.map +1 -0
- package/lib/cjs/keycloak/index.cjs +2 -2
- package/lib/cjs/keycloak/index.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakAuthService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakAuthService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakClientService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakClientService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakIdentityProviderService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakRealmService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakRealmService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakRoleService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakRoleService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/KeycloakUserService.cjs +2 -2
- package/lib/cjs/keycloak/services/KeycloakUserService.cjs.map +1 -0
- package/lib/cjs/keycloak/services/index.cjs +2 -2
- package/lib/cjs/keycloak/services/index.cjs.map +1 -0
- package/lib/cjs/keycloak/services/runtime.cjs +2 -2
- package/lib/cjs/keycloak/services/runtime.cjs.map +1 -0
- package/lib/cjs/keycloak/types.cjs +2 -2
- package/lib/cjs/keycloak/types.cjs.map +1 -0
- package/lib/cjs/kibana/helpers.cjs +2 -2
- package/lib/cjs/kibana/helpers.cjs.map +1 -0
- package/lib/cjs/kibana/index.cjs +2 -2
- package/lib/cjs/kibana/index.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaAuthService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaAuthService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaDashboardService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaDashboardService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaDataViewService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaDataViewService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaRoleService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaRoleService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaSpaceService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaSpaceService.cjs.map +1 -0
- package/lib/cjs/kibana/services/KibanaUserService.cjs +2 -2
- package/lib/cjs/kibana/services/KibanaUserService.cjs.map +1 -0
- package/lib/cjs/kibana/services/index.cjs +2 -2
- package/lib/cjs/kibana/services/index.cjs.map +1 -0
- package/lib/cjs/kibana/services/runtime.cjs +2 -2
- package/lib/cjs/kibana/services/runtime.cjs.map +1 -0
- package/lib/cjs/kibana/types.cjs +2 -2
- package/lib/cjs/kibana/types.cjs.map +1 -0
- package/lib/cjs/namespaces/index.cjs +2 -2
- package/lib/cjs/namespaces/index.cjs.map +1 -0
- package/lib/cjs/namespaces/models/authorization-model.cjs +2 -2
- package/lib/cjs/namespaces/models/authorization-model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/effective-permission.model.cjs +2 -2
- package/lib/cjs/namespaces/models/effective-permission.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/group-membership.model.cjs +2 -2
- package/lib/cjs/namespaces/models/group-membership.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/group.model.cjs +2 -2
- package/lib/cjs/namespaces/models/group.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/index.cjs +2 -2
- package/lib/cjs/namespaces/models/index.cjs.map +1 -0
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs +2 -2
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/org-unit.model.cjs +2 -2
- package/lib/cjs/namespaces/models/org-unit.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/permission.model.cjs +2 -2
- package/lib/cjs/namespaces/models/permission.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/principal.model.cjs +2 -2
- package/lib/cjs/namespaces/models/principal.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/protected-resource.model.cjs +2 -2
- package/lib/cjs/namespaces/models/protected-resource.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/resource-grant.model.cjs +2 -2
- package/lib/cjs/namespaces/models/resource-grant.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/role-assignment.model.cjs +2 -2
- package/lib/cjs/namespaces/models/role-assignment.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/role-permission.model.cjs +2 -2
- package/lib/cjs/namespaces/models/role-permission.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/role.model.cjs +2 -2
- package/lib/cjs/namespaces/models/role.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/storage-binding.model.cjs +2 -2
- package/lib/cjs/namespaces/models/storage-binding.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs +2 -2
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs +2 -2
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/tenant.model.cjs +2 -2
- package/lib/cjs/namespaces/models/tenant.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/user.model.cjs +2 -2
- package/lib/cjs/namespaces/models/user.model.cjs.map +1 -0
- package/lib/cjs/namespaces/org-based-authorization-system.cjs +10 -4
- package/lib/cjs/namespaces/org-based-authorization-system.cjs.map +1 -0
- package/lib/cjs/namespaces/org-based-authorization-system.models.cjs +2 -2
- package/lib/cjs/namespaces/org-based-authorization-system.models.cjs.map +1 -0
- package/lib/cjs/namespaces/org-based-authorization-system.services.cjs +19 -10
- package/lib/cjs/namespaces/org-based-authorization-system.services.cjs.map +1 -0
- package/lib/cjs/namespaces/services/authz.service.cjs +39 -13
- package/lib/cjs/namespaces/services/authz.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/bootstrap.service.cjs +2 -2
- package/lib/cjs/namespaces/services/bootstrap.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/effective-permission.service.cjs +2 -2
- package/lib/cjs/namespaces/services/effective-permission.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/group-membership.service.cjs +2 -2
- package/lib/cjs/namespaces/services/group-membership.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/group.service.cjs +2 -2
- package/lib/cjs/namespaces/services/group.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/index.cjs +2 -2
- package/lib/cjs/namespaces/services/index.cjs.map +1 -0
- package/lib/cjs/namespaces/services/inheritance-block.service.cjs +6 -4
- package/lib/cjs/namespaces/services/inheritance-block.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit-closure.service.cjs +16 -7
- package/lib/cjs/namespaces/services/org-unit-closure.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit-membership.service.cjs +2 -2
- package/lib/cjs/namespaces/services/org-unit-membership.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit-profile.service.cjs +2 -2
- package/lib/cjs/namespaces/services/org-unit-profile.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/org-unit.service.cjs +2 -2
- package/lib/cjs/namespaces/services/org-unit.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/permission.service.cjs +2 -2
- package/lib/cjs/namespaces/services/permission.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/principal.service.cjs +2 -2
- package/lib/cjs/namespaces/services/principal.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/protected-resource.service.cjs +2 -2
- package/lib/cjs/namespaces/services/protected-resource.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/resource-grant.service.cjs +2 -2
- package/lib/cjs/namespaces/services/resource-grant.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs +2 -2
- package/lib/cjs/namespaces/services/resource-lifecycle.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/role-assignment.service.cjs +4 -3
- package/lib/cjs/namespaces/services/role-assignment.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/role-permission.service.cjs +2 -2
- package/lib/cjs/namespaces/services/role-permission.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/role.service.cjs +2 -2
- package/lib/cjs/namespaces/services/role.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/storage-binding.service.cjs +2 -2
- package/lib/cjs/namespaces/services/storage-binding.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/system-management.service.cjs +2 -2
- package/lib/cjs/namespaces/services/system-management.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/tenant-membership.service.cjs +2 -2
- package/lib/cjs/namespaces/services/tenant-membership.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/tenant-profile.service.cjs +2 -2
- package/lib/cjs/namespaces/services/tenant-profile.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/tenant.service.cjs +2 -2
- package/lib/cjs/namespaces/services/tenant.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/user.service.cjs +2 -2
- package/lib/cjs/namespaces/services/user.service.cjs.map +1 -0
- package/lib/cjs/namespaces/types.cjs +2 -2
- package/lib/cjs/namespaces/types.cjs.map +1 -0
- package/lib/cjs/namespaces/utils.cjs +13 -5
- package/lib/cjs/namespaces/utils.cjs.map +1 -0
- package/lib/cjs/nest/authService.cjs +2 -2
- package/lib/cjs/nest/authService.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionController.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionController.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionModule.cjs +6 -4
- package/lib/cjs/nest/graph/GraphExecutionModule.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionResultModel.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutionResultRepository.cjs +2 -2
- package/lib/cjs/nest/graph/GraphExecutionResultRepository.cjs.map +1 -0
- package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs +97 -11
- package/lib/cjs/nest/graph/GraphExecutorRegistryFactory.cjs.map +1 -0
- package/lib/cjs/nest/graph/index.cjs +2 -2
- package/lib/cjs/nest/graph/index.cjs.map +1 -0
- package/lib/cjs/nest/graph/main.cjs +30 -0
- package/lib/cjs/nest/graph/main.cjs.map +1 -0
- package/lib/cjs/nest/index.cjs +2 -2
- package/lib/cjs/nest/index.cjs.map +1 -0
- package/lib/cjs/nest/keycloakAuthHandler.cjs +2 -2
- package/lib/cjs/nest/keycloakAuthHandler.cjs.map +1 -0
- package/lib/cjs/nest/keycloakModule.cjs +2 -2
- package/lib/cjs/nest/keycloakModule.cjs.map +1 -0
- package/lib/cjs/nest/logging.cjs +2 -2
- package/lib/cjs/nest/logging.cjs.map +1 -0
- package/lib/cjs/nest/types.cjs +2 -2
- package/lib/cjs/nest/types.cjs.map +1 -0
- package/lib/cjs/nest/utils.cjs +2 -2
- package/lib/cjs/nest/utils.cjs.map +1 -0
- package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -2
- package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/aws/AwsSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/aws/index.cjs +2 -2
- package/lib/cjs/secrets/aws/index.cjs.map +1 -0
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -2
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/azure/index.cjs +2 -2
- package/lib/cjs/secrets/azure/index.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretErrors.cjs +2 -2
- package/lib/cjs/secrets/core/SecretErrors.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretName.cjs +2 -2
- package/lib/cjs/secrets/core/SecretName.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretReference.cjs +2 -2
- package/lib/cjs/secrets/core/SecretReference.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretSerialization.cjs +2 -2
- package/lib/cjs/secrets/core/SecretSerialization.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretService.cjs +2 -2
- package/lib/cjs/secrets/core/SecretService.cjs.map +1 -0
- package/lib/cjs/secrets/core/SecretTypes.cjs +2 -2
- package/lib/cjs/secrets/core/SecretTypes.cjs.map +1 -0
- package/lib/cjs/secrets/core/index.cjs +2 -2
- package/lib/cjs/secrets/core/index.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -2
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/gcp/GcpSecretManagerServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/index.cjs +2 -2
- package/lib/cjs/secrets/gcp/index.cjs.map +1 -0
- package/lib/cjs/secrets/index.cjs +2 -2
- package/lib/cjs/secrets/index.cjs.map +1 -0
- package/lib/cjs/secrets/model/ModelSecretCrypto.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretCrypto.cjs.map +1 -0
- package/lib/cjs/secrets/model/ModelSecretService.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/model/ModelSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/model/Secret.cjs +2 -2
- package/lib/cjs/secrets/model/Secret.cjs.map +1 -0
- package/lib/cjs/secrets/model/index.cjs +2 -2
- package/lib/cjs/secrets/model/index.cjs.map +1 -0
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -2
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/onepassword/OnePasswordSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/onepassword/index.cjs +2 -2
- package/lib/cjs/secrets/onepassword/index.cjs.map +1 -0
- package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -2
- package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs +2 -2
- package/lib/cjs/secrets/vault/VaultSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/vault/index.cjs +2 -2
- package/lib/cjs/secrets/vault/index.cjs.map +1 -0
- package/lib/cjs/shared/runtime.cjs +2 -2
- package/lib/cjs/shared/runtime.cjs.map +1 -0
- package/lib/cjs/utils.cjs +2 -2
- package/lib/cjs/utils.cjs.map +1 -0
- package/lib/esm/blob/azure/AzureBlobStoreService.js +1 -1
- package/lib/esm/blob/azure/AzureBlobStoreService.js.map +1 -0
- package/lib/esm/blob/azure/index.js +1 -1
- package/lib/esm/blob/azure/index.js.map +1 -0
- package/lib/esm/blob/core/BlobErrors.js +1 -1
- package/lib/esm/blob/core/BlobErrors.js.map +1 -0
- package/lib/esm/blob/core/BlobKey.js +1 -1
- package/lib/esm/blob/core/BlobKey.js.map +1 -0
- package/lib/esm/blob/core/BlobStoreFactory.js +1 -1
- package/lib/esm/blob/core/BlobStoreFactory.js.map +1 -0
- package/lib/esm/blob/core/BlobStoreService.js +1 -1
- package/lib/esm/blob/core/BlobStoreService.js.map +1 -0
- package/lib/esm/blob/core/BlobTypes.js +1 -1
- package/lib/esm/blob/core/BlobTypes.js.map +1 -0
- package/lib/esm/blob/core/BlobValue.js +1 -1
- package/lib/esm/blob/core/BlobValue.js.map +1 -0
- package/lib/esm/blob/core/index.js +1 -1
- package/lib/esm/blob/core/index.js.map +1 -0
- package/lib/esm/blob/gcp/GcsBlobStoreService.js +1 -1
- package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +1 -0
- package/lib/esm/blob/gcp/index.js +1 -1
- package/lib/esm/blob/gcp/index.js.map +1 -0
- package/lib/esm/blob/index.js +1 -1
- package/lib/esm/blob/index.js.map +1 -0
- package/lib/esm/blob/ipfs/IpfsBlobStoreService.js +1 -1
- package/lib/esm/blob/ipfs/IpfsBlobStoreService.js.map +1 -0
- package/lib/esm/blob/ipfs/IpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/IpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/LocalJsonIpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/MemoryIpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js +1 -1
- package/lib/esm/blob/ipfs/PostgresIpfsKeyIndex.js.map +1 -0
- package/lib/esm/blob/ipfs/index.js +1 -1
- package/lib/esm/blob/ipfs/index.js.map +1 -0
- package/lib/esm/blob/local/LocalBlobStoreService.js +1 -1
- package/lib/esm/blob/local/LocalBlobStoreService.js.map +1 -0
- package/lib/esm/blob/local/index.js +1 -1
- package/lib/esm/blob/local/index.js.map +1 -0
- package/lib/esm/blob/memory/MemoryBlobStoreService.js +1 -1
- package/lib/esm/blob/memory/MemoryBlobStoreService.js.map +1 -0
- package/lib/esm/blob/memory/index.js +1 -1
- package/lib/esm/blob/memory/index.js.map +1 -0
- package/lib/esm/blob/s3/MinioBlobStoreService.js +1 -1
- package/lib/esm/blob/s3/MinioBlobStoreService.js.map +1 -0
- package/lib/esm/blob/s3/R2BlobStoreService.js +1 -1
- package/lib/esm/blob/s3/R2BlobStoreService.js.map +1 -0
- package/lib/esm/blob/s3/S3BlobStoreService.js +1 -1
- package/lib/esm/blob/s3/S3BlobStoreService.js.map +1 -0
- package/lib/esm/blob/s3/index.js +1 -1
- package/lib/esm/blob/s3/index.js.map +1 -0
- package/lib/esm/docker/DockerComposeService.js +1 -1
- package/lib/esm/docker/DockerComposeService.js.map +1 -0
- package/lib/esm/docker/index.js +1 -1
- package/lib/esm/docker/index.js.map +1 -0
- package/lib/esm/graph/engine/constants.js +62 -0
- package/lib/esm/graph/engine/constants.js.map +1 -0
- package/lib/esm/graph/engine/decorators.js +2 -0
- package/lib/esm/graph/engine/decorators.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphCycleError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphCycleError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphExecutionError.js +22 -0
- package/lib/esm/graph/engine/errors/GraphExecutionError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphInputError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphInputError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphLoopLimitError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphLoopLimitError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphPinningError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphPinningError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphPortError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphPortError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphStoreError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphStoreError.js.map +1 -0
- package/lib/esm/graph/engine/errors/GraphTopologyError.js +15 -0
- package/lib/esm/graph/engine/errors/GraphTopologyError.js.map +1 -0
- package/lib/esm/graph/engine/errors/index.js +14 -0
- package/lib/esm/graph/engine/errors/index.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEvent.js +2 -0
- package/lib/esm/graph/engine/events/GraphExecutionEvent.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js +35 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventEmitter.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js +32 -0
- package/lib/esm/graph/engine/events/GraphExecutionEventFactory.js.map +1 -0
- package/lib/esm/graph/engine/events/GraphExecutionObserver.js +2 -0
- package/lib/esm/graph/engine/events/GraphExecutionObserver.js.map +1 -0
- package/lib/esm/graph/engine/events/index.js +10 -0
- package/lib/esm/graph/engine/events/index.js.map +1 -0
- package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js +18 -0
- package/lib/esm/graph/engine/execution/CodeSandboxEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionContext.js +74 -0
- package/lib/esm/graph/engine/execution/GraphExecutionContext.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionEngine.js +408 -0
- package/lib/esm/graph/engine/execution/GraphExecutionEngine.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionFrame.js +27 -0
- package/lib/esm/graph/engine/execution/GraphExecutionFrame.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphExecutionResult.js +26 -0
- package/lib/esm/graph/engine/execution/GraphExecutionResult.js.map +1 -0
- package/lib/esm/graph/engine/execution/GraphNodeExecutor.js +2 -0
- package/lib/esm/graph/engine/execution/GraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +98 -0
- package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/execution/index.js +13 -0
- package/lib/esm/graph/engine/execution/index.js.map +1 -0
- package/lib/esm/graph/engine/index.js +67 -0
- package/lib/esm/graph/engine/index.js.map +1 -0
- package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js +82 -0
- package/lib/esm/graph/engine/loops/ConditionExpressionEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js +80 -0
- package/lib/esm/graph/engine/loops/ForeachGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js +80 -0
- package/lib/esm/graph/engine/loops/GraphConditionEvaluator.js.map +1 -0
- package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js +11 -0
- package/lib/esm/graph/engine/loops/GraphLoopExecutionContext.js.map +1 -0
- package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js +72 -0
- package/lib/esm/graph/engine/loops/UntilGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js +73 -0
- package/lib/esm/graph/engine/loops/WhileGraphNodeExecutor.js.map +1 -0
- package/lib/esm/graph/engine/loops/index.js +12 -0
- package/lib/esm/graph/engine/loops/index.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js +23 -0
- package/lib/esm/graph/engine/pinning/GraphPinningDependencyResolver.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js +15 -0
- package/lib/esm/graph/engine/pinning/GraphPinningMetadata.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js +29 -0
- package/lib/esm/graph/engine/pinning/GraphPinningPolicy.js.map +1 -0
- package/lib/esm/graph/engine/pinning/GraphPinningService.js +186 -0
- package/lib/esm/graph/engine/pinning/GraphPinningService.js.map +1 -0
- package/lib/esm/graph/engine/pinning/index.js +10 -0
- package/lib/esm/graph/engine/pinning/index.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlan.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlan.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js +7 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanEdge.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanLayer.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js +2 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanNode.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js +192 -0
- package/lib/esm/graph/engine/planning/GraphExecutionPlanner.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphRelationResolver.js +167 -0
- package/lib/esm/graph/engine/planning/GraphRelationResolver.js.map +1 -0
- package/lib/esm/graph/engine/planning/GraphTopology.js +52 -0
- package/lib/esm/graph/engine/planning/GraphTopology.js.map +1 -0
- package/lib/esm/graph/engine/planning/index.js +13 -0
- package/lib/esm/graph/engine/planning/index.js.map +1 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js +39 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorRegistry.js.map +1 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js +22 -0
- package/lib/esm/graph/engine/registry/GraphNodeExecutorResolver.js.map +1 -0
- package/lib/esm/graph/engine/registry/index.js +8 -0
- package/lib/esm/graph/engine/registry/index.js.map +1 -0
- package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js +48 -0
- package/lib/esm/graph/engine/snapshots/GraphExecutionSnapshotMapper.js.map +1 -0
- package/lib/esm/graph/engine/snapshots/index.js +7 -0
- package/lib/esm/graph/engine/snapshots/index.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphCachedValue.js +2 -0
- package/lib/esm/graph/engine/store/GraphCachedValue.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueKey.js +7 -0
- package/lib/esm/graph/engine/store/GraphValueKey.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueStore.js +71 -0
- package/lib/esm/graph/engine/store/GraphValueStore.js.map +1 -0
- package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js +2 -0
- package/lib/esm/graph/engine/store/GraphValueStoreAdapter.js.map +1 -0
- package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js +64 -0
- package/lib/esm/graph/engine/store/InMemoryGraphValueStoreAdapter.js.map +1 -0
- package/lib/esm/graph/engine/store/index.js +11 -0
- package/lib/esm/graph/engine/store/index.js.map +1 -0
- package/lib/esm/graph/engine/types.js +2 -0
- package/lib/esm/graph/engine/types.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js +28 -0
- package/lib/esm/graph/engine/validation/GraphDefinitionValidator.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js +53 -0
- package/lib/esm/graph/engine/validation/GraphPortSchemaResolver.js.map +1 -0
- package/lib/esm/graph/engine/validation/GraphValueValidator.js +47 -0
- package/lib/esm/graph/engine/validation/GraphValueValidator.js.map +1 -0
- package/lib/esm/graph/engine/validation/index.js +9 -0
- package/lib/esm/graph/engine/validation/index.js.map +1 -0
- package/lib/esm/graph/index.js +9 -59
- package/lib/esm/graph/index.js.map +1 -0
- package/lib/esm/graph/shared/constants.js +56 -0
- package/lib/esm/graph/shared/constants.js.map +1 -0
- package/lib/esm/graph/shared/index.js +19 -0
- package/lib/esm/graph/shared/index.js.map +1 -0
- package/lib/esm/graph/shared/nodes/agent.js +101 -0
- package/lib/esm/graph/shared/nodes/agent.js.map +1 -0
- package/lib/esm/graph/shared/nodes/base.js +31 -0
- package/lib/esm/graph/shared/nodes/base.js.map +1 -0
- package/lib/esm/graph/shared/nodes/category-styles.js +34 -0
- package/lib/esm/graph/shared/nodes/category-styles.js.map +1 -0
- package/lib/esm/graph/shared/nodes/flow-control.js +455 -0
- package/lib/esm/graph/shared/nodes/flow-control.js.map +1 -0
- package/lib/esm/graph/shared/nodes/index.js +18 -0
- package/lib/esm/graph/shared/nodes/index.js.map +1 -0
- package/lib/esm/graph/shared/nodes/triggers.js +241 -0
- package/lib/esm/graph/shared/nodes/triggers.js.map +1 -0
- package/lib/esm/graph/shared/types.js +2 -0
- package/lib/esm/graph/shared/types.js.map +1 -0
- package/lib/esm/index.js +4 -4
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/keycloak/index.js +1 -1
- package/lib/esm/keycloak/index.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakAuthService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakAuthService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakClientService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakClientService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakIdentityProviderService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakRealmService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakRealmService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakRoleService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakRoleService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakService.js.map +1 -0
- package/lib/esm/keycloak/services/KeycloakUserService.js +1 -1
- package/lib/esm/keycloak/services/KeycloakUserService.js.map +1 -0
- package/lib/esm/keycloak/services/index.js +1 -1
- package/lib/esm/keycloak/services/index.js.map +1 -0
- package/lib/esm/keycloak/services/runtime.js +1 -1
- package/lib/esm/keycloak/services/runtime.js.map +1 -0
- package/lib/esm/keycloak/types.js +1 -1
- package/lib/esm/keycloak/types.js.map +1 -0
- package/lib/esm/kibana/helpers.js +1 -1
- package/lib/esm/kibana/helpers.js.map +1 -0
- package/lib/esm/kibana/index.js +1 -1
- package/lib/esm/kibana/index.js.map +1 -0
- package/lib/esm/kibana/services/KibanaAuthService.js +1 -1
- package/lib/esm/kibana/services/KibanaAuthService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaDashboardService.js +1 -1
- package/lib/esm/kibana/services/KibanaDashboardService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaDataViewService.js +1 -1
- package/lib/esm/kibana/services/KibanaDataViewService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaRoleService.js +1 -1
- package/lib/esm/kibana/services/KibanaRoleService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaService.js +1 -1
- package/lib/esm/kibana/services/KibanaService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaSpaceService.js +1 -1
- package/lib/esm/kibana/services/KibanaSpaceService.js.map +1 -0
- package/lib/esm/kibana/services/KibanaUserService.js +1 -1
- package/lib/esm/kibana/services/KibanaUserService.js.map +1 -0
- package/lib/esm/kibana/services/index.js +1 -1
- package/lib/esm/kibana/services/index.js.map +1 -0
- package/lib/esm/kibana/services/runtime.js +1 -1
- package/lib/esm/kibana/services/runtime.js.map +1 -0
- package/lib/esm/kibana/types.js +1 -1
- package/lib/esm/kibana/types.js.map +1 -0
- package/lib/esm/namespaces/index.js +1 -1
- package/lib/esm/namespaces/index.js.map +1 -0
- package/lib/esm/namespaces/models/authorization-model.js +1 -1
- package/lib/esm/namespaces/models/authorization-model.js.map +1 -0
- package/lib/esm/namespaces/models/effective-permission.model.js +1 -1
- package/lib/esm/namespaces/models/effective-permission.model.js.map +1 -0
- package/lib/esm/namespaces/models/group-membership.model.js +1 -1
- package/lib/esm/namespaces/models/group-membership.model.js.map +1 -0
- package/lib/esm/namespaces/models/group.model.js +1 -1
- package/lib/esm/namespaces/models/group.model.js.map +1 -0
- package/lib/esm/namespaces/models/index.js +1 -1
- package/lib/esm/namespaces/models/index.js.map +1 -0
- package/lib/esm/namespaces/models/inheritance-block.model.js +1 -1
- package/lib/esm/namespaces/models/inheritance-block.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit-closure.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit-closure.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit-membership.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit-membership.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit-profile.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit-profile.model.js.map +1 -0
- package/lib/esm/namespaces/models/org-unit.model.js +1 -1
- package/lib/esm/namespaces/models/org-unit.model.js.map +1 -0
- package/lib/esm/namespaces/models/permission.model.js +1 -1
- package/lib/esm/namespaces/models/permission.model.js.map +1 -0
- package/lib/esm/namespaces/models/principal.model.js +1 -1
- package/lib/esm/namespaces/models/principal.model.js.map +1 -0
- package/lib/esm/namespaces/models/protected-resource.model.js +1 -1
- package/lib/esm/namespaces/models/protected-resource.model.js.map +1 -0
- package/lib/esm/namespaces/models/resource-grant.model.js +1 -1
- package/lib/esm/namespaces/models/resource-grant.model.js.map +1 -0
- package/lib/esm/namespaces/models/role-assignment.model.js +1 -1
- package/lib/esm/namespaces/models/role-assignment.model.js.map +1 -0
- package/lib/esm/namespaces/models/role-permission.model.js +1 -1
- package/lib/esm/namespaces/models/role-permission.model.js.map +1 -0
- package/lib/esm/namespaces/models/role.model.js +1 -1
- package/lib/esm/namespaces/models/role.model.js.map +1 -0
- package/lib/esm/namespaces/models/storage-binding.model.js +1 -1
- package/lib/esm/namespaces/models/storage-binding.model.js.map +1 -0
- package/lib/esm/namespaces/models/tenant-membership.model.js +1 -1
- package/lib/esm/namespaces/models/tenant-membership.model.js.map +1 -0
- package/lib/esm/namespaces/models/tenant-profile.model.js +1 -1
- package/lib/esm/namespaces/models/tenant-profile.model.js.map +1 -0
- package/lib/esm/namespaces/models/tenant.model.js +3 -3
- package/lib/esm/namespaces/models/tenant.model.js.map +1 -0
- package/lib/esm/namespaces/models/user.model.js +1 -1
- package/lib/esm/namespaces/models/user.model.js.map +1 -0
- package/lib/esm/namespaces/org-based-authorization-system.js +10 -4
- package/lib/esm/namespaces/org-based-authorization-system.js.map +1 -0
- package/lib/esm/namespaces/org-based-authorization-system.models.js +1 -1
- package/lib/esm/namespaces/org-based-authorization-system.models.js.map +1 -0
- package/lib/esm/namespaces/org-based-authorization-system.services.js +18 -9
- package/lib/esm/namespaces/org-based-authorization-system.services.js.map +1 -0
- package/lib/esm/namespaces/services/authz.service.js +40 -14
- package/lib/esm/namespaces/services/authz.service.js.map +1 -0
- package/lib/esm/namespaces/services/bootstrap.service.js +1 -1
- package/lib/esm/namespaces/services/bootstrap.service.js.map +1 -0
- package/lib/esm/namespaces/services/effective-permission.service.js +1 -1
- package/lib/esm/namespaces/services/effective-permission.service.js.map +1 -0
- package/lib/esm/namespaces/services/group-membership.service.js +1 -1
- package/lib/esm/namespaces/services/group-membership.service.js.map +1 -0
- package/lib/esm/namespaces/services/group.service.js +1 -1
- package/lib/esm/namespaces/services/group.service.js.map +1 -0
- package/lib/esm/namespaces/services/index.js +1 -1
- package/lib/esm/namespaces/services/index.js.map +1 -0
- package/lib/esm/namespaces/services/inheritance-block.service.js +5 -3
- package/lib/esm/namespaces/services/inheritance-block.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit-closure.service.js +16 -7
- package/lib/esm/namespaces/services/org-unit-closure.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit-membership.service.js +1 -1
- package/lib/esm/namespaces/services/org-unit-membership.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit-profile.service.js +1 -1
- package/lib/esm/namespaces/services/org-unit-profile.service.js.map +1 -0
- package/lib/esm/namespaces/services/org-unit.service.js +1 -1
- package/lib/esm/namespaces/services/org-unit.service.js.map +1 -0
- package/lib/esm/namespaces/services/permission.service.js +1 -1
- package/lib/esm/namespaces/services/permission.service.js.map +1 -0
- package/lib/esm/namespaces/services/principal.service.js +1 -1
- package/lib/esm/namespaces/services/principal.service.js.map +1 -0
- package/lib/esm/namespaces/services/protected-resource.service.js +1 -1
- package/lib/esm/namespaces/services/protected-resource.service.js.map +1 -0
- package/lib/esm/namespaces/services/resource-grant.service.js +1 -1
- package/lib/esm/namespaces/services/resource-grant.service.js.map +1 -0
- package/lib/esm/namespaces/services/resource-lifecycle.service.js +1 -1
- package/lib/esm/namespaces/services/resource-lifecycle.service.js.map +1 -0
- package/lib/esm/namespaces/services/role-assignment.service.js +3 -2
- package/lib/esm/namespaces/services/role-assignment.service.js.map +1 -0
- package/lib/esm/namespaces/services/role-permission.service.js +1 -1
- package/lib/esm/namespaces/services/role-permission.service.js.map +1 -0
- package/lib/esm/namespaces/services/role.service.js +1 -1
- package/lib/esm/namespaces/services/role.service.js.map +1 -0
- package/lib/esm/namespaces/services/storage-binding.service.js +1 -1
- package/lib/esm/namespaces/services/storage-binding.service.js.map +1 -0
- package/lib/esm/namespaces/services/system-management.service.js +1 -1
- package/lib/esm/namespaces/services/system-management.service.js.map +1 -0
- package/lib/esm/namespaces/services/tenant-membership.service.js +1 -1
- package/lib/esm/namespaces/services/tenant-membership.service.js.map +1 -0
- package/lib/esm/namespaces/services/tenant-profile.service.js +1 -1
- package/lib/esm/namespaces/services/tenant-profile.service.js.map +1 -0
- package/lib/esm/namespaces/services/tenant.service.js +1 -1
- package/lib/esm/namespaces/services/tenant.service.js.map +1 -0
- package/lib/esm/namespaces/services/user.service.js +1 -1
- package/lib/esm/namespaces/services/user.service.js.map +1 -0
- package/lib/esm/namespaces/types.js +1 -1
- package/lib/esm/namespaces/types.js.map +1 -0
- package/lib/esm/namespaces/utils.js +12 -4
- package/lib/esm/namespaces/utils.js.map +1 -0
- package/lib/esm/nest/authService.js +1 -1
- package/lib/esm/nest/authService.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionController.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionController.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionModule.js +6 -4
- package/lib/esm/nest/graph/GraphExecutionModule.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionResultModel.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionResultModel.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutionResultRepository.js +1 -1
- package/lib/esm/nest/graph/GraphExecutionResultRepository.js.map +1 -0
- package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js +96 -11
- package/lib/esm/nest/graph/GraphExecutorRegistryFactory.js.map +1 -0
- package/lib/esm/nest/graph/index.js +1 -1
- package/lib/esm/nest/graph/index.js.map +1 -0
- package/lib/esm/nest/graph/main.js +27 -0
- package/lib/esm/nest/graph/main.js.map +1 -0
- package/lib/esm/nest/index.js +1 -1
- package/lib/esm/nest/index.js.map +1 -0
- package/lib/esm/nest/keycloakAuthHandler.js +1 -1
- package/lib/esm/nest/keycloakAuthHandler.js.map +1 -0
- package/lib/esm/nest/keycloakModule.js +1 -1
- package/lib/esm/nest/keycloakModule.js.map +1 -0
- package/lib/esm/nest/logging.js +1 -1
- package/lib/esm/nest/logging.js.map +1 -0
- package/lib/esm/nest/types.js +1 -1
- package/lib/esm/nest/types.js.map +1 -0
- package/lib/esm/nest/utils.js +1 -1
- package/lib/esm/nest/utils.js.map +1 -0
- package/lib/esm/secrets/aws/AwsSecretService.js +1 -1
- package/lib/esm/secrets/aws/AwsSecretService.js.map +1 -0
- package/lib/esm/secrets/aws/AwsSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/aws/AwsSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/aws/index.js +1 -1
- package/lib/esm/secrets/aws/index.js.map +1 -0
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +1 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +1 -0
- package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/azure/index.js +1 -1
- package/lib/esm/secrets/azure/index.js.map +1 -0
- package/lib/esm/secrets/core/SecretErrors.js +1 -1
- package/lib/esm/secrets/core/SecretErrors.js.map +1 -0
- package/lib/esm/secrets/core/SecretName.js +1 -1
- package/lib/esm/secrets/core/SecretName.js.map +1 -0
- package/lib/esm/secrets/core/SecretReference.js +1 -1
- package/lib/esm/secrets/core/SecretReference.js.map +1 -0
- package/lib/esm/secrets/core/SecretSerialization.js +1 -1
- package/lib/esm/secrets/core/SecretSerialization.js.map +1 -0
- package/lib/esm/secrets/core/SecretService.js +1 -1
- package/lib/esm/secrets/core/SecretService.js.map +1 -0
- package/lib/esm/secrets/core/SecretTypes.js +1 -1
- package/lib/esm/secrets/core/SecretTypes.js.map +1 -0
- package/lib/esm/secrets/core/index.js +1 -1
- package/lib/esm/secrets/core/index.js.map +1 -0
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js +1 -1
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +1 -0
- package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js +1 -1
- package/lib/esm/secrets/gcp/GcpSecretManagerServiceConfig.js.map +1 -0
- package/lib/esm/secrets/gcp/index.js +1 -1
- package/lib/esm/secrets/gcp/index.js.map +1 -0
- package/lib/esm/secrets/index.js +1 -1
- package/lib/esm/secrets/index.js.map +1 -0
- package/lib/esm/secrets/model/ModelSecretCrypto.js +1 -1
- package/lib/esm/secrets/model/ModelSecretCrypto.js.map +1 -0
- package/lib/esm/secrets/model/ModelSecretService.js +1 -1
- package/lib/esm/secrets/model/ModelSecretService.js.map +1 -0
- package/lib/esm/secrets/model/ModelSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/model/ModelSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/model/Secret.js +1 -1
- package/lib/esm/secrets/model/Secret.js.map +1 -0
- package/lib/esm/secrets/model/index.js +1 -1
- package/lib/esm/secrets/model/index.js.map +1 -0
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +1 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +1 -0
- package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/onepassword/index.js +1 -1
- package/lib/esm/secrets/onepassword/index.js.map +1 -0
- package/lib/esm/secrets/vault/VaultSecretService.js +1 -1
- package/lib/esm/secrets/vault/VaultSecretService.js.map +1 -0
- package/lib/esm/secrets/vault/VaultSecretServiceConfig.js +1 -1
- package/lib/esm/secrets/vault/VaultSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/vault/index.js +1 -1
- package/lib/esm/secrets/vault/index.js.map +1 -0
- package/lib/esm/shared/runtime.js +1 -1
- package/lib/esm/shared/runtime.js.map +1 -0
- package/lib/esm/utils.js +1 -1
- package/lib/esm/utils.js.map +1 -0
- package/lib/types/graph/engine/constants.d.cts +59 -0
- package/lib/types/graph/engine/constants.d.mts +59 -0
- package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.cts +1 -1
- package/lib/types/graph/{execution → engine/execution}/GraphExecutionResult.d.mts +1 -1
- package/lib/types/graph/engine/index.d.cts +61 -0
- package/lib/types/graph/engine/index.d.mts +61 -0
- package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.cts +1 -1
- package/lib/types/graph/{loops → engine/loops}/ConditionExpressionEvaluator.d.mts +1 -1
- package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.cts +2 -1
- package/lib/types/graph/{loops → engine/loops}/GraphConditionEvaluator.d.mts +2 -1
- package/lib/types/graph/{types.d.cts → engine/types.d.cts} +12 -148
- package/lib/types/graph/{types.d.mts → engine/types.d.mts} +12 -148
- package/lib/types/graph/index.d.cts +8 -53
- package/lib/types/graph/index.d.mts +8 -53
- package/lib/types/graph/shared/constants.d.cts +53 -0
- package/lib/types/graph/shared/constants.d.mts +53 -0
- package/lib/types/graph/shared/index.d.cts +18 -0
- package/lib/types/graph/shared/index.d.mts +18 -0
- package/lib/types/graph/shared/types.d.cts +162 -0
- package/lib/types/graph/shared/types.d.mts +162 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.cts +33 -5
- package/lib/types/nest/graph/GraphExecutorRegistryFactory.d.mts +33 -5
- package/lib/types/nest/graph/main.d.cts +1 -0
- package/lib/types/nest/graph/main.d.mts +1 -0
- package/package.json +19 -8
- package/lib/cjs/graph/constants.cjs +0 -94
- package/lib/cjs/graph/decorators.cjs +0 -4
- package/lib/cjs/graph/errors/GraphCycleError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphExecutionError.cjs +0 -27
- package/lib/cjs/graph/errors/GraphInputError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphLoopLimitError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphPinningError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphPortError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphStoreError.cjs +0 -20
- package/lib/cjs/graph/errors/GraphTopologyError.cjs +0 -20
- package/lib/cjs/graph/errors/index.cjs +0 -31
- package/lib/cjs/graph/events/GraphExecutionEvent.cjs +0 -4
- package/lib/cjs/graph/events/GraphExecutionEventEmitter.cjs +0 -40
- package/lib/cjs/graph/events/GraphExecutionEventFactory.cjs +0 -37
- package/lib/cjs/graph/events/GraphExecutionObserver.cjs +0 -4
- package/lib/cjs/graph/events/index.cjs +0 -27
- package/lib/cjs/graph/execution/CodeSandboxEvaluator.cjs +0 -4
- package/lib/cjs/graph/execution/GraphExecutionContext.cjs +0 -79
- package/lib/cjs/graph/execution/GraphExecutionEngine.cjs +0 -407
- package/lib/cjs/graph/execution/GraphExecutionFrame.cjs +0 -32
- package/lib/cjs/graph/execution/GraphExecutionResult.cjs +0 -30
- package/lib/cjs/graph/execution/GraphNodeExecutor.cjs +0 -4
- package/lib/cjs/graph/execution/SwitchGraphNodeExecutor.cjs +0 -103
- package/lib/cjs/graph/execution/index.cjs +0 -30
- package/lib/cjs/graph/loops/ConditionExpressionEvaluator.cjs +0 -87
- package/lib/cjs/graph/loops/ForeachGraphNodeExecutor.cjs +0 -84
- package/lib/cjs/graph/loops/GraphConditionEvaluator.cjs +0 -85
- package/lib/cjs/graph/loops/GraphLoopExecutionContext.cjs +0 -16
- package/lib/cjs/graph/loops/UntilGraphNodeExecutor.cjs +0 -76
- package/lib/cjs/graph/loops/WhileGraphNodeExecutor.cjs +0 -77
- package/lib/cjs/graph/loops/index.cjs +0 -29
- package/lib/cjs/graph/nodes/agent.cjs +0 -110
- package/lib/cjs/graph/nodes/base.cjs +0 -35
- package/lib/cjs/graph/nodes/category-styles.cjs +0 -38
- package/lib/cjs/graph/nodes/flow-control.cjs +0 -464
- package/lib/cjs/graph/nodes/index.cjs +0 -35
- package/lib/cjs/graph/nodes/triggers.cjs +0 -250
- package/lib/cjs/graph/pinning/GraphPinningDependencyResolver.cjs +0 -28
- package/lib/cjs/graph/pinning/GraphPinningMetadata.cjs +0 -20
- package/lib/cjs/graph/pinning/GraphPinningPolicy.cjs +0 -34
- package/lib/cjs/graph/pinning/GraphPinningService.cjs +0 -191
- package/lib/cjs/graph/pinning/index.cjs +0 -27
- package/lib/cjs/graph/planning/GraphExecutionPlan.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanEdge.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanLayer.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanNode.cjs +0 -4
- package/lib/cjs/graph/planning/GraphExecutionPlanner.cjs +0 -197
- package/lib/cjs/graph/planning/GraphRelationResolver.cjs +0 -172
- package/lib/cjs/graph/planning/GraphTopology.cjs +0 -57
- package/lib/cjs/graph/planning/index.cjs +0 -30
- package/lib/cjs/graph/registry/GraphNodeExecutorRegistry.cjs +0 -44
- package/lib/cjs/graph/registry/GraphNodeExecutorResolver.cjs +0 -27
- package/lib/cjs/graph/registry/index.cjs +0 -25
- package/lib/cjs/graph/snapshots/GraphExecutionSnapshotMapper.cjs +0 -53
- package/lib/cjs/graph/snapshots/index.cjs +0 -24
- package/lib/cjs/graph/store/GraphCachedValue.cjs +0 -4
- package/lib/cjs/graph/store/GraphValueKey.cjs +0 -4
- package/lib/cjs/graph/store/GraphValueStore.cjs +0 -76
- package/lib/cjs/graph/store/GraphValueStoreAdapter.cjs +0 -4
- package/lib/cjs/graph/store/InMemoryGraphValueStoreAdapter.cjs +0 -69
- package/lib/cjs/graph/store/index.cjs +0 -28
- package/lib/cjs/graph/types.cjs +0 -4
- package/lib/cjs/graph/validation/GraphDefinitionValidator.cjs +0 -33
- package/lib/cjs/graph/validation/GraphPortSchemaResolver.cjs +0 -58
- package/lib/cjs/graph/validation/GraphValueValidator.cjs +0 -52
- package/lib/cjs/graph/validation/index.cjs +0 -26
- package/lib/esm/graph/constants.js +0 -106
- package/lib/esm/graph/decorators.js +0 -2
- package/lib/esm/graph/errors/GraphCycleError.js +0 -15
- package/lib/esm/graph/errors/GraphExecutionError.js +0 -22
- package/lib/esm/graph/errors/GraphInputError.js +0 -15
- package/lib/esm/graph/errors/GraphLoopLimitError.js +0 -15
- package/lib/esm/graph/errors/GraphPinningError.js +0 -15
- package/lib/esm/graph/errors/GraphPortError.js +0 -15
- package/lib/esm/graph/errors/GraphStoreError.js +0 -15
- package/lib/esm/graph/errors/GraphTopologyError.js +0 -15
- package/lib/esm/graph/errors/index.js +0 -14
- package/lib/esm/graph/events/GraphExecutionEvent.js +0 -2
- package/lib/esm/graph/events/GraphExecutionEventEmitter.js +0 -35
- package/lib/esm/graph/events/GraphExecutionEventFactory.js +0 -32
- package/lib/esm/graph/events/GraphExecutionObserver.js +0 -2
- package/lib/esm/graph/events/index.js +0 -10
- package/lib/esm/graph/execution/CodeSandboxEvaluator.js +0 -18
- package/lib/esm/graph/execution/GraphExecutionContext.js +0 -74
- package/lib/esm/graph/execution/GraphExecutionEngine.js +0 -402
- package/lib/esm/graph/execution/GraphExecutionFrame.js +0 -27
- package/lib/esm/graph/execution/GraphExecutionResult.js +0 -26
- package/lib/esm/graph/execution/GraphNodeExecutor.js +0 -2
- package/lib/esm/graph/execution/SwitchGraphNodeExecutor.js +0 -98
- package/lib/esm/graph/execution/index.js +0 -13
- package/lib/esm/graph/loops/ConditionExpressionEvaluator.js +0 -82
- package/lib/esm/graph/loops/ForeachGraphNodeExecutor.js +0 -79
- package/lib/esm/graph/loops/GraphConditionEvaluator.js +0 -80
- package/lib/esm/graph/loops/GraphLoopExecutionContext.js +0 -11
- package/lib/esm/graph/loops/UntilGraphNodeExecutor.js +0 -71
- package/lib/esm/graph/loops/WhileGraphNodeExecutor.js +0 -72
- package/lib/esm/graph/loops/index.js +0 -12
- package/lib/esm/graph/nodes/agent.js +0 -101
- package/lib/esm/graph/nodes/base.js +0 -30
- package/lib/esm/graph/nodes/category-styles.js +0 -34
- package/lib/esm/graph/nodes/flow-control.js +0 -455
- package/lib/esm/graph/nodes/index.js +0 -18
- package/lib/esm/graph/nodes/triggers.js +0 -241
- package/lib/esm/graph/pinning/GraphPinningDependencyResolver.js +0 -23
- package/lib/esm/graph/pinning/GraphPinningMetadata.js +0 -15
- package/lib/esm/graph/pinning/GraphPinningPolicy.js +0 -29
- package/lib/esm/graph/pinning/GraphPinningService.js +0 -186
- package/lib/esm/graph/pinning/index.js +0 -10
- package/lib/esm/graph/planning/GraphExecutionPlan.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanEdge.js +0 -7
- package/lib/esm/graph/planning/GraphExecutionPlanLayer.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanNode.js +0 -2
- package/lib/esm/graph/planning/GraphExecutionPlanner.js +0 -192
- package/lib/esm/graph/planning/GraphRelationResolver.js +0 -167
- package/lib/esm/graph/planning/GraphTopology.js +0 -52
- package/lib/esm/graph/planning/index.js +0 -13
- package/lib/esm/graph/registry/GraphNodeExecutorRegistry.js +0 -39
- package/lib/esm/graph/registry/GraphNodeExecutorResolver.js +0 -22
- package/lib/esm/graph/registry/index.js +0 -8
- package/lib/esm/graph/snapshots/GraphExecutionSnapshotMapper.js +0 -48
- package/lib/esm/graph/snapshots/index.js +0 -7
- package/lib/esm/graph/store/GraphCachedValue.js +0 -2
- package/lib/esm/graph/store/GraphValueKey.js +0 -7
- package/lib/esm/graph/store/GraphValueStore.js +0 -71
- package/lib/esm/graph/store/GraphValueStoreAdapter.js +0 -2
- package/lib/esm/graph/store/InMemoryGraphValueStoreAdapter.js +0 -64
- package/lib/esm/graph/store/index.js +0 -11
- package/lib/esm/graph/types.js +0 -2
- package/lib/esm/graph/validation/GraphDefinitionValidator.js +0 -28
- package/lib/esm/graph/validation/GraphPortSchemaResolver.js +0 -53
- package/lib/esm/graph/validation/GraphValueValidator.js +0 -47
- package/lib/esm/graph/validation/index.js +0 -9
- package/lib/types/graph/constants.d.cts +0 -101
- package/lib/types/graph/constants.d.mts +0 -101
- /package/lib/types/graph/{decorators.d.cts → engine/decorators.d.cts} +0 -0
- /package/lib/types/graph/{decorators.d.mts → engine/decorators.d.mts} +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphCycleError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphExecutionError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphInputError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphLoopLimitError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPinningError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphPortError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphStoreError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/GraphTopologyError.d.mts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/index.d.cts +0 -0
- /package/lib/types/graph/{errors → engine/errors}/index.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEvent.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventEmitter.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionEventFactory.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/GraphExecutionObserver.d.mts +0 -0
- /package/lib/types/graph/{events → engine/events}/index.d.cts +0 -0
- /package/lib/types/graph/{events → engine/events}/index.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/CodeSandboxEvaluator.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionContext.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionEngine.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphExecutionFrame.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/GraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/SwitchGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/index.d.cts +0 -0
- /package/lib/types/graph/{execution → engine/execution}/index.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/ForeachGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/GraphLoopExecutionContext.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/UntilGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/WhileGraphNodeExecutor.d.mts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/index.d.cts +0 -0
- /package/lib/types/graph/{loops → engine/loops}/index.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningDependencyResolver.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningMetadata.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningPolicy.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/GraphPinningService.d.mts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/index.d.cts +0 -0
- /package/lib/types/graph/{pinning → engine/pinning}/index.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlan.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanEdge.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanLayer.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanNode.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphExecutionPlanner.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphRelationResolver.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/GraphTopology.d.mts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/index.d.cts +0 -0
- /package/lib/types/graph/{planning → engine/planning}/index.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorRegistry.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/GraphNodeExecutorResolver.d.mts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/index.d.cts +0 -0
- /package/lib/types/graph/{registry → engine/registry}/index.d.mts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.cts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/GraphExecutionSnapshotMapper.d.mts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.cts +0 -0
- /package/lib/types/graph/{snapshots → engine/snapshots}/index.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphCachedValue.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueKey.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStore.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/GraphValueStoreAdapter.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/InMemoryGraphValueStoreAdapter.d.mts +0 -0
- /package/lib/types/graph/{store → engine/store}/index.d.cts +0 -0
- /package/lib/types/graph/{store → engine/store}/index.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphDefinitionValidator.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphPortSchemaResolver.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/GraphValueValidator.d.mts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/index.d.cts +0 -0
- /package/lib/types/graph/{validation → engine/validation}/index.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/agent.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/agent.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/base.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/base.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/category-styles.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/flow-control.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/index.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/index.d.mts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.cts +0 -0
- /package/lib/types/graph/{nodes → shared/nodes}/triggers.d.mts +0 -0
package/dist/integrations.cjs
CHANGED
|
@@ -1,1649 +1,2 @@
|
|
|
1
|
-
(function(global, factory) {
|
|
2
|
-
|
|
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.7";
|
|
1579
|
-
const COMMIT = "aca7f9e";
|
|
1580
|
-
const FULL_VERSION = "0.3.7-aca7f9e";
|
|
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/OiAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbn1cbiIsImltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciwgQ2FzY2FkZSwgTW9kZWxTZXJ2aWNlLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEFjY2Vzc0NvbnRleHQsXG4gIEFyYW5nb0F1dGhDb250ZXh0LFxuICBFZmZlY3RpdmVQZXJtaXNzaW9uU25hcHNob3QsXG4gIEdyYW50U25hcHNob3QsXG4gIFFkcmFudEF1dGhGaWx0ZXIsXG4gIFJlc291cmNlVmlzaWJpbGl0eSxcbiAgU2NvcGVLaW5kLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgUkVMX1JFU1RSSUNUID0ge1xuICB1cGRhdGU6IENhc2NhZGUuTk9ORSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG4gIG51bGxhYmxlOiBmYWxzZSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRUxfTlVMTElGWSA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLk5PTkUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5OT05FLFxuICBudWxsYWJsZTogdHJ1ZSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgbnVsbGFibGU6IGZhbHNlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9DQVNDQURFX0lOU0VSVF9VUERBVEUgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbiAgbnVsbGFibGU6IGZhbHNlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXJhbmdvQ29udGV4dChvcHRpb25zOiB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgYWxsb3dlZE9yZ1VuaXRJZHM6IHN0cmluZ1tdO1xuICBhbGxvd2VkUmVzb3VyY2VJZHM6IHN0cmluZ1tdO1xufSk6IEFyYW5nb0F1dGhDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICB0ZW5hbnRJZDogb3B0aW9ucy50ZW5hbnRJZCxcbiAgICBwcmluY2lwYWxJZDogb3B0aW9ucy5wcmluY2lwYWxJZCxcbiAgICBwZXJtaXNzaW9uS2V5OiBvcHRpb25zLnBlcm1pc3Npb25LZXksXG4gICAgYWxsb3dlZE9yZ1VuaXRJZHM6IFsuLi5vcHRpb25zLmFsbG93ZWRPcmdVbml0SWRzXSxcbiAgICBhbGxvd2VkUmVzb3VyY2VJZHM6IFsuLi5vcHRpb25zLmFsbG93ZWRSZXNvdXJjZUlkc10sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFFkcmFudEZpbHRlcihvcHRpb25zOiB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgYWxsb3dlZE9yZ1VuaXRJZHM6IHN0cmluZ1tdO1xuICBhbGxvd2VkUmVzb3VyY2VJZHM6IHN0cmluZ1tdO1xufSk6IFFkcmFudEF1dGhGaWx0ZXIge1xuICByZXR1cm4ge1xuICAgIG11c3Q6IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiBcInRlbmFudF9pZFwiLFxuICAgICAgICBtYXRjaDogeyB2YWx1ZTogb3B0aW9ucy50ZW5hbnRJZCB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2hvdWxkOiBbXG4gICAgICAgICAgeyBrZXk6IFwib3JnX3VuaXRfaWRcIiwgbWF0Y2g6IHsgYW55OiBvcHRpb25zLmFsbG93ZWRPcmdVbml0SWRzIH0gfSxcbiAgICAgICAgICB7IGtleTogXCJwcm90ZWN0ZWRfcmVzb3VyY2VfaWRcIiwgbWF0Y2g6IHsgYW55OiBvcHRpb25zLmFsbG93ZWRSZXNvdXJjZUlkcyB9IH0sXG4gICAgICAgICAgeyBrZXk6IFwib3duZXJfcHJpbmNpcGFsX2lkXCIsIG1hdGNoOiB7IHZhbHVlOiBvcHRpb25zLnByaW5jaXBhbElkIH0gfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2NvcGVLZXkoc2NvcGVLaW5kOiBTY29wZUtpbmQsIHNjb3BlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzY29wZUtpbmR9OiR7c2NvcGVJZH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm93SXNvKCk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXk8VD4odmFsdWU6IFRbXSB8IHVuZGVmaW5lZCk6IFRbXSB7XG4gIHJldHVybiB2YWx1ZSA/PyBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVUZW5hbnQocm93VGVuYW50OiB1bmtub3duLCB0ZW5hbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWxhdGlvbklkKHJvd1RlbmFudCBhcyB7IGlkOiBzdHJpbmcgfSB8IHN0cmluZykgPT09IHRlbmFudElkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpb25NYXRjaCh2YWx1ZTogdW5rbm93biwgdGFyZ2V0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRhcmdldCA/IHJlbGF0aW9uSWQodmFsdWUgYXMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmcpID09PSB0YXJnZXQgOiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvd2VyU2x1Zyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZVxuICAgICAgLnRyaW0oKVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiLVwiKVxuICAgICAgLnJlcGxhY2UoL14tK3wtKyQvZywgXCJcIikgfHwgXCJpdGVtXCJcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGltZVZhbGlkKGF0OiBEYXRlIHwgdW5kZWZpbmVkLCBzdGFydHNBdD86IERhdGUsIGV4cGlyZXNBdD86IERhdGUpOiBib29sZWFuIHtcbiAgY29uc3QgaW5zdGFudCA9IGF0ID8/IG5ldyBEYXRlKCk7XG4gIGlmIChzdGFydHNBdCAmJiBpbnN0YW50IDwgc3RhcnRzQXQpIHJldHVybiBmYWxzZTtcbiAgaWYgKGV4cGlyZXNBdCAmJiBpbnN0YW50ID4gZXhwaXJlc0F0KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBY2Nlc3NDb250ZXh0KG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdO1xuICBncmFudHM6IEdyYW50U25hcHNob3RbXTtcbn0pOiBBY2Nlc3NDb250ZXh0IHtcbiAgY29uc3QgcGVybWlzc2lvbnNCeVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgY29uc3QgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb246IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBvcHRpb25zLnBlcm1pc3Npb25zKSB7XG4gICAgY29uc3Qga2V5ID0gc2NvcGVLZXkocGVybWlzc2lvbi5zY29wZUtpbmQsIHBlcm1pc3Npb24uc2NvcGVJZCk7XG4gICAgcGVybWlzc2lvbnNCeVNjb3BlW2tleV0gPSBwZXJtaXNzaW9uc0J5U2NvcGVba2V5XSA/PyBbXTtcbiAgICBwZXJtaXNzaW9uc0J5U2NvcGVba2V5XS5wdXNoKHBlcm1pc3Npb24ucGVybWlzc2lvbktleSk7XG4gICAgaWYgKHBlcm1pc3Npb24uc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCkge1xuICAgICAgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5XSA9XG4gICAgICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb24ucGVybWlzc2lvbktleV0gPz8gW107XG4gICAgICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXldLnB1c2gocGVybWlzc2lvbi5zY29wZUlkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkLFxuICAgIHByaW5jaXBhbElkOiBvcHRpb25zLnByaW5jaXBhbElkLFxuICAgIHBlcm1pc3Npb25zQnlTY29wZSxcbiAgICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbixcbiAgICAgIHJlc291cmNlR3JhbnRzOiBvcHRpb25zLmdyYW50cy5tYXAoKGdyYW50KSA9PiAoe1xuICAgICAgICByZXNvdXJjZUlkOiBncmFudC5yZXNvdXJjZUlkLFxuICAgICAgICBwZXJtaXNzaW9uS2V5OiBncmFudC5wZXJtaXNzaW9uS2V5LFxuICAgICAgfSkpLFxuICB9O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsU2VydmljZTxNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4gJiB7IGlkOiBzdHJpbmcgfT4gZXh0ZW5kcyBNb2RlbFNlcnZpY2U8XG4gIE0sXG4gIFJlcG9zaXRvcnk8TSwgYW55PlxuPiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihjbGF6ejogbmV3ICgpID0+IE0pIHtcbiAgICBzdXBlcihjbGF6eik7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3TW9kZWw8VD4oY2xheno6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IGNsYXp6KCkgYXMgb2JqZWN0LCBkYXRhIGFzIG9iamVjdCkgYXMgVDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShkYXRhOiBQYXJ0aWFsPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG8uY3JlYXRlKE9iamVjdC5hc3NpZ24oe30gYXMgTSwgZGF0YSBhcyBvYmplY3QpLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9uZShkYXRhOiBQYXJ0aWFsPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShkYXRhLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5SWQoaWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnJlYWQoaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlT25lKGlkOiBzdHJpbmcsIHBhdGNoOiBQYXJ0aWFsPE0+LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5yZXBvLnJlYWQoaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLnJlcG8udXBkYXRlKE9iamVjdC5hc3NpZ24oZXhpc3RpbmcsIHBhdGNoKSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBkZWxldGVCeUlkKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZXBvLmRlbGV0ZShpZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kT25lQnk8SyBleHRlbmRzIGtleW9mIE0gJiBzdHJpbmc+KGtleTogSywgdmFsdWU6IE1bS10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5maW5kT25lQnkoa2V5LCB2YWx1ZSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kTWFueUJ5PEsgZXh0ZW5kcyBrZXlvZiBNICYgc3RyaW5nPihrZXk6IEssIHZhbHVlOiBNW0tdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5zZWxlY3QoKS53aGVyZSh7IFtrZXldOiB2YWx1ZSB9IGFzIGFueSkuZXhlY3V0ZSguLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBbGwoLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG8uc2VsZWN0KCkuZXhlY3V0ZSguLi5hcmdzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGlvbklkKHZhbHVlOiBzdHJpbmcgfCB7IGlkOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLmlkO1xufVxuXG5leHBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IsIHRyYW5zYWN0aW9uYWwgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXV0aG9yaXphdGlvbk1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEgYXMgbmV2ZXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcIi4vdXNlci5tb2RlbFwiO1xuXG5AdGFibGUoXCJ0ZW5hbnRfbWVtYmVyc2hpcHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgVGVuYW50TWVtYmVyc2hpcCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma190ZW5hbnRfbWVtYmVyc2hpcHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBVc2VyLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfdGVuYW50X21lbWJlcnNoaXBzX3VzZXJcIilcbiAgQHJlcXVpcmVkKClcbiAgdXNlciE6IFVzZXIgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zKSBAY29sdW1uKCkgc3RhdHVzITogTWVtYmVyc2hpcFN0YXR1cztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHtcbiAgY29sdW1uLFxuICBjcmVhdGVkQXQsXG4gIG9uZVRvTWFueSxcbiAgcGssXG4gIHRhYmxlLFxuICB1bmlxdWUsXG4gIHVwZGF0ZWRBdCxcbiAgdXVpZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXAgfSBmcm9tIFwiLi90ZW5hbnQtbWVtYmVyc2hpcC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdE1lbWJlcnNoaXAgfSBmcm9tIFwiLi9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbkB0YWJsZShcInVzZXJzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFVzZXIgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSlcbiAgQHV1aWQoKVxuICBpZCE6IHN0cmluZztcblxuICBAdW5pcXVlKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgZW1haWw/OiBzdHJpbmc7XG5cbiAgQHVuaXF1ZSgpXG4gIEB0eXBlKFN0cmluZylcbiAgQGNvbHVtbigpXG4gIHBob25lPzogc3RyaW5nO1xuXG4gIEByZXF1aXJlZCgpXG4gIEB0eXBlKFN0cmluZylcbiAgQGNvbHVtbigpXG4gIGRpc3BsYXlOYW1lITogc3RyaW5nO1xuXG4gIEBvbmVUb01hbnkoKCkgPT4gVGVuYW50TWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSlcbiAgdGVuYW50TWVtYmVyc2hpcHM/OiBUZW5hbnRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcblxuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXRNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKVxuICBvcmdVbml0TWVtYmVyc2hpcHM/OiBPcmdVbml0TWVtYmVyc2hpcFtdIHwgc3RyaW5nW107XG5cbiAgQGNyZWF0ZWRBdCgpXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQHVwZGF0ZWRBdCgpXG4gIHVwZGF0ZWRBdCE6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMsIE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi91c2VyLm1vZGVsXCI7XG5cbkB0YWJsZShcIm9yZ191bml0X21lbWJlcnNoaXBzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRNZW1iZXJzaGlwIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19tZW1iZXJzaGlwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfbWVtYmVyc2hpcHNfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVXNlciwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19tZW1iZXJzaGlwc191c2VyXCIpXG4gIEByZXF1aXJlZCgpXG4gIHVzZXIhOiBVc2VyIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucykgQGNvbHVtbigpIHN0YXR1cyE6IE1lbWJlcnNoaXBTdGF0dXM7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcblxuQHRhYmxlKFwib3JnX3VuaXRfY2xvc3VyZVwiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBPcmdVbml0Q2xvc3VyZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfY2xvc3VyZV90ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfY2xvc3VyZV9hbmNlc3RvclwiKVxuICBAcmVxdWlyZWQoKVxuICBhbmNlc3RvciE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19jbG9zdXJlX2Rlc2NlbmRhbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgZGVzY2VuZGFudCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoTnVtYmVyKSBAY29sdW1uKCkgZGVwdGghOiBudW1iZXI7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBvbmVUb01hbnksIHBrLCB0YWJsZSwgdW5pcXVlLCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2F0ZWdvcnksIFBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb24gfSBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24ubW9kZWxcIjtcblxuQHRhYmxlKFwicGVybWlzc2lvbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbiBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQHVuaXF1ZSgpIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkga2V5ITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zKSBAY29sdW1uKCkgY2F0ZWdvcnkhOiBQZXJtaXNzaW9uQ2F0ZWdvcnk7XG4gIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBvbmVUb01hbnkoKCkgPT4gUm9sZVBlcm1pc3Npb24sIFJFTF9SRVNUUklDVCwgZmFsc2UpIHJvbGVQZXJtaXNzaW9ucz86IFJvbGVQZXJtaXNzaW9uW10gfCBzdHJpbmdbXTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuL3JvbGUubW9kZWxcIjtcbmltcG9ydCB7IFBlcm1pc3Npb24gfSBmcm9tIFwiLi9wZXJtaXNzaW9uLm1vZGVsXCI7XG5cbkB0YWJsZShcInJvbGVfcGVybWlzc2lvbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUm9sZVBlcm1pc3Npb24gZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUm9sZSwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3JvbGVfcGVybWlzc2lvbnNfcm9sZVwiKVxuICBAcmVxdWlyZWQoKVxuICByb2xlITogUm9sZSB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQZXJtaXNzaW9uLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9wZXJtaXNzaW9uc19wZXJtaXNzaW9uXCIpXG4gIEByZXF1aXJlZCgpXG4gIHBlcm1pc3Npb24hOiBQZXJtaXNzaW9uIHwgc3RyaW5nO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfTlVMTElGWSwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uIH0gZnJvbSBcIi4vcm9sZS1wZXJtaXNzaW9uLm1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudCB9IGZyb20gXCIuL3JvbGUtYXNzaWdubWVudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJyb2xlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSb2xlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX05VTExJRlksIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZXNfdGVuYW50XCIpXG4gIHRlbmFudD86IFRlbmFudCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBrZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IFJvbGVQZXJtaXNzaW9uLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByb2xlUGVybWlzc2lvbnM/OiBSb2xlUGVybWlzc2lvbltdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUm9sZUFzc2lnbm1lbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGFzc2lnbm1lbnRzPzogUm9sZUFzc2lnbm1lbnRbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2NvcGVLaW5kLCBTY29wZUtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBQcmluY2lwYWwgfSBmcm9tIFwiLi9wcmluY2lwYWwubW9kZWxcIjtcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi9yb2xlLm1vZGVsXCI7XG5cbkB0YWJsZShcInJvbGVfYXNzaWdubWVudHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUm9sZUFzc2lnbm1lbnQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9hc3NpZ25tZW50c190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3JvbGVfYXNzaWdubWVudHNfcHJpbmNpcGFsXCIpXG4gIEByZXF1aXJlZCgpXG4gIHByaW5jaXBhbCE6IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBSb2xlLCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9hc3NpZ25tZW50c19yb2xlXCIpXG4gIEByZXF1aXJlZCgpXG4gIHJvbGUhOiBSb2xlIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihTY29wZUtpbmRPcHRpb25zKSBAY29sdW1uKCkgc2NvcGVLaW5kITogU2NvcGVLaW5kO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNjb3BlSWQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoQm9vbGVhbikgQGNvbHVtbigpIGluaGVyaXREb3duITogYm9vbGVhbjtcbiAgQGNvbHVtbigpIHN0YXJ0c0F0PzogRGF0ZTtcbiAgQGNvbHVtbigpIGV4cGlyZXNBdD86IERhdGU7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgY29uZGl0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJvdGVjdGVkUmVzb3VyY2UgfSBmcm9tIFwiLi9wcm90ZWN0ZWQtcmVzb3VyY2UubW9kZWxcIjtcblxuQHRhYmxlKFwicmVzb3VyY2VfZ3JhbnRzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFJlc291cmNlR3JhbnQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcmVzb3VyY2VfZ3JhbnRzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJvdGVjdGVkUmVzb3VyY2UsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfcmVzb3VyY2VcIilcbiAgQHJlcXVpcmVkKClcbiAgcmVzb3VyY2UhOiBQcm90ZWN0ZWRSZXNvdXJjZSB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfcHJpbmNpcGFsXCIpXG4gIEByZXF1aXJlZCgpXG4gIHByaW5jaXBhbCE6IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwZXJtaXNzaW9uS2V5ITogc3RyaW5nO1xuICBAY29sdW1uKCkgc3RhcnRzQXQ/OiBEYXRlO1xuICBAY29sdW1uKCkgZXhwaXJlc0F0PzogRGF0ZTtcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcmVzb3VyY2VfZ3JhbnRzX2NyZWF0ZWRfYnlcIilcbiAgY3JlYXRlZEJ5PzogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBvbmVUb01hbnksIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxLaW5kLCBQcmluY2lwYWxLaW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50IH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYW50IH0gZnJvbSBcIi4vcmVzb3VyY2UtZ3JhbnQubW9kZWxcIjtcblxuQHRhYmxlKFwicHJpbmNpcGFsc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBQcmluY2lwYWwgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcHJpbmNpcGFsc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihQcmluY2lwYWxLaW5kT3B0aW9ucykgQGNvbHVtbigpIGtpbmQhOiBQcmluY2lwYWxLaW5kO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHN1YmplY3RJZCE6IHN0cmluZztcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlQXNzaWdubWVudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcm9sZUFzc2lnbm1lbnRzPzogUm9sZUFzc2lnbm1lbnRbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFJlc291cmNlR3JhbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIHJlc291cmNlR3JhbnRzPzogUmVzb3VyY2VHcmFudFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9OVUxMSUZZLCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJlc291cmNlVmlzaWJpbGl0eSwgUmVzb3VyY2VWaXNpYmlsaXR5T3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudCB9IGZyb20gXCIuL3Jlc291cmNlLWdyYW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInByb3RlY3RlZF9yZXNvdXJjZXNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUHJvdGVjdGVkUmVzb3VyY2UgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcHJvdGVjdGVkX3Jlc291cmNlc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcm90ZWN0ZWRfcmVzb3VyY2VzX29yZ191bml0XCIpXG4gIEByZXF1aXJlZCgpXG4gIG9yZ1VuaXQhOiBPcmdVbml0IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlc291cmNlVHlwZSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSByZXNvdXJjZUlkITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihSZXNvdXJjZVZpc2liaWxpdHlPcHRpb25zKSBAY29sdW1uKCkgdmlzaWJpbGl0eSE6IFJlc291cmNlVmlzaWJpbGl0eTtcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9OVUxMSUZZLCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Byb3RlY3RlZF9yZXNvdXJjZXNfb3duZXJcIilcbiAgb3duZXI/OiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2Vuc2l0aXZpdHk/OiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQG9uZVRvTWFueSgoKSA9PiBSZXNvdXJjZUdyYW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBncmFudHM/OiBSZXNvdXJjZUdyYW50W10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcm1pc3Npb25DYXRlZ29yeSwgUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBSRUxfTlVMTElGWSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcblxuQHRhYmxlKFwiaW5oZXJpdGFuY2VfYmxvY2tzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEluaGVyaXRhbmNlQmxvY2sgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfaW5oZXJpdGFuY2VfYmxvY2tzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2luaGVyaXRhbmNlX2Jsb2Nrc19vcmdfdW5pdFwiKVxuICBAcmVxdWlyZWQoKVxuICBvcmdVbml0ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19pbmhlcml0YW5jZV9ibG9ja3NfYmxvY2tlZF9hbmNlc3RvclwiKVxuICBibG9ja2VkRnJvbUFuY2VzdG9yPzogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucykgQGNvbHVtbigpIHBlcm1pc3Npb25DYXRlZ29yeSE6IFBlcm1pc3Npb25DYXRlZ29yeTtcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSByZWFzb24/OiBzdHJpbmc7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdE1lbWJlcnNoaXAgfSBmcm9tIFwiLi9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0Q2xvc3VyZSB9IGZyb20gXCIuL29yZy11bml0LWNsb3N1cmUubW9kZWxcIjtcbmltcG9ydCB7IFByb3RlY3RlZFJlc291cmNlIH0gZnJvbSBcIi4vcHJvdGVjdGVkLXJlc291cmNlLm1vZGVsXCI7XG5pbXBvcnQgeyBJbmhlcml0YW5jZUJsb2NrIH0gZnJvbSBcIi4vaW5oZXJpdGFuY2UtYmxvY2subW9kZWxcIjtcblxuQHRhYmxlKFwib3JnX3VuaXRzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIE9yZ1VuaXQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX3VuaXRzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ191bml0c19wYXJlbnRcIilcbiAgcGFyZW50PzogT3JnVW5pdCB8IHN0cmluZztcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBjaGlsZHJlbj86IE9yZ1VuaXRbXSB8IHN0cmluZ1tdO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIG5hbWUhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcGF0aCE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXRNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBtZW1iZXJzaGlwcz86IE9yZ1VuaXRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBQcm90ZWN0ZWRSZXNvdXJjZSwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcmVzb3VyY2VzPzogUHJvdGVjdGVkUmVzb3VyY2VbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IEluaGVyaXRhbmNlQmxvY2ssIFJFTF9SRVNUUklDVCwgZmFsc2UpIGluaGVyaXRhbmNlQmxvY2tzPzogSW5oZXJpdGFuY2VCbG9ja1tdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdENsb3N1cmUsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGFuY2VzdG9yTGlua3M/OiBPcmdVbml0Q2xvc3VyZVtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdENsb3N1cmUsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGRlc2NlbmRhbnRMaW5rcz86IE9yZ1VuaXRDbG9zdXJlW10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFN0b3JhZ2VCaW5kaW5nS2luZCwgU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucywgU3RvcmFnZUtpbmQsIFN0b3JhZ2VLaW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcblxuQHRhYmxlKFwic3RvcmFnZV9iaW5kaW5nc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBTdG9yYWdlQmluZGluZyBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19zdG9yYWdlX2JpbmRpbmdzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFN0b3JhZ2VLaW5kT3B0aW9ucykgQGNvbHVtbigpIHN0b3JhZ2VLaW5kITogU3RvcmFnZUtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFN0b3JhZ2VCaW5kaW5nS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBiaW5kaW5nS2luZCE6IFN0b3JhZ2VCaW5kaW5nS2luZDtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBiaW5kaW5nS2V5ITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlZ2lvbiE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVuaXF1ZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJc29sYXRpb25UaWVyLCBJc29sYXRpb25UaWVyT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXAgfSBmcm9tIFwiLi90ZW5hbnQtbWVtYmVyc2hpcC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBTdG9yYWdlQmluZGluZyB9IGZyb20gXCIuL3N0b3JhZ2UtYmluZGluZy5tb2RlbFwiO1xuXG5AdGFibGUoXCJ0ZW5hbnRzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFRlbmFudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQHVuaXF1ZSgpIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2x1ZyE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBuYW1lITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihJc29sYXRpb25UaWVyT3B0aW9ucykgQGNvbHVtbigpIGlzb2xhdGlvblRpZXIhOiBJc29sYXRpb25UaWVyO1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG9yZ1VuaXRzPzogT3JnVW5pdFtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gVGVuYW50TWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgbWVtYmVyc2hpcHM/OiBUZW5hbnRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBQcmluY2lwYWwsIFJFTF9SRVNUUklDVCwgZmFsc2UpIHByaW5jaXBhbHM/OiBQcmluY2lwYWxbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFN0b3JhZ2VCaW5kaW5nLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBzdG9yYWdlQmluZGluZ3M/OiBTdG9yYWdlQmluZGluZ1tdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcblxuQHRhYmxlKFwidGVuYW50X3Byb2ZpbGVzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFRlbmFudFByb2ZpbGUgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfdGVuYW50X3Byb2ZpbGVzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcHJvZmlsZUtleSE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5cbkB0YWJsZShcIm9yZ191bml0X3Byb2ZpbGVzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRQcm9maWxlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfdW5pdF9wcm9maWxlc19vcmdfdW5pdFwiKVxuICBAcmVxdWlyZWQoKVxuICBvcmdVbml0ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwcm9maWxlS2V5ITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBHcm91cCB9IGZyb20gXCIuL2dyb3VwLm1vZGVsXCI7XG5pbXBvcnQgeyBQcmluY2lwYWwgfSBmcm9tIFwiLi9wcmluY2lwYWwubW9kZWxcIjtcblxuQHRhYmxlKFwiZ3JvdXBfbWVtYmVyc2hpcHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgR3JvdXBNZW1iZXJzaGlwIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2dyb3VwX21lbWJlcnNoaXBzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gR3JvdXAsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cF9tZW1iZXJzaGlwc19ncm91cFwiKVxuICBAcmVxdWlyZWQoKVxuICBncm91cCE6IEdyb3VwIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2dyb3VwX21lbWJlcnNoaXBzX3ByaW5jaXBhbFwiKVxuICBAcmVxdWlyZWQoKVxuICBwcmluY2lwYWwhOiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBvbmVUb01hbnksIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX05VTExJRlksIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IEdyb3VwTWVtYmVyc2hpcCB9IGZyb20gXCIuL2dyb3VwLW1lbWJlcnNoaXAubW9kZWxcIjtcblxuQHRhYmxlKFwiZ3JvdXBzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEdyb3VwIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2dyb3Vwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9OVUxMSUZZLCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2dyb3Vwc19vcmdfdW5pdFwiKVxuICBvcmdVbml0PzogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBuYW1lITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gR3JvdXBNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBtZW1iZXJzPzogR3JvdXBNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTY29wZUtpbmQsIFNjb3BlS2luZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBQcmluY2lwYWwgfSBmcm9tIFwiLi9wcmluY2lwYWwubW9kZWxcIjtcblxuQHRhYmxlKFwiZWZmZWN0aXZlX3Blcm1pc3Npb25zXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEVmZmVjdGl2ZVBlcm1pc3Npb24gZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZWZmZWN0aXZlX3Blcm1pc3Npb25zX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZWZmZWN0aXZlX3Blcm1pc3Npb25zX3ByaW5jaXBhbFwiKVxuICBAcmVxdWlyZWQoKVxuICBwcmluY2lwYWwhOiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcGVybWlzc2lvbktleSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU2NvcGVLaW5kT3B0aW9ucykgQGNvbHVtbigpIHNjb3BlS2luZCE6IFNjb3BlS2luZDtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzY29wZUlkITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNvdXJjZUtpbmQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc291cmNlSWQhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKSBzdGFydHNBdD86IERhdGU7XG4gIEBjb2x1bW4oKSBleHBpcmVzQXQ/OiBEYXRlO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIGlkLCByZWxhdGlvbklkLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBUZW5hbnRQcm9maWxlIH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQtcHJvZmlsZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgVGVuYW50UHJvZmlsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudFByb2ZpbGU+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoVGVuYW50UHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9maWxlKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJvZmlsZUtleTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnRQcm9maWxlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBwcm9maWxlS2V5LFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JUZW5hbnQodGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudFByb2ZpbGVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHByb2ZpbGUpID0+IHNhbWVUZW5hbnQocHJvZmlsZS50ZW5hbnQsIHRlbmFudElkKSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVGb3JUZW5hbnQodGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhd2FpdCB0aGlzLmxpc3RGb3JUZW5hbnQodGVuYW50SWQsIC4uLmFyZ3MpKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIGlkLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBPcmdVbml0UHJvZmlsZSB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQtcHJvZmlsZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgT3JnVW5pdFByb2ZpbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0UHJvZmlsZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihPcmdVbml0UHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9maWxlKFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHByb2ZpbGVLZXk6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdFByb2ZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgcHJvZmlsZUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yT3JnVW5pdChvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRQcm9maWxlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwcm9maWxlKSA9PiByZWxhdGlvbk1hdGNoKHByb2ZpbGUub3JnVW5pdCwgb3JnVW5pdElkKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIGlkLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBPcmdVbml0Q2xvc3VyZSB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQtY2xvc3VyZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgT3JnVW5pdENsb3N1cmVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0Q2xvc3VyZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihPcmdVbml0Q2xvc3VyZSk7XG4gIH1cblxuICBhc3luYyBsaXN0QW5jZXN0b3JzKHRlbmFudElkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdENsb3N1cmVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKVxuICAgICAgLmZpbHRlcigocm93KSA9PiBzYW1lVGVuYW50KHJvdy50ZW5hbnQsIHRlbmFudElkKSAmJiByZWxhdGlvbk1hdGNoKHJvdy5kZXNjZW5kYW50LCBvcmdVbml0SWQpKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmRlcHRoIC0gcmlnaHQuZGVwdGgpO1xuICB9XG5cbiAgYXN5bmMgbGlzdERlc2NlbmRhbnRzKHRlbmFudElkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdENsb3N1cmVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKVxuICAgICAgLmZpbHRlcigocm93KSA9PiBzYW1lVGVuYW50KHJvdy50ZW5hbnQsIHRlbmFudElkKSAmJiByZWxhdGlvbk1hdGNoKHJvdy5hbmNlc3Rvciwgb3JnVW5pdElkKSlcbiAgICAgIC5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5kZXB0aCAtIHJpZ2h0LmRlcHRoKTtcbiAgfVxuXG4gIGFzeW5jIGlzQW5jZXN0b3JPZihcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIGFuY2VzdG9yT3JnVW5pdElkOiBzdHJpbmcsXG4gICAgZGVzY2VuZGFudE9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QW5jZXN0b3JzKHRlbmFudElkLCBkZXNjZW5kYW50T3JnVW5pdElkLCAuLi5hcmdzKSkuc29tZSgocm93KSA9PlxuICAgICAgcmVsYXRpb25NYXRjaChyb3cuYW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZWxmTGluayh0ZW5hbnRJZDogc3RyaW5nLCBvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBhbmNlc3Rvcjogb3JnVW5pdElkLFxuICAgICAgICBkZXNjZW5kYW50OiBvcmdVbml0SWQsXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaW5zZXJ0QW5jZXN0b3JMaW5rc0Zvck5ld0NoaWxkKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcGFyZW50T3JnVW5pdElkOiBzdHJpbmcsXG4gICAgY2hpbGRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbmNlc3RvckxpbmtzID0gYXdhaXQgdGhpcy5saXN0QW5jZXN0b3JzKHRlbmFudElkLCBwYXJlbnRPcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGZvciAoY29uc3QgbGluayBvZiBhbmNlc3RvckxpbmtzKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgICAgYW5jZXN0b3I6IGxpbmsuYW5jZXN0b3IsXG4gICAgICAgICAgZGVzY2VuZGFudDogY2hpbGRPcmdVbml0SWQsXG4gICAgICAgICAgZGVwdGg6IGxpbmsuZGVwdGggKyAxLFxuICAgICAgICB9LFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUxpbmtzRm9yU3VidHJlZSh0ZW5hbnRJZDogc3RyaW5nLCBvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdWJ0cmVlID0gYXdhaXQgdGhpcy5saXN0RGVzY2VuZGFudHModGVuYW50SWQsIG9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZGVzY2VuZGFudElkcyA9IG5ldyBTZXQoW29yZ1VuaXRJZCwgLi4uc3VidHJlZS5tYXAoKHJvdykgPT4gcmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkpXSk7XG4gICAgY29uc3QgYW5jZXN0b3JJZHMgPSBuZXcgU2V0KFtvcmdVbml0SWQsIC4uLnN1YnRyZWUubWFwKChyb3cpID0+IHJlbGF0aW9uSWQocm93LmFuY2VzdG9yKSldKTtcbiAgICBjb25zdCByb3dzID0gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKHJvdykgPT5cbiAgICAgICAgc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgKGRlc2NlbmRhbnRJZHMuaGFzKHJlbGF0aW9uSWQocm93LmRlc2NlbmRhbnQpKSB8fCBhbmNlc3Rvcklkcy5oYXMocmVsYXRpb25JZChyb3cuYW5jZXN0b3IpKSlcbiAgICApO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgaWQsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25DYXRlZ29yeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgSW5oZXJpdGFuY2VCbG9jayB9IGZyb20gXCIuLi9tb2RlbHMvaW5oZXJpdGFuY2UtYmxvY2subW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIEluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxJbmhlcml0YW5jZUJsb2NrPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEluaGVyaXRhbmNlQmxvY2spO1xuICB9XG5cbiAgYXN5bmMgYmxvY2tDYXRlZ29yeShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25DYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5LFxuICAgIGJsb2NrZWRGcm9tQW5jZXN0b3JJZD86IHN0cmluZyxcbiAgICByZWFzb24/OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxJbmhlcml0YW5jZUJsb2NrPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBvcmdVbml0SWQsXG4gICAgICAgIGJsb2NrZWRGcm9tQW5jZXN0b3I6IGJsb2NrZWRGcm9tQW5jZXN0b3JJZCxcbiAgICAgICAgcGVybWlzc2lvbkNhdGVnb3J5LFxuICAgICAgICByZWFzb24sXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyB1bmJsb2NrQ2F0ZWdvcnkoYmxvY2tJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChibG9ja0lkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JPcmdVbml0KHRlbmFudElkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8SW5oZXJpdGFuY2VCbG9ja1tdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChibG9jaykgPT4gc2FtZVRlbmFudChibG9jay50ZW5hbnQsIHRlbmFudElkKSAmJiByZWxhdGlvbk1hdGNoKGJsb2NrLm9yZ1VuaXQsIG9yZ1VuaXRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY2F0ZWdvcnlCbG9ja2VkRm9yQW5jZXN0b3IoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBhbmNlc3Rvck9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RGb3JPcmdVbml0KHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpKS5zb21lKFxuICAgICAgKGJsb2NrKSA9PlxuICAgICAgICBibG9jay5wZXJtaXNzaW9uQ2F0ZWdvcnkgPT09IGNhdGVnb3J5ICYmXG4gICAgICAgICghYmxvY2suYmxvY2tlZEZyb21BbmNlc3RvciB8fCByZWxhdGlvbk1hdGNoKGJsb2NrLmJsb2NrZWRGcm9tQW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKSlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJc29sYXRpb25UaWVyLCBDcmVhdGVUZW5hbnRJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFRlbmFudFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihUZW5hbnQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVGVuYW50KGlucHV0OiBDcmVhdGVUZW5hbnRJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2x1ZzogaW5wdXQuc2x1ZyxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgaXNvbGF0aW9uVGllcjogaW5wdXQuaXNvbGF0aW9uVGllciA/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+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyb2xlUGVybWlzc2lvbikgPT4gcmVsYXRpb25NYXRjaChyb2xlUGVybWlzc2lvbi5wZXJtaXNzaW9uLCBwZXJtaXNzaW9uSWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlcGxhY2VSb2xlUGVybWlzc2lvbnMocm9sZUlkOiBzdHJpbmcsIHBlcm1pc3Npb25JZHM6IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb25bXT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5saXN0Um9sZVBlcm1pc3Npb25zKHJvbGVJZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgZGVsZXRlUm93c0J5SWQodGhpcywgZXhpc3RpbmcsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwZXJtaXNzaW9uSWRzLm1hcCgocGVybWlzc2lvbklkKSA9PiB0aGlzLmFkZFBlcm1pc3Npb25Ub1JvbGUocm9sZUlkLCBwZXJtaXNzaW9uSWQsIC4uLmFyZ3MpKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVSb2xlV2l0aFBlcm1pc3Npb25zKFxuICAgIGlucHV0OiBpbXBvcnQoXCIuLi90eXBlc1wiKS5DcmVhdGVSb2xlSW5wdXQsXG4gICAgcGVybWlzc2lvbktleXM6IHN0cmluZ1tdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8aW1wb3J0KFwiLi4vbW9kZWxzL3JvbGUubW9kZWxcIikuUm9sZT4ge1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCBuZXcgUm9sZVNlcnZpY2UoKS5jcmVhdGVSb2xlKGlucHV0LCAuLi5hcmdzKTtcbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb25LZXkgb2YgcGVybWlzc2lvbktleXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkUGVybWlzc2lvbktleVRvUm9sZShyb2xlLmlkLCBwZXJtaXNzaW9uS2V5LCAuLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEFzc2lnblJvbGVJbnB1dCwgU2NvcGVLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudCB9IGZyb20gXCIuLi9tb2RlbHMvcm9sZS1hc3NpZ25tZW50Lm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBSb2xlQXNzaWdubWVudFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFJvbGVBc3NpZ25tZW50PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJvbGVBc3NpZ25tZW50KTtcbiAgfVxuXG4gIGFzeW5jIGFzc2lnblJvbGUoaW5wdXQ6IEFzc2lnblJvbGVJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVBc3NpZ25tZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IGlucHV0LnRlbmFudElkLFxuICAgICAgICBwcmluY2lwYWw6IGlucHV0LnByaW5jaXBhbElkLFxuICAgICAgICByb2xlOiBpbnB1dC5yb2xlSWQsXG4gICAgICAgIHNjb3BlS2luZDogaW5wdXQuc2NvcGVLaW5kLFxuICAgICAgICBzY29wZUlkOiBpbnB1dC5zY29wZUlkLFxuICAgICAgICBpbmhlcml0RG93bjogaW5wdXQuaW5oZXJpdERvd24gPz8gZmFsc2UsXG4gICAgICAgIHN0YXJ0c0F0OiBpbnB1dC5zdGFydHNBdCxcbiAgICAgICAgZXhwaXJlc0F0OiBpbnB1dC5leHBpcmVzQXQsXG4gICAgICAgIGNvbmRpdGlvbnM6IGlucHV0LmNvbmRpdGlvbnMsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZXZva2VBc3NpZ25tZW50KGFzc2lnbm1lbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChhc3NpZ25tZW50SWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChhc3NpZ25tZW50KSA9PiBzYW1lVGVuYW50KGFzc2lnbm1lbnQudGVuYW50LCB0ZW5hbnRJZCkgJiYgcmVsYXRpb25NYXRjaChhc3NpZ25tZW50LnByaW5jaXBhbCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RSb2xlQXNzaWdubWVudHMocm9sZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoYXNzaWdubWVudCkgPT4gcmVsYXRpb25NYXRjaChhc3NpZ25tZW50LnJvbGUsIHJvbGVJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudEFzc2lnbm1lbnRzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoYXNzaWdubWVudCkgPT4gc2FtZVRlbmFudChhc3NpZ25tZW50LnRlbmFudCwgdGVuYW50SWQpKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUFzc2lnbm1lbnRXaW5kb3coXG4gICAgYXNzaWdubWVudElkOiBzdHJpbmcsXG4gICAgc3RhcnRzQXQ6IERhdGUgfCB1bmRlZmluZWQsXG4gICAgZXhwaXJlc0F0OiBEYXRlIHwgdW5kZWZpbmVkLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Um9sZUFzc2lnbm1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoYXNzaWdubWVudElkLCB7IHN0YXJ0c0F0LCBleHBpcmVzQXQgfSwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uSWQsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQsIHRyYW5zYWN0aW9uYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdCwgU2NvcGVLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBFZmZlY3RpdmVQZXJtaXNzaW9uIH0gZnJvbSBcIi4uL21vZGVscy9lZmZlY3RpdmUtcGVybWlzc2lvbi5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3Blcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgR3JvdXBNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL2dyb3VwLW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UgfSBmcm9tIFwiLi9vcmctdW5pdC1jbG9zdXJlLnNlcnZpY2VcIjtcbmltcG9ydCB7IEluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlIH0gZnJvbSBcIi4vaW5oZXJpdGFuY2UtYmxvY2suc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEVmZmVjdGl2ZVBlcm1pc3Npb24+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRWZmZWN0aXZlUGVybWlzc2lvbik7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yUHJpbmNpcGFsKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxFZmZlY3RpdmVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKHBlcm1pc3Npb24pID0+IHNhbWVUZW5hbnQocGVybWlzc2lvbi50ZW5hbnQsIHRlbmFudElkKSAmJiByZWxhdGlvbk1hdGNoKHBlcm1pc3Npb24ucHJpbmNpcGFsLCBwcmluY2lwYWxJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZvclNjb3BlKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgc2NvcGVLaW5kOiBTY29wZUtpbmQsXG4gICAgc2NvcGVJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RWZmZWN0aXZlUGVybWlzc2lvbltdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChwZXJtaXNzaW9uKSA9PiBzYW1lVGVuYW50KHBlcm1pc3Npb24udGVuYW50LCB0ZW5hbnRJZCkgJiYgcGVybWlzc2lvbi5zY29wZUtpbmQgPT09IHNjb3BlS2luZCAmJiBwZXJtaXNzaW9uLnNjb3BlSWQgPT09IHNjb3BlSWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaGFzUGVybWlzc2lvbihcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbktleTogc3RyaW5nLFxuICAgIHNjb3BlS2luZDogU2NvcGVLaW5kLFxuICAgIHNjb3BlSWQ6IHN0cmluZyxcbiAgICBhdD86IERhdGUsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKSkuc29tZShcbiAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IHBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgcGVybWlzc2lvbi5zY29wZUtpbmQgPT09IHNjb3BlS2luZCAmJlxuICAgICAgICBwZXJtaXNzaW9uLnNjb3BlSWQgPT09IHNjb3BlSWQgJiZcbiAgICAgICAgKCFwZXJtaXNzaW9uLnN0YXJ0c0F0IHx8ICFhdCB8fCBwZXJtaXNzaW9uLnN0YXJ0c0F0IDw9IGF0KSAmJlxuICAgICAgICAoIXBlcm1pc3Npb24uZXhwaXJlc0F0IHx8ICFhdCB8fCBwZXJtaXNzaW9uLmV4cGlyZXNBdCA+PSBhdClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRm9yUHJpbmNpcGFsKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgYXdhaXQgdGhpcy5saXN0Rm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncykpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUZvclRlbmFudCh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3Qgcm93IG9mIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocGVybWlzc2lvbikgPT4gc2FtZVRlbmFudChwZXJtaXNzaW9uLnRlbmFudCwgdGVuYW50SWQpKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyByZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxFZmZlY3RpdmVQZXJtaXNzaW9uW10+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuXG4gICAgY29uc3Qgcm9sZUFzc2lnbm1lbnRTZXJ2aWNlID0gbmV3IFJvbGVBc3NpZ25tZW50U2VydmljZSgpO1xuICAgIGNvbnN0IHJvbGVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBSb2xlUGVybWlzc2lvblNlcnZpY2UoKTtcbiAgICBjb25zdCBwZXJtaXNzaW9uU2VydmljZSA9IG5ldyBQZXJtaXNzaW9uU2VydmljZSgpO1xuICAgIGNvbnN0IGdyb3VwTWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgR3JvdXBNZW1iZXJzaGlwU2VydmljZSgpO1xuICAgIGNvbnN0IHByaW5jaXBhbFNlcnZpY2UgPSBuZXcgUHJpbmNpcGFsU2VydmljZSgpO1xuICAgIGNvbnN0IG9yZ1VuaXRDbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBjb25zdCBpbmhlcml0YW5jZUJsb2NrU2VydmljZSA9IG5ldyBJbmhlcml0YW5jZUJsb2NrU2VydmljZSgpO1xuXG4gICAgY29uc3QgbWF0ZXJpYWxpemVkOiBFZmZlY3RpdmVQZXJtaXNzaW9uU25hcHNob3RbXSA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZUFzc2lnbm1lbnRzID0gYXdhaXQgcm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGdyb3VwTWVtYmVyc2hpcHMgPSBhd2FpdCBncm91cE1lbWJlcnNoaXBTZXJ2aWNlLmxpc3RQcmluY2lwYWxHcm91cHMocHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGdyb3VwQXNzaWdubWVudHMgPSAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZ3JvdXBNZW1iZXJzaGlwcy5tYXAoYXN5bmMgKG1lbWJlcnNoaXApID0+IHtcbiAgICAgICAgICBjb25zdCBncm91cFByaW5jaXBhbCA9IGF3YWl0IHByaW5jaXBhbFNlcnZpY2UuZ2V0R3JvdXBQcmluY2lwYWwocmVsYXRpb25JZChtZW1iZXJzaGlwLnRlbmFudCksIHJlbGF0aW9uSWQobWVtYmVyc2hpcC5ncm91cCksIC4uLmFyZ3MpO1xuICAgICAgICAgIHJldHVybiByb2xlQXNzaWdubWVudFNlcnZpY2UubGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkLCBncm91cFByaW5jaXBhbC5pZCwgLi4uYXJncyk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG5cbiAgICBjb25zdCBhc3NpZ25tZW50cyA9IFsuLi5zb3VyY2VBc3NpZ25tZW50cywgLi4uZ3JvdXBBc3NpZ25tZW50c107XG4gICAgZm9yIChjb25zdCBhc3NpZ25tZW50IG9mIGFzc2lnbm1lbnRzKSB7XG4gICAgICBjb25zdCByb2xlUGVybWlzc2lvbnMgPSBhd2FpdCByb2xlUGVybWlzc2lvblNlcnZpY2UubGlzdFJvbGVQZXJtaXNzaW9ucyhyZWxhdGlvbklkKGFzc2lnbm1lbnQucm9sZSksIC4uLmFyZ3MpO1xuICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcm9sZVBlcm1pc3Npb25zLm1hcChhc3luYyAocm9sZVBlcm1pc3Npb24pID0+XG4gICAgICAgICAgcGVybWlzc2lvblNlcnZpY2UuZmluZE9uZUJ5KFwiaWRcIiwgcmVsYXRpb25JZChyb2xlUGVybWlzc2lvbi5wZXJtaXNzaW9uKSBhcyBuZXZlciwgLi4uYXJncylcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICBpZiAoIXBlcm1pc3Npb24pIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBzY29wZUtpbmQgPSBhc3NpZ25tZW50LnNjb3BlS2luZDtcbiAgICAgICAgY29uc3Qgc2NvcGVJZCA9IGFzc2lnbm1lbnQuc2NvcGVJZDtcbiAgICAgICAgY29uc3Qgc2NvcGVzOiBBcnJheTx7IHNjb3BlS2luZDogU2NvcGVLaW5kOyBzY29wZUlkOiBzdHJpbmcgfT4gPSBbXTtcbiAgICAgICAgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLlRlbmFudCkge1xuICAgICAgICAgIHNjb3Blcy5wdXNoKHsgc2NvcGVLaW5kLCBzY29wZUlkOiB0ZW5hbnRJZCB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzY29wZUtpbmQgPT09IFNjb3BlS2luZC5SZXNvdXJjZSkge1xuICAgICAgICAgIHNjb3Blcy5wdXNoKHsgc2NvcGVLaW5kLCBzY29wZUlkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiYgIWFzc2lnbm1lbnQuaW5oZXJpdERvd24pIHtcbiAgICAgICAgICBzY29wZXMucHVzaCh7IHNjb3BlS2luZCwgc2NvcGVJZCB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0ICYmIGFzc2lnbm1lbnQuaW5oZXJpdERvd24pIHtcbiAgICAgICAgICBjb25zdCBkZXNjZW5kYW50cyA9IGF3YWl0IG9yZ1VuaXRDbG9zdXJlU2VydmljZS5saXN0RGVzY2VuZGFudHModGVuYW50SWQsIHNjb3BlSWQsIC4uLmFyZ3MpO1xuICAgICAgICAgIHNjb3Blcy5wdXNoKC4uLmRlc2NlbmRhbnRzLm1hcCgocm93KSA9PiAoeyBzY29wZUtpbmQsIHNjb3BlSWQ6IHJlbGF0aW9uSWQocm93LmRlc2NlbmRhbnQpIH0pKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHNjb3BlZCBvZiBzY29wZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0ICYmXG4gICAgICAgICAgICBhc3NpZ25tZW50LmluaGVyaXREb3duICYmXG4gICAgICAgICAgICBzY29wZWQuc2NvcGVJZCAhPT0gc2NvcGVJZCAmJlxuICAgICAgICAgICAgKGF3YWl0IGluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlLmNhdGVnb3J5QmxvY2tlZEZvckFuY2VzdG9yKFxuICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgc2NvcGVkLnNjb3BlSWQsXG4gICAgICAgICAgICAgIHNjb3BlSWQsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb24uY2F0ZWdvcnksXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWF0ZXJpYWxpemVkLnB1c2goe1xuICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgIHByaW5jaXBhbElkLFxuICAgICAgICAgICAgcGVybWlzc2lvbktleTogcGVybWlzc2lvbi5rZXksXG4gICAgICAgICAgICBzY29wZUtpbmQ6IHNjb3BlZC5zY29wZUtpbmQsXG4gICAgICAgICAgICBzY29wZUlkOiBzY29wZWQuc2NvcGVJZCxcbiAgICAgICAgICAgIHNvdXJjZUtpbmQ6IFwicm9sZV9hc3NpZ25tZW50XCIsXG4gICAgICAgICAgICBzb3VyY2VJZDogYXNzaWdubWVudC5pZCxcbiAgICAgICAgICAgIHN0YXJ0c0F0OiBhc3NpZ25tZW50LnN0YXJ0c0F0LFxuICAgICAgICAgICAgZXhwaXJlc0F0OiBhc3NpZ25tZW50LmV4cGlyZXNBdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hdGVyaWFsaXplZC5tYXAoKHBlcm1pc3Npb24pID0+XG4gICAgICAgIHRoaXMuY3JlYXRlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRlbmFudDogcGVybWlzc2lvbi50ZW5hbnRJZCxcbiAgICAgICAgICAgIHByaW5jaXBhbDogcGVybWlzc2lvbi5wcmluY2lwYWxJZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25LZXk6IHBlcm1pc3Npb24ucGVybWlzc2lvbktleSxcbiAgICAgICAgICAgIHNjb3BlS2luZDogcGVybWlzc2lvbi5zY29wZUtpbmQsXG4gICAgICAgICAgICBzY29wZUlkOiBwZXJtaXNzaW9uLnNjb3BlSWQsXG4gICAgICAgICAgICBzb3VyY2VLaW5kOiBwZXJtaXNzaW9uLnNvdXJjZUtpbmQsXG4gICAgICAgICAgICBzb3VyY2VJZDogcGVybWlzc2lvbi5zb3VyY2VJZCxcbiAgICAgICAgICAgIHN0YXJ0c0F0OiBwZXJtaXNzaW9uLnN0YXJ0c0F0LFxuICAgICAgICAgICAgZXhwaXJlc0F0OiBwZXJtaXNzaW9uLmV4cGlyZXNBdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYnVpbGRGb3JUZW5hbnQodGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmluY2lwYWxzID0gKGF3YWl0IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCkubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwcmluY2lwYWwpID0+IHNhbWVUZW5hbnQocHJpbmNpcGFsLnRlbmFudCwgdGVuYW50SWQpKTtcbiAgICBmb3IgKGNvbnN0IHByaW5jaXBhbCBvZiBwcmluY2lwYWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbC5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSZWdpc3RlclJlc291cmNlSW5wdXQsIFJlc291cmNlVmlzaWJpbGl0eSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUHJvdGVjdGVkUmVzb3VyY2UgfSBmcm9tIFwiLi4vbW9kZWxzL3Byb3RlY3RlZC1yZXNvdXJjZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUHJvdGVjdGVkUmVzb3VyY2VTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihQcm90ZWN0ZWRSZXNvdXJjZSk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlclJlc291cmNlKGlucHV0OiBSZWdpc3RlclJlc291cmNlSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgb3JnVW5pdDogaW5wdXQub3JnVW5pdElkLFxuICAgICAgICByZXNvdXJjZVR5cGU6IGlucHV0LnJlc291cmNlVHlwZSxcbiAgICAgICAgcmVzb3VyY2VJZDogaW5wdXQucmVzb3VyY2VJZCxcbiAgICAgICAgdmlzaWJpbGl0eTogaW5wdXQudmlzaWJpbGl0eSxcbiAgICAgICAgb3duZXI6IGlucHV0Lm93bmVyUHJpbmNpcGFsSWQsXG4gICAgICAgIHNlbnNpdGl2aXR5OiBpbnB1dC5zZW5zaXRpdml0eSxcbiAgICAgICAgbWV0YWRhdGE6IGlucHV0Lm1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0QnlEb21haW5SZXNvdXJjZSh0ZW5hbnRJZDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZywgcmVzb3VyY2VJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJvdGVjdGVkUmVzb3VyY2UgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZChcbiAgICAgIChyZXNvdXJjZSkgPT4gc2FtZVRlbmFudChyZXNvdXJjZS50ZW5hbnQsIHRlbmFudElkKSAmJiByZXNvdXJjZS5yZXNvdXJjZVR5cGUgPT09IHJlc291cmNlVHlwZSAmJiByZXNvdXJjZS5yZXNvdXJjZUlkID09PSByZXNvdXJjZUlkXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVSZXNvdXJjZVRvT3JnVW5pdChwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJvdGVjdGVkUmVzb3VyY2U+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocHJvdGVjdGVkUmVzb3VyY2VJZCwgeyBvcmdVbml0OiBvcmdVbml0SWQgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBzZXRWaXNpYmlsaXR5KHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgdmlzaWJpbGl0eTogUmVzb3VyY2VWaXNpYmlsaXR5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJvdGVjdGVkUmVzb3VyY2U+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocHJvdGVjdGVkUmVzb3VyY2VJZCwgeyB2aXNpYmlsaXR5IH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdHJhbnNmZXJPd25lcnNoaXAocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCBvd25lclByaW5jaXBhbElkOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCB7IG93bmVyOiBvd25lclByaW5jaXBhbElkIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdE9yZ1VuaXRSZXNvdXJjZXMob3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZVtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocmVzb3VyY2UpID0+IHJlbGF0aW9uTWF0Y2gocmVzb3VyY2Uub3JnVW5pdCwgb3JnVW5pdElkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50UmVzb3VyY2VzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZVtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocmVzb3VyY2UpID0+IHNhbWVUZW5hbnQocmVzb3VyY2UudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBHcmFudFJlc291cmNlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlc291cmNlR3JhbnQgfSBmcm9tIFwiLi4vbW9kZWxzL3Jlc291cmNlLWdyYW50Lm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUdyYW50U2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8UmVzb3VyY2VHcmFudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihSZXNvdXJjZUdyYW50KTtcbiAgfVxuXG4gIGFzeW5jIGdyYW50UmVzb3VyY2UoaW5wdXQ6IEdyYW50UmVzb3VyY2VJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJlc291cmNlR3JhbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogaW5wdXQudGVuYW50SWQsXG4gICAgICAgIHJlc291cmNlOiBpbnB1dC5yZXNvdXJjZUlkLFxuICAgICAgICBwcmluY2lwYWw6IGlucHV0LnByaW5jaXBhbElkLFxuICAgICAgICBwZXJtaXNzaW9uS2V5OiBpbnB1dC5wZXJtaXNzaW9uS2V5LFxuICAgICAgICBzdGFydHNBdDogaW5wdXQuc3RhcnRzQXQsXG4gICAgICAgIGV4cGlyZXNBdDogaW5wdXQuZXhwaXJlc0F0LFxuICAgICAgICBjb25kaXRpb25zOiBpbnB1dC5jb25kaXRpb25zLFxuICAgICAgICBjcmVhdGVkQnk6IGlucHV0LmNyZWF0ZWRCeVByaW5jaXBhbElkLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmV2b2tlR3JhbnQoZ3JhbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChncmFudElkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RSZXNvdXJjZUdyYW50cyhwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSZXNvdXJjZUdyYW50W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChncmFudCkgPT4gcmVsYXRpb25NYXRjaChncmFudC5yZXNvdXJjZSwgcHJvdGVjdGVkUmVzb3VyY2VJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFByaW5jaXBhbEdyYW50cyh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UmVzb3VyY2VHcmFudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChncmFudCkgPT4gc2FtZVRlbmFudChncmFudC50ZW5hbnQsIHRlbmFudElkKSAmJiByZWxhdGlvbk1hdGNoKGdyYW50LnByaW5jaXBhbCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGhhc0dyYW50KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbktleTogc3RyaW5nLFxuICAgIGF0PzogRGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFByaW5jaXBhbEdyYW50cyh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpKS5zb21lKFxuICAgICAgKGdyYW50KSA9PlxuICAgICAgICByZWxhdGlvbk1hdGNoKGdyYW50LnJlc291cmNlLCBwcm90ZWN0ZWRSZXNvdXJjZUlkKSAmJlxuICAgICAgICBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgICghZ3JhbnQuc3RhcnRzQXQgfHwgIWF0IHx8IGdyYW50LnN0YXJ0c0F0IDw9IGF0KSAmJlxuICAgICAgICAoIWdyYW50LmV4cGlyZXNBdCB8fCAhYXQgfHwgZ3JhbnQuZXhwaXJlc0F0ID49IGF0KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGxGb3JSZXNvdXJjZShwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgYXdhaXQgdGhpcy5saXN0UmVzb3VyY2VHcmFudHMocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncykpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvdGVjdGVkUmVzb3VyY2VTZXJ2aWNlIH0gZnJvbSBcIi4vcHJvdGVjdGVkLXJlc291cmNlLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJlc291cmNlR3JhbnRTZXJ2aWNlIH0gZnJvbSBcIi4vcmVzb3VyY2UtZ3JhbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgcmVsYXRpb25JZCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VWaXNpYmlsaXR5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxpZmVjeWNsZVNlcnZpY2Uge1xuICBhc3luYyB1bnJlZ2lzdGVyUmVzb3VyY2UocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5ldyBSZXNvdXJjZUdyYW50U2VydmljZSgpLmRlbGV0ZUFsbEZvclJlc291cmNlKHByb3RlY3RlZFJlc291cmNlSWQsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IG5ldyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UoKS5kZWxldGVCeUlkKHByb3RlY3RlZFJlc291cmNlSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZVJlc291cmNlU2NvcGUoXG4gICAgcHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8e1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gICAgb3JnVW5pdElkOiBzdHJpbmc7XG4gICAgdmlzaWJpbGl0eTogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICAgIG93bmVyUHJpbmNpcGFsSWQ/OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IG5ldyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UoKS5nZXRCeUlkKHByb3RlY3RlZFJlc291cmNlSWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB7XG4gICAgICB0ZW5hbnRJZDogcmVsYXRpb25JZChyZXNvdXJjZS50ZW5hbnQpLFxuICAgICAgb3JnVW5pdElkOiByZWxhdGlvbklkKHJlc291cmNlLm9yZ1VuaXQpLFxuICAgICAgdmlzaWJpbGl0eTogcmVzb3VyY2UudmlzaWJpbGl0eSxcbiAgICAgIG93bmVyUHJpbmNpcGFsSWQ6IHJlc291cmNlLm93bmVyID8gcmVsYXRpb25JZChyZXNvdXJjZS5vd25lcikgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25JZCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQ3JlYXRlU3RvcmFnZUJpbmRpbmdJbnB1dCwgU3RvcmFnZUJpbmRpbmdLaW5kLCBTdG9yYWdlS2luZCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU3RvcmFnZUJpbmRpbmcgfSBmcm9tIFwiLi4vbW9kZWxzL3N0b3JhZ2UtYmluZGluZy5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUJpbmRpbmdTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxTdG9yYWdlQmluZGluZz4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihTdG9yYWdlQmluZGluZyk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVCaW5kaW5nKGlucHV0OiBDcmVhdGVTdG9yYWdlQmluZGluZ0lucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogaW5wdXQudGVuYW50SWQsXG4gICAgICAgIHN0b3JhZ2VLaW5kOiBpbnB1dC5zdG9yYWdlS2luZCxcbiAgICAgICAgYmluZGluZ0tpbmQ6IGlucHV0LmJpbmRpbmdLaW5kLFxuICAgICAgICBiaW5kaW5nS2V5OiBpbnB1dC5iaW5kaW5nS2V5LFxuICAgICAgICByZWdpb246IGlucHV0LnJlZ2lvbixcbiAgICAgICAgY29uZmlnOiBpbnB1dC5jb25maWcsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50QmluZGluZ3ModGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChiaW5kaW5nKSA9PiByZWxhdGlvbklkKGJpbmRpbmcudGVuYW50KSA9PT0gdGVuYW50SWQpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QmluZGluZyh0ZW5hbnRJZDogc3RyaW5nLCBzdG9yYWdlS2luZDogU3RvcmFnZUtpbmQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0VGVuYW50QmluZGluZ3ModGVuYW50SWQsIC4uLmFyZ3MpKS5maW5kKChiaW5kaW5nKSA9PiBiaW5kaW5nLnN0b3JhZ2VLaW5kID09PSBzdG9yYWdlS2luZCk7XG4gIH1cblxuICBhc3luYyBzZXRCaW5kaW5nQ29uZmlnKFxuICAgIGJpbmRpbmdJZDogc3RyaW5nLFxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShiaW5kaW5nSWQsIHsgY29uZmlnIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcHJvbW90ZVRvRGVkaWNhdGVkKFxuICAgIGJpbmRpbmdJZDogc3RyaW5nLFxuICAgIGJpbmRpbmdLZXk6IHN0cmluZyxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGJpbmRpbmdJZCwgeyBiaW5kaW5nS2luZDogU3RvcmFnZUJpbmRpbmdLaW5kLkRlZGljYXRlZCwgYmluZGluZ0tleSwgcmVnaW9uLCBjb25maWcgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBzZXRTaGFyZWQoXG4gICAgYmluZGluZ0lkOiBzdHJpbmcsXG4gICAgYmluZGluZ0tleTogc3RyaW5nLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmc+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoYmluZGluZ0lkLCB7IGJpbmRpbmdLaW5kOiBTdG9yYWdlQmluZGluZ0tpbmQuU2hhcmVkLCBiaW5kaW5nS2V5LCByZWdpb24sIGNvbmZpZyB9LCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUge1xuICBCb290c3RyYXBPcmdVbml0LFxuICBCb290c3RyYXBUZW1wbGF0ZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFRlbmFudFNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgVGVuYW50UHJvZmlsZVNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQtcHJvZmlsZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0U2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRQcm9maWxlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tIFwiLi91c2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3Blcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9lZmZlY3RpdmUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyByZWxhdGlvbklkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBCb290c3RyYXBTZXJ2aWNlIHtcbiAgcHJpdmF0ZSB0ZW5hbnRTZXJ2aWNlID0gbmV3IFRlbmFudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSB0ZW5hbnRQcm9maWxlU2VydmljZSA9IG5ldyBUZW5hbnRQcm9maWxlU2VydmljZSgpO1xuICBwcml2YXRlIG9yZ1VuaXRTZXJ2aWNlID0gbmV3IE9yZ1VuaXRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgb3JnVW5pdFByb2ZpbGVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRQcm9maWxlU2VydmljZSgpO1xuICBwcml2YXRlIHVzZXJTZXJ2aWNlID0gbmV3IFVzZXJTZXJ2aWNlKCk7XG4gIHByaXZhdGUgbWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwcmluY2lwYWxTZXJ2aWNlID0gbmV3IFByaW5jaXBhbFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uU2VydmljZSA9IG5ldyBQZXJtaXNzaW9uU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVTZXJ2aWNlID0gbmV3IFJvbGVTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFJvbGVQZXJtaXNzaW9uU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVBc3NpZ25tZW50U2VydmljZSA9IG5ldyBSb2xlQXNzaWdubWVudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBlZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSgpO1xuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgYm9vdHN0cmFwVGVuYW50RnJvbVRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBCb290c3RyYXBUZW1wbGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHsgdGVuYW50SWQ6IHN0cmluZzsgcm9vdE9yZ1VuaXRJZDogc3RyaW5nOyBvd25lclVzZXJJZDogc3RyaW5nOyBvd25lclByaW5jaXBhbElkOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMudGVuYW50U2VydmljZS5jcmVhdGVUZW5hbnQodGVtcGxhdGUudGVuYW50LCAuLi5hcmdzKTtcbiAgICBpZiAodGVtcGxhdGUudGVuYW50LnByb2ZpbGVLZXkpIHtcbiAgICAgIGF3YWl0IHRoaXMudGVuYW50UHJvZmlsZVNlcnZpY2UuY3JlYXRlUHJvZmlsZSh0ZW5hbnQuaWQsIHRlbXBsYXRlLnRlbmFudC5wcm9maWxlS2V5LCB0ZW1wbGF0ZS50ZW5hbnQucHJvZmlsZU1ldGFkYXRhLCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVPcmdUcmVlID0gYXN5bmMgKHBhcmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9yZ1VuaXQ6IEJvb3RzdHJhcE9yZ1VuaXQpID0+IHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQgPVxuICAgICAgICBwYXJlbnRJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLm9yZ1VuaXRTZXJ2aWNlLmNyZWF0ZVJvb3QodGVuYW50LmlkLCBvcmdVbml0Lm5hbWUsIG9yZ1VuaXQubWV0YWRhdGEsIG9yZ1VuaXQucHJvZmlsZUtleSwgb3JnVW5pdC5tZXRhZGF0YSwgLi4uYXJncylcbiAgICAgICAgICA6IGF3YWl0IHRoaXMub3JnVW5pdFNlcnZpY2UuY3JlYXRlQ2hpbGQoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZDogdGVuYW50LmlkLFxuICAgICAgICAgICAgICAgIHBhcmVudE9yZ1VuaXRJZDogcGFyZW50SWQsXG4gICAgICAgICAgICAgICAgbmFtZTogb3JnVW5pdC5uYW1lLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHByb2ZpbGVLZXk6IG9yZ1VuaXQucHJvZmlsZUtleSxcbiAgICAgICAgICAgICAgICBwcm9maWxlTWV0YWRhdGE6IG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG9yZ1VuaXQuY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlT3JnVHJlZShjcmVhdGVkLmlkLCBjaGlsZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuXG4gICAgY29uc3Qgcm9vdE9yZ1VuaXQgPSBhd2FpdCBjcmVhdGVPcmdUcmVlKHVuZGVmaW5lZCwgdGVtcGxhdGUucm9vdE9yZ1VuaXQpO1xuICAgIGNvbnN0IG93bmVyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVVc2VyKHRlbXBsYXRlLm93bmVyVXNlciwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5hZGRVc2VyVG9UZW5hbnQodGVuYW50LmlkLCBvd25lci5pZCwgTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IG93bmVyUHJpbmNpcGFsID0gYXdhaXQgdGhpcy5wcmluY2lwYWxTZXJ2aWNlLmdldFVzZXJQcmluY2lwYWwodGVuYW50LmlkLCBvd25lci5pZCwgLi4uYXJncyk7XG5cbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgdGVtcGxhdGUucGVybWlzc2lvbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMucGVybWlzc2lvblNlcnZpY2UuY3JlYXRlUGVybWlzc2lvbihwZXJtaXNzaW9uLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHRlbXBsYXRlLnJvbGVzKSB7XG4gICAgICBjb25zdCBjcmVhdGVkUm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuY3JlYXRlUm9sZShcbiAgICAgICAge1xuICAgICAgICAgIHRlbmFudElkOiB0ZW5hbnQuaWQsXG4gICAgICAgICAga2V5OiByb2xlLmtleSxcbiAgICAgICAgICBuYW1lOiByb2xlLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHJvbGUuZGVzY3JpcHRpb24sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb25LZXkgb2Ygcm9sZS5wZXJtaXNzaW9uS2V5cykge1xuICAgICAgICBhd2FpdCB0aGlzLnJvbGVQZXJtaXNzaW9uU2VydmljZS5hZGRQZXJtaXNzaW9uS2V5VG9Sb2xlKGNyZWF0ZWRSb2xlLmlkLCBwZXJtaXNzaW9uS2V5LCAuLi5hcmdzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvd25lclJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmdldFRlbmFudFJvbGVCeUtleSh0ZW5hbnQuaWQsIHRlbXBsYXRlLm93bmVyUm9sZUtleSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgICAgcHJpbmNpcGFsSWQ6IG93bmVyUHJpbmNpcGFsLmlkLFxuICAgICAgICByb2xlSWQ6IG93bmVyUm9sZS5pZCxcbiAgICAgICAgc2NvcGVLaW5kOiBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgc2NvcGVJZDogcm9vdE9yZ1VuaXQuaWQsXG4gICAgICAgIGluaGVyaXREb3duOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnQuaWQsIG93bmVyUHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZW5hbnRJZDogdGVuYW50LmlkLFxuICAgICAgcm9vdE9yZ1VuaXRJZDogcm9vdE9yZ1VuaXQuaWQsXG4gICAgICBvd25lclVzZXJJZDogb3duZXIuaWQsXG4gICAgICBvd25lclByaW5jaXBhbElkOiBvd25lclByaW5jaXBhbC5pZCxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQtbWVtYmVyc2hpcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4vcHJpbmNpcGFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9lZmZlY3RpdmUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBTeXN0ZW1NYW5hZ2VtZW50U2VydmljZSB7XG4gIHByaXZhdGUgbWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBvcmdNZW1iZXJzaGlwU2VydmljZSA9IG5ldyBPcmdVbml0TWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwcmluY2lwYWxTZXJ2aWNlID0gbmV3IFByaW5jaXBhbFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlU2VydmljZSA9IG5ldyBSb2xlU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVBc3NpZ25tZW50U2VydmljZSA9IG5ldyBSb2xlQXNzaWdubWVudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBlZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSgpO1xuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgb25ib2FyZFVzZXJUb1RlbmFudEFuZE9yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICByb2xlS2V5OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx7IHByaW5jaXBhbElkOiBzdHJpbmcgfT4ge1xuICAgIGF3YWl0IHRoaXMubWVtYmVyc2hpcFNlcnZpY2UuYWRkVXNlclRvVGVuYW50KHRlbmFudElkLCB1c2VySWQsIE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLCAuLi5hcmdzKTtcbiAgICBhd2FpdCB0aGlzLm9yZ01lbWJlcnNoaXBTZXJ2aWNlLmFkZFVzZXJUb09yZ1VuaXQodGVuYW50SWQsIG9yZ1VuaXRJZCwgdXNlcklkLCBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSwgLi4uYXJncyk7XG4gICAgY29uc3QgcHJpbmNpcGFsID0gYXdhaXQgdGhpcy5wcmluY2lwYWxTZXJ2aWNlLmdldFVzZXJQcmluY2lwYWwodGVuYW50SWQsIHVzZXJJZCwgLi4uYXJncyk7XG4gICAgY29uc3Qgcm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuZ2V0VGVuYW50Um9sZUJ5S2V5KHRlbmFudElkLCByb2xlS2V5LCAuLi5hcmdzKTtcbiAgICBhd2FpdCB0aGlzLnJvbGVBc3NpZ25tZW50U2VydmljZS5hc3NpZ25Sb2xlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgcHJpbmNpcGFsSWQ6IHByaW5jaXBhbC5pZCxcbiAgICAgICAgcm9sZUlkOiByb2xlLmlkLFxuICAgICAgICBzY29wZUtpbmQ6IFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICBzY29wZUlkOiBvcmdVbml0SWQsXG4gICAgICAgIGluaGVyaXREb3duOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4geyBwcmluY2lwYWxJZDogcHJpbmNpcGFsLmlkIH07XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIGNoYW5nZVVzZXJPcmdSb2xlKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICByb2xlS2V5OiBzdHJpbmcsXG4gICAgaW5oZXJpdERvd246IGJvb2xlYW4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuZ2V0VGVuYW50Um9sZUJ5S2V5KHRlbmFudElkLCByb2xlS2V5LCAuLi5hcmdzKTtcbiAgICBjb25zdCBjdXJyZW50QXNzaWdubWVudHMgPSBhd2FpdCB0aGlzLnJvbGVBc3NpZ25tZW50U2VydmljZS5saXN0UHJpbmNpcGFsQXNzaWdubWVudHModGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBmb3IgKGNvbnN0IGFzc2lnbm1lbnQgb2YgY3VycmVudEFzc2lnbm1lbnRzLmZpbHRlcigocm93KSA9PiByb3cuc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCAmJiByb3cuc2NvcGVJZCA9PT0gb3JnVW5pdElkKSkge1xuICAgICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UucmV2b2tlQXNzaWdubWVudChhc3NpZ25tZW50LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICAgIHByaW5jaXBhbElkLFxuICAgICAgICByb2xlSWQ6IHJvbGUuaWQsXG4gICAgICAgIHNjb3BlS2luZDogU2NvcGVLaW5kLk9yZ1VuaXQsXG4gICAgICAgIHNjb3BlSWQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgaW5oZXJpdERvd24sXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZS5yZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHN1c3BlbmRVc2VySW5UZW5hbnQodGVuYW50TWVtYmVyc2hpcElkOiBzdHJpbmcsIHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5zZXRTdGF0dXModGVuYW50TWVtYmVyc2hpcElkLCBNZW1iZXJzaGlwU3RhdHVzLlN1c3BlbmRlZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZS5kZWxldGVGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgcmVhY3RpdmF0ZVVzZXJJblRlbmFudCh0ZW5hbnRNZW1iZXJzaGlwSWQ6IHN0cmluZywgdGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1lbWJlcnNoaXBTZXJ2aWNlLnNldFN0YXR1cyh0ZW5hbnRNZW1iZXJzaGlwSWQsIE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLCAuLi5hcmdzKTtcbiAgICBhd2FpdCB0aGlzLmVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlLnJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoekRhdGFTb3VyY2VzLCBDYW5BY2Nlc3NJbnB1dCwgUmVzb3VyY2VWaXNpYmlsaXR5LCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGFzQXJyYXksIGJ1aWxkQWNjZXNzQ29udGV4dCwgYnVpbGRBcmFuZ29Db250ZXh0LCBidWlsZFFkcmFudEZpbHRlciwgaXNUaW1lVmFsaWQsIHJlbGF0aW9uSWQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZnVuY3Rpb24gc2NvcGVLZXkoc2NvcGVLaW5kOiBTY29wZUtpbmQsIHNjb3BlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzY29wZUtpbmR9OiR7c2NvcGVJZH1gO1xufVxuXG5leHBvcnQgY2xhc3MgQXV0aHpTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlczogQXV0aHpEYXRhU291cmNlcztcblxuICBjb25zdHJ1Y3RvcihkYXRhU291cmNlczogQXV0aHpEYXRhU291cmNlcyA9IHt9KSB7XG4gICAgdGhpcy5kYXRhU291cmNlcyA9IGRhdGFTb3VyY2VzO1xuICB9XG5cbiAgYXN5bmMgY2FuQWNjZXNzKGlucHV0OiBDYW5BY2Nlc3NJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhdCA9IGlucHV0LmF0ID8/IG5ldyBEYXRlKCk7XG5cbiAgICBpZiAoaW5wdXQuc2NvcGVLaW5kICYmIGlucHV0LnNjb3BlSWQpIHtcbiAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKGlucHV0LnRlbmFudElkLCBpbnB1dC5zY29wZUtpbmQsIGlucHV0LnNjb3BlSWQpO1xuICAgICAgcmV0dXJuIGFzQXJyYXkocGVybWlzc2lvbnMpLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PiBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiYgaXNUaW1lVmFsaWQoYXQsIHBlcm1pc3Npb24uc3RhcnRzQXQsIHBlcm1pc3Npb24uZXhwaXJlc0F0KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlucHV0LnJlc291cmNlUHJvdGVjdGVkSWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgdGhpcy5kYXRhU291cmNlcy5sb2FkUmVzb3VyY2U/LihpbnB1dC50ZW5hbnRJZCwgaW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZCk7XG4gICAgaWYgKCFyZXNvdXJjZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyZXNvdXJjZS50ZW5hbnRJZCAhPT0gaW5wdXQudGVuYW50SWQpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChyZXNvdXJjZS5vd25lclByaW5jaXBhbElkID09PSBpbnB1dC5wcmluY2lwYWxJZCkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBncmFudHMgPSBhc0FycmF5KGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdFJlc291cmNlR3JhbnRzPy4oaW5wdXQudGVuYW50SWQsIGlucHV0LnJlc291cmNlUHJvdGVjdGVkSWQpKS5maWx0ZXIoXG4gICAgICAoZ3JhbnQpID0+IGdyYW50LnByaW5jaXBhbElkID09PSBpbnB1dC5wcmluY2lwYWxJZCAmJiBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmIGlzVGltZVZhbGlkKGF0LCBncmFudC5zdGFydHNBdCwgZ3JhbnQuZXhwaXJlc0F0KVxuICAgICk7XG4gICAgaWYgKGdyYW50cy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHZpc2liaWxpdHkgPSByZXNvdXJjZS52aXNpYmlsaXR5O1xuICAgIGlmICh2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuUHJpdmF0ZSB8fCB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuUmVzb3VyY2VBY2wpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5Lk9yZ1VuaXQgfHwgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5Lk9yZ1N1YnRyZWUpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKGlucHV0LnRlbmFudElkLCBTY29wZUtpbmQuT3JnVW5pdCwgcmVzb3VyY2Uub3JnVW5pdElkKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBlZmZlY3RpdmVQZXJtaXNzaW9ucy5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT4gcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5UZW5hbnQpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKGlucHV0LnRlbmFudElkLCBTY29wZUtpbmQuVGVuYW50LCBpbnB1dC50ZW5hbnRJZClcbiAgICAgICk7XG4gICAgICByZXR1cm4gZWZmZWN0aXZlUGVybWlzc2lvbnMuc29tZShcbiAgICAgICAgKHBlcm1pc3Npb24pID0+IHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJiBpc1RpbWVWYWxpZChhdCwgcGVybWlzc2lvbi5zdGFydHNBdCwgcGVybWlzc2lvbi5leHBpcmVzQXQpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVpcmVBY2Nlc3MoaW5wdXQ6IENhbkFjY2Vzc0lucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghKGF3YWl0IHRoaXMuY2FuQWNjZXNzKGlucHV0LCAuLi5hcmdzKSkpIHtcbiAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgIGBBY2Nlc3MgZGVuaWVkIGZvciAke2lucHV0LnBlcm1pc3Npb25LZXl9IG9uICR7aW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZCA/PyBzY29wZUtleShpbnB1dC5zY29wZUtpbmQgPz8gU2NvcGVLaW5kLlJlc291cmNlLCBpbnB1dC5zY29wZUlkID8/IFwiXCIpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnVpbGRBY2Nlc3NDb250ZXh0KHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxpbXBvcnQoXCIuLi90eXBlc1wiKS5BY2Nlc3NDb250ZXh0PiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhc0FycmF5KGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zPy4odGVuYW50SWQsIHByaW5jaXBhbElkKSk7XG4gICAgY29uc3QgZ3JhbnRzID0gYXNBcnJheShhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxpc3RQcmluY2lwYWxHcmFudHM/Lih0ZW5hbnRJZCwgcHJpbmNpcGFsSWQpKTtcbiAgICByZXR1cm4gYnVpbGRBY2Nlc3NDb250ZXh0KHtcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICBwZXJtaXNzaW9ucyxcbiAgICAgIGdyYW50cyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkQXJhbmdvQ29udGV4dCh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgYWNjZXNzID0gYXdhaXQgdGhpcy5idWlsZEFjY2Vzc0NvbnRleHQodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBhbGxvd2VkT3JnVW5pdElkcyA9IGFjY2Vzcy5hbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICBjb25zdCBhbGxvd2VkUmVzb3VyY2VJZHMgPSBhY2Nlc3MucmVzb3VyY2VHcmFudHMuZmlsdGVyKChncmFudCkgPT4gZ3JhbnQucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSkubWFwKChncmFudCkgPT4gZ3JhbnQucmVzb3VyY2VJZCk7XG4gICAgcmV0dXJuIGJ1aWxkQXJhbmdvQ29udGV4dCh7IHRlbmFudElkLCBwcmluY2lwYWxJZCwgcGVybWlzc2lvbktleSwgYWxsb3dlZE9yZ1VuaXRJZHMsIGFsbG93ZWRSZXNvdXJjZUlkcyB9KTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkUWRyYW50RmlsdGVyKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIHBlcm1pc3Npb25LZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBhY2Nlc3MgPSBhd2FpdCB0aGlzLmJ1aWxkQWNjZXNzQ29udGV4dCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGFsbG93ZWRPcmdVbml0SWRzID0gYWNjZXNzLmFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb25LZXldID8/IFtdO1xuICAgIGNvbnN0IGFsbG93ZWRSZXNvdXJjZUlkcyA9IGFjY2Vzcy5yZXNvdXJjZUdyYW50cy5maWx0ZXIoKGdyYW50KSA9PiBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5KS5tYXAoKGdyYW50KSA9PiBncmFudC5yZXNvdXJjZUlkKTtcbiAgICByZXR1cm4gYnVpbGRRZHJhbnRGaWx0ZXIoeyB0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIHBlcm1pc3Npb25LZXksIGFsbG93ZWRPcmdVbml0SWRzLCBhbGxvd2VkUmVzb3VyY2VJZHMgfSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnNcbiAqIEBzdW1tYXJ5IFBhY2thZ2UgZW50cnkgcG9pbnQgZm9yIHNoYXJlZCBpbnRlZ3JhdGlvbiBoZWxwZXJzLlxuICogQGRlc2NyaXB0aW9uIEV4cG9zZXMgdGhlIHBhY2thZ2UgdXRpbGl0aWVzIGFuZCBidWlsZC10aW1lIHZlcnNpb24gbWV0YWRhdGEgZm9yIGBAZGVjYWYtdHMvaW50ZWdyYXRpb25zYC5cbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL25hbWVzcGFjZXNcIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT046IHN0cmluZyA9IFwiIyNWRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG5leHBvcnQgY29uc3QgRlVMTF9WRVJTSU9OID0gXCIjI0ZVTExfVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUU6IHN0cmluZyA9IFwiIyNQQUNLQUdFIyNcIjtcbiJdLCJuYW1lcyI6WyJhc3luYyIsImV4ZWNXaXRoTG9nZ2luZyIsImNvbW1hbmQiLCJvcHRpb25zIiwibG9nIiwibGV2ZWwiLCJMb2dMZXZlbCIsImluZm8iLCJkZWJ1ZyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiY2hpbGQiLCJleGVjIiwic3Rkb3V0Iiwic3RkZXJyIiwib24iLCJkYXRhIiwicHVzaCIsInRyaW0iLCJjb2RlIiwic2lsbHkiLCJqb2luIiwiY3JpdGljYWwiLCJJbnRlcm5hbEVycm9yIiwiZXJyIiwiSXNvbGF0aW9uVGllciIsIk1lbWJlcnNoaXBTdGF0dXMiLCJQcmluY2lwYWxLaW5kIiwiU2NvcGVLaW5kIiwiUGVybWlzc2lvbkNhdGVnb3J5IiwiUmVzb3VyY2VWaXNpYmlsaXR5IiwiU3RvcmFnZUtpbmQiLCJTdG9yYWdlQmluZGluZ0tpbmQiLCJJc29sYXRpb25UaWVyT3B0aW9ucyIsIk9iamVjdCIsInZhbHVlcyIsIk1lbWJlcnNoaXBTdGF0dXNPcHRpb25zIiwiUHJpbmNpcGFsS2luZE9wdGlvbnMiLCJTY29wZUtpbmRPcHRpb25zIiwiUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucyIsIlJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMiLCJTdG9yYWdlS2luZE9wdGlvbnMiLCJTdG9yYWdlQmluZGluZ0tpbmRPcHRpb25zIiwiUkVMX1JFU1RSSUNUIiwidXBkYXRlIiwiQ2FzY2FkZSIsIk5PTkUiLCJkZWxldGUiLCJudWxsYWJsZSIsIlJFTF9OVUxMSUZZIiwiUkVMX0NBU0NBREVfREVQRU5ERU5UIiwiQ0FTQ0FERSIsIlJFTF9DQVNDQURFX0lOU0VSVF9VUERBVEUiLCJidWlsZEFyYW5nb0NvbnRleHQiLCJ0ZW5hbnRJZCIsInByaW5jaXBhbElkIiwicGVybWlzc2lvbktleSIsImFsbG93ZWRPcmdVbml0SWRzIiwiYWxsb3dlZFJlc291cmNlSWRzIiwiYnVpbGRRZHJhbnRGaWx0ZXIiLCJtdXN0Iiwia2V5IiwibWF0Y2giLCJ2YWx1ZSIsInNob3VsZCIsImFueSIsInNjb3BlS2V5Iiwic2NvcGVLaW5kIiwic2NvcGVJZCIsIm5vd0lzbyIsIkRhdGUiLCJhc0FycmF5Iiwic2FtZVRlbmFudCIsInJvd1RlbmFudCIsInJlbGF0aW9uSWQiLCJyZWxhdGlvbk1hdGNoIiwidGFyZ2V0IiwibG93ZXJTbHVnIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwiaXNUaW1lVmFsaWQiLCJhdCIsInN0YXJ0c0F0IiwiZXhwaXJlc0F0IiwiaW5zdGFudCIsImJ1aWxkQWNjZXNzQ29udGV4dCIsInBlcm1pc3Npb25zQnlTY29wZSIsImFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uIiwicGVybWlzc2lvbiIsInBlcm1pc3Npb25zIiwiT3JnVW5pdCIsInJlc291cmNlR3JhbnRzIiwiZ3JhbnRzIiwibWFwIiwiZ3JhbnQiLCJyZXNvdXJjZUlkIiwiQmFzZU1vZGVsU2VydmljZSIsIk1vZGVsU2VydmljZSIsImNvbnN0cnVjdG9yIiwiY2xhenoiLCJzdXBlciIsIm5ld01vZGVsIiwiYXNzaWduIiwiY3JlYXRlIiwiYXJncyIsInRoaXMiLCJyZXBvIiwiY3JlYXRlT25lIiwiZ2V0QnlJZCIsImlkIiwicmVhZCIsInVwZGF0ZU9uZSIsInBhdGNoIiwiZXhpc3RpbmciLCJkZWxldGVCeUlkIiwiZmluZE9uZUJ5IiwiZmluZE1hbnlCeSIsInNlbGVjdCIsIndoZXJlIiwiZXhlY3V0ZSIsImxpc3RBbGwiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwiQXV0aG9yaXphdGlvbk1vZGVsIiwiTW9kZWwiLCJUZW5hbnRNZW1iZXJzaGlwIiwiX19kZWNvcmF0ZSIsInBrIiwidHlwZSIsIlN0cmluZyIsInV1aWQiLCJwcm90b3R5cGUiLCJtYW55VG9PbmUiLCJUZW5hbnQiLCJ1bmRlZmluZWQiLCJyZXF1aXJlZCIsIlVzZXIiLCJ0eXBlT2YiLCJvcHRpb24iLCJjb2x1bW4iLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJ0YWJsZSIsIm1vZGVsIiwidW5pcXVlIiwib25lVG9NYW55IiwiT3JnVW5pdE1lbWJlcnNoaXAiLCJPcmdVbml0Q2xvc3VyZSIsIk51bWJlciIsIlBlcm1pc3Npb24iLCJSb2xlUGVybWlzc2lvbiIsIlJvbGUiLCJSb2xlQXNzaWdubWVudCIsIlByaW5jaXBhbCIsIkJvb2xlYW4iLCJSZXNvdXJjZUdyYW50IiwiUHJvdGVjdGVkUmVzb3VyY2UiLCJJbmhlcml0YW5jZUJsb2NrIiwiU3RvcmFnZUJpbmRpbmciLCJUZW5hbnRQcm9maWxlIiwiT3JnVW5pdFByb2ZpbGUiLCJHcm91cE1lbWJlcnNoaXAiLCJHcm91cCIsIkVmZmVjdGl2ZVBlcm1pc3Npb24iLCJUZW5hbnRQcm9maWxlU2VydmljZSIsImNyZWF0ZVByb2ZpbGUiLCJwcm9maWxlS2V5IiwibWV0YWRhdGEiLCJ0ZW5hbnQiLCJsaXN0Rm9yVGVuYW50IiwiZmlsdGVyIiwicHJvZmlsZSIsImRlbGV0ZUZvclRlbmFudCIsInJvdyIsIk9yZ1VuaXRQcm9maWxlU2VydmljZSIsIm9yZ1VuaXRJZCIsIm9yZ1VuaXQiLCJsaXN0Rm9yT3JnVW5pdCIsIk9yZ1VuaXRDbG9zdXJlU2VydmljZSIsImxpc3RBbmNlc3RvcnMiLCJkZXNjZW5kYW50Iiwic29ydCIsImxlZnQiLCJyaWdodCIsImRlcHRoIiwibGlzdERlc2NlbmRhbnRzIiwiYW5jZXN0b3IiLCJpc0FuY2VzdG9yT2YiLCJhbmNlc3Rvck9yZ1VuaXRJZCIsImRlc2NlbmRhbnRPcmdVbml0SWQiLCJzb21lIiwiY3JlYXRlU2VsZkxpbmsiLCJpbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQiLCJwYXJlbnRPcmdVbml0SWQiLCJjaGlsZE9yZ1VuaXRJZCIsImFuY2VzdG9yTGlua3MiLCJsaW5rIiwiZGVsZXRlTGlua3NGb3JTdWJ0cmVlIiwic3VidHJlZSIsImRlc2NlbmRhbnRJZHMiLCJTZXQiLCJhbmNlc3RvcklkcyIsInJvd3MiLCJoYXMiLCJJbmhlcml0YW5jZUJsb2NrU2VydmljZSIsImJsb2NrQ2F0ZWdvcnkiLCJwZXJtaXNzaW9uQ2F0ZWdvcnkiLCJibG9ja2VkRnJvbUFuY2VzdG9ySWQiLCJyZWFzb24iLCJibG9ja2VkRnJvbUFuY2VzdG9yIiwidW5ibG9ja0NhdGVnb3J5IiwiYmxvY2tJZCIsImJsb2NrIiwiY2F0ZWdvcnlCbG9ja2VkRm9yQW5jZXN0b3IiLCJjYXRlZ29yeSIsIlRlbmFudFNlcnZpY2UiLCJjcmVhdGVUZW5hbnQiLCJpbnB1dCIsInNsdWciLCJuYW1lIiwiaXNvbGF0aW9uVGllciIsIlBvb2xlZCIsImdldEJ5U2x1ZyIsInJlbmFtZVRlbmFudCIsImNoYW5nZVNsdWciLCJzZXRJc29sYXRpb25UaWVyIiwiZGVsZXRlVGVuYW50Q29udHJvbGxlZCIsImRlbGV0ZVJvd3NCeUlkIiwic2VydmljZSIsIk9yZ1VuaXRTZXJ2aWNlIiwib3JnVW5pdFBhdGgiLCJwYXJlbnRQYXRoIiwic2VnbWVudCIsImNyZWF0ZVByb2ZpbGVJZk5lZWRlZCIsInByb2ZpbGVNZXRhZGF0YSIsImNyZWF0ZVJvb3QiLCJwYXRoIiwiY3JlYXRlQ2hpbGQiLCJwYXJlbnQiLCJjbG9zdXJlU2VydmljZSIsImxpc3RDaGlsZHJlbiIsImxpc3RUZW5hbnRPcmdVbml0cyIsImxpc3REZXNjZW5kYW50T3JnVW5pdHMiLCJpbmNsdWRlU2VsZiIsImRlc2NlbmRhbnRzIiwiaWRzIiwiYWRkIiwibGlzdEFuY2VzdG9yT3JnVW5pdHMiLCJhbmNlc3RvcnMiLCJyZW5hbWVPcmdVbml0IiwiaW5jbHVkZXMiLCJtb3ZlT3JnVW5pdCIsIm5ld1BhcmVudE9yZ1VuaXRJZCIsIm5ld1BhcmVudCIsInVwZGF0ZWQiLCJyZWJ1aWxkVGVuYW50Q2xvc3VyZSIsImV4aXN0aW5nTGlua3MiLCJvcmdVbml0cyIsImxlZnREZXB0aCIsInNwbGl0IiwibGVuZ3RoIiwicmlnaHREZXB0aCIsImRlbGV0ZU9yZ1VuaXRUcmVlIiwidHJhbnNhY3Rpb25hbCIsIlVzZXJTZXJ2aWNlIiwiY3JlYXRlVXNlciIsImVtYWlsIiwicGhvbmUiLCJkaXNwbGF5TmFtZSIsImdldEJ5RW1haWwiLCJmaW5kIiwidXNlciIsInVwZGF0ZURpc3BsYXlOYW1lIiwidXNlcklkIiwidXBkYXRlRW1haWwiLCJ1cGRhdGVQaG9uZSIsIlByaW5jaXBhbFNlcnZpY2UiLCJjcmVhdGVQcmluY2lwYWwiLCJraW5kIiwic3ViamVjdElkIiwiZ2V0Rm9yU3ViamVjdCIsInByaW5jaXBhbCIsImdldE9yQ3JlYXRlRm9yU3ViamVjdCIsImdldFVzZXJQcmluY2lwYWwiLCJnZXRHcm91cFByaW5jaXBhbCIsImdyb3VwSWQiLCJUZW5hbnRNZW1iZXJzaGlwU2VydmljZSIsImFkZFVzZXJUb1RlbmFudCIsInN0YXR1cyIsIkFjdGl2ZSIsInNldFN0YXR1cyIsIm1lbWJlcnNoaXBJZCIsImxpc3RVc2VyVGVuYW50cyIsIm1lbWJlcnNoaXAiLCJsaXN0VGVuYW50VXNlcnMiLCJyZW1vdmVVc2VyRnJvbVRlbmFudCIsIk9yZ1VuaXRNZW1iZXJzaGlwU2VydmljZSIsImFkZFVzZXJUb09yZ1VuaXQiLCJsaXN0VXNlck9yZ1VuaXRzIiwibGlzdE9yZ1VuaXRVc2VycyIsInJlbW92ZVVzZXJGcm9tT3JnVW5pdCIsIkdyb3VwU2VydmljZSIsImNyZWF0ZUdyb3VwIiwicmVuYW1lR3JvdXAiLCJtb3ZlR3JvdXBUb09yZ1VuaXQiLCJsaXN0VGVuYW50R3JvdXBzIiwiZ3JvdXAiLCJHcm91cE1lbWJlcnNoaXBTZXJ2aWNlIiwiYWRkUHJpbmNpcGFsVG9Hcm91cCIsImxpc3RHcm91cE1lbWJlcnMiLCJsaXN0UHJpbmNpcGFsR3JvdXBzIiwicmVtb3ZlUHJpbmNpcGFsRnJvbUdyb3VwIiwicmVzb2x2ZUdyb3VwUHJpbmNpcGFsSWRzRm9yUHJpbmNpcGFsIiwicHJpbmNpcGFsU2VydmljZSIsIm1lbWJlcnNoaXBzIiwicHJpbmNpcGFscyIsImFsbCIsIlBlcm1pc3Npb25TZXJ2aWNlIiwiY3JlYXRlUGVybWlzc2lvbiIsImRlc2NyaXB0aW9uIiwiZ2V0QnlLZXkiLCJsaXN0QnlDYXRlZ29yeSIsInVwZGF0ZURlc2NyaXB0aW9uIiwicGVybWlzc2lvbklkIiwiUm9sZVNlcnZpY2UiLCJjcmVhdGVSb2xlIiwiZ2V0U3lzdGVtUm9sZUJ5S2V5Iiwicm9sZSIsImNhbmRpZGF0ZSIsIkVycm9yIiwiZ2V0VGVuYW50Um9sZUJ5S2V5IiwicmVuYW1lUm9sZSIsInJvbGVJZCIsInVwZGF0ZVJvbGVNZXRhZGF0YSIsImxpc3RUZW5hbnRSb2xlcyIsImluY2x1ZGVTeXN0ZW0iLCJSb2xlUGVybWlzc2lvblNlcnZpY2UiLCJhZGRQZXJtaXNzaW9uVG9Sb2xlIiwiYWRkUGVybWlzc2lvbktleVRvUm9sZSIsInJlbW92ZVBlcm1pc3Npb25Gcm9tUm9sZSIsInJvbGVQZXJtaXNzaW9uSWQiLCJsaXN0Um9sZVBlcm1pc3Npb25zIiwicm9sZVBlcm1pc3Npb24iLCJsaXN0UGVybWlzc2lvblJvbGVzIiwicmVwbGFjZVJvbGVQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25JZHMiLCJjcmVhdGVSb2xlV2l0aFBlcm1pc3Npb25zIiwicGVybWlzc2lvbktleXMiLCJSb2xlQXNzaWdubWVudFNlcnZpY2UiLCJhc3NpZ25Sb2xlIiwiaW5oZXJpdERvd24iLCJjb25kaXRpb25zIiwicmV2b2tlQXNzaWdubWVudCIsImFzc2lnbm1lbnRJZCIsImxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyIsImFzc2lnbm1lbnQiLCJsaXN0Um9sZUFzc2lnbm1lbnRzIiwibGlzdFRlbmFudEFzc2lnbm1lbnRzIiwidXBkYXRlQXNzaWdubWVudFdpbmRvdyIsIkVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIiwibGlzdEZvclByaW5jaXBhbCIsImxpc3RGb3JTY29wZSIsImhhc1Blcm1pc3Npb24iLCJkZWxldGVGb3JQcmluY2lwYWwiLCJyZWJ1aWxkRm9yUHJpbmNpcGFsIiwicm9sZUFzc2lnbm1lbnRTZXJ2aWNlIiwicm9sZVBlcm1pc3Npb25TZXJ2aWNlIiwicGVybWlzc2lvblNlcnZpY2UiLCJncm91cE1lbWJlcnNoaXBTZXJ2aWNlIiwib3JnVW5pdENsb3N1cmVTZXJ2aWNlIiwiaW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UiLCJtYXRlcmlhbGl6ZWQiLCJzb3VyY2VBc3NpZ25tZW50cyIsImdyb3VwTWVtYmVyc2hpcHMiLCJncm91cEFzc2lnbm1lbnRzIiwiZ3JvdXBQcmluY2lwYWwiLCJmbGF0IiwiYXNzaWdubWVudHMiLCJyb2xlUGVybWlzc2lvbnMiLCJzY29wZXMiLCJSZXNvdXJjZSIsInNjb3BlZCIsInNvdXJjZUtpbmQiLCJzb3VyY2VJZCIsImNyZWF0ZWQiLCJyZWJ1aWxkRm9yVGVuYW50IiwiUHJvdGVjdGVkUmVzb3VyY2VTZXJ2aWNlIiwicmVnaXN0ZXJSZXNvdXJjZSIsInJlc291cmNlVHlwZSIsInZpc2liaWxpdHkiLCJvd25lciIsIm93bmVyUHJpbmNpcGFsSWQiLCJzZW5zaXRpdml0eSIsImdldEJ5RG9tYWluUmVzb3VyY2UiLCJyZXNvdXJjZSIsIm1vdmVSZXNvdXJjZVRvT3JnVW5pdCIsInByb3RlY3RlZFJlc291cmNlSWQiLCJzZXRWaXNpYmlsaXR5IiwidHJhbnNmZXJPd25lcnNoaXAiLCJsaXN0T3JnVW5pdFJlc291cmNlcyIsImxpc3RUZW5hbnRSZXNvdXJjZXMiLCJSZXNvdXJjZUdyYW50U2VydmljZSIsImdyYW50UmVzb3VyY2UiLCJjcmVhdGVkQnkiLCJjcmVhdGVkQnlQcmluY2lwYWxJZCIsInJldm9rZUdyYW50IiwiZ3JhbnRJZCIsImxpc3RSZXNvdXJjZUdyYW50cyIsImxpc3RQcmluY2lwYWxHcmFudHMiLCJoYXNHcmFudCIsImRlbGV0ZUFsbEZvclJlc291cmNlIiwiUmVzb3VyY2VMaWZlY3ljbGVTZXJ2aWNlIiwidW5yZWdpc3RlclJlc291cmNlIiwicmVzb2x2ZVJlc291cmNlU2NvcGUiLCJTdG9yYWdlQmluZGluZ1NlcnZpY2UiLCJjcmVhdGVCaW5kaW5nIiwic3RvcmFnZUtpbmQiLCJiaW5kaW5nS2luZCIsImJpbmRpbmdLZXkiLCJyZWdpb24iLCJjb25maWciLCJsaXN0VGVuYW50QmluZGluZ3MiLCJiaW5kaW5nIiwiZ2V0QmluZGluZyIsInNldEJpbmRpbmdDb25maWciLCJiaW5kaW5nSWQiLCJwcm9tb3RlVG9EZWRpY2F0ZWQiLCJEZWRpY2F0ZWQiLCJzZXRTaGFyZWQiLCJTaGFyZWQiLCJCb290c3RyYXBTZXJ2aWNlIiwidGVuYW50U2VydmljZSIsInRlbmFudFByb2ZpbGVTZXJ2aWNlIiwib3JnVW5pdFNlcnZpY2UiLCJvcmdVbml0UHJvZmlsZVNlcnZpY2UiLCJ1c2VyU2VydmljZSIsIm1lbWJlcnNoaXBTZXJ2aWNlIiwicm9sZVNlcnZpY2UiLCJlZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSIsImJvb3RzdHJhcFRlbmFudEZyb21UZW1wbGF0ZSIsInRlbXBsYXRlIiwiY3JlYXRlT3JnVHJlZSIsInBhcmVudElkIiwiY2hpbGRyZW4iLCJyb290T3JnVW5pdCIsIm93bmVyVXNlciIsIm93bmVyUHJpbmNpcGFsIiwicm9sZXMiLCJjcmVhdGVkUm9sZSIsIm93bmVyUm9sZSIsIm93bmVyUm9sZUtleSIsInJvb3RPcmdVbml0SWQiLCJvd25lclVzZXJJZCIsIlN5c3RlbU1hbmFnZW1lbnRTZXJ2aWNlIiwib3JnTWVtYmVyc2hpcFNlcnZpY2UiLCJvbmJvYXJkVXNlclRvVGVuYW50QW5kT3JnVW5pdCIsInJvbGVLZXkiLCJjaGFuZ2VVc2VyT3JnUm9sZSIsImN1cnJlbnRBc3NpZ25tZW50cyIsInN1c3BlbmRVc2VySW5UZW5hbnQiLCJ0ZW5hbnRNZW1iZXJzaGlwSWQiLCJTdXNwZW5kZWQiLCJyZWFjdGl2YXRlVXNlckluVGVuYW50IiwiQXV0aHpTZXJ2aWNlIiwiZGF0YVNvdXJjZXMiLCJjYW5BY2Nlc3MiLCJsaXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZSIsInJlc291cmNlUHJvdGVjdGVkSWQiLCJsb2FkUmVzb3VyY2UiLCJQcml2YXRlIiwiUmVzb3VyY2VBY2wiLCJPcmdTdWJ0cmVlIiwiZWZmZWN0aXZlUGVybWlzc2lvbnMiLCJyZXF1aXJlQWNjZXNzIiwiQXV0aG9yaXphdGlvbkVycm9yIiwibGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zIiwiYWNjZXNzIiwiVkVSU0lPTiIsIkNPTU1JVCIsIkZVTExfVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSJdLCJtYXBwaW5ncyI6Ijs7Ozs7SUFTT0EsZUFBZUMsZ0JBQ3BCQyxTQUNBQyxTQUNBQyxLQUNBQyxRQUFrQkMsUUFBQUEsU0FBU0M7UUFFM0JILElBQUlJLE1BQU0sY0FBY047UUFFeEIsT0FBTyxJQUFJTyxRQUFRLENBQUNDLFNBQVNDO1lBQzNCLE1BQU1DLFFBQVFDLGNBQUFBLEtBQUtYLFNBQVNDO1lBRTVCLE1BQU1XLFNBQW1CO1lBQ3pCLE1BQU1DLFNBQW1CO1lBRXpCSCxNQUFNRSxRQUFRRSxHQUFHLFFBQVNDO2dCQUN4QkgsT0FBT0ksS0FBS0Q7Z0JBQ1piLElBQUlDLE9BQU9ZLEtBQUtFOztZQUdsQlAsTUFBTUcsUUFBUUMsR0FBRyxRQUFTQztnQkFDeEJGLE9BQU9HLEtBQUtEO2dCQUNaYixJQUFJSSxNQUFNUyxLQUFLRTs7WUFHakJQLE1BQU1JLEdBQUcsU0FBVUk7Z0JBQ2pCLElBQUlBLFNBQVMsR0FBRztvQkFDZGhCLElBQUlpQixNQUFNO29CQUNWWCxRQUFRO3dCQUFFSSxRQUFRQSxPQUFPUSxLQUFLO3dCQUFPUCxRQUFRQSxPQUFPTyxLQUFLOztBQUMzRCx1QkFBTztvQkFDTGxCLElBQUltQixTQUNGLDRCQUE0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
|
|
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
|